Symfony2 ajax twig形成错误

时间:2013-03-22 23:11:07

标签: php jquery ajax symfony twig

有一个问题,当他们从ajax响应中返回时,如何在Symfony2中正确输出表单提交错误。

我通过ajax发布表单,如果表单没有正确填写,它会使用以下代码发回错误的响应...

 $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)

非常感谢你的帮助!!!

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;
    }