Berikut sekilas salah satu cara menggunakan tindakan pengontrol yang sama dan templat Twig (atau hanya templat) untuk menampilkan halaman penuh serta konten dalam permintaan Ajax dalam aplikasi Symfony2. Hal ini dilakukan dengan menggunakan kemampuan untuk secara dinamis mengatur dari template mana template Twig berasal (ini ditunjukkan dalam file Twig).
Jadi katakanlah kita mempunyai template internal saat ini yang terlihat seperti ini:
{# src/Acme/DemoBundle/Resources/views/Product/new.html.twig #}
{% extends '::full-layout.html.twig' %}
{% block title %}New product{% endblock %}
{% block body %}
{% endblock body %}
Ini memperluas templat tata letak utama kita, menambahkan sisa halaman, header, footer, dll. Untuk permintaan Ajax, kami hanya ingin konten blok body ditampilkan, kami tidak ingin konten eksternal apa pun disediakan oleh templat utama, dan kami tidak tertarik dengan blok judul. Kita dapat mencapai hal ini dengan membuat template eksternal Ajax alternatif yang hanya merender body blok, seperti ini:
{# app/Resources/views/ajax-layout.html.twig #}
{% block body %}{% endblock body %}
Kemudian di template internal kita, kita dapat menggunakan cakupan aplikasi untuk mengetahui apakah itu permintaan Ajax:
{# src/Acme/DemoBundle/Resources/views/Product/new.html.twig #}
{% extends app.request.xmlHttpRequest
? '::ajax-layout.html.twig'
: '::full-layout.html.twig' %}
{# ... #}
Catatan: Jika Anda menggunakan Twig di luar Symfony2, Anda perlu menambahkan cara lain untuk mengidentifikasi apakah itu permintaan Ajax.
Sesederhana itu. Namun, kami dapat menambahkan perbaikan untuk menghindari duplikasi pemeriksaan ini di beberapa templat internal. Anda dapat menyimpannya dalam satu templat dengan menambahkan templat perantara yang hanya berisi logika tersebut dan memperluas templat bagian dalam darinya:
{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest
? '::ajax-layout.html.twig'
: '::full-layout.html.twig' %}
{# src/Acme/DemoBundle/Resources/views/Product/new.html.twig #}
{% extends '::layout.html.twig' %}
{# ... #}
Situasi lain yang mungkin terjadi di mana Anda mungkin memerlukan solusi seperti itu adalah ketika templat terkadang harus dirender sebagai permintaan utama dan terkadang sebagai subpermintaan. Satu-satunya perbedaan nyata di sini adalah logika memeriksa template mana yang akan diperluas. Dengan meneruskan parameter saat merender subpermintaan, Anda dapat memeriksa:
{# ... #}
{% render url("inner_route", { 'partial': true }) with {}, { 'standalone': true } %}
{# ... #}
{# app/Resources/views/layout.html.twig #}
{% extends app.request.partial
? '::full-layout.html.twig'
: '::partial-layout.html.twig' %}
Jika Anda perlu membuat keputusan berdasarkan kombinasi alasan ini dan alasan lainnya, ada baiknya memindahkan logika yang terlibat ke dalam fungsi menggunakan ekstensi Twig, yang kemudian dapat diuji di luar templat.