2

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

{% 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" 中。

有任何想法吗?也许我不能在没有过滤器的情况下仅将函数用于短语法?

4

2 回答 2

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';
    }
}

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

于 2013-03-29T15:55:55.437 回答
0

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

例如:

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 最适合基于图像的过滤器的建议。

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

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

于 2014-01-17T21:32:16.720 回答