2013-02-14 1 views
1

У меня есть Form \ Element с InputFilter, для которого «обязательное» значение установлено как «false». При определенных обстоятельствах Element будет нуждаться в «обязательном» значении, установленном в «true» изнутри контроллера.Zend Framework 2 Установка Zend InputFilter setRequired()

Когда я установил Zend \ InputFilter setRequired (true) в моем контроллере, это не похоже на то, что вызывается метод $ form-> isValid(). Однако, если фильтр установлен там, где «требуется» является «истинным» в Zend \ InputFilter (и не динамически устанавливается внутри контроллера), тогда он работает так, как ожидалось, но это не мое желаемое решение, поскольку я использую эту форму и фильтрую несколько местоположения, и иногда поле требуется, а иногда - нет.

В моем контроллере я следующее:

$form = new UserDataForm(); 
$request = $this->getRequest(); 

if ($request->isPost()) { 
    $update = new UserFilter(); 
    // The following doesn't seem to be respected 
    $update->getInputFilter()->get('userName')->setRequired(true); 

    $form->setInputFilter($update->getInputFilter()); 
    $form->setData($request->getPost()); 

    if($form->isValid()) { 
     //The result is true even when the 'userName' var is not set in the POST data. 
     echo("Is Valid"); 
    } else { 
     echo($form->getMessages()); 
    } 

Я поставил свой UserDataForm класс() следующим образом:

class UserDataForm extends Form 
{ 
public function __construct($name = null, array $userTypes) { 
    parent::__construct('user'); 
    $this->setAttribute('method','post'); 

    $this->add(array(
     'name' => 'userName', 
     'attributes' => array(
      'type' => 'text', 
      'class'=> 'small' 
     ), 
     'options' => array(
      'label' => 'Username:' 
     ) 
    )); 

    //... and so on... 

Я установил свой класс UserFilter так:

public function getInputFilter() { 
    if (!$this->inputFilter) { 
     $inputFilter = new InputFilter(); 
     $factory  = new InputFactory(); 

     $inputFilter->add($factory->createInput(array(
      'name'  => 'userName', 
      'required' => false, 
      'filters' => array(
       array('name' => 'StripTags'), 
       array('name' => 'StringTrim'), 
      ), 
      'validators' => array(
       array(
        'name' => 'StringLength', 
        'options' => array(
         'encoding' => 'UTF-8', 
        ) 
       ), 
      ) 
     ))); 

    // ... 

Может кто-нибудь объяснить, почему $ update-> getInputFilter() -> get ('userName') -> setRequired (true) как вызвано из моего Controll er, похоже, не соблюдается, когда форма проверена?

ответ

8

Я нашел проблему после отдыха на ней какое-то время. По-видимому, -> setRequired (true) является взаимоисключающим при назначении динамически. Если вы ищете такое же поведение, как установка 'required' => true из \ FilterInput, вам также необходимо добавить -> setAllowEmpty (false).

Так мой пересмотренный код теперь выглядит следующим образом:

$update->getInputFilter()->get('userName')->setRequired(true); 
$update->getInputFilter()->get('userName')->setAllowEmpty(false); 

Деррик