2016-08-24 3 views
1

복잡한과 여러 개의 중첩 된 Fieldset이 있습니다. 이제 교차 - Fieldset- 유효성 검사를 구현해야합니다. 즉 유효성 검사 규칙은 다른 Fieldset의 복수 Element을 참조합니다. 내가 찾은 유일한 방법은 에이 유효성 검사를 구현하는 것입니다.이 곳은 모든 Fieldset에서 액세스 할 수있는 단일 장소이기 때문에 가능합니다.젠드 프레임 워크 2의 폼에 오류 메시지를 추가하는 방법은 무엇입니까?

MyForm extends Form 
{ 
    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isCrossFieldsetVaidationOk = // my additional validation logic 
     return $isFormValid && $isCrossFieldsetVaidationOk; 
    } 
} 

아직 테스트하지는 않았지만 작동합니다. 문제는 오류 메시지를 추가하는 것입니다.

나는

$this->setMessages(array_merge(
    $this->getMessages(), ['my new message']) 
); 

을 시도했다 그러나 그것은 작동하지 않습니다.

Form 오류 메시지를 어떻게 추가합니까?

답변

2

오류 메시지는 양식에 직접 연결되는 것이 아니라 양식의 요소에 대한 링크입니다. 그래서 newage이 말했듯이, 특정 요소에 대한 메시지를 설정해야합니다 (따라서 그의 대답은 유효하고 나는 그것을 upvoted :-)).

그러나 당신이 양식을 확장, 당신은 당신이 직접 형태로 오류 메시지 방법을 소유 설정할 수 있습니다

MyForm extends Form 
{ 

    protected $errorMessages = []; 

    public function isValid() 
    { 
     $isFormValid = parent::isValid(); 
     $isCrossFieldsetValidationOk = // your additional validation logic 

     if (!$isCrossFieldsetValidationOk) { 
      $this->addErrorMessage('Oh oh... Cross-fieldset validation error...'); 
     } 
     return $isFormValid && $isCrossFieldsetValidationOk; 
    } 

    public function addErrorMessage($text) 
    { 
     $this->errorMessages[] = $text ; 
     return $this; // For a fluent setter 
    } 

    public function getErrorMessages() 
    { 
     return $this->errorMessages ; 
    } 

    public function getMessages($elementName = null) 
    { 
     if ($elementName) { 
      $messages = parent::getMessages($elementName); 
     } else { 
      $messages = array_merge($this->getErrorMessages(), parent::getMessages($elementName)); 
     } 
     return $messages; 
    } 

} 
+0

답변 해 주셔서 감사합니다. 사실, 이렇게하면 양식을 "양식 오류 메시지"를 저장하고 검색 할 수 있습니다. 다음 단계는 그것들을'Element's '메시지와 통합하여 함께 표시하는 것입니다. 이를 위해'Element # getMessages (...)'가 오버라이드되어야합니다. 나는 그것으로 당신의 대답을 확장 할 것이다. 아니면 더 나은 해결책이 있을까요? – automatix

2

양식 요소에 대한 메시지를 참여시켜야합니다.

$form->get('password')->setMessages(['Wrong password']); 
+0

이 답변 주셔서 감사합니다! 하지만 그것은 요소가 아니며 무효입니다. 여러 요소 (여러 Fieldset에서)의 조건입니다. 예 : 서로 다른'Fieldset'의'foo''Element's가 여러 개 있습니다 (동적으로 몇 개 추가되는지 알 수 없습니다). 적어도 하나의'foo'가 설정/채워 져야합니다. 다른 예 : 여러 개의 'bar'요소가 있습니다. 그들의 값의 합은'x'보다 커야합니다. 두 경우 모두'Element' 값 자체가 유효하거나 유효하지 않습니다. 그래서 "Fieldset's"에 걸쳐 유효성을 정의하고 메시지를 직접 Form에 추가하는 방법을 찾고 있습니다. – automatix

+0

@automatix 어쩌면이 링크가 도움이 될 것입니다. http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration – newage

+0

좋은 튜토리얼이지만 내 질문에 대한 답변을 제공하지 않습니다. – automatix

관련 문제