【问题标题】:ZF2 Dynamic Form Filters/ValidatorsZF2 动态表单过滤器/验证器
【发布时间】:2012-11-27 15:06:35
【问题描述】:

我正在设置一个将创建表单的控制器。 我不能使用扩展的 Form 类,所以我需要在我的控制器上构建我的表单。

$form = new Form('example');
$fieldset = new Fieldset('default');
$fieldset->add(array('name' => 'example_field', 'attributes' => array('type' => 'text', 'id' => 'example_field'), 'options' => array('label' => 'Example Field',),));
$form->add($fieldset);

这里的主要问题是,我如何为每个元素/字段集定义过滤器和验证器,而不需要创建一个实现 InputFilterAwareInterface 的类,这样我就可以从我的控制器中做所有事情?

提前致谢!

【问题讨论】:

  • 你能解释一下为什么你不能构建一个表单并附加它的验证器吗?你的表单有哪些你无法构建的动态?

标签: zend-framework2 zend-form2


【解决方案1】:

您可以通过处理表单的 InputFilter 来添加/删除表单验证器,这是我的示例:

$form = new \Zend\Form\Form();
$name = array(
        'name' => 'username',
        'options' => array(
            'label' => 'Your name',
        ),
        'attributes' => array(
            'type'  => 'text'
        ),
);
$form->add($name);


$filter = $form->getInputFilter();
$filter->remove('username');
$filter->add(array(
    'name' => 'username',
    'required' => true,
    'validators' => array (
        'stringLength' => array (
            'name' => 'StringLength',
            'options' => array (
                'max' => '3',
            ),
        ),
    ),
));
$form->setInputFilter($filter);


$form->setData(array(
    'username' => 'longtext',
));
$form->prepare();
echo $form->isValid(); //false
print_r($form->getMessages()); //stringLengthTooLong error will show

【讨论】:

  • 当我使用他们的验证器设置一个字段集然后使用与目标元素相同的字段集创建一个集合时,它仍然有效,验证器找不到正确的字段..它似乎停在数组集合中的迭代器..而不是搜索 [form][collection][0][element].. 它忽略了 [0].. 也许我只是弄错了...
【解决方案2】:

动态添加验证器:

$form->getInputFilter()->get('element_name')->getValidatorChain()->attach(new ValidatorClassName());

动态添加过滤器:

$form->getInputFilter()->get('element_name')->getFilterChain()->attach(new FilterClassName());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多