我正在计划一个基于symfony2的网站。默认布局将由以下块组成:
- 主标题菜单
- 辅助侧菜单
- 站点地图页脚
- 登录表单
- <
- 调查问题/gh>购物车
对于每个部分,我都知道如何通过编写控制器和Twig模板来编写Symfony2中的代码。对于某些部分,我打算使用包,如FOSUserBundle,它提供了自己的控制器。
我找不到一个好的答案是:我怎么能让这一切一起跳舞?如果primary-header-menu bundle或FOSUserBundle的路由被触发并返回一个响应,它们就会上升。但这没有用。我需要一些东西,所有这些构建块处理和渲染他们的部分(几乎)不管什么路由被触发。
这对于表单来说特别有趣。如果提交了表单,则应该通过适当的操作来处理它。但是之后所有其他块应该在整个页面返回之前呈现它们的内容。
如果你了解Drupal:我可以在块中实现表单。我只处理这个块,不需要关心页面上的其他东西。
如果你知道Java/SWING:我可以实现一个动作或对话框作为一个自包含的东西。
如果我理解正确,你想从你的网站的不同区域在你的页面上显示不同的块,对吗?
如果是这种情况,请在layout.html.twig(或base.html)中设置要在页面上包含的块。树枝,或者随便你叫它什么)
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>
如果你想包含一个扁平的小树枝模板,使用'include'。如果你需要一个在加载前需要处理的块,使用'render'。
示例页面(IE: 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#including-other-templates
如果你想包含调用其他复杂渲染的复杂块,那么Twig include是不够的。我认为你应该看看依赖注入器、服务之类的东西。例如,您可以创建一个Twig Service,它从数据库中获取最后一个"Poll Question",并很好地显示它。如果您对某些代码感兴趣,请随意注释。