我有一个关于在Symfony2中进行模板化和使用html等包装块的问题。
我想知道我在做什么是正确的方式,或者是否有另一种更简单的方法来实现我的目标。
我有2个包,一个模板/布局包和一个实体包(还包含一些控制器和视图)。
在实体包中,我有一个显示一些模板的默认控制器,如页面的左右窗格。
然后我使用render(controller())
函数在同一个包中加载另一个控制器,以在页面的左侧或右侧窗格中显示信息。
在请求的控制器中,我返回一个表,其中包含一个容器div中的实体列表,我从模板/布局包扩展到“包装”表。
但这是正常的做法吗?因为只显示带有多个容器的简单页面,我需要最少2个twig文件,2个控制器,1个实体。
以下是我的意思的示例代码(我知道有些事情使用注释会更快):
的Acme / EntityBundle /控制器/ 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 /资源/视图/默认/ 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 /控制器/ 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 /资源/实体/ 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放在右窗格中。使用页面底部的提交按钮,可能是底部窗格或其他内容。
答案 0 :(得分:0)
But is this a normal way of doing this? Because only to show a simple page with multple containers I need minimal 2 twig files, 2 controllers, 1 entity.
是的,这是一种很好的方式。正常情况下,您需要另一个控制器来执行此操作,因为您站点的每个页面都有左侧窗格和侧窗格,并且您不希望从控制器向另一个控制台重复相同的代码。避免使用Do Not Repeat Yourself概念,只需将窗格的代码放在几个控制器/模板中,然后通过render
调用就可以在任何地方使用它。 read this
答案 1 :(得分:0)
通过在模板中使用render(controller())
助手来解决这两个问题。
对于AJAX,我们创建了一个完整的新方法,当请求是一个AJAX请求时,将调用此方法,并且默认方法(通过返回模板)将被“终止”。