У меня есть класс формы, который динамически создает поля с элементами / полями рекурсивно. Я делаю это, чтобы получить settings[general][rpp][value]
в качестве имени ввода (например). Поля генерируются, потому что параметры определяются пользователем в файле XML.
Наборы полей создаются следующим образом:
$fieldset = new Fieldset(...); $fieldset->add(...); $form->add($fieldset);
Форма выводится правильно; все работает. Кроме того, мне нужна проверка.
Моя цель – определить валидаторы и фильтры для этих вложенных элементов. Я действительно запутался в том, как это работает – но похоже, что только форма сама определяет input_filter setInputFilter(...)
и я не знаю, как заставить его распознавать рекурсию без заводских и проприетарных классов для полей вместо того, чтобы быть динамичным.
Я чист?
Благодарю.
Я выяснил, как сделать этот высокодинамичный тип формы с проверкой и фильтрами. Я объясню здесь этот гипотетический сценарий:
// create a form instance and a filter instance $form = new Form(); $filter = new InputFilter(); // create a fieldset instance and another filter instance $fieldset_a = new Fieldset('general'); $fieldset_a_filter = new InputFilter(); // create element(s) to assign to fieldset $setting_1 = new Element('setting_1'); // create another input filter for element defining filters and validators $setting_1_filter = new InputFilter(array( 'name' => 'setting_1', 'required' => true, 'validators' => array(), // ... )); // add element to fieldset $fieldset_a->add($setting_1); // add fieldset to form $form->add($fieldset_a); // add element filter to fieldset filter $fieldset_a_filter->add($setting_1_filter,'setting_1'); // add fieldset A filter to main input filter $filter->add($fieldset_a_filter,'general'); $form->setInputFilter($filter);
Таким образом, вы можете видеть, что вам нужно создавать фильтры ввода для каждого набора элементов и каждого набора полей, а затем работать обратно через них, добавляя их друг к другу до тех пор, пока не будет создан основной входной фильтр, и вы можете назначить его экземпляру формы.
Затем после использования $form->setData($this->request->getPost())
– $form->isValid()
будут использоваться предоставленные валидаторы с именами ввода, такими как general[setting_1]
Этот ответ может быть в 100 раз более подробным, но это лучше, чем доступно для проверки динамического набора полей.
здесь, в документах ZF2 также объясняется http://framework.zend.com/manual/2.3/en/modules/zend.form.collections.html