แสดงปัญหาเวิร์กโฟลว์พร้อมการลบฟิลด์


14

สมมติว่าฉันมีชนิดเนื้อหาPersonที่มีเขตข้อมูล: Name, Age,Email

ประเภทเนื้อหานี้ควบคุมโดยฟีเจอร์ที่เรียกว่าtestดังนั้นฉันจึงสามารถควบคุมแหล่งที่มาและส่งไปยังไซต์สดได้

เวิร์กโฟลว์ของฉันเป็นเช่นนี้:

  • ฉันเพิ่มเขตข้อมูลใหม่ที่Personเรียกว่าPhone
  • ในพื้นที่ที่ฉันทำ: drush fu test -y
  • ฉันแก้ไขtest.infoเพื่อเพิ่มหมายเลขรุ่น
  • ฉันยอมรับการเปลี่ยนแปลงในที่เก็บของฉัน
  • ฉันส่งฟีเจอร์ไปที่เว็บไซต์สด (คัดลอกไฟล์ฟีเจอร์)
  • ในเว็บไซต์สดที่ฉันทำ: drush fr test -y
  • ในเว็บไซต์สดที่ฉันทำ: drush cc all

Personแล้วข้อมูลใหม่จะปรากฏบนเว็บไซต์ของสด

หากในขั้นตอนแรกฉันลบฟิลด์ของPersonฟิลด์จะไม่ถูกลบออกจากเว็บไซต์สด ฉันจะแก้ปัญหานี้ได้อย่างไร ฉันไม่ต้องการที่จะลบมันด้วยตนเองจาก UI บนเว็บไซต์สด
เวิร์กโฟลว์นี้ถูกต้องหรือไม่


1
ใช้ drush fu test -y --version-increment เพื่อเพิ่มหมายเลขรุ่นโดยอัตโนมัติ
Mike

คำตอบ:


9

นี้เป็นดาบสองคมก็เช่นนี้เพื่อป้องกันการลบข้อมูลที่มักจะเป็นสิ่งที่ดี ไม่มีอะไรที่จะแก้ไขได้จริงนี่เป็นพฤติกรรมที่คาดหวัง

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


และถ้าฉันต้องการที่จะลบสนาม? ฉันควรตรวจสอบ hooks การอัพเดทหรือไม่? (ฉันเป็นมือใหม่ D7)
cherouvim

3
การอัพเดทฮุกน่าจะเหมาะที่สุดหรือเอามันออกเอง
ระบบดิจิตอล

2
ตกลงฉันสามารถทำได้drush field-delete field
cherouvim

@cherouvim ดังนั้นคุณต้องทำอย่างนั้นทุกครั้งที่คุณสร้างคุณสมบัติขึ้นมาใหม่?
AlxVallejo

hook_update_N () ในไฟล์. install ของคุณสมบัติจะทำงานได้
Mike

10

วิธีที่ถูกต้องในการลบเนื้อหาที่สร้างคุณลักษณะคือผ่านhook_update_N (ซึ่งควรนำไปใช้ในไฟล์your_module.install)


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


ทำไม? drush field-delete fieldทำงานได้ไม่ดีใช่ไหม
cherouvim

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

ไฟล์ใดของฟีเจอร์ที่ฉันจะใช้ hook_update ()? hook_update () รับวัตถุโหนดเป็นพารามิเตอร์ดังนั้นจึงไม่สามารถให้วัตถุโหนดในขณะที่เปิดใช้งานคุณลักษณะ
subhojit777

@ subhojit777: โอ๊ะฉันเชื่อมโยงไปยังหน้าเอกสารคู่มือเบ็ดผิด ฉันเพิ่งแก้ไขลิงก์ hook_update_Nโปรดดูเอกสารสำหรับ
smokris

@smokris :) ฉันพูดถึงตะขอนั้นในคำตอบของฉัน
subhojit777

2

สร้างไฟล์ใหม่ชื่อ "your_feature_name.install"

ภายในไฟล์ประกาศhook_update_Nคุณสามารถใช้field_delete_field ()และระบุชื่อของฟิลด์ที่คุณต้องการลบเป็นพารามิเตอร์

เรียกใช้ update.php และฟิลด์จะถูกลบ


0

หากคุณใช้field_phoneในพื้นที่อื่นคุณอาจต้องการลบออกจากประเภทเนื้อหาบุคคลของคุณ แต่ไม่สามารถลบออกจากเว็บไซต์ของคุณได้ทั้งหมด สร้างYOUR_FEATURE_NAME.installไฟล์ในโฟลเดอร์ของสถานที่ด้วยตนเองเช่น:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

หากคุณลบสิ่งนี้ออกจากย่อหน้าบุคคลแทนที่จะเป็นประเภทเนื้อหาบุคคลคุณสามารถเปลี่ยนคำแถลงตามเงื่อนไขข้อแรกเป็นอย่างเช่น:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.