2012-03-03 119 views
13

我已經構建了一個樹枝擴展來做一些事情,其中​​一個呈現模板。我如何從樹枝內部訪問引擎環境並調用Render方法?從樹枝延伸呈現模板

回答

35

您可以定義進行擴展,以便它需要的環境。 Twig會自動將它傳遞給函數。

public function getFunctions() 
{ 
    return array(
     new \Twig_SimpleFunction(
      'myfunction', 
      array($this, 'myFunction'), 
      array('needs_environment' => true) 
     ), 
    ); 
} 

public function myFunction(\Twig_Environment $environment, string $someParam) 
{ 
    // ... 
} 
+4

\ Twig_Function_Method已棄用,請使用\ Twig_SimpleFunction – spectralsun 2013-05-13 23:15:55

19

使用此功能用戶可以在樹枝環境實例傳遞給一個樹枝延伸

private $environment; 

public function initRuntime(\Twig_Environment $environment) 
{ 
    $this->environment = $environment; 
} 
+4

工作,然後做$ this-> environment-> render() – ojreadmore 2012-06-05 15:59:42

+4

現在不推薦使用initRuntime。 @tvlooy的needs_environment是正確的答案。 – MECU 2015-12-01 22:10:37

5

@tvlooy答案給我一個提示,但對我沒有工作。我需要來實現這一目標是:

namespace AppBundle\Twig; 


class MenuExtension extends \Twig_Extension 
{ 
    public function getName() 
    { 
     return 'menu_extension'; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('myMenu', [$this, 'myMenu'], [ 
       'needs_environment' => true, 
       'is_safe' => ['html'] 
      ]) 
     ]; 
    } 

    public function myMenu(\Twig_Environment $environment) 
    { 
      return $environment->render('AppBundle:Menu:main-menu.html.twig'); 
    } 
} 

我需要addtionaly添加'is_safe' => ['html']避免HTML的autoescaping。

我也註冊了類symfony作爲服務:

app.twig.menu_extension: 
    class: AppBundle\Twig\MenuExtension 
    public: false 
    tags: 
     - { name: twig.extension } 

在嫩枝模板我已經添加{{ myMenu() }}

"twig/twig": "~1.10"和Symfony的3.1.3版本

+0

'needs_environment'=> true是真正的交易。 +1 – 2017-01-12 13:26:50