Bladeren bron

fixed HelpersExtension (removed usage of the magic _view context attribute -- helpers should now work from macros)

Fabien Potencier 14 jaren geleden
bovenliggende
commit
3ce8ad1718

+ 21 - 8
src/Symfony/Bundle/TwigBundle/Extension/HelpersExtension.php

@@ -3,6 +3,7 @@
 namespace Symfony\Bundle\TwigBundle\Extension;
 
 use Symfony\Bundle\TwigBundle\TokenParser\HelperTokenParser;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /*
  * This file is part of the Symfony package.
@@ -19,6 +20,18 @@ use Symfony\Bundle\TwigBundle\TokenParser\HelperTokenParser;
  */
 class HelpersExtension extends \Twig_Extension
 {
+    protected $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    public function getContainer()
+    {
+        return $this->container;
+    }
+
     /**
      * Returns the token parser instance to add to the existing list.
      *
@@ -28,28 +41,28 @@ class HelpersExtension extends \Twig_Extension
     {
         return array(
             // {% javascript 'bundles/blog/js/blog.js' %}
-            new HelperTokenParser('javascript', '<js> [with <arguments:array>]', 'javascripts', 'add'),
+            new HelperTokenParser('javascript', '<js> [with <arguments:array>]', 'templating.helper.javascripts', 'add'),
 
             // {% javascripts %}
-            new HelperTokenParser('javascripts', '', 'javascripts', 'render'),
+            new HelperTokenParser('javascripts', '', 'templating.helper.javascripts', 'render'),
 
             // {% stylesheet 'bundles/blog/css/blog.css' with ['media': 'screen'] %}
-            new HelperTokenParser('stylesheet', '<css> [with <arguments:array>]', 'stylesheets', 'add'),
+            new HelperTokenParser('stylesheet', '<css> [with <arguments:array>]', 'templating.helper.stylesheets', 'add'),
 
             // {% stylesheets %}
-            new HelperTokenParser('stylesheets', '', 'stylesheets', 'render'),
+            new HelperTokenParser('stylesheets', '', 'templating.helper.stylesheets', 'render'),
 
             // {% asset 'css/blog.css' %}
-            new HelperTokenParser('asset', '<location>', 'assets', 'getUrl'),
+            new HelperTokenParser('asset', '<location>', 'templating.helper.assets', 'getUrl'),
 
             // {% route 'blog_post' with ['id': post.id] %}
-            new HelperTokenParser('route', '<route> [with <arguments:array>]', 'router', 'generate'),
+            new HelperTokenParser('route', '<route> [with <arguments:array>]', 'templating.helper.router', 'generate'),
 
             // {% render 'BlogBundle:Post:list' with ['limit': 2], ['alt': 'BlogBundle:Post:error'] %}
-            new HelperTokenParser('render', '<template> [with <attributes:array>[, <options:array>]]', 'actions', 'render'),
+            new HelperTokenParser('render', '<template> [with <attributes:array>[, <options:array>]]', 'templating.helper.actions', 'render'),
 
             // {% flash 'notice' %}
-            new HelperTokenParser('flash', '<name>', 'session', 'flash'),
+            new HelperTokenParser('flash', '<name>', 'templating.helper.session', 'flash'),
         );
     }
 

+ 1 - 0
src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml

@@ -44,6 +44,7 @@
 
         <service id="twig.extension.helpers" class="Symfony\Bundle\TwigBundle\Extension\HelpersExtension">
             <tag name="twig.extension" />
+            <argument type="service" id="service_container" />
         </service>
     </services>
 </container>

+ 5 - 1
src/Symfony/Bundle/TwigBundle/TokenParser/HelperTokenParser.php

@@ -56,7 +56,11 @@ class HelperTokenParser extends \Twig_SimpleTokenParser
         return $this->output(
             $this->markAsSafe(
                 $this->call(
-                    $this->getAttribute('_view', $this->helper),
+                    $this->call(
+                        $this->call(new \Twig_Node_Expression_ExtensionReference('symfony.helpers', 0), 'getContainer'),
+                        'get',
+                        array(new \Twig_Node_Expression_Constant($this->helper, 0))
+                    ),
                     $this->method,
                     $this->getNodeValues($values)
                 )