Drupal ไม่ขอเรียกใช้ตะขอของฉัน


9

ฉันกำลังพัฒนาโมดูล แต่ hooks ที่ฉันเพิ่มไม่ได้ถูกเรียกใช้จาก Drupal มันเกิดขึ้นกับเบ็ดมากกว่าหนึ่งอัน

ฉันอ่านเอกสารประกอบของ hooks และฉันไม่พบสิ่งใดที่จะอธิบายว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันยืนยันว่าฉันใช้พารามิเตอร์ที่ถูกต้องและส่งคืนค่าที่ถูกต้อง

ผมทำอะไรผิดหรือเปล่า? มีอะไรที่ฉันขาดหายไปไหม


คำถามนี้ถือว่าเป็นคำถามที่ยอมรับได้สำหรับคำถามเหล่านั้นเกี่ยวกับ hooks ที่ไม่ถูกเรียกใช้โดย Drupal
kiamlaluno

คำตอบ:


13

เมื่อพัฒนาโมดูลคุณควรคำนึงถึงหมายเหตุต่อไปนี้

  • การนำไปปฏิบัติของ hook ที่ทำจากโมดูลนั้นเป็นฟังก์ชั่นที่มีชื่อถูกนำหน้าด้วยชื่อย่อโมดูล (เรียกอีกอย่างว่าชื่อเครื่อง ); จากชื่อเบ็ดถอดส่วนฮุกและแทนที่ด้วยชื่อโมดูลเครื่อง ยกตัวอย่างเช่นการดำเนินการhook_menu()ทำได้จาก example.module example_menu()คือ หากโมดูลคือ example_menu.module และฟังก์ชั่นนั้นคือexample_menu()นั่นก็ไม่ถือว่าเป็นการhook_menu()ใช้งานสำหรับ example_menu.module
    นอกจากนี้ยังหมายความยกตัวอย่างเช่นว่าhook_form_alter()การดำเนินการใน example_form.module ไม่ได้แต่example_form_alter() example_form_form_alter()เป็นอีกตัวอย่างหนึ่งการใช้งานที่hook_form_FORM_ID_alter()ทำเพื่อแก้ไขแบบฟอร์มที่ส่งคืนจากuser_register_form()จาก example.module ไม่ใช่example_form_user_register_alter()แต่example_form_user_register_form_alter(). (ID ของฟอร์มคือuser_register_form )

  • โดยทั่วไปใช้อักษรตัวพิมพ์ใหญ่ในชื่อเครื่องโมดูลไม่ได้สร้างปัญหา: PHP ไม่ได้ทำให้ความแตกต่างระหว่างmyModule_get_value()และmymodule_get_value()และ$value = myModule_get_value()จะเรียกอย่างใดอย่างหนึ่งหรือmyModule_get_value() แม้ว่าจะมีกรณีที่ใช้อักขระตัวพิมพ์ใหญ่ในชื่อเครื่องโมดูลจะทำให้เกิดปัญหา: เมื่อกำหนด hooks การปรับปรุงสำหรับโมดูล ฟังก์ชั่นที่ส่งคืนรายการของการปรับปรุงที่มีอยู่มีรหัสต่อไปนี้mymodule_get_value()
    drupal_get_schema_versions()

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }
    

    บรรทัดสุดท้ายที่ดำเนินการจากdrupal_get_schema_versions()นั้นคือบรรทัดต่อไปนี้

    return empty($updates[$module]) ? FALSE : $updates[$module];

    หากชื่อโมดูลคือ myModule.module drupal_get_schema_versions('myModule')จะส่งคืนเฉพาะฟังก์ชันที่มีชื่อที่ขึ้นต้นด้วย myModule_update และลงท้ายด้วยตัวเลข ฟังก์ชั่นเช่นmymodule_update_7120()นี้จะไม่ถูกรวมไว้เนื่องจากนิพจน์ทั่วไปที่ใช้จากตัวdrupal_get_schema_versions()พิมพ์เล็กและใหญ่ สิ่งนี้ยังใช้กับ Drupal 8 เนื่องจากการแสดงออกปกติยังคงเหมือนเดิมที่ใช้ใน Drupal 7

  • ตะขอบางอย่างถูกเรียกในช่วงเวลาเฉพาะ ตัวอย่างเช่นhook_menu()และhook_menu_alter()ถูกเรียกใช้จาก Drupal 7 หลังจากโมดูลถูกเปิดใช้งาน / ปิดใช้งานหรือเมื่อแคชสำหรับข้อมูลเราเตอร์ถูกลบทิ้ง hook_init()ไม่ได้เรียกใช้สำหรับหน้าแคช
    เมื่อตะขอถูกเรียกใช้เนื่องจากมีเหตุการณ์เฉพาะเกิดขึ้นพวกเขาจะไม่ถูกเรียกอีกครั้งจนกว่าเหตุการณ์ที่คล้ายกันจะไม่เกิดขึ้น พวกเขาจะไม่ถูกเรียกในการร้องขอหน้าสองต่อเนื่อง

  • Drupal เก็บรายการของ hooks ที่นำมาใช้จากโมดูล หากคุณกำลังแก้ไขรหัสของโมดูลที่เปิดใช้งานเพื่อเพิ่ม hooks ใหม่ก่อนอื่นคุณต้องปิดการใช้งานและเปิดใช้งานโมดูลอีกครั้งมิฉะนั้น Drupal จะไม่สังเกตเห็นว่ามี hooks ใหม่

  • ตรวจสอบให้แน่ใจว่าreturnคำสั่งไม่ได้แอบเข้ามาในฟังก์ชั่น hook ของคุณในระหว่างการเปลี่ยนโครงสร้าง มีความเป็นไปได้ที่จะทำลายไม่เพียงแค่ตะขอที่ปรากฏ แต่จะทำให้เกิดปฏิกิริยาลูกโซ่ที่แตกตัวตะขออื่นด้วยเช่นกันทำให้ปัญหาในการค้นหายาก


นอกจากนี้ยังอาจคุ้มค่าที่จะพูดถึงความผิดพลาดของฉันเพื่อประโยชน์ของผู้อื่นในอนาคต: อย่ากำหนดเนมสเปซในไฟล์. modmodule ของคุณ (หรืออื่น ๆ "แบน", PHP ที่ไม่ใช่คลาส) มิฉะนั้น Drupal จะไม่รู้จักไฟล์ของคุณดังนั้นจะไม่ค้นพบ hooks ที่กำหนดไว้ในนั้น
Balu Ertl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.