2016-08-24 102 views
1

我有一個複雜的Zend\Form與多個嵌套Fieldset s。現在我需要實現一個交叉Fieldset驗證。這意味着,驗證規則是指來自不同Fieldset的多個Element。我發現要做到這一點的唯一方法是在MyForm#isValid()中實施此驗證,因爲它是唯一的地方,我可以從中訪問每個Fieldset如何向Zend Framework 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

謝謝您的回答!但它不是元素,它是無效的,它是跨越多個Element的條件(在不同的Fieldset中)。例如:不同'Fieldset'有多個'foo''Element'(我們不知道有多少個,它們是動態添加的)。至少有一個'foo'必須被設置/填充。又如:有多個'bar'元素。它們的總和必須大於'x'。在這兩種情況下,元素的值本身都是無效的或無效的。這就是爲什麼我正在尋找一種方法來定義「跨Fieldset」的驗證,並將消息直接添加到「Form」中。 – automatix

+0

@automatix也許這個鏈接將幫助你。 http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration – newage

+0

這是一個很好的教程,但它不能回答我的問題。 – automatix

相關問題