我的模板由模块分隔。
并命名为moduleName:templateName
。
将在文件<moduleNameDirectory>/templateName.twig
中搜索此模板。
例如:
{% extends "firstModule:layout" %}
{% block content %}
{% include "secondModule:inc" %}
{% endblock %}
通过我的加载程序处理的extends
和include
中的模板名称(实现Twig_LoaderInterface
)。
它有效。
但我不想在模块内部指定模块密钥。
{% extends ":layout" %}
{% block content %}
{% include "secondModule:inc" %}
{% endblock %}
:layout
与上述模板位于同一模块中。
如何在loader方法中找到父模板名称。 或者解决这个问题的其他方法(没有全局状态)。
答案 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);