7

内部に2つのドロップダウンリストを備えたフォームを作成しているコントローラーがあります。

ビューをレンダリングするとき、ページの上部と下部に同じフォーム要素を配置したいと考えています。問題は、フォームの要素 (ドロップダウン リスト) がページの上部にしか表示されないことです。

ここに私が欲しいものがあります:

ここに画像の説明を入力

1 と 2 はドロップダウンリストです。そして、これをページの上部と下部に複製したいと思います。

これをどのように行うことができるかについてのアイデアはありますか?

2 つのドロップダウンリストが含まれる上部のコンテンツと下部のコンテンツは、1 つの別個の twig ファイル (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のフォームコンポーネントが、ページ上で同じフォームを2回レンダリングした場合に複製されるIDを持つフォーム要素をレンダリングすることです。また、csrf_tokenで問題が発生する可能性があります。その要点は、フォームを複製することを意図したものではありません。

これが私がすることです。Symfony \ Formを使用せずに、paginatorフォームを含むtwig-templateを作成します。つまり、すべてのフォーム要素を静的に作成し、を使用する代わりに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>

フォームアクションはデータを現在のルートに自動的に送信するため、別のアクションにデータを埋め込むことができ、同じアクションにデータを送信します。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()) {
                // ...
            }
        }
    }
}

次のように、フォームをビューに簡単に埋め込むことができます。

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

基本的には、検証の目的でコントローラーのフォームコンポーネントを使用するだけです。いくつかのデフォルト値を設定したり、引数を追加したりする場合は、そのテンプレートからマクロを作成することもできますが、ユースケースではこれで十分です。たぶん他の誰かがより良い解決策を持っていますが、これは私が私のプロジェクトの1つで同様の問題を抱えた方法です。

于 2013-02-04T10:17:44.997 に答える