Zend Framework 2 – Удаленный элемент формы приводит к отказу проверки

Я использую определенную форму в нескольких местах. В одном из них мне нужно игнорировать элемент формы, который я программно устанавливал после проверки.

Поскольку это просто исключение, я не хочу создавать новую форму. Поэтому я подумал, что просто удалю этот элемент в контроллере, например:

$myForm->remove('myElement'); 

Проблема в том, что форма теперь не будет проверяться. Я не получаю никаких ошибок, но $myForm->isValid() просто возвращает пустое значение.

Любые идеи, что я могу делать неправильно?

Благодаря!

Хорошо, наконец я нашел решение ! Вы можете определить ValidationGroup которая позволяет вам устанавливать атрибуты, которые вы хотите проверить. Остальные не проверяются:

 $form->setValidationGroup('name', 'email', 'subject', 'message'); $form->setData($data); if ($form->isValid()) { ... 

Первое, о чем я думал, – это удалить валидатор из вашего ValidatorChain myElement. Вы можете получить его внутри контроллера с помощью:

 $form->getInputFilter()->get( 'myElement' )->getValidatorChain() 

Похоже, вы не можете удалить из ValidatorChain, просто добавьте. Проверьте этот пост . Мэтью Вейер О'Пинни из Zend объясняет, почему это невозможно и возможное решение для вашего сценария.

Как я решаю эту проблему, проверяется «условие удаления», когда я создаю валидатор в классе FormFilter. Если вы используете аннотации, я думаю, что это не работает для вас, поэтому предложения Matthew – это тот, который вы должны использовать.

Или вы можете попробовать тот, что в этом посте от @Stoyan Dimov: определить две формы, своего рода BasicForm и ExtendedForm. Первый имеет все общие элементы формы, второй – расширенный один из остальных с остальными полями. В зависимости от вашего состояния вы можете использовать тот или иной.

В class ValidatorChain implements Countable, ValidatorInterface , добавляет новый метод:

 public function remove($name){ foreach ($this->validators as $key => $element) { $validator = $element['instance']; if($validator instanceof $name){ unset($this->validators[$key]); break; } } } не public function remove($name){ foreach ($this->validators as $key => $element) { $validator = $element['instance']; if($validator instanceof $name){ unset($this->validators[$key]); break; } } } 

Используйте следующее:

 $form->getInputFilter()->get("xxxxx")->getValidatorChain()->remove('xxxxxx'); 

Для этого конкретного элемента должен быть установлен валидатор, который вы пытаетесь удалить.

В контроллере, где вы добавляете новые элементы для формирования, должен быть добавлен addValidator, например:

$ Element-> addValidator ( 'цифра, буква');

Это фактически приводит к отказу проверки. Таким образом, вы удалили элемент из формы, но у вас все еще есть проверка, определенная на проверяемом элементе.

Если вы не можете найти эту функцию добавления валидации в контроллере, попробуйте определить, было ли оно определено через файл конфигурации.

Подробнее о проверке формы в zf вы можете прочитать здесь: http://framework.zend.com/manual/1.12/en/zend.form.elements.html