【发布时间】:2013-11-19 22:07:44
【问题描述】:
我有一个关于 Symfony2 中的模板和用 html 等包装块的问题。
我想知道我所做的是否正确,或者是否有另一种更简单的方法来实现我的目标。
我有 2 个包,一个模板/布局包和一个实体包(其中还包含一些控制器和视图)。
在实体包中,我有一个默认控制器,它显示一些模板,例如页面的左右窗格。
然后我使用render(controller()) 函数在同一个包中加载另一个控制器,以在页面的左侧或右侧窗格中显示信息。
在请求的控制器中,我返回一个表格,其中包含一个容器 div 中的实体列表,我从模板/布局包扩展以“包装”表格。
但这是正常的做法吗?因为只显示一个包含多个容器的简单页面,我需要最少 2 个树枝文件、2 个控制器、1 个实体。
这是我的意思的示例代码(我知道有些事情使用注释会更快):
Acme/EntityBundle/Controller/DefaultController.php
namespace Acme\EntityBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction()
{
return $this->render('AcmeEntityBundle:Default:index.html.twig');
}
}
Acme/EntityBundle/Resources/views/Default/index.html.twig
{% extends "AcmeLayoutBundle:Default:index.html.twig" %}
{% block content %}
<div class="col-sm-6">
{{ render(controller('AcmeEntityBundle:Entity:list')) }}
</div>
<div class="col-sm-6">
here some other info
</div>
{% endblock %}
Acme/EntityBundle/Controller/EntityController.php
namespace Acme\EntityBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\EntityBundle\Entity\Entity;
use Symfony\Component\HttpFoundation\Request;
class EntityController extends Controller
{
public function listAction()
{
$entities = $this->getDoctrine()
->getRepository('AcmeEntityBundle:Entity')
->findAll();
return $this->render('AcmeEntityBundle:Entity:list.html.twig', array('list' => $entities));
}
}
Acme/EntityBundle/Resources/Entity/list.html.twig
{% extends "AcmeLayoutBundle:templates:containers.html.twig" %}
{% block title %}Just a Title{% endblock %}
{% block content %}
<table><tr><td></td></tr></table>
{% endblock %}
如您所见,我使用了 2 个控制器。 - 作为一种门户,具有基本布局(侧边栏、页眉、内容、页脚块)呈现第二个控制器 - 以及实体本身的第二个控制器
您可以在 twig 文件中看到,我为完整的布局扩展了一次 layoutbundle,并为表格的包装器扩展了一次。
但现在又是一个真正的问题:这是在 symfony2 中编程的正确方法,还是有更好的方法?因为只是为了显示实体列表,我需要使用 4 个不同的文件(通用且不要写两次)。
[编辑]
作为上述问题的延伸。
我有一个使用 formBuilder 创建的表单,我需要在左窗格中显示表单的某些部分,在右窗格中显示某些部分,但两者都包含在 container.html.twig 文件中。
我知道这样做的方法
form_start(form)
form_label(form.field1)
form_widget(form.field1)
form_label(form.field2)
form_widget(form.field2)
...
form_end(form)
但是在上述情况下这可能吗?例如:将 field1 放在左侧窗格中,将 field2 放在右侧窗格中。在页面底部有一个提交按钮,可能在底部窗格或其他地方。
【问题讨论】:
标签: php forms templates symfony