2017-09-14 2 views
0

私はフォームを持っています。フォームにはCollectionがあり、そのターゲット要素はチェックボックスと2つのテキストフィールドを持つフィールドセットです。zf2/zf3コレクションのフィールドセットの依存入力を検証する方法は?

class AFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    public function __construct(HydratorInterface $hydrator) 
    { 
     parent::__construct(); 

     $this->setHydrator($hydrator) 
      ->setObject(new SomeObject()); 

     $this->add([ 
      'type' => Hidden::class, 
      'name' => 'id', 
     ]); 

     $this->add([ 
      'type' => Checkbox::class, 
      'name' => 'selectedInForm', 
     ]); 

     $this->add([ 
      'type' => Text::class, 
      'name' => 'textField1', 
     ]); 

     $this->add([ 
      'type' => Text::class, 
      'name' => 'textField2', 
     ]); 
    } 
    public function getInputFilterSpecification() 
    { 
     return [ 
      'selectedInForm' => [ 
       'required' => false, 
       'continue_if_empty' => true, 
       'validators' => [ 
        ['name' => Callback::class // + options for the validator], 
       ], 
      ], 
      'id' => [ 
       'requred' => false, 
       'continue_if_empty' => true, 
      ], 
      'textField1' => [ 
       'required' => false, 
       'continue_if_empty' => true, 
       'validators' => [ 
        ['name' => SomeValidator::class], 
       ], 
      ], 
      'textField2' => [ 
       'required' => true, 
       'validators' => [ 
        ['name' => SomeValidator::class], 
       ], 
      ], 
     ], 
    } 
} 

私はselectedInFormチェックボックスがフォームにチェックされている場合に基づいてtextField1textField2を検証したいと思います:Collectionにターゲット要素として添付フィールドセットは、この(あまりにも多くのコードを避けるために簡略化さ)のように見えます。

どうすればいいですか?しかし、このようなselectedInFormチェックボックスのためCallbackバリデータを使用しての

I:

'callback' => function($value) { 
    if ($value) { 
     $this->get('textField1')->isValid(); 
     // or $this->get('textField1')->getValue() and do some validation with it 
    } 
} 

、それに伴う問題は、何らかの理由で、textField1値の掲示値がまだ入力に接続されていない、ということです。 textField2についても同じです。

答えて

1

2つのオプションがあります。 1つは、コールバック・バリデーターを使用して開始した場所です。

もう1つは、カスタムバリデータを作成して再利用できるようにすることです。このソリューションをお勧めします。

<?php 

use Zend\Validator\NotEmpty; 

class IfSelectedInFormThanNotEmpty extends NotEmpty 
{ 
    public function isValid($value, array $context = null): bool 
    { 
     if (! empty($context['selectedInForm']) && $context['selectedInForm']) { 
      return parent::isValid($value); 
     } 
     return true; 
    } 
} 

そして、あなたは他のすべてのバリデータとして使用することができます:

'textField2' => [ 
    'required' => true, 
    'validators' => [ 
     ['name' => IfSelectedInFormThanNotEmpty::class], 
    ], 
], 

これはあなたの正確なケースではないかもしれないが、私はそれがアイデアを得るために助けを願っています。

構成可能な条件付きフィールドpublic function __construct($options = null)で再利用可能にするオプションを定義できます。

+0

回答のおかげで、コントローラのフォームを検証するときに 'IfSelectedInFormThanNotEmpty :: isValid()'に '$ context'変数を取得する方法はありますか?私は 'Form'の' isValid() 'メソッドも書き直さなければならないと思います。これはそうですか? –

+0

もちろん、そうではありません。実際には、私はzf devsと話をしていた文書化されていない機能です。文脈はすでにそこにあるはずです。 'Form :: isValid'を呼び出すと、ValidatorChainのisValidが呼び出され、定義されたバリデーターを値とコンテキストで反復処理します。したがって、新しいバリデーターをバリデーターリストに追加するだけです: ''validators' => [['name' =>あなたの\ Namespace \ IfSelectedInFormThanNotEmpty :: class]]' それとも、それ以上の合併症はありますか? – LWjuniOr

+0

奇妙ですが、 'AbstractValidator'のコンストラクタに' $ context'変数が挿入されていません。私はそれを試み、あなたに戻ってきます。 +あなたの答えは今のところ1です。 :-) –

関連する問題