Skip to content

Commit 9172538

Browse files
committed
some improvements
1 parent 2f59b06 commit 9172538

File tree

2 files changed

+47
-27
lines changed

2 files changed

+47
-27
lines changed

Serializer/GenericSerializationVisitor.php

+5
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,9 @@ public function getRoot()
160160
{
161161
return $this->root;
162162
}
163+
164+
public function setRoot($data)
165+
{
166+
$this->root = $data;
167+
}
163168
}

Serializer/Handler/FormErrorHandler.php

+42-27
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
namespace JMS\SerializerBundle\Serializer\Handler;
2020

21+
use JMS\SerializerBundle\Serializer\GenericSerializationVisitor;
22+
2123
use Symfony\Component\Form\Form;
2224
use Symfony\Component\Form\FormError;
2325
use Symfony\Component\Translation\TranslatorInterface;
@@ -37,51 +39,64 @@ public function __construct(TranslatorInterface $translator)
3739
public function serialize(VisitorInterface $visitor, $data, $type, &$handled)
3840
{
3941
if ($data instanceof Form) {
40-
$handled = true;
41-
4242
if ($visitor instanceof XmlSerializationVisitor) {
43+
$handled = true;
44+
4345
if (null === $visitor->document) {
4446
$visitor->document = $visitor->createDocument(null, null, false);
47+
$visitor->document->appendChild($formNode = $visitor->document->createElement('form'));
48+
$visitor->setCurrentNode($formNode);
49+
} else {
50+
$visitor->getCurrentNode()->appendChild(
51+
$formNode = $visitor->document->createElement('form')
52+
);
4553
}
4654

47-
$formNode = $visitor->document->createElement('form');
4855
$formNode->setAttribute('name', $data->getName());
4956

50-
if (null === $visitor->getCurrentNode()) {
51-
$visitor->document->appendChild($formNode);
57+
$formNode->appendChild($errorsNode = $visitor->document->createElement('errors'));
58+
foreach ($data->getErrors() as $error) {
59+
$errorNode = $visitor->document->createElement('entry');
60+
$errorNode->appendChild($this->serialize($visitor, $error, null, $visited));
61+
$errorsNode->appendChild($errorNode);
5262
}
53-
else {
54-
$visitor->getCurrentNode()->appendChild($formNode);
63+
64+
foreach ($data->getChildren() as $child) {
65+
if (null !== $node = $this->serialize($visitor, $child, null, $visited)) {
66+
$formNode->appendChild($node);
67+
}
5568
}
5669

57-
// append errors node
58-
$formNode->appendChild($errorsNode = $visitor->document->createElement('errors'));
59-
$visitor->setCurrentNode($errorsNode);
60-
$visitor->visitArray($data->getErrors(), $type);
61-
$visitor->revertCurrentNode();
70+
return;
71+
} else if ($visitor instanceof GenericSerializationVisitor) {
72+
$handled = true;
73+
$isRoot = null === $visitor->getRoot();
6274

63-
if ($data->hasChildren()) {
64-
$visitor->setCurrentNode($formNode);
75+
$form = $errors = array();
76+
foreach ($data->getErrors() as $error) {
77+
$errors[] = $this->serialize($visitor, $error, null, $visited);
78+
}
6579

66-
foreach ($data->getChildren() as $child) {
67-
$this->serialize($visitor, $child, $type, $visited);
68-
}
80+
if ($errors) {
81+
$form['errors'] = $errors;
82+
}
6983

70-
$visitor->revertCurrentNode();
84+
$children = array();
85+
foreach ($data->getChildren() as $child) {
86+
$children[$child->getName()] = $this->serialize($visitor, $child, null, $visited);
7187
}
7288

73-
return $formNode;
74-
}
75-
else {
76-
$form = array('errors' => $data->getErrors());
77-
if ($data->hasChildren()) {
78-
$form['children'] = $data->getChildren();
89+
if ($children) {
90+
$form['children'] = $children;
91+
}
92+
93+
if ($isRoot) {
94+
$visitor->setRoot($form);
7995
}
8096

81-
return $visitor->visitArray($form, $type);
97+
return $form;
8298
}
83-
}
84-
else if ($data instanceof FormError) {
99+
} else if ($data instanceof FormError) {
85100
$handled = true;
86101
$message = $this->translator->trans($data->getMessageTemplate(), $data->getMessageParameters(), 'validators');
87102

0 commit comments

Comments
 (0)