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_modesemua 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 includedfile - file ini terlihat persis seperti Anda akan memasukkannya ke dalam node.preprocess.incfile, 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 fullmode tampilan dan yang lain untukteaser
Semoga ini bisa membantu, haruskah seseorang menemukan pertanyaan ini lagi (:
foo_preprocess_nodedengan mengimplementasikannyacall_user_func('_preprocess_' . $vars['type'], $vars);untuk menghindari pengulangan tetapi jika itu mungkin yang terbaik untuk tetap sederhana.