Symfony2枝条模板在模板中包装内容

时间:2013-11-19 22:07:45

标签: php forms templates symfony

我有一个关于在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放在右窗格中。使用页面底部的提交按钮,可能是底部窗格或其他内容。

2 个答案:

答案 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请求时,将调用此方法,并且默认方法(通过返回模板)将被“终止”。