树枝中的动态{%use%}声明?

时间:2011-11-22 10:12:18

标签: php twig

我想实现以下目标:

我的所有网页都有一个基本模板,名为“_page_base.twig”。它包含页眉和页脚。

然后我在页面的不同区域有一个模板:“topic.twig”,“section.twig”和“article.twig” - 每个区域都扩展了“_page_base.twig “那到目前为止运作良好。

现在我想写我的文章。我也希望将它们保存为.twig文件,因为我可以在编辑器中编辑完整的标记,然后上传它。

由于我不能说我的文章文件只是扩展“article.twig”(多重继承是不可能的)我可以告诉“article.twig”它应该使用我不同文章中的块 - 内容twigfiles。 问题是:“使用”语句必须硬编码!

我目前的解决方案是将{% use "[PLACEHOLDER]" %}添加到“article.twig”中,然后将模板加载到字符串中,将占位符替换为正确的article-content.twig,然后将整个内容传递给模板引擎。真是一团糟。

你们有没有想过更好的解决方案?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用include标记。由于此标记接受要包含的动态名称模板,因此您只需要定义一个包含文章树枝模板名称的变量。

{# on article.twig#}

{% set articles = ['someArticle.twig', ...] %}
{% for article in articles %}
    {% include article %}
{% endfor %}

{# on someArticle.twig #}
... Article text ...

如果您需要自定义someArticle.twig内的某些内容,则可以进入下一级:embed标记。您应该在someArticle.twig内定义一个块标记,该块将是自定义值的占位符。

{# on article.twig#}

{% set articles=['someArticle.twig', ...] %}
{% for article in articles %}
    {% embed article %}
        {% block inside_text_article %}
            ... custom text ...
        {% endblock %}
    {% endembed %}
{% endfor %}


{# on someArticle.twig #}
    ... article text ...
    {% block inside_text_article %}default values{% endblock %}
    ... article text ...

答案 1 :(得分:0)

https://github.com/fabpot/Twig/issues/17 - 没有动态命名空间

LiipThemeBundle可能是一个解决方案: http://symfony2bundles.org/liip/LiipThemeBundle

答案 2 :(得分:0)

除非我不理解这个问题,否则显示一篇文章只需要扩展__page_base.twig。

如果您需要显示多篇文章,您可以拥有一个专门用于显示文章列表的模板,这些文章也会扩展__page_base.twig并将文章列表传递给此模板。