فهرست منبع

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

Bulat Shakirzyanov 14 سال پیش
والد
کامیت
cb53414e91
1فایلهای تغییر یافته به همراه24 افزوده شده و 6 حذف شده
  1. 24 6
      src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php

+ 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)
+        ;
     }
 
     /**