Przeglądaj źródła

Merge branch 'formHandler'

Johannes Schmitt 13 lat temu
rodzic
commit
35323f5ae7

+ 5 - 0
Serializer/GenericSerializationVisitor.php

@@ -160,4 +160,9 @@ abstract class GenericSerializationVisitor extends AbstractVisitor
     {
         return $this->root;
     }
+
+    public function setRoot($data)
+    {
+        $this->root = $data;
+    }
 }

+ 72 - 11
Serializer/Handler/FormErrorHandler.php

@@ -18,6 +18,9 @@
 
 namespace JMS\SerializerBundle\Serializer\Handler;
 
+use JMS\SerializerBundle\Serializer\GenericSerializationVisitor;
+
+use Symfony\Component\Form\Form;
 use Symfony\Component\Form\FormError;
 use Symfony\Component\Translation\TranslatorInterface;
 use JMS\SerializerBundle\Serializer\Handler\SerializationHandlerInterface;
@@ -35,21 +38,79 @@ class FormErrorHandler implements SerializationHandlerInterface
 
     public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
     {
-        if (!$data instanceof FormError) {
-            return;
-        }
+        if ($data instanceof Form) {
+            if ($visitor instanceof XmlSerializationVisitor) {
+                $handled = true;
+
+                if (null === $visitor->document) {
+                    $visitor->document = $visitor->createDocument(null, null, false);
+                    $visitor->document->appendChild($formNode = $visitor->document->createElement('form'));
+                    $visitor->setCurrentNode($formNode);
+                } else {
+                    $visitor->getCurrentNode()->appendChild(
+                        $formNode = $visitor->document->createElement('form')
+                    );
+                }
+
+                $formNode->setAttribute('name', $data->getName());
+
+                $formNode->appendChild($errorsNode = $visitor->document->createElement('errors'));
+                foreach ($data->getErrors() as $error) {
+                    $errorNode = $visitor->document->createElement('entry');
+                    $errorNode->appendChild($this->serialize($visitor, $error, null, $visited));
+                    $errorsNode->appendChild($errorNode);
+                }
+
+                foreach ($data->getChildren() as $child) {
+                    if (null !== $node = $this->serialize($visitor, $child, null, $visited)) {
+                        $formNode->appendChild($node);
+                    }
+                }
+
+                return;
+            } else if ($visitor instanceof GenericSerializationVisitor) {
+                $handled = true;
+                $isRoot = null === $visitor->getRoot();
+
+                $form = $errors = array();
+                foreach ($data->getErrors() as $error) {
+                    $errors[] = $this->serialize($visitor, $error, null, $visited);
+                }
+
+                if ($errors) {
+                    $form['errors'] = $errors;
+                }
+
+                $children = array();
+                foreach ($data->getChildren() as $child) {
+                    $children[$child->getName()] = $this->serialize($visitor, $child, null, $visited);
+                }
+
+                if ($children) {
+                    $form['children'] = $children;
+                }
+
+                if ($isRoot) {
+                    $visitor->setRoot($form);
+                }
+
+                return $form;
+            }
+        } else if ($data instanceof FormError) {
+            $handled = true;
+            $message = $this->translator->trans($data->getMessageTemplate(), $data->getMessageParameters(), 'validators');
 
-        $handled = true;
-        $message = $this->translator->trans($data->getMessageTemplate(), $data->getMessageParameters(), 'validators');
+            if ($visitor instanceof XmlSerializationVisitor) {
+                if (null === $visitor->document) {
+                    $visitor->document = $visitor->createDocument(null, null, true);
+                }
 
-        if ($visitor instanceof XmlSerializationVisitor) {
-            if (null === $visitor->document) {
-                $visitor->document = $visitor->createDocument(null, null, true);
+                return $visitor->document->createCDATASection($message);
             }
 
-            return $visitor->document->createCDATASection($message);
+            return $message;
         }
 
-        return $message;
+        return null;
     }
-}
+}

+ 15 - 0
Tests/Serializer/BaseSerializationTest.php

@@ -19,6 +19,7 @@
 namespace JMS\SerializerBundle\Tests\Serializer;
 
 use Doctrine\Common\Collections\ArrayCollection;
+use Symfony\Component\Form\Form;
 use Symfony\Component\Form\FormError;
 use JMS\SerializerBundle\Serializer\Handler\DeserializationHandlerInterface;
 use JMS\SerializerBundle\Tests\Fixtures\AuthorList;
@@ -199,6 +200,20 @@ abstract class BaseSerializationTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($this->getContent('form_errors'), $this->serialize($errors));
     }
 
+    public function testNestedFormErrors()
+    {
+        $dispather = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
+
+        $form = new Form('foo', $dispather);
+        $form->addError(new FormError('This is the form error'));
+
+        $child = new Form('bar', $dispather);
+        $child->addError(new FormError('Error of the child form'));
+        $form->add($child);
+
+        $this->assertEquals($this->getContent('nested_form_errors'), $this->serialize($form));
+    }
+
     abstract protected function getContent($key);
     abstract protected function getFormat();
 

+ 1 - 0
Tests/Serializer/JsonSerializationTest.php

@@ -46,6 +46,7 @@ class JsonSerializationTest extends BaseSerializationTest
             $outputs['log'] = '{"author_list":[{"full_name":"Johannes Schmitt"},{"full_name":"John Doe"}],"comments":[{"author":{"full_name":"Foo Bar"},"text":"foo"},{"author":{"full_name":"Foo Bar"},"text":"bar"},{"author":{"full_name":"Foo Bar"},"text":"baz"}]}';
             $outputs['lifecycle_callbacks'] = '{"name":"Foo Bar"}';
             $outputs['form_errors'] = '["This is the form error","Another error"]';
+            $outputs['nested_form_errors'] = '{"errors":["This is the form error"],"children":{"bar":{"errors":["Error of the child form"]}}}';
         }
 
         if (!isset($outputs[$key])) {

+ 11 - 0
Tests/Serializer/xml/nested_form_errors.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<form name="foo">
+  <errors>
+    <entry><![CDATA[This is the form error]]></entry>
+  </errors>
+  <form name="bar">
+    <errors>
+      <entry><![CDATA[Error of the child form]]></entry>
+    </errors>
+  </form>
+</form>