2013-02-14 145 views
1

我有一個FormFile,其InputFilter的'required'值設置爲「false」。在某些情況下,Element將需要Controller中的「required」值設置爲「true」。Zend Framework 2設置Zend InputFilter setRequired()

當我在我的控制器中設置Zend \ InputFilter setRequired(true)時,它調用$ form-> isValid()方法時似乎不被尊重。然而,如果在Zend \ InputFilter中'required'爲「true」的地方設置了過濾器(而不是在Controller內動態設置),那麼它的工作方式和預期的一樣 - 但這不是我想要的解決方案,因爲我使用這種形式和過濾器有時候這個領域是必需的,而其他時間則不是。

在我的控制,我有以下幾點:

$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', 
        ) 
       ), 
      ) 
     ))); 

    // ... 

有人可以解釋爲什麼從我的Controll調用$ update-> getInputFilter() - > get('userName') - > setRequired(true)呃在表單驗證時似乎不被尊重?

回答

8

我在休息一段時間後發現問題。 顯然, - > setRequired(true)在動態分配時是互斥的。如果您正在尋找與\ FilterInput中的'required'=> true相同的行爲,那麼還需要另外添加 - > setAllowEmpty(false)。

所以我修改後的代碼現在看起來是這樣的:

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

德里克