คำสั่งการดำเนินการ hook_form_alter


10

มีวิธีการเปลี่ยนลำดับของการดำเนินการของ hook_form_alter ใน Drupal 7 โดยไม่เปลี่ยนน้ำหนักของโมดูลหรือแฮ็ค Drupal Core หรือไม่?

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

คำตอบ:


2

ฉันไม่คิดอย่างนั้น translation_form_node_form_alter()การดำเนินการhook_form_BASE_FORM_ID_alter()ที่ฉันเชื่อว่าถูกเรียกหลังจาก hook_form_alter()ดังนั้นแม้การเปลี่ยนน้ำหนักโมดูลจะไม่เพียงพอ ฉันคิดว่าสองตัวเลือกของคุณคือการใช้hook_form_BASE_FORM_ID_alter()และให้แน่ใจว่าคุณมีน้ำหนักโมดูลที่สูงพอหรือใช้hook_form_FORM_ID_alter()(ถ้าเป็นไปได้)


hook_form_FORM_ID_alter () ถูกเรียกหลังจาก hook_form_alter ()
iStryker

แก้ไขได้โดยใช้ hook_form_form_id_alter และโมดูลน้ำหนัก
บาร์ต

@Bart ถ้าคุณใช้hook_form_FORM_ID_alter()แล้วความเข้าใจของฉันคือคุณไม่จำเป็นต้องปรับเปลี่ยนน้ำหนักเลย (เพราะการhook_form_FORM_ID_alter()โทรทั้งหมดจะทำหลังจากทั้งหมดhook_form_BASE_FORM_ID_alter())
Andy

@Andy ดูเหมือนว่าจะไม่ทำงานถ้าฉันใช้ foo_form_page_node_form_alter โดยไม่ต้องปรับน้ำหนัก
บาร์ต

1
@Bart ฉันกำลังมองไปที่แหล่งที่มาเพื่อให้รายละเอียดเหล่านั้น - ตรวจสอบด้านล่างของและdrupal_prepare_form() drupal_alter()ผมสังเกตเห็นแล้วว่าเอกสารดูเหมือนปิดดังนั้นฉันสร้างปัญหา Dunno ทำไมมันถึงไม่เหมาะกับคุณโดยไม่ต้องเปลี่ยนน้ำหนักของระบบ!
Andy

17

นอกจากนี้ยังมีการกล่าวถึงด้วย drupal 7 API ใหม่ที่เรียกว่าhook_module_implements_alter ()ซึ่งช่วยให้คุณสามารถเปลี่ยนลำดับการดำเนินการสำหรับ hook ที่กำหนดไว้โดยไม่ต้องเปลี่ยนตารางน้ำหนักโมดูล

โค้ดตัวอย่างจากเอกสาร API แสดงให้เห็นว่าทำได้ง่ายเพียงใด:

<?php
function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'rdf_mapping') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}
?>

ฉันสามารถรันคำสั่งฮุคครั้งสุดท้ายด้วยรหัสที่แน่นอนนี้ ขอบคุณ!
Beau

4

นี่คือวิธีการทำให้แน่ใจว่า hook_form_alter ของคุณถูกเรียกหลังจากโมดูลอื่น hook_form_alter:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  // do your stuff
}

/**
 * Implements hook_module_implements_alter().
 *
 * Make sure that our form alter is called AFTER the same hook provided in xxx
 */
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}

สิ่งนี้ยังใช้งานได้เมื่อโมดูลอื่นจัดเตรียม hook form_alter ในรูปแบบ: hook_form_FORM_ID_alter (พวกเขาอธิบายว่าในเอกสารประกอบ: hook_module_implements_alter )

ฉันรู้ว่าโพสต์นี้ค่อนข้างคล้ายกับโพสต์ของ wiifm แต่คิดว่ามันมีประโยชน์กับตัวอย่างของ hook_form_alter


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