Forms ZF2相关表单字段

Forms ZF2相关表单字段,forms,filter,zend-framework2,Forms,Filter,Zend Framework2,如何设置依赖于其他输入字段的输入筛选器。 我只想在选中其他表单字段(复选框)时将表单字段设置为必需 如何在zf2中处理此问题?在控制器操作中验证前,您可以在表单上测试复选框是否已填充,并相应地设置验证组 public function someAction() { $form = new MyForm; // contains name, title, checkbox, required_if_checked fields // usual form related setup

如何设置依赖于其他输入字段的输入筛选器。 我只想在选中其他表单字段(复选框)时将表单字段设置为必需


如何在zf2中处理此问题?

在控制器操作中验证前,您可以在表单上测试复选框是否已填充,并相应地设置验证组

public function someAction()
{
    $form = new MyForm; // contains name, title, checkbox, required_if_checked fields
    // usual form related setup

    if ($request->isPost()) {
        $form->setData($request->getPost());
        // see if the checkbox is checked
        $checked = $this->params()->fromPost('checkbox', false);
        // not checked, set validation group, omitting the dependent field
        if (!$checked) {
            $form->setValidationGroup(array(
                'name',
                'title',
                'checkbox', // could probably skip this too
            ));
        }        
        if ($form->isValid()) {
            // do stuff with valid data
        }
   }
}

我使用了与Crisp相同的想法,但是我更喜欢在表单类中而不是在控制器中进行。我认为最好将所有验证器一起定义在同一个位置。我是这样做的:

class FormEdit extends BaseForm
{
    public function __construct( $name = null, $serviceManager ) {
        parent::__construct( $name, $serviceManager );

        $filter = new SomeFilter( $this->getPostData() );

        $this->setInputFilter( $filter );
    }
1所有表单类都继承自自定义基表单:

class BaseForm extends ProvidesEventsForm
{
    private $postData;

    protected function getPostData() {
        return $this->postData;
    }

    public function __construct( $name = null, $serviceManager ) {
        parent::__construct( $name );

        $this->serviceManager = $serviceManager;
        $this->request = $serviceManager->get( 'Application' )->getMvcEvent()->getRequest();
        $this->postData = get_object_vars( $this->request->getPost() );
    }
}
通过这种方式,您可以轻松地从帖子中选择任何值,就像您的复选框一样(您可以对路由参数执行相同的方法,这样您就可以在表单中获得所有视图数据)

2-在从BaseForm继承的FormEdit类中,通过以下方式将getPostData()值传递给SomeFilter:

class FormEdit extends BaseForm
{
    public function __construct( $name = null, $serviceManager ) {
        parent::__construct( $name, $serviceManager );

        $filter = new SomeFilter( $this->getPostData() );

        $this->setInputFilter( $filter );
    }
3-现在只需在SomeFilter中使用它:

class SomeFilter extends InputFilter
{
    public function __construct( $postData ) {
        if ( $postData[ 'checkbox' ] ) {
            $this->add( array(
                'name'      => 'other_input',
                'required'  => true,
            ) );
        }
    }
}

通过这种方式,您可以保持控制器干净,并将所有验证器放在同一位置。

要么这样做,要么编写自己的验证器,然后从查看相同的验证器开始,看看如何访问其他表单元素。