0

我正在计划一个基于 symfony2 的网站。默认布局将由以下块组成:

  • 主标题菜单
  • 辅助侧菜单
  • 页脚中的站点地图
  • 登录表格
  • 搜索
  • 投票问题
  • 购物车

对于每个部分,我都知道如何通过编写控制器和 Twig 模板在 Symfony2 中编写代码。对于某些部分,我计划使用诸如FOSUserBundle之类的包,它提供了自己的控制器。

我找不到好的答案是:我怎样才能让这一切一起跳舞?如果它们的路由被触发并返回响应,我的 primary-header-menu 包或 FOSUserBundle 会升级。但这没用。我需要一些东西,所有这些构建块都可以处理并(几乎)渲染它们的部分,而不管触发了什么路由。

这对表单特别有趣。如果提交了表单,则应通过适当的操作对其进行处理。但之后所有其他块应在返回整个页面之前呈现其内容。

如果你知道Drupal:我可以在一个块中实现一个表单。我只处理这个块,不必关心页面上的所有其他内容。

如果你知道Java/SWING:我可以将一个动作或一个对话框实现为一个自包含的东西。该框架负责使其他所有内容保持最新。

4

2 回答 2

1

如果我对您的理解正确,您想在您网站不同区域的页面上显示不同的块,对吗?

如果是这种情况,请在您的 layout.html.twig(或 base.html.twig,或任何您可能称呼的名称)中设置您想要包含在页面上的块

示例 layout.html.twig:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Acme Example Page</title>
    </head>
    <body>
        <div id="sidebar">
            <div id="sidebar-menu-block" class="block">
                {% include 'AcmeBundle:Sidemenu:sideMenu.html.twig' %}
            </div>
            <div id="sidebar-cart-block" class="block">
                {% render url('acme_shopping_cart_block_url') %}
            </div>
            <div id="sidebar-poll-block" class="block">
                {% render url('acme_poll_block_url') %}
            </div>
        </div>

        <div id="content">
            {% block body %}{% endblock %}
        </div>
    </body>
</html>

如果要包含扁平树枝模板,请使用“包含”。如果您需要在加载前需要处理的块,请使用“渲染”。

示例页面(即:AcmeUserBundle:Registration:register.html.twig):

{% extends 'layout.html.twig' %}

{% block body %}
<h1>My Page with a form!</h1>
<form>
   {{ form_widget(form) }}
   <input type="submit" value="Save" />
</form>
{% endblock body %}

上面的示例将使用 layout.html.twig 中定义的所有块包围您的 register.html.twig。查看 symfony 文档的“包含其他模板”部分:http: //symfony.com/doc/2.0/book/templating.html#include-other-templates

于 2013-01-08T14:51:52.053 回答
0

如果你想包含将调用其他复杂渲染的复杂块,Twig 包含是不够的。我认为您应该查看依赖注入器、服务等。例如,您可以创建一个 Twig 服务,从您的数据库中获取最后一个“投票问题”并很好地显示它。如果您对某些代码感兴趣,请随时发表评论。

于 2013-07-08T15:46:23.343 回答