私のフォームにはいくつかのチェックボックスがありますが、デフォルトでは 私が持っています :
SYmfony2によって生成されたHTMLコードは次のとおりです。
<div>
<input ...>
<label ...></label>
<input ...>
<label ...></label>
</div>
何 が欲しいです 持っていることです:
最初のラジオウィジェット最初のラベル
2番目のラジオウィジェット2番目のラベル
HTMLコードは次のようになります。
<label .....><input ....></label>
Choice_widgetをオーバーライドする必要があると思いますが、入力とラベルを同じ行に配置する方法がわかりません
これは私がオーバーライドする必要があるかもしれないchoice_widgetです:
{% block choice_widget %}
{% spaceless %}
{% if expanded %}
<div {{ block('widget_container_attributes') }}>
{% for child in form %}
{{ form_widget(child) }} {{ form_label(child) }}
{% 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 choice_widget %}
_ブロックをオーバーライドする必要があることは正しいです。最初のステップは、別のラベルを印刷する_{% if expanded %}
_セクションから{{ form_label(child) }}
行を削除することです。
_{% 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 %}
_
Alberto GaonaとJamesの助けを借りて、BS3ラジオとチェックボックスを統合するSymfony 2.4の正しいソリューションは次のとおりです。
あなたの見解では:
{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}
// A radio or checkbox input
{{ form_widget(form.example) }}
次に、fields.html.twig(これは https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twigをオーバーライドします) ;参照 http://symfony.com/doc/current/cookbook/form/form_customization.html )
{# src/Acme/DemoBundle/Resources/views/Form/fields.html.twig #}
{% block choice_widget_expanded %}
{% spaceless %}
<div {{ block('widget_container_attributes') }}>
{% for child in form %}
{% if multiple %}
<div class="checkbox">
{% else %}
<div class="radio">
{% endif %}
{{ form_widget(child) }}
</div>
{% endfor %}
</div>
{% endspaceless %}
{% endblock choice_widget_expanded %}
{% block checkbox_widget %}
{% spaceless %}
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
<label for="{{ id }}">
<input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}
</label>
{% endspaceless %}
{% endblock checkbox_widget %}
{% block radio_widget %}
{% spaceless %}
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
<label for="{{ id }}">
<input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />{{ label|trans({}, translation_domain) }}
</label>
{% endspaceless %}
{% endblock radio_widget %}
注:Symfony 2.3の更新されたボブFソリューション( https://github.com/symfony/symfony/blob/2.3/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twigを参照) ):
Choice_widget_expandedをオーバーライドします。
{% block choice_widget_expanded %}
{% spaceless %}
<div {{ block('widget_container_attributes') }}>
{% for child in form %}
{{ form_widget(child) }}
{% endfor %}
</div>
{% endspaceless %}
{% endblock choice_widget_expanded %}
上書きチェックボックス(ブートストラップスタイル):
{% block checkbox_widget %}
{% spaceless %}
<label for="{{ id }}" class="checkbox {% if checked %}checked{% endif %}" ><span class="icons"><span class="first-icon fui-checkbox-unchecked"></span><span class="second-icon fui-checkbox-checked"></span></span><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 %}
{% 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 %}
ラベルがレンダリングされると、for
属性が含まれます-これにより、label
がinput
にリンクされます- ここでlabel
のドキュメントを参照してください) 出力を提案したものに変更することは、label
とinput
をリンクするもう1つの方法です
ラベルを入力の左側に表示する場合は、テンプレートを次のように変更する必要があります。
{% for child in form %}
<div>
{{ form_label(child) }} {{ form_widget(child) }}
</div>
{% endfor %}
label
の前にinput
をレンダリングし、次の出力を作成します
<div>
<div>
<label ...></label>
<input ...>
</div>
<div>
<label ...></label>
<input ...>
</div>
</div>
次に、CSSスタイルを適用してインラインで表示することができます。
div label {
display: inline-block;
width: 200px;
}
デフォルトでは、CSSがない場合、label
はinput
の前にこのHTMLレイアウトで整列しますが、inline-block
は、width
属性を使用して、ラベルテキストの長さに関係なく、すべてのフィールドが正しく配置されるようにすることもできます。
フォーム入力をlabelタグ内に配置すると、HTMLが壊れます。
あなたの目標は何ですか?ラベルと入力をブラウザの同じ行に表示するだけの場合は、cssを使用できます。
input, label {
display: inline;
}
Symfony 3以降では、radio-inlineクラスをlabel_attrを介してフォームに渡すだけです。
$builder->add('type', ChoiceType::class, [
'expanded' => true,
'label_attr' => ['class' => 'radio-inline']
]);
カスタムウィジェットなどを作成する必要はありません...
ベンダーディレクトリ(src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig)でSymfonyが提供するbootstrap_4_layout.html.twigを見て、これらのことを推測できます。
お役に立てれば。
Symfony 2.4では、これは期待どおりに機能しません。
{% 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 %}
...ラベルは使用できません。以下を追加する必要があります。
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
したがって、完全なソリューションは次のとおりです。
{% block checkbox_widget %}
{% if label is empty %}
{% set label = name|humanize %}
{% endif %}
{% 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 %}
ラベルはかなり簡単なので、私は個人的にそれを手動でレンダリングすることを好みました。
あなたの小枝で素早く汚い:
<label for="field">
{{ form_widget(form.field) }} Field Label
</label>
Symfonyがこれに対するより簡単な解決策を持っているなら、私はそれを望んでいたでしょう。
もちろん、上記の答えはおそらくよりエレガントで、そうではありません。 ;)