--- a/field_collection.module +++ b/field_collection.module @@ -1293,7 +1293,19 @@ function field_collection_field_widget_embed_validate($element, &$form_state, $c $language = $element['#language']; $field_state = field_form_get_state($field_parents, $field_name, $language, $form_state); - $field_collection_item = $field_state['entity'][$element['#delta']]; + + //We have to populate the field_collection_item before we can attach it to the form. + if (isset($field_state['entity'][$element['#delta']])) { + $field_collection_item = $field_state['entity'][$element['#delta']]; + } + elseif ($form_state['input'][$field_state['array_parents'][0]][$field_state['array_parents'][1]][$element['#delta']]) { + $field_collection_item = clone $field_state['entity'][0]; + foreach ($form_state['input'][$field_state['array_parents'][0]][$field_state['array_parents'][1]][$element['#delta']] as $key => $value) { + if (property_exists($field_collection_item, $key)) { + $field_collection_item->{$key} = $value; + } + } + } @@ -478,6 +547,11 @@ class FieldCollectionItemEntity extends Entity { throw new Exception("Unable to create a field collection item without a given host entity."); } + // Copy the values of translatable fields for a new field collection item. + if (!empty($this->is_new) && $this->langcode == LANGUAGE_NONE) { + $this->copyTranslations(); + } + + // Entity translation bugfix. + $this->addTranslations(); + // Only save directly if we are told to skip saving the host entity. Else, // we always save via the host as saving the host might trigger saving // field collection items anyway (e.g. if a new revision is created). @@ -510,6 +584,36 @@ class FieldCollectionItemEntity extends Entity { } /** + * Copies text to all languages the collection item has a translation for. + * + * @param $source_language + * Language code to copy the text from. + */ + public function copyTranslations($source_language = LANGUAGE_NONE) { + $target_languages = language_list(); + $fields = array_keys(field_info_instances('field_collection_item', $this->field_name)); + + foreach ($fields as $translatable_field) { + foreach ($target_languages as $langcode => $language) { + if (isset($this->{$translatable_field}[$source_language])) { + $this->{$translatable_field}[$langcode] = + $this->{$translatable_field}[$source_language]; + } + } + if ($source_language == LANGUAGE_NONE && count($this->{$translatable_field}) > 1) { + $this->{$translatable_field}[$source_language] = NULL; + } + } + } + + /** + * Add translations. + */ + public function addTranslations() { + global $language; + $langcode = $language->language; + $fields = array_keys(field_info_instances('field_collection_item', $this->field_name)); + foreach($fields as $field) { + if (!isset($this->{$field}[$langcode])) { + $value = reset($this->{$field}); + $this->{$field}[$langcode] = $value; + } + } + } + + /**