2016-08-24 5 views
1

У меня есть комплекс Zend\Form с несколькими вложенными Fieldset s. Теперь мне нужно выполнить перекрестное-Fieldset -добавление. Это означает, что правило проверки относится к нескольким Element s от разных Fieldset s. Единственный способ, которым я нашел это, - выполнить эту проверку в 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 сказал, вы должны установить сообщение для определенного элемента (поэтому его ответ действительно, и я его поддержал :-)).

Но, как вы расширяете форму, вы можете установить у вас есть способ сообщения об ошибках непосредственно в форме:

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 # getMessages (...)'. Я продолжу ваш ответ. Или, может быть, есть лучшее решение? – automatix

2

Нужно присоединиться к сообщению для элемента формы.

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

Спасибо за ваш ответ! Но это не тот элемент, который является недопустимым, это условие для нескольких элементов 'Element' (в разных' Fieldset 's). Например: существует несколько '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '! По крайней мере один 'foo' должен быть установлен/заполнен. Другой пример: Есть несколько элементов 'bar'. Сумма их значений должна быть больше, чем 'x'. В обоих случаях значение 'Element' само не может быть действительным или недействительным. Именно поэтому я ищу способ определить валидацию «по« Полевому набору »и добавить сообщения непосредственно в« Форма ». – automatix

+0

@automatix Возможно, эта ссылка вам поможет. http://circlical.com/blog/2015/7/6/zend-framework-2-forms-factories-inputfilters-and-hydration – newage

+0

Это хороший учебник, но он не дает ответа на мой вопрос. – automatix

Смежные вопросы