2017-09-14 1 views
0

양식이 있습니다. 양식은 Collection이며 대상 요소는 체크 상자와 몇 개의 텍스트 필드가있는 필드 세트입니다. Collection에 대상 요소로 연결된 필드 셋은 (너무 많은 코드를 방지하기 위해 단순화) 다음과 같습니다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], 
       ], 
      ], 
     ], 
    } 
} 

내가 확인하고 싶습니다 textField1selectedInForm 체크 박스 형태로 선택된 경우에 기반 textField2.

어떻게하면됩니까? 하지만이 같은 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

두 가지 옵션을 사용할 수 있습니다. 하나는 콜백 유효성 검사기를 사용하여 시작한 곳입니다.

다른 하나는 사용자 정의 유효성 검사기를 작성하고 재사용 할 수 있도록이 솔루션을 권장합니다.

<?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'=> Your \ Namespace \ IfSelectedInFormThanNotEmpty :: class]]' 답변에서 언급했듯이. 아니면 더 이상의 합병증이 있습니까? – LWjuniOr

+0

흠, 이상하지만,'AbstractValidator'의 생성자에'$ context' 변수가 삽입되지 않습니다. 나는 그것에게 시도를주고, 당신에게 앙갚음을 할 것이다. + 지금 답을 +1했습니다. :-) –

관련 문제