ฉันสามารถใช้เบ็ดอะไรสำหรับการกระทำหลังบันทึก


16

ฉันพบหลายบทความพร้อมคำถามเดียวกันนี้ แต่คำตอบมักจะแตกต่างจากหัวข้ออื่น ๆ ไม่เช่นนั้นจะไม่ได้ผลสำหรับความต้องการของฉัน

หลังจากบันทึกโหนดฉันต้องการให้โมดูลที่กำหนดเองของฉันแทรกแถวลงในหนึ่งในตารางที่กำหนดเองซึ่งมี nid ของโหนดใหม่ เมื่อhook_node_submitมีการเรียก nid ยังไม่มีอยู่ hook_node_insertมี nid แต่ถูกเรียกเพียงครั้งแรกที่โหนดถูกบันทึก แต่ฉันอาจต้องดำเนินการทุกครั้งที่มีการบันทึกโหนด

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

มีตะขอซึ่งเรียกว่าทุกครั้งที่มีการบันทึกโหนดและเรียกว่าหลังจากการบันทึกเสร็จสมบูรณ์หรือไม่


3
คุณสามารถใช้การรวมกันของhook_node_insertและhook_node_update(ทำหน้าที่ทุกครั้งที่มีการบันทึกโหนด)
AjitS

ใช่ฉันอธิบายว่าในโพสต์ด้านบน
Kenny Wyland

@ KennyWyland ที่คุณพูดถึงhook_node_submitแต่ไม่ใช่hook_node_updateเหรอ?
เดวิดโธมัส

คุณจะได้รับโหนด nid ในเช่นเดียวกับในhook_node_insert hook_node_update
Sumit Madan

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

คำตอบ:


5

มองไปที่ความคิดเห็นในคำถามที่ดูเหมือนว่าวิธีการแก้ปัญหาที่เห็นได้ชัดคือการใช้ตะขอและhook_node_insert()hook_node_update()

จริง ๆ แล้วฉันเพิ่งทำสิ่งที่คล้ายกันมากตามที่อธิบายไว้ในคำตอบ: ฉันเขียนฟังก์ชันที่ทำในสิ่งที่ฉันต้องการจะทำทุกครั้งที่มีการสร้าง / อัปเดตโหนดจากนั้นเรียกมันจากตะขอแต่ละอัน มันใช้งานได้ดี


เยี่ยมมาก! hook_form_alter()คุณยังสามารถทำเช่นนี้จาก drupal.stackexchange.com/a/221041/15055
leymannx

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

12

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

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

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

อัปเดต:คุณสามารถค้นหาทางเลือกที่ง่ายกว่าได้ที่นี่/programming//a/24035797/1726778


1
ความคิดที่ดี. drupal_register_shutdown_function()แม้ว่ามันจะดีกว่าที่จะใช้ แต่โปรดทราบว่าทั้งคู่ดูเหมือนจะมีปัญหาในสภาพแวดล้อมของ php-fpm ดูdrupal.stackexchange.com/q/102603/10667
Shevchuk

ฉันมีปัญหาในการตรวจสอบว่าโหนดทำหน้าที่เป็นกลุ่มออร์แกนิกog_is_groupหรือไม่ ฉันคิดว่าฉันได้รับการคัดค้านที่ผิดพลาดด้วยเหตุนี้
icicleking

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