วิธีที่ดีที่สุดในการดร็อปฟิลด์จากประเภทเนื้อหา


21

วิธีที่ดีที่สุดในการลบฟิลด์ Drupal 7 ออกจากประเภทเนื้อหาที่กำหนดผ่าน GUI คืออะไร ฉันต้องการใช้ hook_update_N เพื่อให้การเปลี่ยนแปลงสามารถแพร่กระจายไปยังเซิร์ฟเวอร์หลายเครื่องเมื่อเรียกใช้ update.php อย่างไรก็ตามฉันไม่สามารถหาทางแก้ไขได้ db_drop_table () จะเหมาะสมสำหรับฉันสำหรับ schema ที่กำหนดเอง แต่ไม่ใช่สำหรับชนิดเนื้อหา / ฟิลด์ที่กำหนดผ่าน GUI


คุณสร้างโมดูลที่กำหนดเองเพื่อกำหนดประเภทเนื้อหา?
iStryker

iStryker: สร้างประเภทเนื้อหาผ่านส่วนต่อประสานผู้ดูแลระบบเพิ่มบางฟิลด์จากนั้นส่งออกผ่านทางฟีเจอร์ แต่ตอนนี้ฉันต้องการลบหนึ่งในฟิลด์เหล่านั้นโดยทางโปรแกรม
บาริสต้ามือสมัครเล่น

สังเกตว่า D5 มีฟังก์ชั่นcontent_field_instance_delete ()ซึ่งมีการบันทึกไว้ที่นี่และที่นี่แต่ฟังก์ชั่นดังกล่าวไม่สามารถใช้งานได้สำหรับ D7 นอกจากนี้ยังอยากรู้ว่าฟิลด์ใดติดตั้งใน D7 คอร์ที่ใช้เพื่อลบฟิลด์: _update_7000_field_delete_instance () - ฟังก์ชัน "ภายใน" แบบกำหนดเองที่ผู้อื่นไม่สามารถใช้ได้ สำหรับบางสิ่งที่มีความสำคัญเช่นเดียวกับเขตข้อมูลฉันคิดว่าควรจะมีฟังก์ชั่น "สาธารณะ" ที่มีอยู่ที่ไหนสักแห่งและนั่นคือสิ่งที่ฉันกำลังค้นหา
บาริสต้ามือสมัครเล่น

ขณะนี้ฟังก์ชั่นสาธารณะ "ผู้สมัคร" ของฉันคือ field_delete_instance ()
บาริสต้ามือสมัครเล่น

คำตอบ:


18

มีฟังก์ชัน API สองรายการเพื่อลบฟิลด์:

  • field_delete_field ในการลบฟิลด์ทั้งหมด (อินสแตนซ์ทั้งหมดของฟิลด์)
  • field_delete_instance หากต้องการลบเฉพาะอินสแตนซ์ของฟิลด์ - ซึ่งเป็นสิ่งที่แนบมากับเอนทิตี

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


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

9

ใช่field_delete_instance ()เป็นฟังก์ชันในการลบอินสแตนซ์ของฟิลด์

โปรดทราบว่าfield_delete_instance()การโทรโดยอัตโนมัติfield_delete_field()หากไม่มีอินสแตนซ์ที่เหลืออยู่ดังนั้นfield_delete_instance()เป็นไปได้มากที่สุดเท่าที่คุณต้องการ

_update_7000_field_delete_instance()ถูกออกแบบมาสำหรับฟังก์ชั่นการอัพเดทคอร์ ตัวอย่าง: ในฟังก์ชั่นการปรับปรุงคุณกำลังใช้x_update_7000() field_delete_instance()จากนั้นในx_update_7001()คุณเปลี่ยน{field_config}ตารางในลักษณะที่ไม่สอดคล้องกันและfield_delete_instance()ต้องมีการเปลี่ยนแปลงอย่างชัดเจนเช่นกัน

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

แต่นี่เป็นรูปแบบที่คุณอาจต้องการใช้สำหรับฟังก์ชั่น API ของคุณซึ่งคุณใช้ในฟังก์ชั่นอัพเดท

นอกจากนี้ฟังก์ชัน _update เหล่านี้จะไม่เรียกใช้ hooks เนื่องจากผลลัพธ์จะไม่สามารถคาดการณ์ได้ (ตัวอย่างเช่นเนื่องจากโมดูลที่อาจมีการปิดใช้งานการอัปเดต)

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