Postingan ini adalah sedikit komentar sebagai tanggapan terhadap beberapa postingan saya sebelumnya tentang penggunaan kembali template Twig internal untuk respons halaman penuh dan respons ajax.
Satu hal yang perlu diklarifikasi, karena saya tidak menjelaskannya, adalah bahwa ini hanya relevan jika fragmen HTML yang Anda kirim kembali adalah respons terhadap permintaan Ajax (dan fragmen itu sama dengan respons halaman penuh dikurangi bagian publik dari halaman). Jika respons Ajax Anda adalah XML atau JSON, teknik ini tidak masalah karena Anda sudah menggunakan templat yang berbeda. Dalam hal ini, Anda dapat mengganti templat menggunakan parameter rute _format, atau Anda mungkin ingin menggunakan FOSRestBundle.
Thomas Rabex Orang yang bertanggung jawab atas proyek Sonata menunjukkan bahwa perbaikan lebih lanjut dapat dilakukan dengan menggunakan variabel global Twig untuk mengisolasi nama templat untuk diperluas ke dalam konfigurasi. Artinya, pemilihan templat yang akan diperluas tidak lagi dikodekan ke dalam templat. Dalam aplikasi Symfony2, mudah untuk mendaftarkan variabel global dalam konfigurasi. Templat perantara sederhana tempat kita memutuskan apakah kita ingin memperluas templat lengkap atau templat ajax sekarang terlihat seperti ini:
{# app/Resources/views/layout.html.twig #}
{% extends app.request.xmlHttpRequest
? acme.templates.full
: acme.templates.partial %}
Tetapkan parameter global di file konfigurasi utama aplikasi:
# app/config/config.yml
twig:
globals:
acme:
templates:
full: "::ajax-layout.html.twig"
partial: "::full-layout.html.twig"
Saya juga menyebutkan bahwa jika logika dalam memutuskan templat mana yang akan digunakan lebih kompleks daripada operator ternary sederhana kita, pindahkan ke ekstensi Twig sehingga dapat diuji di luar templat. Hal ini dapat mengembalikan templat untuk digunakan, bukan hanya nilai boolean, dan memungkinkan pengambilan keputusan yang lebih kompleks.
Versi sederhana yang diperluas mungkin terlihat seperti ini:
namespace Acme\DemoBundle\Twig;
class DemoExtension extends \Twig_Extension
{
const FULL_TEMPLATE = '::full-layout.html.twig';
const PARTIAL_TEMPLATE = '::partial-layout.html.twig';
public function getFunctions()
{
return array(
'parent_template' => new \Twig_Function_Method($this, 'getParentTemplate'),
);
}
public function getParentTemplate()
{
if ($this->useFullTemplate()) {
return self::FULL_TEMPLATE;
}
return self::PARTIAL_TEMPLATE;
}
public function useFullTemplate()
{
//...
}
}
Sekarang kita dapat menghapus seluruh templat perantara dan memanggil fungsiranting dari templat bagian dalam:
{# src/Acme/DemoBundle/Resources/views/Product/new.html.twig #}
{% extends parent_template() %}
{% block title %}New product{% endblock %}
{% block body %}
{% endblock body %}
Dalam contoh ini, template di-hardcode sebagai konstanta kelas agar contoh tetap sederhana, hal ini dapat diubah untuk memasukkannya ke dalam ekstensi sehingga dapat bertahan dalam konfigurasi.