2013-02-14 97 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); 

德里克