Theme hooks vs โมดูล hooks


10

บางครั้งเมื่อฉันพยายามที่จะใช้ตะขอเพียงตระหนักว่ามันควรจะอยู่ในไฟล์โมดูล

มีวิธีการรู้หรือไม่ว่า hooks ใดที่สามารถนำไปใช้ในไฟล์ template.php ของชุดรูปแบบหรือหนึ่งอันในโมดูล


4
โดยทั่วไปเมื่อตะขอไม่พร้อมที่จะถูกแทนที่ในชุดรูปแบบมันเป็นเหตุผลที่ดี ชุดรูปแบบควรเป็นรหัสที่เกี่ยวข้องกับการแสดงเนื้อหาและฟังก์ชันการทำงานที่โมดูลมีให้ รหัสที่เพิ่ม / ลบ / เปลี่ยนฟังก์ชั่นหรือเนื้อหามักจะอยู่ในโมดูล ลองคิดถึงความจริงที่ว่าถ้าคุณเปลี่ยนธีมคุณจะสูญเสียการปรับแต่งใด ๆ ที่ทำใน template.php ดังนั้นหากคุณทำการเปลี่ยนแปลงที่คุณอาจต้องการที่จะรักษาถ้าคุณเคยเปลี่ยนธีมแล้วแน่นอนว่าจะต้องไปในโมดูล
rooby

คำตอบ:


11

โดยทั่วไปแล้วการแก้ไข hooks สามารถใช้งานได้โดยธีมเท่านั้นซึ่งหมายความว่า hooks like hook_form_alter()and hook_menu_alter()หรือในระยะสั้น hooks เหล่านั้นทั้งหมดที่ถูกเรียกใช้drupal_alter()ใน Drupal 7 และต่ำกว่า ( ModuleHandler()::alter()หรือThemeManager::alter()ใน Drupal 8)

ตะขออื่น ๆ ซึ่งถูกเรียกใช้โดยmodule_invoke_all()( ModuleHandler::invokeAll()ใน Drupal 8) ไม่ได้ถูกเรียกใช้สำหรับชุดรูปแบบเพียงเพราะรหัสไม่ได้ตรวจสอบว่าชุดรูปแบบที่เปิดใช้งานในปัจจุบันกำหนดเบ็ดใด ๆ

  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }

ใน Drupal 8 ที่ModuleHandlerตะขอจะเรียกระดับการดำเนินการจากโมดูลและThemeManagerจะเรียกระดับตะขอดำเนินการตามรูปแบบเฉพาะการดำเนินการชั้นแรกและinvoke() invokeAll()ซึ่งหมายความว่าในชุดรูปแบบ Drupal 8 จะไม่ถูกเรียกใช้โดย Drupal core

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

  // Let modules modify the view just prior to rendering it.
  foreach (module_implements('views_pre_render') as $module) {
    $function = $module . '_views_pre_render';
    $function($this);
  }

  // Let the themes play too, because pre render is a very themey thing.
  foreach ($GLOBALS['base_theme_info'] as $base) {
    $function = $base->name . '_views_pre_render';
    if (function_exists($function)) {
      $function($this);
    }
  }
  $function = $GLOBALS['theme'] . '_views_pre_render';
  if (function_exists($function)) {
    $function($this);
  }

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


hook_entity_view_alter () ไม่ทำงานในธีม
dxvargas

อย่างน้อยใน D7 alter-hooks ในชุดรูปแบบจะเรียกใช้เฉพาะถ้าชุดรูปแบบได้รับการเริ่มต้นในคำขอเดียวกัน (เช่นโดยการโทรtheme()) หากยังไม่ได้รับการเริ่มต้นจะไม่มีการแก้ไข hooks ในชุดรูปแบบใด ๆ
zwirbeltier

@zwirbeltier Theme hooks ถูกเรียกใช้สำหรับธีมที่ใช้แสดงหน้าเว็บ theme()ไม่เปลี่ยนธีมที่ใช้สำหรับหน้า แต่เรียกใช้ฟังก์ชันเพื่อแสดงข้อมูล มันไม่เปลี่ยนธีมเช่นจาก Garland เป็น Minelli
kiamlaluno

@kiamlaluno: ถ้าคุณดูรหัสdrupal_alter()คุณเห็นว่ามันจะเรียกใช้ hooks-hooks ในชุดรูปแบบถ้าdrupal_theme_initialize()มีการเรียกมาก่อน หากยังไม่มีก็จะไม่มีธีมที่ใช้งานอยู่ (ยัง) ดังนั้นจึงไม่มีการเรียกใช้ hooks อย่างน้อยใน D7 ไม่มีการรับประกันเมื่อdrupal_theme_initialize()มีการเรียกครั้งแรกในคำขอ
zwirbeltier

@zwirbeltier ชุดรูปแบบจาก Drupal นั้นเริ่มต้นแล้วเมื่อมีการแสดงหน้าเว็บ หากโมดูลตั้งค่าธีมสำหรับหน้าโดยไม่เรียกใช้ฟังก์ชันที่เหมาะสมแสดงว่าเป็นหน้าที่รับผิดชอบในการเริ่มต้น
kiamlaluno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.