我使用没有Symfony的Twig已经有一段时间了。现在我想将整个应用程序切换到symfony并使用我的旧模板,我通常使用Twig的相对路径出现问题:
我在独立的Twig中使用这样的东西:
function show_template() {
global $lang;
# $lang is "es" or "nl" etc
$templates_dir = 'templates/'.$lang;
# fallback dir if template is not found in the main location
$fallback_dir = 'templates/en'
$loader = new Twig_Loader_Filesystem(array($templates_dir, $fallback_dir));
$twig = new Twig_Environment($loader, array(
# 'cache' => './cache',
));
# $file is relative path to $templates_dir
return $twig->render($file, $params);
}
show_template('index.html.twig');
我也在模板中使用相对路径。即io index.html.twig
{% include 'includes/header.html.twig' %}
hello world
{% include 'includes/footer.html.twig' %}
这很简单,但是在Symfony2中使用它是不可能的,因为我可以看到。
我可以看到我必须使用这样的东西:
$this->render('AcmeHelloBundle:Default:index.html.twig', $params);
必须更改模板以使用以下内容:
{% include '@AcmeHello/Default/includes/header.html.twig' %}
hello world
{% include '@AcmeHello/Default/includes/footer.html.twig' %}
我不介意调整我的代码/ templats添加一些新的模板逻辑模板,但我需要灵活的路径。问题:
答案 0 :(得分:1)
我通过覆盖控制器中的render()函数解决了这个问题。
public function render($template, array $parameters = array(), Response $response = null) {
# default language/directory
$lang = $this->container->getParameter('lang');
$this->container->get('twig.loader')->addPath(__DIR__.'/../Resources/views/'.$lang);
## falback language/directory
if ($lang != 'en') {
$this->container->get('twig.loader')->addPath(__DIR__.'/../Resources/views/en');
}
return parent::render($template, $parameters, $response);
}
public function myAction() {
return $this->render('index.html.twig');
}
然后我为每种语言创建了一个Resources / views子目录,所以现在相对模板路径和后备模板也可以工作:
{% include 'includes/header.html.twig' %}
hello world
{% include 'includes/footer.html.twig' %}
如果Resources / views / es / includes /中没有includes / footer.html.twig,则会从参考资料/ views / en / includes /中获取