Versione Drupal: 7.21
Versione modulo raccolta campi: 7.x-1.0-beta5
Breve spiegazione : sono impegnato nel tentativo di importare le raccolte di campi a livello di codice ma quando si eliminano alcune di esse, rimane sempre una raccolta di campi "fasulli".
Spiegazione lunga : i miei utenti hanno un campo di raccolta dei campi sul loro profilo. Questa raccolta di campi contiene 3 campi di testo. Voglio importare i dati da un database sql personalizzato nella raccolta dei campi dell'utente. Questa raccolta di campi può avere più valori. Quando importi i dati per la prima volta, tutto funziona correttamente, vedo i dati nei campi della raccolta dei campi. Grande.
Ma ecco che arriva la parte difficile. Supponiamo di importare per un utente specifico 5 righe dal database personalizzato. Vengono aggiunti alla raccolta di campi, quindi questa raccolta di campi ha 5 elementi ciascuno contenente 3 campi. Quindi elimino alcune righe dal mio database personalizzato in modo da avere solo 3 righe per questo utente. Eseguo di nuovo l'importazione, aggiornando i primi 3 elementi della raccolta di campi, ma poi mi rimangono 2 elementi dall'importazione precedente. Dovrebbero essere eliminati perché ho solo 3 righe importate ma ancora 5 elementi di raccolta dei campi.
Quindi ho cercato di eliminare questi elementi della raccolta di campi, ma rimangono sempre uno o più elementi. I campi sono vuoti quando guardo il profilo utente ma c'è ancora qualcosa lì. Diciamo che a questo punto aggiungo 5 nuove righe per l'utente nel mio database personalizzato, quindi ho 8 righe in totale per questo utente. Quindi eseguo nuovamente l'importazione. I primi 3 elementi vengono aggiornati, ma quando provo ad aggiungere la 4a riga ottiene ancora un ID entità dall'elemento della raccolta del 4o campo, tenta di aggiornarlo ma non riesce e restituisce questo errore:
Fatal error: Call to undefined method stdClass::save()
Ho provato a eliminare gli elementi della raccolta di campi con ciascuno di questi metodi di seguito:
// 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();
Questo è il mio codice completo:
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();
}
}
}
}
Quindi la mia domanda è: come posso eliminare gli elementi della raccolta dei campi in modo che siano effettivamente spariti?
entity_delete_multiple()
. Potrebbe essere necessario eseguire cron un paio di volte dopo aver eliminato i campi (i dati dei campi vengono eliminati in base a una pianificazione in modo da non gravare un singolo caricamento di pagina con tutte le elaborazioni da eseguire)
entity_delete_multiple
è sicuramente il modo giusto per farlo al 100% - dai un'occhiata allafield_collection_field_delete
funzione, che è quella che Field Collection stessa usa per ripulire gli oggetti quando il campo di riferimento viene rimosso