Saya memiliki beberapa jenis konten yang harus saya preproses dengan cara yang berbeda. Jadi template.php
dalam tema saya foo
saat ini terlihat seperti:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Saya ingin dapat menentukan fungsi preproses khusus Drupal yang akan menghubungkan nama mesin tipe konten. Saya mencoba menggunakan foo_preprocess_news
tetapi tidak pernah dipanggil.
Apakah ada cara yang lebih baik?
foo_preprocess_node
dengan mengimplementasikannyacall_user_func('_preprocess_' . $vars['type'], $vars);
untuk menghindari pengulangan tetapi jika itu mungkin yang terbaik untuk tetap sederhana.hook_preprocess_node()
pada modul khusus, dan berharap itu akan membatasi ketika kait dipanggil, tetapi tidak. Adakah cara untuk membatasi ketika hook dipanggil oleh tipe konten?if ($vars['node']->type == 'foo') { ...
akan mencapai efek yang Anda carihook_block_view_MODULE_DELTA_alter()
. Saat ini saya melakukan apa yang Anda katakan, tetapi berharap ada cara untuk membatasi kapan kailnya mengenai.Subtema zen menyelesaikan ini dengan menambahkan ini ke fungsi theme_preprocess_node-nya:
Jika Anda memiliki tipe konten yang disebut 'berita', maka Anda dapat membuat fungsi yang disebut foo_preprocess_node_news di file template.php Anda.
sumber
Saya hanya punya masalah serupa yang menyebabkan Google membawa saya ke halaman ini: fungsi preprocess node saya tumbuh sangat besar, sehingga saya lebih suka membagi fungsi menjadi beberapa file.
Saya sudah melakukan pendekatan yang serupa di file template.php saya yang berisi semua fungsi alter, dan karena metode yang sama bekerja dengan baik di sini, saya pikir saya akan membagikan pendekatan saya:
pengaturan file di dalam folder
MYTHEME/preprocess
:Anda seharusnya sudah memiliki
node.preprocess.inc
, yang lain Anda dapat membuat sendiri. bagaimana Anda memanggil mereka sebenarnya agak sewenang-wenang, tetapi lebih baik memberi mereka nama yang mengidentifikasi mereka dengan baik dan cocok dengan seluruh sistem penamaan drupal.selanjutnya ke konten file-file ini!
kami pada dasarnya beralih melalui jenis node saat ini. apa yang Anda beralih terserah Anda;
#id
,,#view_mode
semua tergantung kebutuhan Anda.sekali ada kecocokan, itu akan memuat file yang ditentukan dan bertindak atas isinya sama seperti itu ditulis tepat di dalam fungsi ini.
konten
included
file - file ini terlihat persis seperti Anda akan memasukkannya ke dalamnode.preprocess.inc
file, kecuali kami tidak memanggil fungsi preprocess lagi:Anda pada dasarnya dapat melakukan ini dengan banyak file yang Anda inginkan dan bahkan membuat banyak switch, misalnya lebih lanjut membagi file preprocess node tertentu tergantung pada
#view_mode
, memiliki satu file untukfull
mode tampilan dan yang lain untukteaser
Semoga ini bisa membantu, haruskah seseorang menemukan pertanyaan ini lagi (:
sumber
call_user_func()
tidak lulus parameter dengan referensi. Jadi, jika fungsi$variables
Anda hanyapreprocess_foo()
akan bekerja pada salinan array asli; perubahan pada non-objek tidak akan berlaku selama proses render yang tersisa.sumber
Di hook_preprocess_node utama Anda, Terapkan kode berikut di akhir
Jadi Anda sekarang akan memiliki preprocess dengan tipe node
sumber