2016-06-21 9 views
2

私のテンプレートはモジュールで区切られています。 moduleName:templateNameという名前です。 このテンプレートはファイル<moduleNameDirectory>/templateName.twigで検索されます。例えば小枝と相対テンプレート

:私のローダー(実装Twig_LoaderInterface)を介して処理extendsinclude

{% extends "firstModule:layout" %} 

{% block content %} 
    {% include "secondModule:inc" %} 
{% endblock %} 

テンプレート名。 それは動作します。

しかし、私はモジュール自体の内部にモジュールキーを指定したくありません。

{% extends ":layout" %} 

{% block content %} 
    {% include "secondModule:inc" %} 
{% endblock %} 

:layoutは、上記のテンプレートと同じモジュール内にあります。

ローダーメソッドの内部で親テンプレート名を調べるにはどうすればよいですか。 またはこの問題を解決する他の方法(グローバル状態なし)。

+1

残念ながら、ローダーはtota現在のテンプレートの範囲外では、あなたはリソースが必要なテンプレートを知ることができません。 –

+0

ありがとう、アラン。しかし、おそらく他の方法がありますか?例えば、テンプレートクラスを拡張する。 –

答えて

0

解決策が見つかりました。 おそらくハックです。

テンプレートの基本クラスはTwig_Templateであり、方法はloadTemplate($template, $templateName, $line, $index)です。

我々は現在のテンプレート

とベースクラスを拡張することができる

  • $templateNameが含ま
    • $templatehttp://twig.sensiolabs.org/doc/api.html#environment-options

      は、親の名前に基づいて相対的なテンプレート名を正規化:

      abstract class MyBaseTemplate extends \Twig_Template 
      { 
          /** 
          * {@inheritdoc} 
          */ 
          protected function loadTemplate($template, $templateName = null, $line = null, $index = null) 
          { 
           if (substr($template, 0, 1) === ':') { 
            $parent = explode(':', $templateName, 2); 
            if (count($parent) === 1) { 
             throw new \MyTwigException('It is global template'); 
            } 
            $template = $parent[0].$template; 
           }   
           return parent::loadTemplate($template, $templateName, $line, $index); 
          } 
      } 
      
      $loader = new Loader(); 
      $options = [ 
          'base_template_class' => 'MyBaseTemplate', 
      ]; 
      
      $env = new \Twig_Environment($loader, $options); 
      $template = $env->loadTemplate('mo:page'); 
      $content = $template->render($vars);