2010-03-06 3 views
13

Zend Form에 두 개의 필드가 있는데 사용자가이 두 필드 중 하나를 입력하도록하는 유효성 검사 규칙을 적용하려고합니다.젠드 폼 검사기 : 요소 A 또는 요소 B

$companyname = new Zend_Form_Element_Text('companyname'); 
    $companyname->setLabel('Company Name'); 
    $companyname->setDecorators($decors); 
    $this->addElement($companyname); 

    $companyother = new Zend_Form_Element_Text('companyother'); 
    $companyother->setLabel('Company Other'); 
    $companyother->setDecorators($decors); 
    $this->addElement($companyother); 

어떻게 두 필드를 모두 볼 수있는 유효성 검사기를 추가 할 수 있습니까?

답변

12

page의 '참고 : 유효성 확인 컨텍스트'를 참조하십시오. Zend_Form은 모든 Zend_Form_Element :: isValid 호출에 따라 컨텍스트를 두 번째 매개 변수로 전달합니다. 따라서 컨텍스트를 분석하는 자체 유효성 검사기를 작성하십시오.

편집 :
좋아, 나는 I'ld이 나 자신을 탄을 생각했다. 그것은 테스트되지도 않았고 모든 것을 의미하는 것이 아니라 기본적인 아이디어를 줄 것입니다.

class My_Validator_OneFieldShouldBePresent extend Zend_Validator_Abstract 
{ 
    const NOT_PRESENT = 'notPresent'; 

    protected $_messageTemplates = array(
     self::NOT_PRESENT => 'Field %field% is not present' 
    ); 

    protected $_messageVariables = array(
     'field' => '_field' 
    ); 

    protected $_field; 

    protected $_listOfFields; 

    public function __construct(array $listOfFields) 
    { 
     $this->_listOfFields = $listOfFields; 
    } 

    public function isValid($value, $context = null) 
    { 
     if(!is_array($context)) 
     { 
      $this->_error(self::NOT_PRESENT); 

      return false; 
     } 

     foreach($this->_listOfFields as $field) 
     { 
      if(isset($context[ $field ])) 
      { 
       return true; 
      } 
     } 

     $this->_field = $field; 
     $this->_error(self::NOT_PRESENT); 

     return false; 
    } 
} 

사용법 :

$oneOfTheseFieldsShouldBePresent = array('companyname', 'companyother'); 

$companyname = new Zend_Form_Element_Text('companyname'); 
$companyname->setLabel('Company Name'); 
$companyname->setDecorators($decors); 
$companyname->addValidator(new My_Validator_OneFieldShouldBePresent($oneOfTheseFieldsShouldBePresent)); 
$this->addElement($companyname); 

$companyother = new Zend_Form_Element_Text('companyother'); 
$companyother->setLabel('Company Other'); 
$companyother->setDecorators($decors); 
$companyname->addValidator(new My_Validator_OneFieldShouldBePresent($oneOfTheseFieldsShouldBePresent)); 
$this->addElement($companyother); 
0

나는 그런 해결책을 발견하지 못했지만 +1은 완벽하게 유효합니다.

Your_Form::isValid()을 확장하면 두 요소의 값에 대한 수동 확인이 포함됩니다.

모든 필드가 고유 한 개별 유효성 검사기를 전달하면이 유효성 검사는 아마도 양식 전체에 속하므로 필드 대신 양식 유효성 검사에 배치 될 수 있습니다. 이 사고 방식에 동의하십니까?

0

@chelmertz와 (과) 같은 기능이 없다는 것에 동의합니다.

동의하지 않는 점은 Your_Form::isValid()입니다. 대신, 값이 있어야하는 두 양식 요소의 값을 받아들이는 write a custom Validator입니다. 이 방법으로 임의의 양식 요소에 다시 사용할 수 있습니다. 이는 동일 유효성 검사기와 다소 유사합니다.

1

솔루션 @fireeyedboy가 제공하는 편리하지만 정확한 문제에 대한 작동하지 않습니다.

Zend_Validate_AbstractisValid()에 변수로 전달할 수없는 컨텍스트를 사용하고 있습니다. 이렇게하면 isValid() 메서드를 사용할 때 (원래 또는 덮어 쓴 것과 상관없이) setRequired(true) 또는 setAllowEmpty(false)이 없으면 빈 필드가 전달되고 유효성이 검사되지 않습니다. 두 필드 (companynamecompanyother)를 모두 비워두면 아무 작업도 수행되지 않습니다. 유일한 해결책은 빈 필드의 유효성을 허용하도록 Zend_Validate 클래스를 확장하는 것입니다.

제가 비슷한 문제로 고심하고 있기 때문에 더 나은 해결책을 알고 계시다면 알려 주시기 바랍니다.

관련 문제