2012-11-23 75 views
2

我添加圖片了assetic這樣的:短語法Assetic樹枝圖像功能

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

工作正常,我,但我想少寫,所以我tryed以創建像在Symfony2的樹枝功能實況。但我不使用任何過濾器:

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') }}" /> 

我得到異常:

An exception has been thrown during the compilation of a template ("Catchable Fatal Error: Argument 3 passed to Twig_Node_Expression_GetAttr::__construct() must be an instance of Twig_Node_Expression_Array, instance of Twig_Node given, called in C:\wamp2\www\symfony\vendor\symfony\assetic-bundle\Symfony\Bundle\AsseticBundle\Twig\AsseticNodeVisitor.php on line 66 and defined in C:\wamp2\www\symfony\vendor\twig\twig\lib\Twig\Node\Expression\GetAttr.php line 14") in "::top.html.twig".

任何想法?也許我不能使用沒有過濾器的簡短語法的函數?

+0

http://symfony.com/doc/current/cookbook/assetic/jpeg_optimize.html#shorter-syntax-twig-function在這裏我得到了這個短sintax的想法 – degressor

回答

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

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作爲一個功能適用於開發,而不是督促 - 而不暴露確切的原因我想重申這個建議,即資產過濾器功能在樹枝最適合image based filters

爲了使用timg作爲功能,必須先將其定義爲資產過濾器。您必須首先執行它a custom assetic filter

概覽@ alexcasalboni的答案提供了一個很好的實現樹枝過濾器的例子,並且似乎比在symfony中設置資源過濾器的配置要少。