10

<select>要素に追加データを付けて要素をレンダリングしたいと思い<option>ます。例として、選択の変更時に別の入力値をリセットするサービス セレクター (非複数エンティティ フィールド) が必要です。JS データ構造の使用には興味がありません。レンダリングされたフィールドを次のようにする必要があります。

<select name="...">
    <option value="1" data-price="90">Service 1</option>
    <option value="2" data-price="40">Service 2</option>
</select>

私は2つの異なる解決策を取り、両方に対する答えを見て喜んでいます.

  1. form小枝に渡した変数を使用して上記の HTML コードのアセンブルを開始することにより、Twig でフィールドを手動でレンダリングします。これを解決するには2つの問題があります。A)nameファイルの名前を指定する安全な方法が見つかりません。つまり、変数を使用して Symfony が期待する属性を取得するにはどうすればよいですかform.service(service は FormType 内のフィールドの名前です)。[フィールドが現在Symfony によってどのように命名されているかを観察することに基づいて、いくつかの値を連結するトリックを省いてください。リバース エンジニアリングではなく、インターフェイスに依存する必要があります。] B)選択肢のリストにアクセスする方法がわかりません。つまり、entityフィールドのquery_builderオプション。[私は一般的な解決策を探しているので、これらの項目をコントローラーの twig-parameter に複製するつもりはありません。そのような提案を避けるためです。]
  2. クックブックのフォーム スタイリングの章で提案されているように、関連するフィールド ブロックのレンダリングをオーバーライドしますが、それには 3 つの問題があります。A)どのブロックをオーバーライドする必要があるかわかりません (そのため、サンプルが見つかりません)。B)フォーム ビルダーからブロックにパラメーターを渡して、data-レンダリングする追加の属性を知らせますが、これを行う方法がわかりません。最後にC)標準のレンダリングから逸脱する必要がない場合 (フィールドが複数の場合など)、デフォルトのレンダリングにフォールバックする方法がわかりません。

したがって、これらは実際には 5 つの質問 (1A、1B、2A、2B、2C) ですが、選択フィールドのレンダリングに関して文書化されていないと私が考える問題にすべて対処しているため、他の人が一緒に回答する方が役立つと思いました。

4

2 に答える 2

18

1.手動レンダリング。フィールドの個別のフォームであり、作業に必要な時間が短いため、どこかで繰り返されない方がよいでしょう。

A)使用できるフィールドの名前を取得しますform.service.vars.full_name

B)選択肢のリスト - form.service.vars.choices. ChoiceViewエンティティを取得するには、パブリック プロパティにアクセスするだけですdata

{% for choice in form.service.vars.choices %}
    {% set service_entity = choice.data %}
{% endfor %}

2.テンプレートのオーバーライドを介して。オーバーライドする必要があるブロックの名前をブルート フォースで取得したい場合。

A)ドキュメントに記載されているように、オーバーライドできるのwidgetは ,ブロックのみです。ウィジェット名(ドキュメンテーション)でブロックを指定できます。何かのようなものlabelerrors

{% block _form_service_widget %}
    {% if expanded %}
        {{ block('choice_widget_expanded') }}
    {% else %}
        {{ block('my_service_widget') }}
    {% endif %}
{% endblock %}

{% block my_service_widget %}
{% spaceless %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value="">{{ empty_value|trans({}, translation_domain) }}</option>
        {% endif %}
        {% set options = choices %}
        {{ block('my_service_options') }}
    </select>
{% endspaceless %}
{% endblock my_service_widget %}

{% block my_service_options %}
{% spaceless %}
    {% for group_label, choice in options %}
        {# here you can access choice #}
        <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
    {% endfor %}
{% endspaceless %}
{% endblock my_service_options %}
于 2013-07-25T04:17:31.753 に答える