7

我有一个控制器,我在其中创建一个带有两个下拉列表的表单。

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

这是我想要的:

在此处输入图像描述

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

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

顶部内容和底部内容(两个下拉列表位于其中)位于一个单独的树枝文件(searchPanel.html.twig)中,并且该文件包含在页面中

{% include "MyBundle:Search:searchPanel.html.twig" %}

这是 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>
4

3 回答 3

5

您的方法中的一个问题是 Symfony 的 Form-component 将呈现带有 id 的表单元素,如果您在页面上两次呈现相同的表单,则会复制这些元素。您可能还会遇到 csrf_token 问题。要点是表格不打算被复制。

这就是我要做的。在不使用 Symfony\Form 的情况下创建一个包含分页器表单的 twig-template,即静态创建所有表单元素并将其传递给分页器对象(或数组)以获取数据,而不是使用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>

表单操作会自动将数据提交到您当前的路由,因此您可以将其嵌入到不同的操作中,并将数据提交到相同的操作。在 POST 上,您可以使用 post-data 创建一个分页器对象,然后将其添加为表单的数据。之后,您只需照常使用 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()) {
                // ...
            }
        }
    }
}

您可以像这样轻松地将表单嵌入到您的视图中:

{{ include 'AcmeDemoBundle:Form:paginator.html.twig' with { 'paginator': paginator } }}

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

于 2013-02-04T10:17:44.997 回答
2

另一种选择是使用渲染树枝助手。这样就可以根据需要多次在页面中呈现相同的表单。不同之处在于,使用这个帮助器,也有必要将表单呈现作为一个独立的控制器操作,即:在你的树枝模板的每个地方,你想要在帮助器中渲染表单以调用表单,必须是这样的:

{{ render(controller('BundleNameBundle:Controller:Action', {
    'param': paramId
})) }}

此后只是创建控制器的问题......

于 2014-11-04T17:24:03.340 回答
0

另一个选项是在控制器中创建 2 个表单:

 //first form
 $form = $this->createForm(new MyFormType(), ...);

 //second form: must have different form name that default,
 //to render in twig the fields with different ids
 $formType = new MyFormType();
 $formType->setName('second_form_name');
 $formSecond = $this->createForm($formType, ...);

渲染树枝表单时发送两者:

return $this->render( ... 
            'form' => $form->createView(), 'formSecond'=>$formSecond->createView()));

然后将第二个名称定义为

形式第二

,并且会与第一个冲突。

于 2017-11-09T05:42:55.640 回答