如何根据另一个元素的值禁用/删除元素的验证?

时间:2013-04-11 09:15:04

标签: zend-framework2 zend-form

我有一个如下所示的字段集:

namespace Store\Form;

use Zend\Form\Fieldset;    
use Zend\InputFilter\InputFilterProviderInterface;

class ProductFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function init()
    {
        $this->setName('product');

        $this->add(array(
            'name' => 'isSale',
            'type' => 'Checkbox',
            'options' => array(
                'label' => 'Is the product for sale?',
            ),
        ));

        $this->add(array(
            'name' => 'salePrice',
            'options' => array(
                'label' => 'Sale price',
            ),
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'salePrice' => array(
                'filters' => array(
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' =>'NotEmpty',
                        'break_chain_on_failure' => true,
                        'options' => array(
                            'messages' => array(
                                'isEmpty' => 'Enter the sale price.',
                            ),
                        ),
                    ),
                    array(
                        'name' => 'Float',
                        'options' => array(
                            'locale'   => 'pt_BR',
                            'messages' => array(
                                'notFloat' => 'Enter a valid price.',
                            ),
                        ),
                    ),
                ),
            ),
        );
    }
}

我需要它的工作方式是,当isSale被选中时,salePrice是必需的,但如果未选中isSale,则不需要salePriceisValid()问题是我不知道在调用isSale之前如何删除验证器。

我可以反过来做:删除inputfilter规范中的验证器,并在选中use Zend\Form\Form; class CreateProduct extends Form { public function init() { $this->setName('createProduct'); $this->add(array( 'type' => 'Store\Form\ProductFieldset', 'options' => array( 'use_as_base_fieldset' => true, ), )); $this->add(array( 'name' => 'create', 'type' => 'Submit', 'attributes' => array( 'class' => 'btn btn-success', 'value' => 'Create', ), )); } } 时添加验证器。但我不知道怎么做。

以下是我的表单类的外观:

{{1}}

提前致谢!

1 个答案:

答案 0 :(得分:2)

我通过覆盖表单中的isValid()方法解决了这个问题:

class CreateProduct extends Form
{
    public function init()
    {
        /* ... */
    }

    public function isValid()
    {
        if (!$this->get('product')->get('isSale')->isChecked()) {
            $this->getInputFilter()->get('product')->remove('salePrice');
            $this->get('product')->get('salePrice')->setValue(null);
        }
        return parent::isValid();
    }
}

虽然感觉太乱了!