Sfoglia il codice sorgente

Cascade form groups on FormMapper::remove call

Emmanuel Vella 11 anni fa
parent
commit
088967e9d4

+ 14 - 0
Admin/Admin.php

@@ -1576,6 +1576,20 @@ abstract class Admin implements AdminInterface, DomainObjectInterface
         $this->formGroups = $formGroups;
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function removeFieldFromFormGroup($key)
+    {
+        foreach ($this->formGroups as $name => $formGroup) {
+            unset($this->formGroups[$name]['fields'][$key]);
+
+            if (empty($this->formGroups[$name]['fields'])) {
+                unset($this->formGroups[$name]);
+            }
+        }
+    }
+
     /**
      * @param array $group
      * @param array $keys

+ 18 - 0
Admin/AdminInterface.php

@@ -823,6 +823,15 @@ interface AdminInterface
      */
     public function setFormGroups(array $formGroups);
 
+    /**
+     * Remove a form group field
+     *
+     * @param $key
+     *
+     * @return void
+     */
+    public function removeFieldFromFormGroup($key);
+
     /**
      * Returns the show groups
      *
@@ -855,6 +864,15 @@ interface AdminInterface
      */
     public function addFormFieldDescription($name, FieldDescriptionInterface $fieldDescription);
 
+    /**
+     * Remove a FieldDescription
+     *
+     * @param string $name
+     *
+     * @return void
+     */
+    public function removeFormFieldDescription($name);
+
     /**
      * Returns true if this admin uses ACL
      *

+ 1 - 0
Form/FormMapper.php

@@ -157,6 +157,7 @@ class FormMapper extends BaseGroupedMapper
     public function remove($key)
     {
         $this->admin->removeFormFieldDescription($key);
+        $this->admin->removeFieldFromFormGroup($key);
         $this->formBuilder->remove($key);
 
         return $this;

+ 27 - 0
Tests/Admin/AdminTest.php

@@ -1139,4 +1139,31 @@ class AdminTest extends \PHPUnit_Framework_TestCase
 
         return $tagAdmin;
     }
+
+    public function testRemoveFieldFromFormGroup()
+    {
+        $formGroups = array(
+            'foobar' => array(
+                'fields' => array(
+                    'foo' => 'foo',
+                    'bar' => 'bar',
+                ),
+            )
+        );
+
+        $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
+        $admin->setFormGroups($formGroups);
+
+        $admin->removeFieldFromFormGroup('foo');
+        $this->assertEquals($admin->getFormGroups(), array(
+            'foobar' => array(
+                'fields' => array(
+                    'bar' => 'bar',
+                ),
+            )
+        ));
+
+        $admin->removeFieldFromFormGroup('bar');
+        $this->assertEquals($admin->getFormGroups(), array());
+    }
 }

+ 10 - 0
Tests/Form/FormMapperTest.php

@@ -113,4 +113,14 @@ class FormMapperTest extends \PHPUnit_Framework_TestCase
         ->add('foo', 'bar')
         ->end();
     }
+
+    public function testRemoveCascadeRemoveFieldFromFormGroup()
+    {
+        $this->admin->expects($this->once())
+            ->method('removeFieldFromFormGroup')
+            ->with('foo')
+        ;
+
+        $this->formMapper->remove('foo');
+    }
 }