ฉันเพิ่มเขตข้อมูลบางอย่างจากประเภทเนื้อหาลงในแบบฟอร์มที่กำหนดเองโดยใช้ field_attach_form () เมื่อส่งแบบฟอร์มฉันกำลังประมวลผลฟิลด์เหล่านั้นโดยการเรียก field_attach_form_validate () และ field_attach_submit () จาก #validate และ #submit callbacks
ณ จุดนั้นฉันต้องการเปรียบเทียบออบเจกต์ post-submit ที่เตรียมไว้กับโหนดเดิมและรำคาญกับ node_save () ถ้ามีฟิลด์ใดฟิลด์หนึ่งเปลี่ยนไป entity_load_unchanged()
ดังนั้นผมจึงเริ่มต้นด้วยการโหลดโหนดเดิมใช้
น่าเสียดายที่อาร์เรย์ฟิลด์ในวัตถุโหนดดั้งเดิมไม่ตรงกับอาร์เรย์ฟิลด์ในวัตถุโหนดที่เตรียมไว้ซึ่งกำลังรอการบันทึกแม้ว่าจะไม่มีการเปลี่ยนแปลงใด ๆ ในฟิลด์ดังนั้น "$ old_field == $ new_field ที่เรียบง่าย "การเปรียบเทียบเป็นไปไม่ได้ ตัวอย่างเช่นฟิลด์ข้อความธรรมดาจะปรากฏเช่นนี้ในต้นฉบับ:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
ในขณะที่โหนดที่จัดเตรียมปรากฏเป็นเช่นนี้
$node->field_text['und'][0] = array(
'value' => 'Test',
);
คุณอาจคิดว่าจะเปรียบเทียบคีย์ 'value' แต่คุณจะพบกับฟิลด์ที่ประกอบด้วยองค์ประกอบอื่น ๆ ซึ่งไม่มีคีย์ 'value' ตัวอย่างเช่นลองดูที่ฟิลด์ที่ไม่มีคีย์ 'ค่า' และมีคีย์ในโหนดเก่าและที่เตรียมไว้ซึ่งไม่มีคู่
โหนดเก่า
$old_node->field_address['und'][0] = array(
'country' => 'GB',
'administrative_area' => 'Test',
'sub_administrative_area' => NULL,
'locality' => 'Test',
'dependent_locality' => NULL,
'postal_code' => 'Test',
'thoroughfare' => 'Test',
'premise' => 'Test',
'sub_premise' => NULL,
'organisation_name' => 'Test',
'name_line' => 'Test',
'first_name' => NULL,
'last_name' => NULL,
'data' => NULL,
);
โหนดที่เตรียมไว้
$node->field_address['und'][0] = array(
'element_key' => 'node|page|field_address|und|0',
'thoroughfare' => 'Test',
'premise' => 'Test',
'locality' => 'Test',
'administrative_area' => 'Test',
'postal_code' => 'Test',
'country' => 'GB',
'organisation_name' => 'Test',
'name_line' => 'Test',
);
สำหรับฟิลด์ว่างยังมีความคลาดเคลื่อนอื่นอยู่
โหนดเก่า
$old_node->field_text = array();
โหนดที่เตรียมไว้
$node->field_text = array(
'und' => array(),
);
ฉันสามารถเปรียบเทียบค่าเก่ากับค่าใหม่ของฟิลด์ใด ๆ โดยทั่วไปเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่
นี่เป็นเพียงเป็นไปไม่ได้
_field_invoke()
หรือสิ่งที่เกี่ยวข้องเพื่อเตรียมโครงสร้างฟิลด์แบบเต็มจากโหนด "ที่เตรียมไว้" แสดงทั้งสองฟิลด์และเพียงเปรียบเทียบสตริง HTML เหล่านี้ แค่ความคิด