diff -u b/field_collection.entity.inc b/field_collection.entity.inc --- b/field_collection.entity.inc +++ b/field_collection.entity.inc @@ -326,14 +326,34 @@ public function delta() { if (($entity = $this->hostEntity()) && isset($entity->{$this->field_name})) { foreach ($entity->{$this->field_name} as $langcode => &$data) { - foreach ($data as $delta => $item) { - if (isset($item['value']) && $item['value'] == $this->item_id) { - $this->langcode = $langcode; - return $delta; + if (!empty($data)) { + foreach ($data as $delta => $item) { + if (isset($item['value']) && $item['value'] == $this->item_id) { + $this->langcode = $langcode; + return $delta; + } + elseif (isset($item['entity']) && $item['entity'] === $this) { + $this->langcode = $langcode; + return $delta; + } } - elseif (isset($item['entity']) && $item['entity'] === $this) { - $this->langcode = $langcode; - return $delta; + } + } + // If we don't find the delta in the current values (cause the item + // is being deleted, for example), we search the delta in the originalcontent. + if (!empty($entity->original)) { + foreach ($entity->original->{$this->field_name} as $langcode => &$data) { + if (!empty($data)) { + foreach ($data as $delta => $item) { + if (isset($item['value']) && $item['value'] == $this->item_id) { + $this->langcode = $langcode; + return $delta; + } + elseif (isset($item['entity']) && $item['entity'] === $this) { + $this->langcode = $langcode; + return $delta; + } + } } } } diff -u b/field_collection.module b/field_collection.module --- b/field_collection.module +++ b/field_collection.module @@ -510,6 +510,7 @@ return; } + // Load items from the original entity. $items_original = !empty($original->{$field['field_name']}[$langcode]) ? $original->{$field['field_name']}[$langcode] : array(); $original_by_id = array_flip(field_collection_field_item_to_ids($items_original)); @@ -577,8 +578,17 @@ ->execute(); } else { + // Load items from the original entity from all languages checking which + // are the unused items. + $current_items = array(); + $languages = language_list(); + foreach ($languages as $langcode_value) { + $current_items += !empty($host_entity->{$field['field_name']}[$langcode_value->language]) ? $host_entity->{$field['field_name']}[$langcode_value->language] : array(); + $current_by_id = field_collection_field_item_to_ids($current_items); + } + $items_to_remove = array_diff($ids, $current_by_id); // Delete unused field collection items now. - foreach (field_collection_item_load_multiple($ids) as $un_item) { + foreach (field_collection_item_load_multiple($items_to_remove) as $un_item) { $un_item->updateHostEntity($host_entity); $un_item->deleteRevision(TRUE); }