Browse Source

cascade form name for embedded form

Thomas Rabaix 10 years ago
parent
commit
20b4c3b68e

+ 37 - 12
Form/Extension/Field/Type/FormTypeFieldExtension.php

@@ -108,7 +108,31 @@ class FormTypeFieldExtension extends AbstractTypeExtension
      */
     public function buildView(FormView $view, FormInterface $form, array $options)
     {
-        $sonataAdmin     = $form->getConfig()->getAttribute('sonata_admin');
+        $sonataAdmin = $form->getConfig()->getAttribute('sonata_admin');
+
+        /**
+         * We have a child, so we need to upgrade block prefix
+         */
+        if ($view->parent->vars['sonata_admin_enabled'] && !$sonataAdmin['admin']) {
+            $blockPrefixes    = $view->vars['block_prefixes'];
+
+            $baseName = str_replace('.', '_', $view->parent->vars['sonata_admin_code']);
+
+            $baseType = $blockPrefixes[count($blockPrefixes) - 2];
+            $blockSuffix = preg_replace("#^_([a-z0-9]{14})_(.++)$#", "\$2", array_pop($blockPrefixes));
+
+            $blockPrefixes[] = sprintf('%s_%s', $baseName, $baseType);
+            $blockPrefixes[] = sprintf('%s_%s_%s_%s', $baseName, $baseType, $view->parent->vars['name'], $view->vars['name']);
+            $blockPrefixes[] = sprintf('%s_%s_%s_%s', $baseName, $baseType, $view->parent->vars['name'], $blockSuffix);
+
+            $view->vars['block_prefixes']       = $blockPrefixes;
+            $view->vars['sonata_admin_enabled'] = true;
+            $view->vars['sonata_admin']         = array('admin' => false, 'field_description' => false);
+            $view->vars['sonata_admin_code']    = $view->parent->vars['sonata_admin_code'];
+
+            return;
+        }
+
         $sonataAdminHelp = isset($options['sonata_help']) ? $options['sonata_help'] : null;
 
         // avoid to add extra information not required by non admin field
@@ -116,22 +140,23 @@ class FormTypeFieldExtension extends AbstractTypeExtension
             $sonataAdmin['value'] = $form->getData();
 
             // add a new block types, so the Admin Form element can be tweaked based on the admin code
-            $block_prefixes    = $view->vars['block_prefixes'];
+            $blockPrefixes    = $view->vars['block_prefixes'];
             $baseName = str_replace('.', '_', $sonataAdmin['admin']->getCode());
-            $baseType = $block_prefixes[count($block_prefixes) - 2];
-            $blockSuffix = preg_replace("#^_([a-z0-9]{14})_(.++)$#", "\$2", array_pop($block_prefixes));
+            $baseType = $blockPrefixes[count($blockPrefixes) - 2];
+            $blockSuffix = preg_replace("#^_([a-z0-9]{14})_(.++)$#", "\$2", array_pop($blockPrefixes));
 
-            $block_prefixes[] = sprintf('%s_%s', $baseName, $baseType);
-            $block_prefixes[] = sprintf('%s_%s_%s', $baseName, $sonataAdmin['name'], $baseType);
-            $block_prefixes[] = sprintf('%s_%s_%s_%s', $baseName, $sonataAdmin['name'], $baseType, $blockSuffix);
+            $blockPrefixes[] = sprintf('%s_%s', $baseName, $baseType);
+            $blockPrefixes[] = sprintf('%s_%s_%s', $baseName, $sonataAdmin['name'], $baseType);
+            $blockPrefixes[] = sprintf('%s_%s_%s_%s', $baseName, $sonataAdmin['name'], $baseType, $blockSuffix);
 
             if (isset($sonataAdmin['block_name']) && $sonataAdmin['block_name'] !== false) {
-                $block_prefixes[] = $sonataAdmin['block_name'];
+                $blockPrefixes[] = $sonataAdmin['block_name'];
             }
 
-            $view->vars['block_prefixes'] = $block_prefixes;
+            $view->vars['block_prefixes']       = $blockPrefixes;
             $view->vars['sonata_admin_enabled'] = true;
-            $view->vars['sonata_admin'] = $sonataAdmin;
+            $view->vars['sonata_admin']         = $sonataAdmin;
+            $view->vars['sonata_admin_code']    = $sonataAdmin['admin']->getCode();
 
             $attr = $view->vars['attr'];
 
@@ -144,8 +169,8 @@ class FormTypeFieldExtension extends AbstractTypeExtension
             $view->vars['sonata_admin_enabled'] = false;
         }
 
