Ver Fonte

Merge pull request #2325 from Bladrak/fix_multiple_subforms

Fixed issue when multiple sub-admins were added in form building
Thomas há 10 anos atrás
pai
commit
ac60457e39
3 ficheiros alterados com 45 adições e 6 exclusões
  1. 3 2
      Admin/Admin.php
  2. 3 4
      Form/Type/AdminType.php
  3. 39 0
      Tests/Admin/AdminTest.php

+ 3 - 2
Admin/Admin.php

@@ -1005,7 +1005,8 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
      */
     public function getClass()
     {
-        if ($this->hasSubject()) {
+        // see https://github.com/sonata-project/SonataCoreBundle/commit/247eeb0a7ca7211142e101754769d70bc402a5b4
+        if ($this->hasSubject() && is_object($this->getSubject())) {
             return ClassUtils::getClass($this->getSubject());
         }
 
@@ -1013,7 +1014,7 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
             if (count($this->getSubClasses()) > 0) {
                 $subject = $this->getSubject();
 
-                if ($subject) {
+                if ($subject && is_object($subject)) {
                     return ClassUtils::getClass($subject);
                 }
             }

+ 3 - 4
Form/Type/AdminType.php

@@ -16,6 +16,7 @@ use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\Form\FormInterface;
 use Symfony\Component\Form\FormView;
 
+use Symfony\Component\Form\ReversedTransformer;
 use Symfony\Component\OptionsResolver\Options;
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
@@ -28,15 +29,13 @@ class AdminType extends AbstractType
      */
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $admin = $this->getAdmin($options);
+        $admin = clone $this->getAdmin($options);
 
         if ($options['delete'] && $admin->isGranted('DELETE')) {
             $builder->add('_delete', 'checkbox', array('required' => false, 'mapped' => false, 'translation_domain' => $admin->getTranslationDomain()));
         }
 
-        if (!$admin->hasSubject()) {
-            $admin->setSubject($builder->getData());
-        }
+        $admin->setSubject($builder->getData());
 
         $admin->defineFormBuilder($builder);
 

+ 39 - 0
Tests/Admin/AdminTest.php

@@ -48,6 +48,45 @@ class AdminTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($baseControllerName, $admin->getBaseControllerName());
     }
 
+    public function testGetClass()
+    {
+        $class = 'Application\Sonata\NewsBundle\Entity\Post';
+        $baseControllerName = 'SonataNewsBundle:PostAdmin';
+
+        $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
+
+        $testObject = new \stdClass();
+        $admin->setSubject($testObject);
+        $this->assertEquals('stdClass', $admin->getClass());
+
+        $admin->setSubClasses(array('foo'));
+        $this->assertEquals('stdClass', $admin->getClass());
+
+        $admin->setSubject(null);
+        $admin->setSubClasses(array());
+        $this->assertEquals($class, $admin->getClass());
+
+        $admin->setSubClasses(array('foo' => 'bar'));
+        $admin->setRequest(new Request(array('subclass' => 'foo')));
+        $this->assertEquals('bar', $admin->getClass());
+    }
+
+    /**
+     * @expectedException \RuntimeException
+     * @expectedExceptionMessage Feature not implemented: an embedded admin cannot have subclass
+     */
+    public function testGetClassException()
+    {
+        $class = 'Application\Sonata\NewsBundle\Entity\Post';
+        $baseControllerName = 'SonataNewsBundle:PostAdmin';
+
+        $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
+        $admin->setParentFieldDescription(new FieldDescription());
+        $admin->setSubClasses(array('foo' => 'bar'));
+        $admin->setRequest(new Request(array('subclass' => 'foo')));
+        $admin->getClass();
+    }
+
     public function testGetBreadCrumbs()
     {
         $class = 'Application\Sonata\NewsBundle\Entity\Post';