web-dev-qa-db-ja.com

Symfony2-> Twig->フォーム->フィールド->レンダリング設定= true

簡単な問題があります。

たとえば、フィールドのあるフォームがあります:

$builder
    ->add('x')
    ->add('y')
    ->add('z')
;

私のtwigファイルでは、複数のブロックを使用しており、フィールドのレンダリングを停止したいのですが... b.html.twigファイルを表示します!

a.html.twig

{% block body %}
    {% block form %}
        {{ form_widget(form) }}
    {% endblock form %}
{% endblock body %}

b.html.twig

{% block form %}
    {{ form.x.set('rendered', true) | default() }}
    {{ parent() }}
{% endblock form %}

「default()」を削除すると、エラーが発生し、オブジェクトを文字列に変換できません。そして実際には、フォームはすべてのフィールドをレンダリングします... xフィールドを含みます。しかし、それらはxフィールドをレンダリングすべきではありません...

よろしくお願いします!

24
PatrickB

ここに質問がありませんか?単純な呼び出しではないのに、フィールドをレンダリング済みに設定したい場合は、次のようにします。

{% do form.x.setRendered %}

誤解した場合は、お詫び申し上げます。

78
Comstar

次の終了フォームステートメントを使用して、フォームで定義されているがテンプレートには記述されていないフォームフィールドがレンダリングされないようにすることができます。

_{{ form_end(form, {'render_rest': false}) }}
_

たとえば、次のフォームを定義します。

_public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'id',
            HiddenType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'name',
            TextType::class,
            array(                                     
                'required' => false
            )
        )
        ->add(
            'comment',
            TextType::class,
            array(
                'required' => false
            )
        )
        ->add(
            'amount',
            TextType::class,
            array(
                'required' => false
            )
        );
}
_

このフォームでは次のテンプレートについて説明しますが、フィールドidをレンダリングしたくないので、_render_rest_ブロックでオプション_form_end_を使用して、フィールドidのレンダリングを省略できます。

_{# render opening form tag #}
{{ form_start(form) }}
{# render field with label #}
{{ form_row(form.name) }}
{# render only field #}
{{ form_widget(form.comment) }}
{# render only label #}
{{ form_label(form.amount) }}

{# render only field #}
{{ form_widget(form.amount) }}

{# if csrf token is enabled for form render field #}
{% if form._token is defined %}
{{ form_widget(form._token) }}
{% endif %}

{# render closing form tag and do not render rest form elements #}
{{ form_end(form, {'render_rest': false}) }}
_
6
Roman

なんらかの決定ロジックを含めることにより、FormTypeのフォームフィールドを削除(または追加のみ)する必要があります。

たとえば、cerain変数の存在/値をチェックします。

次に、この変数をコンストラクターに注入できます。

テンプレートから削除するのは、テンプレートに属さないアプリケーションロジックです。

他に選択肢がない場合は、 FormView :: setRendered() メソッドを確認してください。

Twigs attribute function を使用して、オブジェクトのメソッドにアクセスできます。

{{ attribute(object, method, arguments) }}
4