วิธีรับ hook_install () เพื่อเรียกใช้ hook_update_N ทั้งหมด ()


18

ฉันจะขอ hook_install () เพื่อเรียกใช้การอัปเดตทั้งหมดที่มีสำหรับโมดูลได้อย่างไร ฉันมีมันในไฟล์ติดตั้ง mymod

ฉันเหนื่อย

function mymod_install() {
  mymod_update_6001();
}

แต่ดูเหมือนจะไม่ทำอะไรเลย หากฉันมี mymod_update_6002 () ฉันจะยังคงโทรหา 6001 () ได้เพียงแค่เรียก 6002 () หรือโทรทั้งสองตามลำดับที่ 6001 (), 6002 ()

ฉันคิดว่าการเปิดใช้งานการปรับปรุงทั้งหมดเป็นเรื่องปกติถ้าคุณติดตั้งโมดูลเป็นค่าเริ่มต้น

คำตอบ:


19

คุณไม่ควรติดตั้ง hook เพื่อเรียกใช้การอัปเดต เมื่อโมดูลถูกติดตั้งเป็นครั้งแรกไม่จำเป็นต้องทำการอัพเดท

การอัปเดตจะใช้เมื่อติดตั้งโมดูลแล้ว (ฐานข้อมูลหรือตัวแปรถูกสร้างขึ้น) ในกรณีดังกล่าวคุณไม่ต้องการติดตั้งโมดูลอีกครั้งเนื่องจากจะเป็นการลบข้อมูลทั้งหมดแทนที่จะสร้าง hooks_NOT_TITLE Drupal จะตรวจสอบว่าจำเป็นต้องมีการอัปเดตใดupdate.phpบ้าง ใน Drupal 6 มันจะเลือกการอัพเดตที่จะทำโดยอัตโนมัติ แต่คุณสามารถเปลี่ยนได้ในขณะที่ Drupal 7 ไม่สามารถทำได้

Drupal ตรวจสอบว่าจำเป็นต้องมีการอัปเดตใดบ้างโดยบันทึกหมายเลขของการอัพเดทล่าสุด นี่อาจเป็นการเปลี่ยนแปลงในฐานข้อมูลซึ่งจะอนุญาตให้รันการอัปเดตใหม่ใน Drupal 7 การอัพเดตที่รันใหม่มักเป็นความคิดที่ไม่ดีและมักจะทำให้เกิดข้อผิดพลาดและในบางกรณีอาจทำให้ข้อมูลของคุณยุ่งเหยิง

อย่าลืมสำรองฐานข้อมูลของคุณก่อนเรียกใช้การปรับปรุง


15

วัตถุประสงค์ของ hooks นั้นแตกต่างกัน

  • hook_install ()ถูกเรียกใช้เมื่อติดตั้งโมดูล หมายความว่าไม่ได้ติดตั้งโมดูลไว้ก่อนหน้านี้ดังนั้นจึงไม่จำเป็นต้องได้รับการปรับปรุง
  • hook_update_N ()ถูกเรียกใช้เมื่อติดตั้งโมดูลแล้วและจำเป็นต้องได้รับการอัปเดต

หากมีงานบางอย่างที่ต้องทำทั้งสองอย่างเมื่อติดตั้งโมดูลและเมื่อมีการอัปเดตโมดูลแล้วควรแสดงรหัสใน hooks ทั้งสอง ไม่มีโมดูลที่เรียกใช้ hooks การอัพเดททั้งหมดในระหว่างการติดตั้งและจะผิดอย่างยิ่งเมื่อฟังก์ชั่นการอัพเดทอัพเดตสกีมาของตารางฐานข้อมูลที่ใช้จากโมดูล hook_schema ()ควรส่งคืน schema ที่ปรับปรุงแล้วและการปรับปรุง schema ด้วยฟังก์ชันการปรับปรุงจะผิด

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


5

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

ในการบังคับให้ฟังก์ชันอัปเดตทำงานบนการติดตั้งคุณต้องเปลี่ยนเวอร์ชันสกีมาของคุณเช่น:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

หรือเรียกใช้จาก drush -y updbdrush:

ดูเพิ่มเติม: เป็นไปได้หรือไม่ที่จะบังคับให้ฮุกอัพเดตของโมดูลทำงานได้?


1

hook_install จะไม่ทำงานกับในmymod.moduleไฟล์

คุณต้องวางhook_installและhook_uninstallแยกไฟล์mymod.install

ฉันเดาว่าhook_update_N()ควรวางไว้ด้วยmymod.install


คำตอบหลังจากคำถามถูกปรับปรุง:

สอบถามจากลิงค์กรุณาตรวจสอบหมายเลขรุ่นของคุณในไฟล์ข้อมูล

เนื่องจากฉันกำลังพัฒนาแบบส่วนตัวและไม่ใช่เพื่อการมีส่วนร่วมฟิลด์ 'รุ่น' ของฉันในไฟล์. info ของโมดูลของฉันจะว่างเปล่าหรือไม่เปลี่ยนแปลงเมื่อฉันอัปเดตโมดูล จริงๆแล้วฉันกำลังใช้ Subversive สำหรับ eclipse PDT และดังนั้นหมายเลขเวอร์ชันของไฟล์ข้อมูลของฉันจะไม่ได้รับการอัพเดต ดังนั้น hook_update_6001 ของฉันจึงไม่ถูกเรียกใช้โดย update.php

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