Victor Berchet пре 14 година
родитељ
комит
41e07c96e3

+ 20 - 18
src/Symfony/Bridge/Twig/Extension/FormExtension.php

@@ -30,15 +30,12 @@ class FormExtension extends \Twig_Extension
     protected $themes;
     protected $varStack;
     protected $template;
-    protected $rendering;
 
     public function __construct(array $resources = array())
     {
         $this->themes = new \SplObjectStorage();
         $this->varStack = array();
         $this->blocks = new \SplObjectStorage();
-        $this->rendering = array();
-
         $this->resources = $resources;
     }
 
@@ -133,7 +130,7 @@ class FormExtension extends \Twig_Extension
             ),
             $variables
         );
-        
+
         return $this->render($view, 'row', $variables);
     }
 
@@ -235,37 +232,42 @@ class FormExtension extends \Twig_Extension
             }
         }
 
-        $blocks = $this->getBlocks($view);
         $custom = '_'.$view->get('proto_id', $view->get('id'));
-        $types = $view->get('types');
-        $types[] = $custom;
         $rendering = $custom.$section;
+        $blocks = $this->getBlocks($view);
 
-        $i = isset($this->rendering[$rendering]) ? $this->rendering[$rendering] - 1 : count ($types) - 1;
+        if (isset($this->varStack[$rendering])) {
+            $typeIndex = $this->varStack[$rendering]['typeIndex'] - 1;
+            $types = $this->varStack[$rendering]['types'];
+            $this->varStack[$rendering]['variables'] = array_replace_recursive($this->varStack[$rendering]['variables'], $variables);
+        } else {
+            $types = $view->get('types');
+            $types[] = $custom;
+            $typeIndex = count($types) - 1;
+            $this->varStack[$rendering] = array (
+                'variables' => array_replace_recursive($view->all(), $variables),
+                'types'     => $types,
+            );
+        }
 
         do {
-            $block = $types[$i].'_'.$section;
+            $block = $types[$typeIndex].'_'.$section;
 
             if (isset($blocks[$block])) {
 
-                $this->rendering[$rendering] = $i;
-
-                $this->varStack[$rendering] = array_replace_recursive(
-                    isset($this->varStack[$rendering]) ? $this->varStack[$rendering] : $view->all(),
-                    $variables
-                );
+                $this->varStack[$rendering]['typeIndex'] = $typeIndex;
 
-                $html = $this->template->renderBlock($block, $this->varStack[$rendering], $blocks);
+                $html = $this->template->renderBlock($block, $this->varStack[$rendering]['variables'], $blocks);
 
                 if ($mainTemplate) {
                     $view->setRendered();
                 }
 
-                unset($this->varStack[$rendering], $this->rendering[$rendering]);
+                unset($this->varStack[$rendering]);
 
                 return $html;
             }
-        } while (--$i >= 0);
+        } while (--$typeIndex >= 0);
 
         throw new FormException(sprintf('Unable to render form as none of the following blocks exist: "%s".', implode('", "', $types)));
     }

+ 20 - 18
src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php

@@ -31,15 +31,12 @@ class FormHelper extends Helper
 
     protected $varStack;
 
-    protected $rendering;
-
     protected $context;
 
     public function __construct(EngineInterface $engine)
     {
         $this->engine = $engine;
         $this->varStack = array();
-        $this->rendering = array();
         $this->context = array();
     }
 
@@ -110,7 +107,7 @@ class FormHelper extends Helper
             ),
             $variables
         );
-        
+
         return $this->renderSection($view, 'row', $variables);
     }
 
@@ -185,31 +182,36 @@ class FormHelper extends Helper
         $template = null;
 
         $custom = '_'.$view->get('proto_id', $view->get('id'));
-        $types = $view->get('types');
-        $types[] = $custom;
         $rendering = $custom.$section;
 
-        $i = isset($this->rendering[$rendering]) ? $this->rendering[$rendering] - 1 : count ($types) - 1;
+        if (isset($this->varStack[$rendering])) {
+            $typeIndex = $this->varStack[$rendering]['typeIndex'] - 1;
+            $types = $this->varStack[$rendering]['types'];
+            $this->varStack[$rendering]['variables'] = array_replace_recursive($this->varStack[$rendering]['variables'], $variables);
+        } else {
+            $types = $view->get('types');
+            $types[] = $custom;
+            $typeIndex = count($types) - 1;
+            $this->varStack[$rendering] = array (
+                'variables' => array_replace_recursive($view->all(), $variables),
+                'types'     => $types,
+            );
+        }
 
         do {
-            $block = $types[$i].'_'.$section;
+            $block = $types[$typeIndex].'_'.$section;
             $template = $this->lookupTemplate($block);
 
             if ($template) {
 
-                $this->rendering[$rendering] = $i;
-
-                $this->varStack[$rendering] = array_replace_recursive(
-                    isset($this->varStack[$rendering]) ? $this->varStack[$rendering] : $view->all(),
-                    $variables
-                );
+                $this->varStack[$rendering]['typeIndex'] = $typeIndex;
 
-                $this->context[] = $this->varStack[$rendering];
+                $this->context[] = $this->varStack[$rendering]['variables'];
 
-                $html = $this->engine->render($template, $this->varStack[$rendering]);
+                $html = $this->engine->render($template, $this->varStack[$rendering]['variables']);
 
                 array_pop($this->context);
-                unset($this->varStack[$rendering], $this->rendering[$rendering]);
+                unset($this->varStack[$rendering]);
 
                 if ($mainTemplate) {
                     $view->setRendered();
@@ -217,7 +219,7 @@ class FormHelper extends Helper
 
                 return $html;
             }
-        }  while (--$i >= 0);
+        }  while (--$typeIndex >= 0);
 
         throw new FormException(sprintf('Unable to render the form as none of the following blocks exist: "%s".', implode('", "', $types)));
     }