รุ่น Drupal: 7.21
โมดูลโมดูลการรวบรวมฟิลด์: 7.x-1.0-beta5
คำอธิบายสั้น ๆ : ฉันไม่ว่างที่จะพยายามนำเข้าคอลเลกชันฟิลด์โดยทางโปรแกรม แต่เมื่อลบบางรายการจะมีการรวบรวมฟิลด์ 'ปลอม' อยู่เสมอ
คำอธิบายแบบยาว : ผู้ใช้ของฉันมีฟิลด์การรวบรวมฟิลด์ในโปรไฟล์ของพวกเขา การรวบรวมฟิลด์นี้มี 3 ฟิลด์ข้อความ ฉันต้องการนำเข้าข้อมูลจากฐานข้อมูล sql แบบกำหนดเองไปยังการรวบรวมฟิลด์ของผู้ใช้ การรวบรวมฟิลด์นี้สามารถมีได้หลายค่า เมื่อฉันนำเข้าข้อมูลเป็นครั้งแรกที่ทุกอย่างทำงานได้ดีฉันเห็นข้อมูลในฟิลด์ของการรวบรวมฟิลด์ ยิ่งใหญ่
แต่ที่นี่ส่วนที่ยุ่งยากมา สมมติว่าฉันนำเข้าสำหรับผู้ใช้ที่ระบุ 5 แถวจากฐานข้อมูลที่กำหนดเอง พวกมันจะถูกเพิ่มลงในคอลเลกชันฟิลด์ดังนั้นคอลเลกชันฟิลด์นี้มี 5 รายการแต่ละรายการมี 3 ฟิลด์ จากนั้นฉันลบบางแถวออกจากฐานข้อมูลที่กำหนดเองของฉันเพื่อที่ฉันจะได้เหลือเพียง 3 แถวสำหรับผู้ใช้รายนี้ ฉันเรียกใช้การนำเข้าอีกครั้งอัปเดต 3 รายการแรกของการรวบรวมฟิลด์ แต่จากนั้นฉันเหลือ 2 รายการจากการนำเข้าก่อนหน้า ควรลบเพราะฉันมีแถวที่นำเข้าเพียง 3 แถว แต่ยังมีรายการคอลเลกชันฟิลด์ 5 รายการ
ดังนั้นฉันจึงพยายามที่จะลบรายการคอลเลกชันเขตข้อมูลเหล่านี้ แต่มีอย่างน้อยหนึ่งรายการที่เหลือ เขตข้อมูลว่างเปล่าเมื่อฉันดูโปรไฟล์ผู้ใช้ แต่ยังมีบางสิ่งอยู่ สมมติว่า ณ จุดนี้ฉันเพิ่ม 5 แถวใหม่สำหรับผู้ใช้ในฐานข้อมูลที่กำหนดเองดังนั้นฉันจึงมีทั้งหมด 8 แถวสำหรับผู้ใช้นี้ จากนั้นฉันก็รันการนำเข้าอีกครั้ง 3 รายการแรกได้รับการอัปเดต แต่เมื่อฉันพยายามเพิ่มแถวที่ 4 มันยังคงได้รับรหัสเอนทิตีจากรายการคอลเลกชันของฟิลด์ที่ 4 พยายามอัปเดต แต่ล้มเหลวและส่งคืนข้อผิดพลาดนี้:
Fatal error: Call to undefined method stdClass::save()
ฉันพยายามลบรายการรวบรวมฟิลด์ด้วยแต่ละวิธีด้านล่าง:
// Method 1
entity_delete_multiple('field_collection_item', array($fc_id));
// Method 2
$field_collection_item = field_collection_item_load($fc_id);
$field_collection_item->delete();
// Method 3
$field_collection_item = field_collection_item_load($fc_id);
$field_collection_item->deleteRevision();
นี่คือรหัสเต็มของฉัน:
function import_user_field_collection(&$user, $old_user_id) {
// I do a query to get the rows I want to import for this specific user.
db_set_active('custom_sql_database');
$result = db_query("SELECT * FROM {users} WHERE user_id = :user_id", array(':user_id' => $old_user_id));
db_set_active('default');
$i = 0; // Keep count of how many rows I imported.
foreach($result as $row) {
// Check if the field collection item already exists.
if(!empty($user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'])) {
// If it does exists, update this particular field collection item.
$fc_id = $user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'];
$field_collection_item = entity_load('field_collection_item', array($fc_id));
// These 3 text fields are children of the field collection field.
$field_collection_item[$fc_id]->field_profile_diploma_instituut[LANGUAGE_NONE][0]['value'] = $row->instituut;
$field_collection_item[$fc_id]->field_profile_diploma_vakgebied[LANGUAGE_NONE][0]['value'] = $row->vakgebied;
$field_collection_item[$fc_id]->field_profile_diploma_jaar[LANGUAGE_NONE][0]['value'] = $row->jaar_diploma;
$field_collection_item[$fc_id]->save(TRUE);
} else {
// If the field collection item doesn't exist I want to create a new field collection item.
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_profile_diploma_opleiding'));
$field_collection_item->setHostEntity('user', $user);
$field_collection_item->field_profile_diploma_instituut[LANGUAGE_NONE][0]['value'] = $row->instituut;
$field_collection_item->field_profile_diploma_vakgebied[LANGUAGE_NONE][0]['value'] = $row->vakgebied;
$field_collection_item->field_profile_diploma_jaar[LANGUAGE_NONE][0]['value'] = $row->jaar_diploma;
$field_collection_item->save(TRUE);
}
$i++;
}
$fc_fields = field_get_items('user', $user, 'field_profile_diploma_opleiding');
// Check if there are more field collection items than imported rows
if(count($fc_fields) > $i) {
for($i; $i <= count($fc_fields); $i++) {
// Run through each field collection item that's left from the previous import and delete it.
if(!empty($user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'])) {
// Method 1
$fc_id = $user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'];
entity_delete_multiple('field_collection_item', array($fc_id));
// Method 2
//$field_collection_item = field_collection_item_load($fc_id);
//$field_collection_item->delete();
// Method 3
//$field_collection_item = field_collection_item_load($fc_id);
//$field_collection_item->deleteRevision();
}
}
}
}
ดังนั้นคำถามของฉันคือฉันจะลบรายการคอลเล็กชันฟิลด์เพื่อให้พวกเขาหายไปได้อย่างไร
entity_delete_multiple()
หากมีก็ลบได้โดยใช้ คุณอาจจำเป็นต้องเรียกใช้ cron สองสามครั้งหลังจากที่คุณลบเขตข้อมูล (ลบข้อมูลภาคสนามตามกำหนดเวลาเพื่อไม่ให้ภาระในการโหลดหน้าเดียวด้วยการประมวลผลทั้งหมดที่ต้องทำ)
entity_delete_multiple
เป็นวิธีที่ถูกต้องแน่นอน 100% - ดูfield_collection_field_delete
ฟังก์ชั่นซึ่งเป็นสิ่งที่ Collection Field ใช้ในการล้างรายการเมื่อลบฟิลด์อ้างอิง