Symfony2内から特定の入力またはラベルフィールドにクラスを追加したい。
Twig内のフォームで次のようなことができます。
<div class="row">
{{ form_label(form.subject) }}
{{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }}
</div>
それはうまくいきます。ただし、すべてのフォームにテンプレートを設定する必要があります。そして、可能な限り最小の出力レベルに分解する必要があります。私は実際に使用したい:
{{ form_widget(form) }}
だから、私はlのCSSクラスをどこに追加することができるか考えていました:
class SystemNotificationType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options) {
$builder ->add('subject', 'text', array( 'label' => 'Subject' ) )
–
1つの場所で変更を加えるだけでよいので、これはもっと便利だと思いました。
だからこれをどうやってやるか、あるいは間違ったやり方を考えているのかもしれない。
どんな助けも素晴らしいでしょう、
どうもありがとう、フィリップ
フィールドのクラスはアプリケーションのプレゼンテーションレイヤーの一部であるため、フォーム用にtwigテーマを作成するのが最善です:
ファイルを作成するfields.html.twig
in Resources/views/Form
をバンドルし、フォーム行のフォーマット方法を定義します。次に例を示します。
{% block field_row %}
<div class="row">
{{ form_errors(form) }}
{{ form_label(form) }}
{{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock field_row %}
特定のフィールド、たとえばfieldName
という形式のフィールドformName
のみをカスタマイズする場合は、行をカスタマイズします。
{% block _formName_fieldName_row %}
<div class="row">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock %}
[〜#〜] edit [〜#〜]:フィールドのみをカスタマイズします:
{% block _formName_fieldName_widget %}
{% set type = type|default('text') %}
<input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" class="c4" />
{% endblock %}
次に、このテーマを使用するすべてのフォームテンプレートに以下を追加します。
{% form_theme form 'MyBundle:Form:fields.html.twig' %}
これは クックブック で詳細に説明されています
次のようにできます:
class SystemNotificationType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options) {
$builder->add('subject', 'text', array(
'label' => 'Subject',
'attr' => array(
'class' => 'c4')
)
);
}
}
フォームのテーマ
フォームのレンダリング方法のあらゆる部分をカスタマイズできます。各フォームの「行」のレンダリング方法を変更したり、エラーのレンダリングに使用されるマークアップを変更したり、textareaタグのレンダリング方法をカスタマイズすることもできます。制限はありません。さまざまなカスタマイズをさまざまな場所で使用できます。
Symfonyはテンプレートを使用して、ラベルタグ、入力タグ、エラーメッセージなど、フォームのすべての部分をレンダリングします。
Twigでは、各フォームの「フラグメント」はTwigブロックで表されます。フォームのレンダリング方法の一部をカスタマイズするには、適切なブロックをオーバーライドする必要があります。
PHPでは、各フォーム「フラグメント」は個別のテンプレートファイルを介してレンダリングされます。フォームのレンダリング方法の一部をカスタマイズするには、新しいテンプレートを作成して既存のテンプレートをオーバーライドするだけです。
これがどのように機能するかを理解するには、form_rowフラグメントをカスタマイズし、各行を囲むdiv要素にクラス属性を追加します。これを行うには、新しいマークアップを保存する新しいテンプレートファイルを作成します。
{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #}
{% block form_row %}
{% spaceless %}
<div class="form_row">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}
Form_row関数を介してほとんどのフィールドをレンダリングする場合、form_rowフォームフラグメントが使用されます。上記で定義した新しいform_rowフラグメントを使用するようにフォームコンポーネントに指示するには、フォームをレンダリングするテンプレートの上部に次を追加します。
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig'
'AcmeTaskBundle:Form:fields2.html.twig' %}
{{ form(form) }}
Form_themeタグ(Twig内)は、指定されたテンプレートで定義されたフラグメントを「インポート」し、フォームをレンダリングするときにそれらを使用します。つまり、このテンプレートの後半でform_row関数が呼び出されると、(Symfonyに同梱されているデフォルトのform_rowブロックの代わりに)カスタムテーマのform_rowブロックが使用されます。
カスタムテーマですべてのブロックをオーバーライドする必要はありません。カスタムテーマでオーバーライドされないブロックをレンダリングすると、テーマエンジンはグローバルテーマ(バンドルレベルで定義)にフォールバックします。
複数のカスタムテーマが提供されている場合、グローバルテーマにフォールバックする前に、リストされた順序でそれらが検索されます。
フォームの任意の部分をカスタマイズするには、適切なフラグメントをオーバーライドするだけです。オーバーライドするブロックまたはファイルを正確に知ることは、次のセクションの主題です。
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig',
'AcmeTaskBundle:Form:fields2.html.twig'] %}
詳細については、レンダリングのカスタマイズ方法 in Symfony cookbookを参照してください。
グローバルフォームテーマ
上記の例では、form_themeヘルパー(Twig内)を使用して、カスタムフォームフラグメントをそのフォームに「インポート」しました。プロジェクト全体にフォームのカスタマイズをインポートするようにSymfonyに指示することもできます。
小枝
すべてのテンプレートで以前に作成したfields.html.twigテンプレートからカスタマイズしたブロックを自動的に含めるには、アプリケーション構成ファイルを変更します。
# app/config/config.yml
twig:
form:
resources:
- 'AcmeTaskBundle:Form:fields.html.twig'
Fields.html.twigテンプレート内のブロックは、フォーム出力を定義するためにグローバルに使用されるようになりました。