-        $view->vars['sonata_help'] = $sonataAdminHelp;
-        $view->vars['sonata_admin']      = $sonataAdmin;
+        $view->vars['sonata_help']  = $sonataAdminHelp;
+        $view->vars['sonata_admin'] = $sonataAdmin;
     }
 
     /**

+ 51 - 1
Tests/Form/Extension/Field/Type/FormTypeFieldExtensionTest.php

@@ -50,7 +50,12 @@ class FormTypeFieldExtensionTest extends \PHPUnit_Framework_TestCase
     {
         $eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
 
+        $parentFormView = new FormView();
+        $parentFormView->vars['sonata_admin_enabled'] = false;
+
         $formView = new FormView();
+        $formView->parent = $parentFormView;
+
         $options = array();
         $config = new FormConfigBuilder('test', 'stdClass', $eventDispatcher, $options);
         $form = new Form($config);
@@ -80,7 +85,7 @@ class FormTypeFieldExtensionTest extends \PHPUnit_Framework_TestCase
     public function testbuildViewWithWithSonataAdmin()
     {
         $admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
-        $admin->expects($this->once())->method('getCode')->will($this->returnValue('my.admin.reference'));
+        $admin->expects($this->exactly(2))->method('getCode')->will($this->returnValue('my.admin.reference'));
 
         $eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
 
@@ -95,6 +100,9 @@ class FormTypeFieldExtensionTest extends \PHPUnit_Framework_TestCase
 
         $form = new Form($config);
 
+        $formView->parent = new FormView();
+        $formView->parent->vars['sonata_admin_enabled'] = false;
+
         $formView->vars['block_prefixes'] = array('form', 'field', 'text', '_s50b26aa76cb96_username');
 
         $extension = new FormTypeFieldExtension();
@@ -119,4 +127,46 @@ class FormTypeFieldExtensionTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($formView->vars['sonata_admin_enabled']);
         $this->assertEquals('help text', $formView->vars['sonata_help']);
     }
+
+    public function testbuildViewWithNestedForm()
+    {
+        $eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
+
+        $formView = new FormView();
+        $formView->vars['name'] = 'format';
+
+        $options = array();
+        $config = new FormConfigBuilder('test', 'stdClass', $eventDispatcher, $options);
+        $config->setAttribute('sonata_admin', array('admin' => false));
+
+        $form = new Form($config);
+
+        $formView->parent = new FormView();
+        $formView->parent->vars['sonata_admin_enabled'] = true;
+        $formView->parent->vars['sonata_admin_code'] = 'parent_code';
+        $formView->parent->vars['name'] = 'settings';
+
+        $formView->vars['block_prefixes'] = array('form', 'field', 'text', '_s50b26aa76cb96_settings_format');
+
+        $extension = new FormTypeFieldExtension();
+        $extension->buildView($formView, $form, array(
+            'sonata_help' => 'help text'
+        ));
+
+        $this->assertArrayHasKey('block_prefixes', $formView->vars);
+        $this->assertArrayHasKey('sonata_admin_enabled', $formView->vars);
+        $this->assertArrayHasKey('sonata_admin', $formView->vars);
+
+        $expected = array(
+            'form',
+            'field',
+            'text',
+            'parent_code_text',
+            'parent_code_text_settings_format',
+            'parent_code_text_settings_settings_format',
+        );
+
+        $this->assertEquals($expected, $formView->vars['block_prefixes']);
+        $this->assertTrue($formView->vars['sonata_admin_enabled']);
+    }
 }