【问题标题】:How to extend twig template from parent bundle?如何从父包扩展树枝模板?
【发布时间】:2014-09-25 17:55:26
【问题描述】:

我正在学习 symfony2 并且非常喜欢它(从 ZendFramework 1.x 迁移),但我现在被 twig 模板所困。你能指出我正确的方向吗?

我的应用程序有很多客户,每个客户都有一些自定义(主要是模板,但也有控制器等)。

我尝试通过捆绑继承来实现这一点/我创建了ClientBundle,它继承自BaseBundle,包含所有基本代码和模板......它可以满足我对所有芽模板的需要。当我在ClientBundle 中创建模板时,它会覆盖来自BaseBundle 的模板,并且我无法从ClientBundle 模板访问来自BaseBundle 的原始模板。我想扩展父模板,而不是覆盖它……这不可能吗?

谢谢!

【问题讨论】:

    标签: symfony templates inheritance twig bundle


    【解决方案1】:

    使用标准 Symfony extends 表示法来引用父级的包模板会导致致命错误。 Symfony 将您对 BaseBundle 的模板引用解释为 ChildBundle,因为包继承导致函数嵌套级别异常。

    您可以使用以下符号直接引用父级的捆绑模板文件:

    {% extends "@Client/Foo/bar.html.twig" %}
    

    代替:

    {% extends "ClientBundle:Foo:bar.html.twig" %}
    

    Twig 的FilesystemLoader 将引用字符串拆分为namespace(客户端)和path(Foo/bar.html.twig)。命名空间是您的捆绑包名称,不带捆绑包后缀。每个命名空间的完整路径通过将默认 <bundle_path>/Resources/views/ 与提供的 path 连接来解析。

    【讨论】:

    • 这是正确的解决方案。不需要虚拟/基本模板。
    【解决方案2】:

    树枝模板中用于扩展的标准命令是:

    {% extends 'BaseBundle::yourTemplate.html.twig' %}
    

    您可能在子包中使用相同的模板名称(您的父包和子包中可能都有 yourTemplate.html.twig,因此子模板会覆盖父包)。在这种情况下,您可以重命名您的子模板 (yourTemplate2.html.twig),然后从父模板扩展子模板。有关捆绑继承和树枝模板扩展的更多信息: http://symfony.com/doc/current/cookbook/bundles/inheritance.html http://symfony.com/doc/current/book/templating.html

    【讨论】:

    • 是的,我希望模板具有相同的名称...如果我要更改名称,我还需要覆盖相应的操作并更改模板...我正在寻找一些东西更优雅。有什么解决办法吗?
    • 即使您覆盖了模板,您仍然可以使用扩展命令。您是否尝试在子模板中包含 {% extends ... %} 行?
    • 是的,我做了/它以包含循环结束。即使我在扩展中使用父包名称,它也不包含父模板:-(
    • 在这种情况下,您可以在子包中使用虚拟模板 (tempTemplate.html.twig) 来扩展父模板,然后在子组件 yourTemplate.html.twig 中扩展虚拟模板,甚至最好在你的 app/Resources/views 文件夹中创建一个 baseYourTemplate.html.twig 模板,并从那里扩展父模板和子模板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2017-10-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多