Zend_Form:只有在选中复选框时才需要元素

jan*_*ver 11 php zend-framework zend-form

我有一个表单,用户可以在其中选中"创建新地址"复选框,然后可以在同一表单中填写此新地址的字段.

现在,我想仅在选中复选框时验证此新地址的字段.否则,应该忽略它们.

如何使用Zend_Form和Zend_Validate来做到这一点?

谢谢!

JCM*_*JCM 6

我认为最好,更正确的方法是创建一个自定义验证器.

您可以通过两种不同的方式执行此验证器,一种是使用传递给方法isValid的第二个参数,$ context,即要验证的当前表单,或者注入需要检查以进行验证的Checkbox元素,在构造函数中.我更喜欢最后一个:

<?php
class RequiredIfCheckboxIsChecked extends Zend_Validate_Abstract {

    const REQUIRED = 'required';

    protected $element;

    protected $_messageTemplates = array(
        self::REQUIRED => 'Element required'
    );

    public function __construct( Zend_Form_Element_Checkbox $element )
    {
        $this->element = $element;
    }

    public function isValid( $value )
    {
        $this->_setValue( $value );

        if( $this->element->isChecked() && $value === '' ) {
            $this->_error( self::REQUIRED );
            return false;
        }

        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

class MyForm extends Zend_Form {

    public function init()
    {
        //...

        $checkElement = new Zend_Form_Element_Checkbox( 'checkbox' );
        $checkElement->setRequired();

        $dependentElement = new Zend_Form_Element_Text( 'text' );
        $dependentElement->setAllowEmpty( false )
            ->addValidator( new RequiredIfCheckboxIsChecked( $checkElement ) );

        //...
    }

}
Run Code Online (Sandbox Code Playgroud)

我没有测试过代码,但我认为它应该可行.