【问题标题】:How to include different templates conditionally?如何有条件地包含不同的模板?
【发布时间】:2019-08-29 17:37:45
【问题描述】:

我有一个基本模板,我需要为前端和后端包含不同的页脚。这在 Symfony 4 中是否可行?

我需要为前端页面添加以下内容:

{% include ('core/footer-frontend.html.twig') %}

对于后端

{% include ('core/footer-backend.html.twig') %}

如何告诉基本模板要包含哪个页脚?

【问题讨论】:

  • 你认为前端和后端是什么?要不要根据一个url参数,用户角色..?
  • 在我的应用后端有路由 /admin 或控制器从我调用模板在 src/controller/admin

标签: php twig symfony4


【解决方案1】:

不知道你是问如何在 Twig 中完成还是在控制器 + twig 中整体完成,但是对于 Twig 你可以简单地做到:

{% if conditionIfThisIsFrontend %}
    {% include ('core/footer-frontend.html.twig') %}
{% else %}
    {% include ('core/footer-backend.html.twig') %}
{% endif %}

显然,您需要填写conditionIfThisIsFrontend,方法是在控制器中设置此变量以保存true(如果它在前端上下文中呈现)或false 用于后端上下文。

【讨论】:

  • 但是这种方式假设我在每个管理控制器中设置变量,或者我可以为每个管理控制器设置一次?
  • 这取决于你的控制器代码的样子。如果你有一些基本的管理控制器,你可以在那里设置保存该值的变量,并在扩展该控制器的所有其他管理控制器中使用它。
【解决方案2】:

另一种方法是制作您的基本模板,然后制作一个前端和一个后端模板,每个模板都扩展您的基本模板。主要代码可以进入基础,前端/后端模板可以扩展基础并包含正确的页脚。在处理后端视图时,扩展后端模板,反之亦然。

【讨论】:

    【解决方案3】:

    如果您想基于 uri 执行此操作,您可以通过 app global variable 访问当前路由,然后使用 comparison operator 将其与您的管理员 url 匹配:

    {% if app.request.pathinfo starts with '/admin/' %}
        {% include ('core/footer-backend.html.twig') %}
    {% else %}
        {% include ('core/footer-frontend.html.twig') %}
    {% endif %}
    

    您可能希望为and is_granted('ROLE_ADMIN') 之类的条件添加额外的保护措施,以确保在显示错误页面时不会发生路由泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2012-03-15
      • 2020-03-18
      相关资源
      最近更新 更多