Версія 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
функцію, яку саме колекція Field Field використовує для очищення елементів при видаленні посилального поля