บางครั้งเมื่อฉันพยายามที่จะใช้ตะขอเพียงตระหนักว่ามันควรจะอยู่ในไฟล์โมดูล
มีวิธีการรู้หรือไม่ว่า hooks ใดที่สามารถนำไปใช้ในไฟล์ template.php ของชุดรูปแบบหรือหนึ่งอันในโมดูล
บางครั้งเมื่อฉันพยายามที่จะใช้ตะขอเพียงตระหนักว่ามันควรจะอยู่ในไฟล์โมดูล
มีวิธีการรู้หรือไม่ว่า hooks ใดที่สามารถนำไปใช้ในไฟล์ template.php ของชุดรูปแบบหรือหนึ่งอันในโมดูล
คำตอบ:
โดยทั่วไปแล้วการแก้ไข 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
theme()
) หากยังไม่ได้รับการเริ่มต้นจะไม่มีการแก้ไข hooks ในชุดรูปแบบใด ๆ
theme()
ไม่เปลี่ยนธีมที่ใช้สำหรับหน้า แต่เรียกใช้ฟังก์ชันเพื่อแสดงข้อมูล มันไม่เปลี่ยนธีมเช่นจาก Garland เป็น Minelli
drupal_alter()
คุณเห็นว่ามันจะเรียกใช้ hooks-hooks ในชุดรูปแบบถ้าdrupal_theme_initialize()
มีการเรียกมาก่อน หากยังไม่มีก็จะไม่มีธีมที่ใช้งานอยู่ (ยัง) ดังนั้นจึงไม่มีการเรียกใช้ hooks อย่างน้อยใน D7 ไม่มีการรับประกันเมื่อdrupal_theme_initialize()
มีการเรียกครั้งแรกในคำขอ