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
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
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!
node.preprocess.inc
, di sini saya melakukan sesuatu seperti ini:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
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 dalam node.preprocess.inc
file, kecuali kami tidak memanggil fungsi preprocess lagi:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
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 untuk full
mode tampilan dan yang lain untukteaser
Semoga ini bisa membantu, haruskah seseorang menemukan pertanyaan ini lagi (:
foo_preprocess_node
dengan mengimplementasikannyacall_user_func('_preprocess_' . $vars['type'], $vars);
untuk menghindari pengulangan tetapi jika itu mungkin yang terbaik untuk tetap sederhana.