diff options
Diffstat (limited to 'vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php')
-rw-r--r-- | vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php new file mode 100644 index 00000000..f1c39db2 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php | |||
@@ -0,0 +1,173 @@ | |||
1 | <?php | ||
2 | |||
3 | /* | ||
4 | * This file is part of the Symfony package. | ||
5 | * | ||
6 | * (c) Fabien Potencier <fabien@symfony.com> | ||
7 | * | ||
8 | * For the full copyright and license information, please view the LICENSE | ||
9 | * file that was distributed with this source code. | ||
10 | */ | ||
11 | |||
12 | namespace Symfony\Component\Form\Extension\Core\EventListener; | ||
13 | |||
14 | use Symfony\Component\Form\FormEvents; | ||
15 | use Symfony\Component\Form\FormEvent; | ||
16 | use Symfony\Component\Form\Exception\UnexpectedTypeException; | ||
17 | use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
18 | |||
19 | /** | ||
20 | * Resize a collection form element based on the data sent from the client. | ||
21 | * | ||
22 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
23 | */ | ||
24 | class ResizeFormListener implements EventSubscriberInterface | ||
25 | { | ||
26 | /** | ||
27 | * @var string | ||
28 | */ | ||
29 | protected $type; | ||
30 | |||
31 | /** | ||
32 | * @var array | ||
33 | */ | ||
34 | protected $options; | ||
35 | |||
36 | /** | ||
37 | * Whether children could be added to the group | ||
38 | * @var Boolean | ||
39 | */ | ||
40 | protected $allowAdd; | ||
41 | |||
42 | /** | ||
43 | * Whether children could be removed from the group | ||
44 | * @var Boolean | ||
45 | */ | ||
46 | protected $allowDelete; | ||
47 | |||
48 | public function __construct($type, array $options = array(), $allowAdd = false, $allowDelete = false) | ||
49 | { | ||
50 | $this->type = $type; | ||
51 | $this->allowAdd = $allowAdd; | ||
52 | $this->allowDelete = $allowDelete; | ||
53 | $this->options = $options; | ||
54 | } | ||
55 | |||
56 | public static function getSubscribedEvents() | ||
57 | { | ||
58 | return array( | ||
59 | FormEvents::PRE_SET_DATA => 'preSetData', | ||
60 | FormEvents::PRE_SUBMIT => 'preSubmit', | ||
61 | // (MergeCollectionListener, MergeDoctrineCollectionListener) | ||
62 | FormEvents::SUBMIT => array('onSubmit', 50), | ||
63 | ); | ||
64 | } | ||
65 | |||
66 | public function preSetData(FormEvent $event) | ||
67 | { | ||
68 | $form = $event->getForm(); | ||
69 | $data = $event->getData(); | ||
70 | |||
71 | if (null === $data) { | ||
72 | $data = array(); | ||
73 | } | ||
74 | |||
75 | if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) { | ||
76 | throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)'); | ||
77 | } | ||
78 | |||
79 | // First remove all rows | ||
80 | foreach ($form as $name => $child) { | ||
81 | $form->remove($name); | ||
82 | } | ||
83 | |||
84 | // Then add all rows again in the correct order | ||
85 | foreach ($data as $name => $value) { | ||
86 | $form->add($name, $this->type, array_replace(array( | ||
87 | 'property_path' => '['.$name.']', | ||
88 | ), $this->options)); | ||
89 | } | ||
90 | } | ||
91 | |||
92 | public function preSubmit(FormEvent $event) | ||
93 | { | ||
94 | $form = $event->getForm(); | ||
95 | $data = $event->getData(); | ||
96 | |||
97 | if (null === $data || '' === $data) { | ||
98 | $data = array(); | ||
99 | } | ||
100 | |||
101 | if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) { | ||
102 | throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)'); | ||
103 | } | ||
104 | |||
105 | // Remove all empty rows | ||
106 | if ($this->allowDelete) { | ||
107 | foreach ($form as $name => $child) { | ||
108 | if (!isset($data[$name])) { | ||
109 | $form->remove($name); | ||
110 | } | ||
111 | } | ||
112 | } | ||
113 | |||
114 | // Add all additional rows | ||
115 | if ($this->allowAdd) { | ||
116 | foreach ($data as $name => $value) { | ||
117 | if (!$form->has($name)) { | ||
118 | $form->add($name, $this->type, array_replace(array( | ||
119 | 'property_path' => '['.$name.']', | ||
120 | ), $this->options)); | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | |||
126 | public function onSubmit(FormEvent $event) | ||
127 | { | ||
128 | $form = $event->getForm(); | ||
129 | $data = $event->getData(); | ||
130 | |||
131 | if (null === $data) { | ||
132 | $data = array(); | ||
133 | } | ||
134 | |||
135 | if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) { | ||
136 | throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)'); | ||
137 | } | ||
138 | |||
139 | // The data mapper only adds, but does not remove items, so do this | ||
140 | // here | ||
141 | if ($this->allowDelete) { | ||
142 | foreach ($data as $name => $child) { | ||
143 | if (!$form->has($name)) { | ||
144 | unset($data[$name]); | ||
145 | } | ||
146 | } | ||
147 | } | ||
148 | |||
149 | $event->setData($data); | ||
150 | } | ||
151 | |||
152 | /** | ||
153 | * Alias of {@link preSubmit()}. | ||
154 | * | ||
155 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
156 | * {@link preSubmit()} instead. | ||
157 | */ | ||
158 | public function preBind(FormEvent $event) | ||
159 | { | ||
160 | $this->preSubmit($event); | ||
161 | } | ||
162 | |||
163 | /** | ||
164 | * Alias of {@link onSubmit()}. | ||
165 | * | ||
166 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
167 | * {@link onSubmit()} instead. | ||
168 | */ | ||
169 | public function onBind(FormEvent $event) | ||
170 | { | ||
171 | $this->onSubmit($event); | ||
172 | } | ||
173 | } | ||