【问题标题】:Symfony Twig extension render viewSymfony Twig 扩展渲染视图
【发布时间】:2016-05-06 08:22:19
【问题描述】:

我的树枝扩展代码如下

/**
 * @return array
 */
public function getFunctions()
{
    return [
        new \Twig_SimpleFunction('bsPanelTitle', array($this, 'bsPanelTitle')),
    ];
}


/**
 * @param $headline
 * @return string
 */
public function bsPanelTitle($headline)
{
    $loader = new \Twig_Loader_Filesystem(__DIR__ . '/../Resources/views/Common/Placeholder');
    $twig = new \Twig_Environment($loader);
    return $twig->render('xtitle.html.twig', ['headline' => $headline]);
}

我的问题是:

有没有更好的方法从 Twig 扩展功能访问 AppBundle/Resources/views/Common/Placeholder 文件夹?

【问题讨论】:

  • 你应该只是include主模板中的占位符
  • bsPanelTitle 将在整个应用程序中使用。它呈现 css 引导标记和标题。我不想在每个树枝文件中复制该标记。所以我想把它当作一个函数来使用。
  • 我发现的另一件事是,您可以将所有帮助视图模板放在一个文件夹中,而不是文件夹和子文件夹(我正在这样做)更改您的函数定义如下 /** * @return array */公共函数 getFunctions() { 返回 [ 新 \Twig_SimpleFunction('bsPanelTitle', [$this, 'bsPanelTitle'], ['needs_environment' => true]), ]; } 公共函数 bsPanelTitle(\Twig_Environment $environment, $headline) { return $environment->render('AppBundle:Common:xtitle.html.twig', ['headline' => $headline]); } 它看起来更干净 :-)

标签: symfony twig render


【解决方案1】:

由于这个问题被标记为 symfony2,我假设您确实在谈论 symfony2 项目,如果是这种情况,您可以使用 twig 配置注册自己的命名空间,如下所示:

twig:
    # ...
    paths:
        "%kernel.root_dir%/../pathFromProjectRootToPlaceholder/Placeholder": placeholder

这会为文件夹 pathFromProjectRootToPlaceholder/Placeholder 创建一个别名,然后您可以使用它来呈现您的模板,如下所示:

//from controller
return $this->render(
    '@placeholder/index.html.twig',
    $data
);

{# from twig template #}
{% include '@placeholder/index.html.twig' %}

您可以为同一个别名添加多个路径,但有关更多信息,请查看 symfony 2 网站上的官方食谱: http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

希望对你有帮助,

亚历山德鲁·科索伊

【讨论】:

    【解决方案2】:

    如评论中所述,使用 include() 将模板包含在您需要的任何位置。

    例如,以下内容与您要实现的目标相同:

    app/Resources/views/xtitle.html.twig:

    {% stylesheets '@AppBundle/Resources/css/bootstrap.css' %}
    <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
    
    {# Other Markup Here #}
    

    在您的模板中,只需调用:

    {% include 'xtitle.html.twig' %}
    

    这将包括模板以及引导样式和该模板中的任何其他内容。

    【讨论】:

    • 您的解决方案也可以工作,但使用 php 代码我可以在其上编写测试,类似于视图助手测试
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多