2016-06-21 13 views
2

Meine Vorlagen getrennt durch Module. Und benannt als moduleName:templateName. Diese Vorlage wird in der Datei <moduleNameDirectory>/templateName.twig gesucht.Zweig und relative Vorlagen

Zum Beispiel:

{% extends "firstModule:layout" %} 

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

Template-Name in extends und include über meine Lader (implementiert Twig_LoaderInterface) verarbeitet. Und es funktioniert.

Aber ich möchte nicht einen Modulschlüssel innerhalb Modul selbst angeben.

{% extends ":layout" %} 

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

:layout ist im gleichen Modul wie die oben Vorlage.

Wie finde ich in den Loader-Methoden den Namen der Elternvorlage. Oder andere Möglichkeit, dieses Problem zu lösen (ohne globale Zustände).

+1

Leider heißt loader tota Ich fürchte, Sie werden nicht wissen können, in welcher Vorlage Sie eine Ressource benötigt haben. –

+0

Danke, Alain. Aber vielleicht gibt es andere Möglichkeiten? Erweitern Sie beispielsweise die Vorlagenklasse. –

Antwort

0

Ich fand eine Lösung. Vielleicht ist es Hack.

Basisklasse der Vorlagen ist Twig_Template und es hat Methode loadTemplate($template, $templateName, $line, $index).

  • $template, dass wir schließen
  • $templateName die aktuelle Vorlage

Und Basisklasse erweitert werden kann: http://twig.sensiolabs.org/doc/api.html#environment-options

Normalisieren der relativen Vorlagennamen auf der Grundlage der Muttername:

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);