2016-08-24 131 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