Browse Source

some improvements

Johannes Schmitt 13 years ago
parent
commit
9172538704
2 changed files with 47 additions and 27 deletions
  1. 5 0
      Serializer/GenericSerializationVisitor.php
  2. 42 27
      Serializer/Handler/FormErrorHandler.php

+ 5 - 0
Serializer/GenericSerializationVisitor.php

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

+ 42 - 27
Serializer/Handler/FormErrorHandler.php

@@ -18,6 +18,8 @@
 
 
 namespace JMS\SerializerBundle\Serializer\Handler;
 namespace JMS\SerializerBundle\Serializer\Handler;
 
 
+use JMS\SerializerBundle\Serializer\GenericSerializationVisitor;
+
 use Symfony\Component\Form\Form;
 use Symfony\Component\Form\Form;
 use Symfony\Component\Form\FormError;
 use Symfony\Component\Form\FormError;
 use Symfony\Component\Translation\TranslatorInterface;
 use Symfony\Component\Translation\TranslatorInterface;
@@ -37,51 +39,64 @@ class FormErrorHandler implements SerializationHandlerInterface
     public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
     public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
     {
     {
         if ($data instanceof Form) {
         if ($data instanceof Form) {
-            $handled = true;
-
             if ($visitor instanceof XmlSerializationVisitor) {
             if ($visitor instanceof XmlSerializationVisitor) {
+                $handled = true;
+
                 if (null === $visitor->document) {
                 if (null === $visitor->document) {
                     $visitor->document = $visitor->createDocument(null, null, false);
                     $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 = $visitor->document->createElement('form');
                 $formNode->setAttribute('name', $data->getName());
                 $formNode->setAttribute('name', $data->getName());
 
 
-                if (null === $visitor->getCurrentNode()) {
-                    $visitor->document->appendChild($formNode);
+                $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);
                 }
                 }
-                else {
-                    $visitor->getCurrentNode()->appendChild($formNode);
+
+                foreach ($data->getChildren() as $child) {
+                    if (null !== $node = $this->serialize($visitor, $child, null, $visited)) {
+                        $formNode->appendChild($node);
+                    }
                 }
                 }
 
 
-                // append errors node
-                $formNode->appendChild($errorsNode = $visitor->document->createElement('errors'));
-                $visitor->setCurrentNode($errorsNode);
-                $visitor->visitArray($data->getErrors(), $type);
-                $visitor->revertCurrentNode();
+                return;
+            } else if ($visitor instanceof GenericSerializationVisitor) {
+                $handled = true;
+                $isRoot = null === $visitor->getRoot();
 
 
-                if ($data->hasChildren()) {
-                    $visitor->setCurrentNode($formNode);
+                $form = $errors = array();
+                foreach ($data->getErrors() as $error) {
+                    $errors[] = $this->serialize($visitor, $error, null, $visited);
+                }
 
 
-                    foreach ($data->getChildren() as $child) {
-                        $this->serialize($visitor, $child, $type, $visited);
-                    }
+                if ($errors) {
+                    $form['errors'] = $errors;
+                }
 
 
-                    $visitor->revertCurrentNode();
+                $children = array();
+                foreach ($data->getChildren() as $child) {
+                    $children[$child->getName()] = $this->serialize($visitor, $child, null, $visited);
                 }
                 }
 
 
-                return $formNode;
-            }
-            else {
-                $form = array('errors' => $data->getErrors());
-                if ($data->hasChildren()) {
-                    $form['children'] = $data->getChildren();
+                if ($children) {
+                    $form['children'] = $children;
+                }
+
+                if ($isRoot) {
+                    $visitor->setRoot($form);
                 }
                 }
 
 
-                return $visitor->visitArray($form, $type);
+                return $form;
             }
             }
-        }
-        else if ($data instanceof FormError) {
+        } else if ($data instanceof FormError) {
             $handled = true;
             $handled = true;
             $message = $this->translator->trans($data->getMessageTemplate(), $data->getMessageParameters(), 'validators');
             $message = $this->translator->trans($data->getMessageTemplate(), $data->getMessageParameters(), 'validators');