ฉันเพิ่งมีปัญหาที่คล้ายกันซึ่งเป็นเหตุผลที่ 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 แต่อาจเป็นการดีที่สุดที่จะคงความเรียบง่ายไว้