如何在控制器中禁用Zend Framework 2中字段的过滤器?

时间:2014-07-31 14:15:18

标签: forms validation zend-framework zend-framework2

添加/编辑用户的表单我从已安装过滤器的服务管理器获取,这是测试密码。但是编辑用户时不需要此密码。我可以以某种方式在控制器中禁用密码字段验证吗?

在模块的getServiceConfig函数中:

// ....
'UserCRUDFilter' => function($sm)
{
    return new \Users\Form\UserCRUDFilter();
},

'UserCRUDForm' => function($sm, $param, $param1)
{
    $form = new \Users\Form\UserCRUDForm();
    $form->setInputFilter($sm->get('UserCRUDFilter'));
    return $form;
},
// ....

在控制器中我首先从服务管理器获取表单对象:

$form = $this->getServiceLocator()->get('UserCRUDForm');

然后在编辑用户并且未指定密码时禁用用户密码验证和要求:

if ($user_id > 0 && $this->request->getPost('password') == '') {
      $form->.... // Someway gained access to the filter class and change the password field validation
}

在此之后我做了一个验证:

$form->isValid();

4 个答案:

答案 0 :(得分:6)

我找到了它!

// If user is editted - clear password requirement
if ($user_id > 0) {
    $form->getInputFilter()->get('password')->setRequired(false);
    $form->getInputFilter()->get('confirm_password')->setRequired(false);
}

这行是禁用输入表单字段的要求:)

答案 1 :(得分:3)

如果您想自己设置所有验证器,请在表单类中调用

$this->setUseInputFilterDefaults(false);

禁用从zend添加的自动元素验证/过滤器。

如果您希望在表单对象

之后从控制器中的元素调用中删除过滤器

$form->getInputFilter()->remove('InputFilterName');

答案 2 :(得分:0)

$form->get('password')->removeValidator('VALIDATOR_NAME');应该做到这一点。

请注意,在使用Fieldsets时,您可能必须通过Validatorchain进行迭代。

答案 3 :(得分:0)

$inputFilter->add(array(
        'name'        => 'password',
        'required'    => true,
        'allow_empty' => true,
    ));

在ModeleTable上:saveModule:

public function saveAlbum(Album $album)
    {
        $data = array(
            'name'        => $album->name,
        );
        if (isset($album->password)){
            $data['password'] = $album->password;
        }