Symfony2表单:如何在同一视图中两次呈现相同的元素

Mil*_*loš 7 php symfony twig

我有一个控制器,我在其中创建一个表单,其中包含两个下拉列表.

当我渲染我的视图时,我希望在页面的顶部和底部具有相同的表单元素.问题是表单elemet(下拉列表)仅显示在页面顶部,即使我要求twig将它们也放在底部.

这是我想要的:

在此输入图像描述

1和2是下拉列表.我想在页面的顶部和底部复制它.

关于如何做到这一点的任何想法?

顶部内容和底部内容(两个下拉列表位于其中)位于单个sseparate twig文件(searchPanel.html.twig)中,此文件包含在页面中

{% include "MyBundle:Search:searchPanel.html.twig" %}
Run Code Online (Sandbox Code Playgroud)

这是searchPanel.html.twig

<div class="searchPanel">

<form action="{{ path }}" method="POST" {{ form_enctype(form) }}>
    Papers per page
    {{ form_widget(form.papers_per_page, { 'class': 'ppp'}) }}

    / Sort by 
    {{ form_widget(form.sort_by, { 'class': 'sort'}) }}
    {{ form_rest(form) }}

    / Papers ({{ papers_number }} results)

 <input type="submit" class="updateSearchResults" value="Update"></input>
</form>
Run Code Online (Sandbox Code Playgroud)

dbr*_*ann 5

您的方法中的一个问题是,Symfony的Form-component将呈现带有id的表单元素,如果您在页面上呈现两次相同的表单,则会复制该表单元素.您也可能遇到csrf_token问题.形式的要点不是要复制的.

这就是我要做的.创建一个包含您的paginator表单的twig-template而不使用Symfony\Form,即静态创建所有表单元素并将其传递给paginator-object(或数组)以获取数据而不是使用form_widget().像这样的东西:

<form action="{{ path(app.request.attributes.get('_route') }}" method="POST">
    <select name="paginator[per_page]">
        {% for per_page in paginator.papers_per_page %}
        <option value=""{{ per_page }}">{{ per_page }}</option>
        {% endfor %}
    </select>
</form>
Run Code Online (Sandbox Code Playgroud)

表单操作会自动将数据提交到当前路由,因此您可以将其嵌入到不同的操作中,并将数据提交给同一操作.在POST时,您可以使用post-data创建一个paginator-object,然后将其添加为表单的数据.之后你就像往常一样使用isValid().

在您的控制器中,您可以获得如下数据:

use Symfony\Component\HttpFoundation\Request;
// ...

public function PaperController()
{
    public function listAction(Request $request)
    {
        if ($request->getMethod() == 'POST') {
            $data = $request->request->get('paginator');
            $paginator = new Paginator($data);

            $form = new PaginatorFormType();
            $form->setData($paginator);

            if ($form->isValid()) {
                // ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以轻松地在您的视图中嵌入表单,如下所示:

{{ include 'AcmeDemoBundle:Form:paginator.html.twig' with { 'paginator': paginator } }}
Run Code Online (Sandbox Code Playgroud)

基本上,您只需使用控制器中的Form-component进行验证.如果要设置某些默认值或添加其他参数,可能需要从该模板创建,但对于您的用例,这应该足够了.也许其他人有更好的解决方案,但这就是我在其中一个项目中遇到类似问题的方法.