从独立的Twig切换到Symfony Twig:模板中的相对路径

时间:2014-04-08 09:41:29

标签: php symfony path twig relative-path

我使用没有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添加一些新的模板逻辑模板,但我需要灵活的路径。问题:

  1. 如何在PHP代码中使用模板的相对路径才能够 根据语言/无论
  2. 使用更改templates_dir
  3. 如何在模板中使用相对路径?
  4. 我如何拥有后备模板/后备目录?

1 个答案:

答案 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 /中获取