我有一个如下所示的字段集:
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
,则不需要salePrice
。isValid()
问题是我不知道在调用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}}
提前致谢!
答案 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();
}
}
虽然感觉太乱了!