ZF2依赖表单字段

时间:2013-03-28 14:07:46

标签: forms filter zend-framework2

如何设置依赖于其他输入字段的输入过滤器。 我只想在选择其他表单字段(复选框)时根据需要设置表单字段。

我如何在zf2中处理这个?

2 个答案:

答案 0 :(得分:1)

我使用与Crisp相同的想法,但我更喜欢在Form类而不是控制器中使用它。我认为最好将所有验证器一起定义在同一个地方。我是这样做的:

1 - 所有Form类都继承自定义BaseForm:

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,
            ) );
        }
    }
}

这样可以保持Controller清洁,并将所有验证器放在同一个地方。

答案 1 :(得分:0)

您可以测试是否填充了复选框并在表单上相应地setValidationGroup,然后在您的控制器操作中对其进行验证...

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
        }
   }
}