7

symfony2 フォーム コンポーネントとそのテンプレートに関する質問:

スタイルを設定するチェックボックスがたくさんあります (1 つのフォーム行に約 10 個)。通常、私は<label>この方法でタグを使用します:<label><input/> some text</label>しかし、フォーム テンプレート (form_div_layout.html.twig) でタグを変更する方法が見つかりません。入力ウィジェットとそのラベルの周りにタグをラップする方法さえ見つけることができず、常に次のようなマークアップになってしまいます:<input/> <some_tag><label>some text</label></some_tag>または<some_tag><input/></some_tag> <label>some text</label>控えめに言ってもあまり役に立ちません...

かなりグーグルで検索しましたが、答えが見つかりませんでした。

4

4 に答える 4

5

Whistlegreg は、小枝のフォーム テンプレートをオーバーライドする必要があることは正しいです。ただし、{% block generic_label %}ブロックを削除する必要はありません。テンプレートをオーバーライドする方法についてのヘルプが必要な場合は、彼の回答を参照してください。

チェックボックスの入力タグをラベルでラップするために、最初のステップは{% block choice_widget %}ブロックをオーバーライドし、別のラベルを出力するセクション{{ form_label(child) }}から行を削除することです。{% if expanded %}

{% block choice_widget %}
{% spaceless %}
    {% if expanded %}
        <div {{ block('widget_container_attributes') }}>
        {% for child in form %}
            {{ form_widget(child) }}
        {#  {{ form_label(child) }} <--------------------- remove this line #}  
        {% endfor %}
        </div>
    {% else %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value="">{{ empty_value|trans }}</option>
        {% endif %}
        {% if preferred_choices|length > 0 %}
            {% set options = preferred_choices %}
            {{ block('widget_choice_options') }}
            {% if choices|length > 0 and separator is not none %}
                <option disabled="disabled">{{ separator }}</option>
            {% endif %}
        {% endif %}
        {% set options = choices %}
        {{ block('widget_choice_options') }}
    </select>
    {% endif %}
{% endspaceless %}
{% endblock choice_widget %}

{% block checkbox_widget %}これで、ブロック内のラベルの印刷を処理するだけで済みます。

{% block checkbox_widget %}
{% spaceless %}
    <label  for="{{ id }}"><input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock checkbox_widget %}

{% block radio_widget %}そうしないとラベルがないため、同じことを行う必要があります。

{% block radio_widget %}
{% spaceless %}
    <label  for="{{ id }}"><input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans }}</label>
{% endspaceless %}
{% endblock radio_widget %}
于 2012-08-19T21:58:29.917 に答える
4

これはあなたが探しているものだと思います: http://symfony.com/doc/current/book/templating.html#overriding-bundle-templates

app/resources フォルダーに同じ名前の別のファイルを作成することで、デフォルトの twig テンプレートをオーバーライドできます。

あなたのケースでは、form_div_layout.html.twig テンプレートをオーバーライドし、バンドルから app/Resources/TwigBundle/views/Form/form_div_layout.html.twig にコピーし、カスタマイズして、symfony がデフォルトではなくそれを使用するようにします。

編集: テンプレートをオーバーライドしたら{% block checkbox_widget %}、twig vars を使用して入力をラベル タグでラップするように変更できます。

<label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
  {{label|trans }} 
  <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} /> 
</label> 

「generic_label」定義も削除する必要があります。つまり、他のすべてのブロックを変更する必要があります。

于 2012-05-30T17:31:30.277 に答える
1

特定のフォームウィジェットタイプの行のブロックを定義することができます{% block checkbox_row %}。私はここでこれを発見しました:http: //forum.symfony-project.org/viewtopic.php? f = 23&t = 57986#p153546

チェックボックスのウィジェットの周りにラベルをラップするために必要なのは、次のとおりです。

{% block checkbox_row %}
{% spaceless %}
    <div>
        {% if not compound %}
            {% set label_attr = label_attr|merge({'for': id}) %}
        {% endif %}
        {% if required %}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
        {% endif %}
        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}
        {{ form_widget(form) }}
        {% if label is empty %}
            {% set label = name|humanize %}
        {% endif %}
        </label>
        {{ form_errors(form) }}
    </div>
{% endspaceless %}
{% endblock checkbox_row %}

ラベルコードはからコピーアンドペーストされてい{% block form_label %}ます。ZurbのFoundationフレームワークを使用しているため、ウィジェットの下にフォームエラーを配置しました。

{% block radio_row %}ラジオボタンのコードは、存在しないように見えるため、より複雑です。そのため、Whistlegregのアドバイスを受けて、{% block choice_widget %}ブロックを編集する必要があります。Symfony2.1では、実際には{% block choice_widget_expanded %}。これが私のコードです:

{% block choice_widget_expanded %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
    {% for child in form %}
        {% set child_label = child.get('label') %}
        {% if child_label is not sameas(false) %}
            {% set child_id = child.get('id') %}
            {% set child_compound = child.get('compound') %}
            {% set child_required = child.get('required') %}
            {% set child_label_attr = child.get('label_attr') %}
            {% if not child_compound %}
                {% set child_label_attr = child_label_attr|merge({'for': child_id}) %}
            {% endif %}
            {% if child_required %}
                {% set child_label_attr = child_label_attr|merge({'class': (child_label_attr.class|default('') ~ ' required')|trim}) %}
            {% endif %}
            <label{% for attrname, attrvalue in child_label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
        {% endif %}
        {{ form_widget(child) }}
        {% if child_label is not sameas(false) %}
            {% if child_label is empty %}
                {% set child_label = name|humanize %}
            {% endif %}
            {{ child_label|trans({}, translation_domain) }}
            </label>
        {% endif %}
    {% endfor %}
    </div>
{% endspaceless %}
{% endblock choice_widget_expanded %}

Symfony2.1.9DEVでテストおよび動作しています。

于 2013-03-03T16:58:05.913 に答える
0

form_rowブロックを変更することでそれができると思います。

次のようなものを試してください。

{% block form_row %}
{% spaceless %}
    <label>
        {{ form_widget(form) }}
    </label>
{% endspaceless %}
{% endblock form_row %}

ただし、注意してください。これは非常に柔軟なソリューションではありません...
おそらく、すべてではなく、特定のタイプでのみこれを使用する必要があります。
とにかく、あなたはそれを機能させるために使用form_rowしなければなりません。

于 2012-05-30T18:48:15.607 に答える