18

フォーム フィールド タイプを取得し、フィールド タイプのクラスを設定したい

私は試します:

{# Form field row #}
{% block form_row %}
{% spaceless %}
  <div class="field-group{% if errors|length > 0%} error{%endif%}" id="fc-{{ id }}">
    {{ form_label(form, label|default(null)) }}
    <div class="field-item {{ type }}">
      {{ form_widget(form) }}
      {% if errors|length > 0 %}
        <div class="errors">{{ form_errors(form) }}</div>
      {% endif %}
    </div>
  </div>
{% endspaceless %}
{% endblock %}

しかし {{ type }} は機能しません。

4

5 に答える 5

23

MatsRietdijk さんからの回答は正しいのですが、Symfony 2.3 の時点で型のインデックスが 2 から 1 に変更されたようです。その結果、、、など{{ form.vars.block_prefixes.1 }}が返されます。checkboxdatechoice

アプリケーション全体のカスタマイズを行うときに、フォーム行にクラスを追加するために使用できます。

{% block form_row %}
    <div class="form_row {{ form.vars.block_prefixes.1 }}">
        {{ form_label(form) }}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
    </div>
{% endblock form_row %}

次に、CSS ルールを適用できます。

div.form_row.text {color:Red;}

Twitter ブートストラップ

Twitter ブートストラップを使用する場合、.checkboxクラスが bootstrap に存在するため、問題が発生する可能性があります。Symfony フォームの行にプレフィックスを使用することをお勧めします。

{% block form_row %}
    <div class="form_row symfony_{{ form.vars.block_prefixes.1 }}">
        {{ form_label(form) }}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
    </div>
{% endblock form_row %}

CSS ファイルのルールは異なります。

div.form_row.symfony_text {color:Red;}

アップデート

Twitter ブートストラップ フォーム テーマが Symfony 2.6 に含まれるようになりました

于 2013-09-13T12:41:25.383 に答える
19

これを使用してフィールド タイプを取得できます。

{{ form.FIELD_NAME.vars.block_prefixes.2 }}

したがって、フォームに message というフィールドがある場合は、次を使用します。

{{ form.message.vars.block_prefixes.2 }}

ネストされたフォーム フィールド タイプの場合は、次を使用します。

{{ form.NESTED_FORM_NAME.FIELD_NAME.vars.block_prefixes.2 }}

編集 :

基本的なフォーム ブロックを上書きするには、テンプレート ファイルで次のようにします。

....
{% form_theme form _self %}
{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% if not attr.class is defined %}
        class="{{ type|default('text') }}"
    {% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% elseif attrname == 'class' %}{{ attrname }}="{{ type|default('text') }} {{ attrvalue }}"{% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
{% block content %}
    ....
{% endblock %}

またはより良いタイプを取得するには:

....
{% form_theme form _self %}
{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% if not attr.class is defined %}
        class="{{ form.vars.block_prefixes.2 }}"
    {% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% elseif attrname == 'class' %}{{ attrname }}="{{ form.vars.block_prefixes.2 }} {{ attrvalue }}"{% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
{% block content %}
    ....
{% endblock %}
于 2012-11-03T12:50:30.750 に答える
2

block_prefixesフィールドを表示するブロック名を生成するために使用されます (cfFormRenderer::searchAndRenderBlockメソッド)。form_div_layout.html.twigテンプレート (通常はファイル)内の最も具体的な既存のブロックが表示されます。

したがって、最後の項目はblock_prefixes入力の id であり、特定のフィールドのブロックをオーバーライドできるようにします。

前のアイテムが必要なアイテムになります。

これを使用できます: $form->vars.block_prefixes[$form->vars.block_prefixes|count -2]smarty 構文で。

于 2015-05-05T13:44:39.077 に答える
1

配列インデックス (Symfony のバージョンに応じて 1 または 2) をハードコーディングするのを避けるために、以下を使用しました。

{{ form.vars.block_prefixes | slice(-2,1) | first }}
于 2015-02-24T11:29:59.387 に答える