Phiên bản Drupal: 7.21
Phiên bản mô-đun bộ sưu tập trường: 7.x-1.0-beta5
Giải thích ngắn gọn : Tôi đang bận nhập các bộ sưu tập trường theo chương trình nhưng khi xóa một số trong số chúng luôn có một số bộ sưu tập trường 'không có thật'.
Giải thích dài : Người dùng của tôi có trường thu thập trường trong hồ sơ của họ. Bộ sưu tập trường này chứa 3 trường văn bản. Tôi muốn nhập dữ liệu từ cơ sở dữ liệu sql tùy chỉnh vào bộ sưu tập trường của người dùng. Bộ sưu tập trường này có thể có nhiều giá trị. Khi tôi nhập dữ liệu lần đầu tiên mọi thứ hoạt động tốt, tôi thấy dữ liệu trong các trường của bộ sưu tập trường. Tuyệt quá.
Nhưng ở đây có phần khó khăn. Giả sử tôi nhập cho một người dùng cụ thể 5 hàng từ cơ sở dữ liệu tùy chỉnh. Chúng được thêm vào bộ sưu tập trường, vì vậy bộ sưu tập trường này có 5 mục, mỗi mục chứa 3 trường. Sau đó, tôi xóa một số hàng khỏi cơ sở dữ liệu tùy chỉnh của mình để tôi chỉ còn 3 hàng cho người dùng này. Tôi chạy lại quá trình nhập, cập nhật 3 mục đầu tiên của bộ sưu tập trường, nhưng sau đó tôi còn lại 2 mục từ lần nhập trước. Chúng nên bị xóa vì tôi chỉ có 3 hàng đã nhập nhưng vẫn có 5 mục bộ sưu tập trường.
Vì vậy, tôi đã cố gắng xóa các mục bộ sưu tập trường này, nhưng luôn có một hoặc nhiều mục còn lại. Các trường trống khi tôi nhìn vào hồ sơ người dùng nhưng vẫn còn một cái gì đó ở đó. Giả sử tại thời điểm này tôi thêm 5 hàng mới cho người dùng trong cơ sở dữ liệu tùy chỉnh của mình, vì vậy tôi có tổng cộng 8 hàng cho người dùng này. Sau đó tôi chạy nhập lại. 3 mục đầu tiên được cập nhật, nhưng sau đó khi tôi cố gắng thêm hàng thứ 4, nó vẫn nhận được id thực thể từ mục bộ sưu tập trường thứ 4, cố gắng cập nhật nhưng không thành công và trả về lỗi này:
Fatal error: Call to undefined method stdClass::save()
Tôi đã thử xóa các mục bộ sưu tập trường với từng phương thức dưới đây:
// 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();
Đây là mã đầy đủ của tôi:
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();
}
}
}
}
Vì vậy, câu hỏi của tôi là: Làm thế nào để tôi xóa các mục bộ sưu tập trường để chúng thực sự biến mất?
entity_delete_multiple()
. Bạn có thể cần chạy cron một vài lần sau khi xóa các trường (dữ liệu trường được xóa theo lịch để không gây gánh nặng cho một tải trang với tất cả quá trình xử lý phải làm)
entity_delete_multiple
chắc chắn 100% là cách đúng đắn để thực hiện - hãy xemfield_collection_field_delete
chức năng, đó là những gì mà Bộ sưu tập Trường sử dụng để dọn dẹp các mục khi trường được tham chiếu bị xóa