zf 以 class 的形式为新的 fieldset 元素添加 inputfilter
zf add inputfilter for a new fieldset element in the form class
在zend framework中,如何使用表单中的代码为字段集中的新表单元素添加inputfilter?在下面的例子中,我在字段集 class 中定义了一组通用表单元素和这些元素的输入过滤器,并将字段集添加到表单中。之后,我在表单代码中向字段集中添加一个或多个新的表单元素(我是在表单中而不是在字段集中进行的,以准备通过表单工厂动态添加元素)。我遇到的问题是为附加元素添加新的输入过滤器定义。
在我的字段集中:
class myFieldset extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
// add form elements
}
public function getInputFilterSpecification()
{
$inputFilter['myFormElement'] = [
'required' => true,
'filters' => [[ ... ],],
'validators' => [[ ... ],],
'allow_empty' => false,
'continue_if_empty' => false,
];
// more filters
return $inputFilter;
}
}
在我的表格中:
class myForm extends Form
{
public function __construct()
{
// ...
// add elements from fieldset
$this->add([
'name' => 'myFieldset',
'type' => 'Application\Form\Fieldset\myFieldset',
'options' => [
'use_as_base_fieldset' => true,
],
]);
// add new element
$myFieldset = $this->get('myFieldset');
$myFieldset->add([
'name' => 'additionalElement',
'type' => 'Zend\Form\Element\ ... ',
'attributes' => [],
'options' => [],
]);
// update inputfilter
$input = new Input('additionalElement');
$input->setRequired(false);
$currentInputFilter = $this->getInputFilter();
$currentInputFilter->add($input);
$this->setInputFilter($currentInputFilter);
// submit buttons
}
}
在这个例子中,附加元素被添加到字段集中,但我的代码错误,无法将新定义添加到输入过滤器。
您需要获取 Fieldset 的输入过滤器,而不是 class 的形式。因为这个 Zend Framework 包含 InputFilterProviderFieldset
class,您应该从中继承您的字段集。 InputFilterProviderFieldset
class 带有 getter 和 setter 方法,用于在运行时修改输入过滤器规范。以下代码未经测试,但应该可以工作。
namesapce Application\Form\MyFieldset;
use Zend\Form\InputFilterProviderFieldset;
class MyFieldset extends InputFilterProviderFieldset
{
public function init()
{
$this->add([
'name' => 'element1',
'type' => Text::class,
'attributes' => [
...
],
'options' => [
...
],
]);
}
}
使用 InputFilterProviderFieldset
class,您的表单 class 应该如下所示。
namespace Application\Form;
use Zend\Form\Form;
class YourForm extends Form
{
public function __construct(string $name, array $options = [])
{
// definition of your fieldset must use the input_filter_spec key
$this->add([
'name' => 'myFieldset',
'type' => 'Application\Form\Fieldset\myFieldset',
'options' => [
'use_as_base_fieldset' => true,
'input_filter_spec' => [
'element1' => [
'required' => true,
'filters' => [
...
],
'validators' => [
...
],
],
],
],
]);
// add a new element to the fieldset
$this->get('myFieldset')->add([
'name' => 'element2',
'type' => Text::class,
'attributes' => [
...
],
'options' => [
...
],
]);
// Update the input filter of the fieldset
$myFieldsetFilterSpec = $this->get('myFieldset')->getInputFilterSpecification();
$myNewFieldsetFilterSpec = array_merge(
$myFieldsetFilterSpec,
[
'element2' => [
'required' => false,
],
],
);
// set the new filter specs for your fieldset
$this->get('myFieldset')->setInputFilterSpecification($myNewFieldsetFilterSpec);
}
}
如您所见,Zend Framework 提供了解决问题所需的所有内容。我希望这种方法对你有所帮助。
在zend framework中,如何使用表单中的代码为字段集中的新表单元素添加inputfilter?在下面的例子中,我在字段集 class 中定义了一组通用表单元素和这些元素的输入过滤器,并将字段集添加到表单中。之后,我在表单代码中向字段集中添加一个或多个新的表单元素(我是在表单中而不是在字段集中进行的,以准备通过表单工厂动态添加元素)。我遇到的问题是为附加元素添加新的输入过滤器定义。
在我的字段集中:
class myFieldset extends Fieldset implements InputFilterProviderInterface
{
public function init()
{
// add form elements
}
public function getInputFilterSpecification()
{
$inputFilter['myFormElement'] = [
'required' => true,
'filters' => [[ ... ],],
'validators' => [[ ... ],],
'allow_empty' => false,
'continue_if_empty' => false,
];
// more filters
return $inputFilter;
}
}
在我的表格中:
class myForm extends Form
{
public function __construct()
{
// ...
// add elements from fieldset
$this->add([
'name' => 'myFieldset',
'type' => 'Application\Form\Fieldset\myFieldset',
'options' => [
'use_as_base_fieldset' => true,
],
]);
// add new element
$myFieldset = $this->get('myFieldset');
$myFieldset->add([
'name' => 'additionalElement',
'type' => 'Zend\Form\Element\ ... ',
'attributes' => [],
'options' => [],
]);
// update inputfilter
$input = new Input('additionalElement');
$input->setRequired(false);
$currentInputFilter = $this->getInputFilter();
$currentInputFilter->add($input);
$this->setInputFilter($currentInputFilter);
// submit buttons
}
}
在这个例子中,附加元素被添加到字段集中,但我的代码错误,无法将新定义添加到输入过滤器。
您需要获取 Fieldset 的输入过滤器,而不是 class 的形式。因为这个 Zend Framework 包含 InputFilterProviderFieldset
class,您应该从中继承您的字段集。 InputFilterProviderFieldset
class 带有 getter 和 setter 方法,用于在运行时修改输入过滤器规范。以下代码未经测试,但应该可以工作。
namesapce Application\Form\MyFieldset;
use Zend\Form\InputFilterProviderFieldset;
class MyFieldset extends InputFilterProviderFieldset
{
public function init()
{
$this->add([
'name' => 'element1',
'type' => Text::class,
'attributes' => [
...
],
'options' => [
...
],
]);
}
}
使用 InputFilterProviderFieldset
class,您的表单 class 应该如下所示。
namespace Application\Form;
use Zend\Form\Form;
class YourForm extends Form
{
public function __construct(string $name, array $options = [])
{
// definition of your fieldset must use the input_filter_spec key
$this->add([
'name' => 'myFieldset',
'type' => 'Application\Form\Fieldset\myFieldset',
'options' => [
'use_as_base_fieldset' => true,
'input_filter_spec' => [
'element1' => [
'required' => true,
'filters' => [
...
],
'validators' => [
...
],
],
],
],
]);
// add a new element to the fieldset
$this->get('myFieldset')->add([
'name' => 'element2',
'type' => Text::class,
'attributes' => [
...
],
'options' => [
...
],
]);
// Update the input filter of the fieldset
$myFieldsetFilterSpec = $this->get('myFieldset')->getInputFilterSpecification();
$myNewFieldsetFilterSpec = array_merge(
$myFieldsetFilterSpec,
[
'element2' => [
'required' => false,
],
],
);
// set the new filter specs for your fieldset
$this->get('myFieldset')->setInputFilterSpecification($myNewFieldsetFilterSpec);
}
}
如您所见,Zend Framework 提供了解决问题所需的所有内容。我希望这种方法对你有所帮助。