Bläddra i källkod

fix issue with csrf token not present on collection fields because of resize listener

Bulat Shakirzyanov 14 år sedan
förälder
incheckning
cb53414e91

+ 24 - 6
src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php

@@ -12,6 +12,7 @@
 namespace Symfony\Component\Form\Extension\Csrf\Type;
 
 use Symfony\Component\Form\AbstractTypeExtension;
+use Symfony\Component\Form\Event\DataEvent;
 use Symfony\Component\Form\FormBuilder;
 use Symfony\Component\Form\FormView;
 use Symfony\Component\Form\FormInterface;
@@ -35,18 +36,35 @@ class FormTypeCsrfExtension extends AbstractTypeExtension
      */
     public function buildForm(FormBuilder $builder, array $options)
     {
-        if ($options['csrf_protection']) {
+        if (!$options['csrf_protection']) {
+            return;
+        }
+
+        $listener = function(DataEvent $event) use ($options, $builder)
+        {
+            $form = $event->getForm();
+
+            if (!$form->isRoot()) {
+                return;
+            }
+
             $csrfOptions = array('intention' => $options['intention']);
 
             if ($options['csrf_provider']) {
                 $csrfOptions['csrf_provider'] = $options['csrf_provider'];
             }
 
-            $builder
-                ->add($options['csrf_field_name'], 'csrf', $csrfOptions)
-                ->setAttribute('csrf_field_name', $options['csrf_field_name'])
-            ;
-        }
+            $form->add(
+                $builder
+                    ->create($options['csrf_field_name'], 'csrf', $csrfOptions)
+                    ->getForm()
+            );
+        };
+
+        $builder
+            ->addEventListener('form.pre_set_data', $listener, -10)
+            ->addEventListener('form.pre_bind', $listener, -10)
+        ;
     }
 
     /**