3

Я прочитал этот вопрос на SO: «how to disable inArray validator forms in zend framework2» и пытался найти его, но не смог найти способ отсоединить/удалить валидатор . Но InArray всего лишь a валидатор. Итак, как можно удалить валидатор из списка проверки элемента формы?Как удалить валидатор из элемента Form Element/Form ValidatorChain в Zend Framework 2?

я могу получить валидатор:

$myElement = $form->getInputFilter()->get('city'); 
$validatorChain = $cityElement->getValidatorChain(); 
$validators = $validatorChain->getValidators(); 

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

Как удалить валидатор из элемента формы?

+1

Вы попробовали $ inputFilter = new InputFilter(); $ inputFilter-> remove ($ name); И вы используете ** $ factory = new InputFactory(); ** например? –

+0

Спасибо! Да, он работает: '$ formInputFilter = $ form-> getInputFilter(); $ formInputFilter-> remove ('city'); $ formInputFilter-> добавить ((новый Zend \ InputFilter \ Factory()) -> createInput (массив ( \t 'имя' => 'город', \t 'требуется' => правда, ))); 'Но то мне пришлось бы создать «Input» в скрипте вида. Грязные. – automatix

+0

На ваш взгляд, просто сделайте $ newInputFilter = new InputFilter(); // .. ваш материал .. $ inputFilter = new InputFilter(); $ inputFilter-> add ($ newInputFilter, "yourElement"); $ form-> setInputFilter ($ inputFilter); Но это будет лучше в вашем контроллере! –

ответ

6

Ну, вы можете просто заменить цепочку валидатора на новую. Скажем, у меня есть элемент с двумя валидаторов:

  • Zend \ Validator \ NotEmpty
  • Zend \ Validator \ EmailAddress

И я хочу, чтобы удалить EmailAddress валидатор от него. Вы могли бы сделать что-то вроде этого:

// create new validator chain 
$newValidatorChain = new \Zend\Validator\ValidatorChain; 
// loop through all validators of the validator chained currently attached to the element 
foreach ($form->getInputFilter()->get('myElement')->getValidatorChain()->getValidators() as $validator) { 
    // attach validator unless it's instance of Zend\Validator\EmailAddress 
    if (!($validator['instance'] instanceof \Zend\Validator\EmailAddress)) { 
     $newValidatorChain->addValidator($validator['instance'], $validator['breakChainOnFailure']); 
    } 
} 
// replace the old validator chain on the element 
$form->getInputFilter()->get('myElement')->setValidatorChain($newValidatorChain); 

Easy;)

+0

Позвольте мне попробовать, если это сработает, это будет большой помощью, так как на данный момент «disable_inarray_validator» отключает только сообщение об ошибке и ничего не проверяет w.r.t. –

+0

Thx для вашего усилия, помогите, это сработало на данный момент, но после того, как я создал новую цепочку Validator, я позже проверил ее как this print_r ($ Form-> getInputFilter() -> get ('account') -> getValidatorChain() -> getValidators()) ;. И в итоге я получил пустой массив(); теперь мне было интересно, удалит ли этот алгот все валидаторы в цепочке. –

+0

Это дамп для ValidatorChain. Zend \ Validator \ ValidatorChain Object ([plugins: protected] => [validators: protected] => Array() [messages: protected] => Array()) –

1

Я нашел эту работу с 1.12.3

в моей форме обновления

$element = new My_Form_Element_Username('username'); 
$element->setValue('some-value'); 
$element->removeValidator('Db_NoRecordExists'); 
$this->addElement($element); 

или

$this->addElement(new My_Form_Element_Username('username') 
    ->setValue('some-value') 
    ->removeValidator('Db_NoRecordExists'); 

My_Form_Element_Use rname только расширяет некоторый Zend_Form_Element и имеет определенные валидаторы.

Смежные вопросы