私はフォームを持っています。フォームには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
チェックボックスがフォームにチェックされている場合に基づいてtextField1
とtextField2
を検証したいと思います: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
についても同じです。
回答のおかげで、コントローラのフォームを検証するときに 'IfSelectedInFormThanNotEmpty :: isValid()'に '$ context'変数を取得する方法はありますか?私は 'Form'の' isValid() 'メソッドも書き直さなければならないと思います。これはそうですか? –
もちろん、そうではありません。実際には、私はzf devsと話をしていた文書化されていない機能です。文脈はすでにそこにあるはずです。 'Form :: isValid'を呼び出すと、ValidatorChainのisValidが呼び出され、定義されたバリデーターを値とコンテキストで反復処理します。したがって、新しいバリデーターをバリデーターリストに追加するだけです: ''validators' => [['name' =>あなたの\ Namespace \ IfSelectedInFormThanNotEmpty :: class]]' それとも、それ以上の合併症はありますか? – LWjuniOr
奇妙ですが、 'AbstractValidator'のコンストラクタに' $ context'変数が挿入されていません。私はそれを試み、あなたに戻ってきます。 +あなたの答えは今のところ1です。 :-) –