2017-02-16 7 views
2

symfonyフォームのレンダリングに小さな問題がありますので、まずはそのコンテキストについて説明します。Symfony Twigブロック生成の優先度

小枝では、ブロックはテンプレートに特定の順序で定義されています。

{# base.layout.html.twig #} 

{% block firstBlock %} 
{% endblock firstBlock %} 

{% block secondBlock %} 
{% endblock secondBlock %} 

をそして私たちは、このテンプレートを拡張するときに我々は、この書き込みをすることができますので、問題はフォームである

{# child.layout.html.twig #} 
{% embed "base.layout.html.twig" %} 

{% block secondBlock %} 
    {{ form_widget(form.submit_button) }} 
{% endblock secondBlock %} 

{% block firstBlock %} 
    {{ form_widget(form.some_field) }} 
    {{ form_rest(form) }} 
{% endblock firstBlock %} 

を()は、Symfonyフォームをレンダリングする小枝で機能します。

私はモーダルウィンドウ の最後に送信ボタンを生成しようとしていますが、form_rest()はまだレンダリングされていないフォームのすべての部分をレンダリングするという問題があります。 form.submit_buttonをレンダリングするform_restを避けるために少し修正があり

、それはで既にレンダリングフィールドとしてform.submit_button設定します:

{% do form.submit_button .setRendered %} 

しかし、このform.submit_buttonと

をレンダリングされることはありません

もちろん、このすべての最終的なことは、form_rest命令を削除しないことです。

私はform_rest命令の後にform.submit_buttonのレンダリングされた値を設定しないようにするか、テンプレートのブロック生成の順番を選択する方法を探します。このよう

{% block secondBlock with(1) %} 
    {{ form_widget(form.submit_button) }} 
{% endblock secondBlock %} 

{% block firstBlock with(2) %} 
    {{ form_widget(form.some_field) }} 
    {{ form_rest(form) }} 
{% endblock firstBlock %} 

はあなたの助けをありがとう!

+0

あなたが追加した場合、 '{{form_rest(フォーム)}}' 'secondBlock'か? – sakhunzai

+0

@sakhunzai私がこのようにすると私の見解は崩れてしまいます。問題は、テンプレート内の指定された位置にすべてのフォームフィールドをレンダリングし、同じテンプレートの下位に送信ボタンをレンダリングすることです。したがってbodyブロック(この例では 'firstBlock')と' footer'ブロック( 'secondBlock') – Tanaky

+0

は、Alain Tiembloが以下に示唆しているものを確認します – sakhunzai

答えて

0

送信ボタンだけの場合は、フォームタイプから削除してhtmlに書き込むことができます。問題なく動作します。

問題は、あなたが最初に(ボタン含む)、残りをレンダリングすることで、そしてもちろん

...あなたはボタンをレンダリングしようとするが、それはすでにレンダリングされた後、あなたのHTMLボタンを<フォーム内でなければなりません>タグ。

あなたのフォームタイプからご送信ボタンを維持したい場合は、

1ソリューションは、いくつかのJavaScriptを使用して、それを移動することです...

2ソリューションは、レンダリングされたとして、あなたが行っているとして(それをマークすることです)、あなたが望む場所に送信ボタンの正確なhtmlを書いてください。

[編集] フォームのすべてのフィールドを最初のブロックにレンダリングし、2番目のブロックに送信ボタンをレンダリングし、すべてのフィールドの後にform_restを置くこともできます(すべてのフィールドがレンダリングされているので、レンダリングする何か、 これはまた、溶液である)

+0

したがって、一般的な解決法はないと思います。 'form_rest()'命令を削除し、 'form_end()'が 'form_rest()'を呼び出すようにします。しかし、私は 'form_end()'命令の前に未レンダリングの可視入力がないことを確かめなければなりません。 – Tanaky

+0

はい、divとスタイルの表示で残りの部分を非表示にすることができます:none; @Alain Tiembloの回答もご覧ください – Constantin

0

それだけで何のロジックとまったくマッピングを持っていない送信ボタンの問題だ場合、最も簡単な方法は、直接HTMLであなたの送信ボタンをレンダリングすることですから、それを削除しますあなたのフォーム。

<input type="submit" value="Submit"> {# ¯\_(ツ)_/¯ #} 

別の解決策はmodal_layout.html.twigであなたのモーダルを入れ、その後、まさに問題のこの種のために作られembedタグを使用することです。

modal_layout.html.twig

<div class="modal"> 
    <div class="form"> 
    {% block form_part %}{% endblock %} 
    </div> 
    <div class="submit pull-right"> 
    {% block submit_part %}{% endblock %} 
    </div> 
</div> 

your_page.html.twig

{% embed 'modal_layout.html.twig' %} 
    {% block submit_part %} 
     {{ form_row(form.submit_button) }} 
    {% endblock %} 
    {% block form_part %} 
     {{ form(form) }} {# won't render submit again #} 
    {% endblock %} 
{% endembed %} 

しかし、IMO、それはクリーナー表示された場合でも、そのために価値がない第二の溶液ありません愚かな送信ボタン。

乾杯