Browse Source

[Form] Added FormTypeInterface::buildRendererBottomUp() which is called after children are initialized

Bernhard Schussek 14 years ago
parent
commit
8c7a93c90c

+ 7 - 1
src/Symfony/Component/Form/Renderer/ThemeRenderer.php

@@ -51,13 +51,19 @@ class ThemeRenderer implements FormRendererInterface, \ArrayAccess, \IteratorAgg
             $this->setTemplate($template);
         }
 
-        foreach ((array)$form->getTypes() as $type) {
+        $types = (array)$form->getTypes();
+
+        foreach ($types as $type) {
             $type->buildRenderer($this, $form);
         }
 
         foreach ($form as $key => $child) {
             $this->children[$key] = new self($child, $themeFactory, null, $parent);
         }
+
+        foreach ($types as $type) {
+            $type->buildRendererBottomUp($this, $form);
+        }
     }
 
     public function setTemplate($template)

+ 4 - 1
src/Symfony/Component/Form/Type/AbstractType.php

@@ -24,7 +24,10 @@ abstract class AbstractType implements FormTypeInterface
 
     public function buildRenderer(FormRendererInterface $renderer, FormInterface $form)
     {
-        $renderer->setBlock($this->getName());
+    }
+
+    public function buildRendererBottomUp(FormRendererInterface $renderer, FormInterface $form)
+    {
     }
 
     public function createBuilder(array $options)

+ 12 - 18
src/Symfony/Component/Form/Type/FieldType.php

@@ -67,26 +67,20 @@ class FieldType extends AbstractType
 
     public function buildRenderer(FormRendererInterface $renderer, FormInterface $form)
     {
+        if ($renderer->hasParent()) {
+            $parentId = $renderer->getParent()->getVar('id');
+            $parentName = $renderer->getParent()->getVar('name');
+            $id = sprintf('%s_%s', $parentId, $form->getName());
+            $name = sprintf('%s[%s]', $parentName, $form->getName());
+        } else {
+            $id = $form->getName();
+            $name = $form->getName();
+        }
+
         $renderer->setBlock('field');
         $renderer->setVar('renderer', $renderer);
-        $renderer->setVar('id', function () use ($renderer, $form) {
-            if ($renderer->hasParent()) {
-                $parentId = $renderer->getParent()->getVar('id');
-
-                return sprintf('%s_%s', $parentId, $form->getName());
-            }
-
-            return $form->getName();
-        });
-        $renderer->setVar('name', function () use ($renderer, $form) {
-            if ($renderer->hasParent()) {
-                $parentName = $renderer->getParent()->getVar('name');
-
-                return sprintf('%s[%s]', $parentName, $form->getName());
-            }
-
-            return $form->getName();
-        });
+        $renderer->setVar('id', $id);
+        $renderer->setVar('name', $name);
         $renderer->setVar('errors', $form->getErrors());
         $renderer->setVar('value', $form->getClientData());
         $renderer->setVar('disabled', $form->isReadOnly());

+ 10 - 9
src/Symfony/Component/Form/Type/FormType.php

@@ -40,18 +40,19 @@ class FormType extends AbstractType
         }
     }
 
-    public function buildRenderer(FormRendererInterface $renderer, FormInterface $form)
+    public function buildRendererBottomUp(FormRendererInterface $renderer, FormInterface $form)
     {
-        $renderer->setBlock('form');
-        $renderer->setVar('multipart', function () use ($renderer) {
-            foreach ($renderer as $child) {
-                if ($child->getVar('multipart')) {
-                    return true;
-                }
+        $multipart = false;
+
+        foreach ($renderer as $child) {
+            if ($child->getVar('multipart')) {
+                $multipart = true;
+                break;
             }
+        }
 
-            return false;
-        });
+        $renderer->setBlock('form');
+        $renderer->setVar('multipart', $multipart);
     }
 
     public function getDefaultOptions(array $options)

+ 2 - 0
src/Symfony/Component/Form/Type/FormTypeInterface.php

@@ -21,6 +21,8 @@ interface FormTypeInterface
 
     function buildRenderer(FormRendererInterface $renderer, FormInterface $form);
 
+    function buildRendererBottomUp(FormRendererInterface $renderer, FormInterface $form);
+
     function createBuilder(array $options);
 
     function getDefaultOptions(array $options);

+ 1 - 3
src/Symfony/Component/Form/Type/RadioType.php

@@ -31,9 +31,7 @@ class RadioType extends AbstractType
         $renderer->setVar('checked', (bool)$form->getData());
 
         if ($renderer->hasParent()) {
-            $renderer->setVar('name', function () use ($renderer) {
-                $renderer->setVar('name', $renderer->getParent()->getVar('name'));
-            });
+            $renderer->setVar('name', $renderer->getParent()->getVar('name'));
         }
     }
 

+ 2 - 0
tests/Symfony/Tests/Component/Form/Type/Loader/SimpleTypeLoaderTest.php

@@ -64,6 +64,8 @@ class TestType implements FormTypeInterface
 
     function buildRenderer(FormRendererInterface $renderer, FormInterface $form) {}
 
+    function buildRendererBottomUp(FormRendererInterface $renderer, FormInterface $form) {}
+
     function createBuilder(array $options) {}
 
     function getDefaultOptions(array $options) {}