2016-06-21 2 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)입니다.

  • $template 우리는 포함이
  • $templateName

그리고 기본 클래스를 확장 할 수있는 현재 템플릿 :

: http://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); 
관련 문제