2013-02-14 5 views
1

'required'값이 'false'로 설정된 InputFilter가있는 Form \ Element가 있습니다. 특정 상황에서 Element는 Controller 내에서 'required'값을 'true'로 설정해야합니다.Zend Framework 2 설정 Zend InputFilter setRequired()

내 컨트롤러에서 Zend \ InputFilter setRequired (true)를 설정하면 $ form-> isValid() 메서드가 호출 될 때 존중되지 않는 것 같습니다. 그러나 Zend \ InputFilter (컨트롤러 내부에 동적으로 설정되지 않음)에서 'required'가 "true"인 필터가 설정된 경우 예상대로 작동합니다. 그러나이 형식을 사용하고 여러 가지 필터를 사용하면 원하는 솔루션이 아닙니다. 위치 및 때로는 필드가 필요하고 그렇지 않은 경우가 있습니다. 내 컨트롤러에서

, 나는 다음과 같은 한 :

$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() 클래스를 설정 :

: 내가 지금처럼 내 UserFilter 클래스를 설정 한

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... 

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); 

데릭