【问题标题】:Symfony2 twig template in a template like wrapping contentSymfony2 树枝模板中的模板,如包装内容
【发布时间】: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


    【解决方案1】:
    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.

    【讨论】:

    • 好的,所以我们走对了。但是我们如何保存render(controller()) 命令生成的表单呢?因为我认为请求并没有通过这种方式通过控制器。
    • 您的render 命令只会调用给定的控制器并使用您在该控制器中定义的模板将其呈现在您的当前页面中。因此,如果您的一个侧窗格中有一个表单,请在 twig 的表单标记中添加action 属性,并提供您为此创建的控制器的route。请注意,您的侧面板就像一个简单的 symfony 页面,混合了路由、控制器和模板。
    • 这是个问题,因为没有到控制器的路由。我想创建我所有的控制器,比如小部件,以便以后使用它们(保存并重定向到您来自的页面)。但我认为我通过将with { request: app.request } 传递给render(controller()) 方法使其工作。我还需要知道的一件事是,我是否也可以通过 AJAX 保存来使用此方法。因为控制器的输出总是一个模板。
    • 很高兴您找到了解决方案。对于 Ajax 问题,更清楚!
    • 我以不同的方式做了一些事情。我们创建了一个可以处理 ajax 调用的新控制器方法。当我们保存数据时,默认控制器首先检查请求是否是 AJAX 请求,如果是,将调用自定义方法并且默认方法(通过返回模板)将被“终止”。
    【解决方案2】:

    通过在模板中使用 render(controller()) 助手修复了这两个问题。 对于 AJAX,我们创建了一个全新的方法,当请求是 AJAX 请求时,该方法将被调用,并且默认方法(通过返回模板)将被“终止”。

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 2013-08-07
      • 2013-04-30
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多