diff options
Diffstat (limited to 'vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener')
6 files changed, 549 insertions, 0 deletions
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php new file mode 100644 index 00000000..1f62e060 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php | |||
@@ -0,0 +1,62 @@ | |||
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\EventDispatcher\EventSubscriberInterface; | ||
17 | use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface; | ||
18 | |||
19 | /** | ||
20 | * Takes care of converting the input from a list of checkboxes to a correctly | ||
21 | * indexed array. | ||
22 | * | ||
23 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
24 | */ | ||
25 | class FixCheckboxInputListener implements EventSubscriberInterface | ||
26 | { | ||
27 | private $choiceList; | ||
28 | |||
29 | /** | ||
30 | * Constructor. | ||
31 | * | ||
32 | * @param ChoiceListInterface $choiceList | ||
33 | */ | ||
34 | public function __construct(ChoiceListInterface $choiceList) | ||
35 | { | ||
36 | $this->choiceList = $choiceList; | ||
37 | } | ||
38 | |||
39 | public function preSubmit(FormEvent $event) | ||
40 | { | ||
41 | $values = (array) $event->getData(); | ||
42 | $indices = $this->choiceList->getIndicesForValues($values); | ||
43 | |||
44 | $event->setData(count($indices) > 0 ? array_combine($indices, $values) : array()); | ||
45 | } | ||
46 | |||
47 | /** | ||
48 | * Alias of {@link preSubmit()}. | ||
49 | * | ||
50 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
51 | * {@link preSubmit()} instead. | ||
52 | */ | ||
53 | public function preBind(FormEvent $event) | ||
54 | { | ||
55 | $this->preSubmit($event); | ||
56 | } | ||
57 | |||
58 | public static function getSubscribedEvents() | ||
59 | { | ||
60 | return array(FormEvents::PRE_SUBMIT => 'preSubmit'); | ||
61 | } | ||
62 | } | ||
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php new file mode 100644 index 00000000..bf03792f --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php | |||
@@ -0,0 +1,66 @@ | |||
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\EventDispatcher\EventSubscriberInterface; | ||
17 | use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface; | ||
18 | |||
19 | /** | ||
20 | * Takes care of converting the input from a single radio button | ||
21 | * to an array. | ||
22 | * | ||
23 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
24 | */ | ||
25 | class FixRadioInputListener implements EventSubscriberInterface | ||
26 | { | ||
27 | private $choiceList; | ||
28 | |||
29 | private $placeholderPresent; | ||
30 | |||
31 | /** | ||
32 | * Constructor. | ||
33 | * | ||
34 | * @param ChoiceListInterface $choiceList | ||
35 | * @param Boolean $placeholderPresent | ||
36 | */ | ||
37 | public function __construct(ChoiceListInterface $choiceList, $placeholderPresent) | ||
38 | { | ||
39 | $this->choiceList = $choiceList; | ||
40 | $this->placeholderPresent = $placeholderPresent; | ||
41 | } | ||
42 | |||
43 | public function preSubmit(FormEvent $event) | ||
44 | { | ||
45 | $value = $event->getData(); | ||
46 | $index = current($this->choiceList->getIndicesForValues(array($value))); | ||
47 | |||
48 | $event->setData(false !== $index ? array($index => $value) : ($this->placeholderPresent ? array('placeholder' => '') : array())) ; | ||
49 | } | ||
50 | |||
51 | /** | ||
52 | * Alias of {@link preSubmit()}. | ||
53 | * | ||
54 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
55 | * {@link preSubmit()} instead. | ||
56 | */ | ||
57 | public function preBind(FormEvent $event) | ||
58 | { | ||
59 | $this->preSubmit($event); | ||
60 | } | ||
61 | |||
62 | public static function getSubscribedEvents() | ||
63 | { | ||
64 | return array(FormEvents::PRE_SUBMIT => 'preSubmit'); | ||
65 | } | ||
66 | } | ||
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php new file mode 100644 index 00000000..e25dacf2 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php | |||
@@ -0,0 +1,56 @@ | |||
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\EventDispatcher\EventSubscriberInterface; | ||
17 | |||
18 | /** | ||
19 | * Adds a protocol to a URL if it doesn't already have one. | ||
20 | * | ||
21 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
22 | */ | ||
23 | class FixUrlProtocolListener implements EventSubscriberInterface | ||
24 | { | ||
25 | private $defaultProtocol; | ||
26 | |||
27 | public function __construct($defaultProtocol = 'http') | ||
28 | { | ||
29 | $this->defaultProtocol = $defaultProtocol; | ||
30 | } | ||
31 | |||
32 | public function onSubmit(FormEvent $event) | ||
33 | { | ||
34 | $data = $event->getData(); | ||
35 | |||
36 | if ($this->defaultProtocol && $data && !preg_match('~^\w+://~', $data)) { | ||
37 | $event->setData($this->defaultProtocol.'://'.$data); | ||
38 | } | ||
39 | } | ||
40 | |||
41 | /** | ||
42 | * Alias of {@link onSubmit()}. | ||
43 | * | ||
44 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
45 | * {@link onSubmit()} instead. | ||
46 | */ | ||
47 | public function onBind(FormEvent $event) | ||
48 | { | ||
49 | $this->onSubmit($event); | ||
50 | } | ||
51 | |||
52 | public static function getSubscribedEvents() | ||
53 | { | ||
54 | return array(FormEvents::SUBMIT => 'onSubmit'); | ||
55 | } | ||
56 | } | ||
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php new file mode 100644 index 00000000..4d0bdfaa --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php | |||
@@ -0,0 +1,137 @@ | |||
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\EventDispatcher\EventSubscriberInterface; | ||
15 | use Symfony\Component\Form\FormEvents; | ||
16 | use Symfony\Component\Form\FormEvent; | ||
17 | use Symfony\Component\Form\Exception\UnexpectedTypeException; | ||
18 | |||
19 | /** | ||
20 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
21 | */ | ||
22 | class MergeCollectionListener implements EventSubscriberInterface | ||
23 | { | ||
24 | /** | ||
25 | * Whether elements may be added to the collection | ||
26 | * @var Boolean | ||
27 | */ | ||
28 | private $allowAdd; | ||
29 | |||
30 | /** | ||
31 | * Whether elements may be removed from the collection | ||
32 | * @var Boolean | ||
33 | */ | ||
34 | private $allowDelete; | ||
35 | |||
36 | /** | ||
37 | * Creates a new listener. | ||
38 | * | ||
39 | * @param Boolean $allowAdd Whether values might be added to the | ||
40 | * collection. | ||
41 | * @param Boolean $allowDelete Whether values might be removed from the | ||
42 | * collection. | ||
43 | */ | ||
44 | public function __construct($allowAdd = false, $allowDelete = false) | ||
45 | { | ||
46 | $this->allowAdd = $allowAdd; | ||
47 | $this->allowDelete = $allowDelete; | ||
48 | } | ||
49 | |||
50 | public static function getSubscribedEvents() | ||
51 | { | ||
52 | return array( | ||
53 | FormEvents::SUBMIT => 'onSubmit', | ||
54 | ); | ||
55 | } | ||
56 | |||
57 | public function onSubmit(FormEvent $event) | ||
58 | { | ||
59 | $dataToMergeInto = $event->getForm()->getNormData(); | ||
60 | $data = $event->getData(); | ||
61 | |||
62 | if (null === $data) { | ||
63 | $data = array(); | ||
64 | } | ||
65 | |||
66 | if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) { | ||
67 | throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)'); | ||
68 | } | ||
69 | |||
70 | if (null !== $dataToMergeInto && !is_array($dataToMergeInto) && !($dataToMergeInto instanceof \Traversable && $dataToMergeInto instanceof \ArrayAccess)) { | ||
71 | throw new UnexpectedTypeException($dataToMergeInto, 'array or (\Traversable and \ArrayAccess)'); | ||
72 | } | ||
73 | |||
74 | // If we are not allowed to change anything, return immediately | ||
75 | if ((!$this->allowAdd && !$this->allowDelete) || $data === $dataToMergeInto) { | ||
76 | $event->setData($dataToMergeInto); | ||
77 | |||
78 | return; | ||
79 | } | ||
80 | |||
81 | if (!$dataToMergeInto) { | ||
82 | // No original data was set. Set it if allowed | ||
83 | if ($this->allowAdd) { | ||
84 | $dataToMergeInto = $data; | ||
85 | } | ||
86 | } else { | ||
87 | // Calculate delta | ||
88 | $itemsToAdd = is_object($data) ? clone $data : $data; | ||
89 | $itemsToDelete = array(); | ||
90 | |||
91 | foreach ($dataToMergeInto as $beforeKey => $beforeItem) { | ||
92 | foreach ($data as $afterKey => $afterItem) { | ||
93 | if ($afterItem === $beforeItem) { | ||
94 | // Item found, next original item | ||
95 | unset($itemsToAdd[$afterKey]); | ||
96 | continue 2; | ||
97 | } | ||
98 | } | ||
99 | |||
100 | // Item not found, remember for deletion | ||
101 | $itemsToDelete[] = $beforeKey; | ||
102 | } | ||
103 | |||
104 | // Remove deleted items before adding to free keys that are to be | ||
105 | // replaced | ||
106 | if ($this->allowDelete) { | ||
107 | foreach ($itemsToDelete as $key) { | ||
108 | unset($dataToMergeInto[$key]); | ||
109 | } | ||
110 | } | ||
111 | |||
112 | // Add remaining items | ||
113 | if ($this->allowAdd) { | ||
114 | foreach ($itemsToAdd as $key => $item) { | ||
115 | if (!isset($dataToMergeInto[$key])) { | ||
116 | $dataToMergeInto[$key] = $item; | ||
117 | } else { | ||
118 | $dataToMergeInto[] = $item; | ||
119 | } | ||
120 | } | ||
121 | } | ||
122 | } | ||
123 | |||
124 | $event->setData($dataToMergeInto); | ||
125 | } | ||
126 | |||
127 | /** | ||
128 | * Alias of {@link onSubmit()}. | ||
129 | * | ||
130 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
131 | * {@link onSubmit()} instead. | ||
132 | */ | ||
133 | public function onBind(FormEvent $event) | ||
134 | { | ||
135 | $this->onSubmit($event); | ||
136 | } | ||
137 | } | ||
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 | } | ||
diff --git a/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php new file mode 100644 index 00000000..cbe6e0ab --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php | |||
@@ -0,0 +1,55 @@ | |||
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\EventDispatcher\EventSubscriberInterface; | ||
17 | |||
18 | /** | ||
19 | * Trims string data | ||
20 | * | ||
21 | * @author Bernhard Schussek <bschussek@gmail.com> | ||
22 | */ | ||
23 | class TrimListener implements EventSubscriberInterface | ||
24 | { | ||
25 | public function preSubmit(FormEvent $event) | ||
26 | { | ||
27 | $data = $event->getData(); | ||
28 | |||
29 | if (!is_string($data)) { | ||
30 | return; | ||
31 | } | ||
32 | |||
33 | if (null !== $result = @preg_replace('/^[\pZ\p{Cc}]+|[\pZ\p{Cc}]+$/u', '', $data)) { | ||
34 | $event->setData($result); | ||
35 | } else { | ||
36 | $event->setData(trim($data)); | ||
37 | } | ||
38 | } | ||
39 | |||
40 | /** | ||
41 | * Alias of {@link preSubmit()}. | ||
42 | * | ||
43 | * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use | ||
44 | * {@link preSubmit()} instead. | ||
45 | */ | ||
46 | public function preBind(FormEvent $event) | ||
47 | { | ||
48 | $this->preSubmit($event); | ||
49 | } | ||
50 | |||
51 | public static function getSubscribedEvents() | ||
52 | { | ||
53 | return array(FormEvents::PRE_SUBMIT => 'preSubmit'); | ||
54 | } | ||
55 | } | ||