web-dev-qa-db-ja.com

Symfony2-FormBuilder-フィールドと入力にクラスを追加します

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つの場所で変更を加えるだけでよいので、これはもっと便利だと思いました。

だからこれをどうやってやるか、あるいは間違ったやり方を考えているのかもしれない。

どんな助けも素晴らしいでしょう、

どうもありがとう、フィリップ

19

フィールドのクラスはアプリケーションのプレゼンテーションレイヤーの一部であるため、フォーム用に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' %}

これは クックブック で詳細に説明されています

29
Visavì

次のようにできます:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('subject', 'text', array( 
            'label'  => 'Subject',
            'attr'   =>  array(
                'class'   => 'c4')
            )
        );
    }
}
44
Pappa

フォームのテーマ


フォームのレンダリング方法のあらゆる部分をカスタマイズできます。各フォームの「行」のレンダリング方法を変更したり、エラーのレンダリングに使用されるマークアップを変更したり、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テンプレート内のブロックは、フォーム出力を定義するためにグローバルに使用されるようになりました。

6
mukulu