Вам нужно получить входной фильтр набора полей, а не класса формы. Для этого Zend Framework содержит класс InputFilterProviderFieldset
, от которого вы должны унаследовать свой набор полей. Класс InputFilterProviderFieldset
поставляется с методами получения и установки для изменения спецификаций входного фильтра во время выполнения. Следующий код не проверен, но должен работать.
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
ваш класс формы должен выглядеть следующим образом.
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 предоставляет все необходимое для решения вашей проблемы. Я надеюсь, что этот подход поможет вам.