Kaynağa Gözat

fix #2076 - make sure sonata_admin_type on sonata_collection_type get the valid subject

Thomas Rabaix 10 yıl önce
ebeveyn
işleme
1a5ba565a7

+ 0 - 1
Admin/AdminHelper.php

@@ -139,7 +139,6 @@ class AdminHelper
         }
 
         $this->addNewInstance($form->getData(), $fieldDescription);
-        $data[$childFormBuilder->getName()][] = $value;
 
         $finalForm = $admin->getFormBuilder()->getForm();
         $finalForm->setData($subject);

+ 1 - 1
Controller/HelperController.php

@@ -92,7 +92,7 @@ class HelperController
 
         $admin->setSubject($subject);
 
-        list($fieldDescription, $form) = $this->helper->appendFormFieldElement($admin, $subject, $elementId);
+        list(, $form) = $this->helper->appendFormFieldElement($admin, $subject, $elementId);
 
         /** @var $form \Symfony\Component\Form\Form */
         $view = $this->helper->getChildFormView($form->createView(), $elementId);

+ 18 - 0
Form/Type/AdminType.php

@@ -20,6 +20,9 @@ use Symfony\Component\OptionsResolver\Options;
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
 use Sonata\AdminBundle\Form\DataTransformer\ArrayToModelTransformer;
+use Symfony\Component\PropertyAccess\Exception\NoSuchIndexException;
+use Symfony\Component\PropertyAccess\PropertyAccess;
+use Symfony\Component\PropertyAccess\PropertyAccessor;
 
 class AdminType extends AbstractType
 {
@@ -42,6 +45,21 @@ class AdminType extends AbstractType
             $builder->add('_delete', $options['delete_options']['type'], $options['delete_options']['type_options']);
         }
 
+        // hack to make sure the subject is correctly set
+        // https://github.com/sonata-project/SonataAdminBundle/pull/2076
+        if ($builder->getData() === null) {
+            $p = new PropertyAccessor(false, true);
+            try {
+                $subject = $p->getValue(
+                    $admin->getParentFieldDescription()->getAdmin()->getSubject(),
+                    $this->getFieldDescription($options)->getFieldName().$options['property_path']
+                );
+                $builder->setData($subject);
+            } catch (NoSuchIndexException $e) {
+                // no object here
+            }
+        }
+
         $admin->setSubject($builder->getData());
 
         $admin->defineFormBuilder($builder);