2013-03-22 3 views
1

У вас возник вопрос о том, как правильно выводить ошибки отправки формы в Symfony2, когда они возвращаются из ответа ajax.Ошибки формы формы Symfony2 ajax

Я отправляю форму через AJAX, если форма не заполнена правильно, он будет посылать обратно réponse с ошибками, используя следующий код ...

$errors = $form->getErrorsAsString(); 
$return = array("responseCode"=>200, "responseVal"=>"Error", "errorReport"=>$errors); 

Это создаст массив ошибки и другие переменные, как так:

{"responseCode":200,"responseVal":"Error","errorReport":"ERROR: Name cannot be blank.\nERROR: Address cannot be blank.\nERROR: City cannot be blank.\nERROR: State cannot be blank.\nERROR: Zip cannot be blank.\nERROR: Phone cannot be blank.\nERROR: Email cannot be blank.\nname:\n No errors\naddress:\n No errors\ncity:\n No errors\nstate:\n No errors\nzip:\n No errors\nemail:\n No errors\nfax:\n No errors\nphone:\n No errors\n"} 

Я затем с помощью JQuery, чтобы написать ошибки в DIV, например, так:

$("#errorReport").html(data.errorReport); 

Это дает мне DIV со следующим содержанием:

ERROR: Name cannot be blank. ERROR: Address cannot be blank. ERROR: City cannot be blank. ERROR: State cannot be blank. ERROR: Zip cannot be blank. ERROR: Phone cannot be blank. ERROR: Email cannot be blank. name: No errors address: No errors city: No errors state: No errors zip: No errors email: No errors fax: No errors phone: No errors 

Это выглядит действительно липким. Есть ли вообще в Twig или Symfony, что я могу отформатировать эти ошибки, чтобы он выглядел презентабельно, когда они были возвращены в шаблон ветки? Я хотел бы, чтобы это выглядело, как это, но я просто не знаю, как его сделали:

Name cannot be blank. 
Address cannot be blank. 
City cannot be blank. 
State cannot be blank. 
Zip cannot be blank. 
Phone cannot be blank. 
Email cannot be blank. 

(any of the "No errors" would not be shown) 

Большое спасибо за вашу помощь !!!

+0

как о '$ ошибок = strtr ($ форма-> getErrorsAsString(), массив ('\ п' => '
')); '? –

ответ

5

Вы должны использовать $form->getErrors() метод вместо $form->getErrorsAsString();getErrors функции Возвращает FormError объекта, который может быть использован для создания сообщения об ошибках

Так что код будет выглядеть примерно так

$errors = $form->getErrors(); 
$errorCollection = array(); 
foreach($errors as $error){ 
     $errorCollection[] = $error->getMessageTemplate() 
} 
$return = array("responseCode"=>200, "responseVal"=>"Error", "errorReport"=>$errorCollection); 
+0

Спасибо, что отлично поработал! – LargeTuna

0

Я бы сказал, что самым чистым решением является внедрение JMSSerializerBundle (http://jmsyst.com/bundles/JMSSerializerBundle), который использует следующий класс:

https://github.com/schmittjoh/serializer/blob/6bfebdcb21eb0e1eb04aa87a68e0b706193b1e2b/src/JMS/Serializer/Handler/FormErrorHandler.php

затем в вашем контроллер:

 // ... 
     if ($request->isXMLHttpRequest()) { 
     $jsonResponse = new JsonResponse(); 

     $serializer = $this->container->get('jms_serializer'); 
     $form = $serializer->serialize($form, 'json'); 

     $data = array('success' => false, 
         'errorList' => $form); 

     $jsonResponse->setData($data); 

     return $jsonResponse; 
    } 
Смежные вопросы