【问题标题】:Short syntax for Assetic twig image functionAssetic twig 图像函数的简短语法
【发布时间】:2012-11-11 21:07:30
【问题描述】:

我像这样在资产上添加图片:

{% image '@MyBundle/Resources/public/img/name.png' %} 
  <img src="{{ asset_url }}"/>
{% endimage %}

对我来说很好,但我想少写一些,所以我尝试创建一个像 symfony2 文档中那样的 twig 函数。但我不使用任何过滤器:

assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [MyBundle]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
    twig:
        functions:
            timg: ~

但如果我现在使用它:

<img src="{{ timg('@MyBundle/Resources/public/img/name.png') }}" />

我得到了例外:

在编译模板期间引发了异常(“可捕获的致命错误:传递给 Twig_Node_Expression_GetAttr::__construct() 的参数 3 必须是 Twig_Node_Expression_Array 的实例,给定的 Twig_Node 的实例,在 C:\wamp2\www 中调用\symfony\vendor\symfony\assetic-bundle\Symfony\Bundle\AsseticBundle\Twig\AsseticNodeVisitor.php 在第 66 行并在 C:\wamp2\www\symfony\vendor\twig\twig\lib\Twig\Node\Expression 中定义\GetAttr.php 第 14 行") 在 "::top.html.twig" 中。

有什么想法吗?也许我不能只使用没有过滤器的短语法函数?

【问题讨论】:

标签: php image symfony twig assetic


【解决方案1】:

我建议你定义一个非常简单的过滤器并像{{ 'mypath'|timg }}一样使用它:

class ImgExtension extends \Twig_Extension
{
    private $asset;
    public function __construct(Container $c){
        $this->asset = $c->get('templating.helper.assets');
    }
    public function getFilters(){
        return array('timg' => new \Twig_Filter_Method($this, 'timg'));
    }
    public function timg($src, $package = null) {
        $url = $this->asset->getUrl($src, $package);
        return '<img src="'.$url.'" />';
    }
    public function getName(){
        return 'timg';
    }
}

然后你可以添加一些其他有用的参数,例如alttitle等。

【讨论】:

    【解决方案2】:

    您的函数名称需要映射到过滤器名称。

    例如:

    assetic:
        debug:          "%kernel.debug%"
        use_controller: false
        bundles:        [MyBundle]
        filters:
            cssrewrite: ~
        twig:
            functions:
                cssrewrite: ~
    

    允许您这样做:

    <link rel="stylesheet" href="{{ cssrewrite('bundles/my/css/style.css') }}" />
    

    这只是说明了语法:使用 cssrewrite 作为函数在 dev 上工作,但在 prod 上工作 - 在没有揭示确切原因的情况下,我重申了assetic-filter-functions-in-twig 的建议最适合image based filters

    为了以相同的方式将timg 用作函数,必须首先将其定义为资产过滤器。您必须首先将其实现为 a custom assetic filter

    一目了然@alexcasalboni 的回答提供了一个很好的实现 twig 过滤器的示例,并且似乎比在 symfony 中设置资产过滤器配置更少。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2011-10-26
      相关资源
      最近更新 更多