Я использую определенную форму в нескольких местах. В одном из них мне нужно игнорировать элемент формы, который я программно устанавливал после проверки.
Поскольку это просто исключение, я не хочу создавать новую форму. Поэтому я подумал, что просто удалю этот элемент в контроллере, например:
$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