树枝和相对模板

时间:2016-06-21 15:45:36

标签: php twig

我的模板由模块分隔。 并命名为moduleName:templateName。 将在文件<moduleNameDirectory>/templateName.twig中搜索此模板。

例如:

{% extends "firstModule:layout" %}

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

通过我的加载程序处理的extendsinclude中的模板名称(实现Twig_LoaderInterface)。 它有效。

但我不想在模块内部指定模块密钥。

{% extends ":layout" %}

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

:layout与上述模板位于同一模块中。

如何在loader方法中找到父模板名称。 或者解决这个问题的其他方法(没有全局状态)。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 也许是黑客攻击。

基类模板为Twig_Template,方法为loadTemplate($template, $templateName, $line, $index)

  • $template我们包含
  • $templateName当前模板

基类可以扩展:http://twig.sensiolabs.org/doc/api.html#environment-options

根据父名称<:p>规范化相对模板名称

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