ฉันเพิ่งมีปัญหาที่คล้ายกันซึ่งเป็นเหตุผลที่ google นำฉันมาที่หน้านี้: ฟังก์ชั่นการเตรียมประมวลผลโหนดของฉันเติบโตขึ้นอย่างมากขนาดใหญ่ที่ฉันจะแยกฟังก์ชั่นออกเป็นหลายไฟล์
ฉันได้ทำวิธีที่คล้ายกันแล้วในไฟล์ template.php ซึ่งมีฟังก์ชั่นการเปลี่ยนแปลงทั้งหมดและเนื่องจากวิธีการเดียวกันนี้ทำงานได้ดีอย่างสมบูรณ์แบบที่นี่ฉันคิดว่าฉันจะแบ่งปันวิธีการของฉัน:
ตั้งค่าไฟล์ภายในโฟลเดอร์MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
คุณควรมีอยู่แล้วnode.preprocess.inc
คนอื่น ๆ ที่คุณสามารถสร้างตัวเอง วิธีที่คุณเรียกพวกเขาว่าเป็นเรื่องที่ค่อนข้างไร้เหตุผล แต่ควรให้ชื่อที่ระบุอย่างชัดเจนและเหมาะสมกับระบบการตั้งชื่อ drupal
เป็นต้นไปกับเนื้อหาของไฟล์เหล่านี้!
node.preprocess.inc
ที่นี่ฉันกำลังทำอะไรแบบนี้:
<?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
}
โดยทั่วไปแล้วเราสลับผ่านชนิดของโหนดปัจจุบัน สิ่งที่คุณเปลี่ยนไปนั้นขึ้นอยู่กับคุณ #id
, #view_mode
ทั้งหมดขึ้นอยู่กับความต้องการของคุณ
เมื่อมีการแข่งขันมันจะโหลดไฟล์ที่ระบุและดำเนินการกับเนื้อหาของมันราวกับว่ามันถูกเขียนในฟังก์ชั่นนี้
เนื้อหาของincluded
ไฟล์เหล่านี้ดูเหมือนว่าคุณจะใส่ไว้ในnode.preprocess.inc
ไฟล์ยกเว้นว่าเราจะไม่เรียกฟังก์ชัน preprocess อีกครั้ง:
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;
}
//...
โดยทั่วไปคุณสามารถทำสิ่งนี้กับไฟล์ได้มากเท่าที่คุณต้องการและแม้แต่เรียงซ้อนสวิตช์หลายตัวตัวอย่างเช่นการแยกไฟล์ preprocess โหนดเฉพาะเพิ่มเติมขึ้นอยู่กับการ#view_mode
มีไฟล์หนึ่งไฟล์สำหรับfull
โหมดมุมมองและอีกอันสำหรับteaser
หวังว่าสิ่งนี้จะช่วยได้ถ้ามีคนเคยเจอคำถามนี้อีกครั้ง (:
foo_preprocess_node
โดยการใช้มันcall_user_func('_preprocess_' . $vars['type'], $vars);
เพื่อหลีกเลี่ยงการทำซ้ำ ifs แต่อาจเป็นการดีที่สุดที่จะคงความเรียบง่ายไว้