Apakah ada cara untuk mengganti output halaman dari modul yang disumbangkan dan mengeluarkan html.tpl.php Anda sendiri, secara efektif mengendalikan output dari tema?
Saya ingin melakukan ini dalam upaya untuk membuat pengalaman login / registrasi yang unik, tetapi sepertinya hanya bisa mengesampingkan templat tingkat halaman, bukan templat level html. Saya melihat bahwa modul cetak melakukan ini, tetapi apakah itu cara untuk mendekatinya?
hook_menu_alter()
untuk mengubahdelivery callback
jalur pengguna / masuk ke versi Anda sendiridrupal_deliver_html_page()
. Itu akan memberi Anda kendali mutlak atas apa yang ditampilkan di layar, meskipun itu berarti mengatur tajuk yang tepat sendiriajax_deliver()
fungsi, yang mendapat sama$page_callback_result
sepertidrupal_html_deliver_page()
tetapi proses itu berbeda. Saya tidak yakin apakah Anda dapat menghentikan proses lebih jauh dengan cara yang berarti sebelum mesin tema terlibatusing_views_api_mode
dimatikan.Jawaban:
Menurut jawaban ini , Anda cukup mencetak konten halaman dalam panggilan balik halaman menu daripada mengembalikannya.
Saya kira modul Cetak menerapkan halaman ramah-printer dengan cara ini. Berikut ini adalah cuplikan kode dari modul.
Menurut ini, modul menggunakan templat HTML khusus
print.tpl.php
. Ini adalah template tingkat HTML. Modul kemudian mendapatkan HTML dengan memanggiltheme('print',...)
dan merendernya langsung ke browser menggunakanprint $html;
.Inilah ide umum untuk tujuan Anda: mymodule.module
Templat: mylogin.tpl.php
Saya harap ini akan menyesuaikan halaman login Anda sesuai kebutuhan.
sumber
Kedua @Sithu dan @Ayesh K telah menyediakan jawaban yang besar. Dalam contoh ini, saya akan menggabungkan metode @ Ayesh dan bagian dari kode @ Sithu untuk solusi yang lengkap.
hooks_menu atau hook_menu_alter fungsi keduanya memberikan
delivery callback
, yang menginstruksikan Drupal pada bagaimana Anda ingin kode Anda dibungkus. Secara default, Drupal menetapkandelivery callback
ke drupal_deliver_html_page () , yang secara kasar memberi tahu Drupal untuk membungkus halaman Anda denganhtml.tpl.php
danpage.tpl.php
.Untuk memodifikasi cara Drupal membungkus halaman Anda, salin fungsi
drupal_deliver_html_page()
ke modul Anda, dan modifikasi itu. Kemudian panggil fungsi baru Anda didelivery callback
. Drupal kemudian akan menggunakan fungsi itu untuk membungkus halaman Anda.Contoh
Berikut adalah modul yang berfungsi. Masukkan kode berikut ke dalam
/sites/all/modules/MYMODULE
direktori Anda dan aktifkan modul.Secara opsional, untuk mengganti jalur yang ada, gantikan
hook_menu
denganhook_menu_alter
.MYMODULE.module
MYMODULE.info
MYMODULE.tpl.php
MYMODULE.css
sumber
Saya pikir Anda perlu menginvestasikan waktu untuk menemukan kait yang paling tepat untuk ini. Anda dapat mencoba
hook_page_alter untuk mengubah "apa yang akan diberikan",
gunakan hook_menu_alter untuk mengubah callback pengiriman untuk login dan mendaftar router menu,
gunakan halaman - file user-login.tpl.php untuk mengambil alih templat halaman dari halaman login,
tambahkan beberapa saran template di template.php untuk menggunakan file html.tpl.php yang berbeda hanya untuk jalur login,
atau akhirnya, hook_theme_regitry_alter , untuk mengubah tema registry dan melakukan apa yang ingin Anda lakukan (perubahan html.tpl.php)
sumber
hook_theme_registry_alter()
mungkin tidak berfungsi karena kemungkinan besar akan mengubah templat untuk semua halaman, tetapidelivery callback
pasti akan berfungsi. Saya juga telah menjelajahi metode ini dalam jawaban saya, di sini.