18
18
19
19
namespace JMS \SerializerBundle \Serializer \Handler ;
20
20
21
+ use JMS \SerializerBundle \Serializer \GenericSerializationVisitor ;
22
+
21
23
use Symfony \Component \Form \Form ;
22
24
use Symfony \Component \Form \FormError ;
23
25
use Symfony \Component \Translation \TranslatorInterface ;
@@ -37,51 +39,64 @@ public function __construct(TranslatorInterface $translator)
37
39
public function serialize (VisitorInterface $ visitor , $ data , $ type , &$ handled )
38
40
{
39
41
if ($ data instanceof Form) {
40
- $ handled = true ;
41
-
42
42
if ($ visitor instanceof XmlSerializationVisitor) {
43
+ $ handled = true ;
44
+
43
45
if (null === $ visitor ->document ) {
44
46
$ 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
+ );
45
53
}
46
54
47
- $ formNode = $ visitor ->document ->createElement ('form ' );
48
55
$ formNode ->setAttribute ('name ' , $ data ->getName ());
49
56
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 );
52
62
}
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
+ }
55
68
}
56
69
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 ();
62
74
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
+ }
65
79
66
- foreach ( $ data -> getChildren () as $ child ) {
67
- $ this -> serialize ( $ visitor , $ child , $ type , $ visited ) ;
68
- }
80
+ if ( $ errors ) {
81
+ $ form [ ' errors ' ] = $ errors ;
82
+ }
69
83
70
- $ visitor ->revertCurrentNode ();
84
+ $ children = array ();
85
+ foreach ($ data ->getChildren () as $ child ) {
86
+ $ children [$ child ->getName ()] = $ this ->serialize ($ visitor , $ child , null , $ visited );
71
87
}
72
88
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 );
79
95
}
80
96
81
- return $ visitor -> visitArray ( $ form, $ type ) ;
97
+ return $ form ;
82
98
}
83
- }
84
- else if ($ data instanceof FormError) {
99
+ } else if ($ data instanceof FormError) {
85
100
$ handled = true ;
86
101
$ message = $ this ->translator ->trans ($ data ->getMessageTemplate (), $ data ->getMessageParameters (), 'validators ' );
87
102
0 commit comments