0

別の入力フィールドに依存する入力フィルターを設定するにはどうすればよいですか。他のフォームフィールド(チェックボックス)が選択されている場合のみ、フォームフィールドを必須として設定したい。

zf2 でこれを処理するにはどうすればよいですか?

4

2 に答える 2

1

私は Crisp と同じ考え方を使用していますが、コントローラーではなく Form クラスで行うことを好みます。すべてのバリデーターを同じ場所でまとめて定義する方がよいと思います。私はこのようにします:

1 - すべてのフォーム クラスは、カスタム 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,
            ) );
        }
    }
}

このようにして、コントローラーをクリーンに保ち、すべてのバリデーターを同じ場所に保ちます。

于 2013-03-28T19:37:59.850 に答える
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
        }
   }
}
于 2013-03-28T14:47:38.047 に答える