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

Forms 如何在控制器中禁用Zend Framework 2中的字段过滤器?,forms,validation,zend-framework,zend-framework2,Forms,Validation,Zend Framework,Zend Framework2,用于添加/编辑我从service manager获得的已安装过滤器(即测试密码)的用户的表单。但编辑用户时不需要此密码。我是否可以在控制器中禁用密码字段验证 在模块的getServiceConfig函数中: // .... 'UserCRUDFilter' => function($sm) { return new \Users\Form\UserCRUDFilter(); }, 'UserCRUDForm' => function($sm, $param, $param1

用于添加/编辑我从service manager获得的已安装过滤器(即测试密码)的用户的表单。但编辑用户时不需要此密码。我是否可以在控制器中禁用密码字段验证

在模块的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();
$form->get('password')->移除验证器('VALIDATOR_NAME')应该可以做到这一点


请注意,在使用字段集时,您可能必须通过Validator链进行迭代。

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

$this->setUseInputFilterDefaults(false)

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

如果要从元素中删除过滤器,请在窗体对象之后调用控制器

$form->getInputFilter()->删除('InputFilterName')

我找到了

// If user is editted - clear password requirement
if ($user_id > 0) {
    $form->getInputFilter()->get('password')->setRequired(false);
    $form->getInputFilter()->get('confirm_password')->setRequired(false);
}
这行是输入表单字段的要求:)

以及在ModelTable:saveModule:

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

这就是导致致命错误的原因:调用未定义的方法Zend\Form\Element::removeValidator()这将不起作用,因为inputfilter添加在元素类下面,并且属于表单类。如果您认为您找到了问题的正确解决方案,请将您的答案标记为correct.foozy,很遗憾,我不能。他说只有明天。
public function saveAlbum(Album $album)
    {
        $data = array(
            'name'        => $album->name,
        );
        if (isset($album->password)){
            $data['password'] = $album->password;
        }