commit f71dfa9b69c44664cade38d0048373f409849f0c Author: Erik Stielstra Date: Fri Oct 21 18:12:50 2016 +0200 Issue 2461695-72 diff --git a/src/Plugin/Field/FieldWidget/InlineParagraphsWidget.php b/src/Plugin/Field/FieldWidget/InlineParagraphsWidget.php index 25efb48..f462c04 100644 --- a/src/Plugin/Field/FieldWidget/InlineParagraphsWidget.php +++ b/src/Plugin/Field/FieldWidget/InlineParagraphsWidget.php @@ -16,6 +16,7 @@ use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Render\Element; use Drupal\field\Entity\FieldConfig; use Drupal\paragraphs; +use Drupal\paragraphs\Entity\Paragraph; use Symfony\Component\Validator\ConstraintViolationInterface; @@ -167,7 +168,6 @@ class InlineParagraphsWidget extends WidgetBase { $parents = $element['#field_parents']; $paragraphs_entity = NULL; - $host = $items->getEntity(); $widget_state = static::getWidgetState($parents, $field_name, $form_state); $entity_manager = \Drupal::entityTypeManager(); @@ -216,61 +216,7 @@ class InlineParagraphsWidget extends WidgetBase { } if ($paragraphs_entity) { - // Detect if we are translating. - $this->initIsTranslating($form_state, $host); - $langcode = $form_state->get('langcode'); - - if (!$this->isTranslating) { - // Set the langcode if we are not translating. - if ($paragraphs_entity->get('langcode') != $langcode) { - // If a translation in the given language already exists, switch to - // that. If there is none yet, update the language. - if ($paragraphs_entity->hasTranslation($langcode)) { - $paragraphs_entity = $paragraphs_entity->getTranslation($langcode); - } - else { - $paragraphs_entity->set('langcode', $langcode); - } - } - } - - // Localised Paragraphs. - // If the parent field is marked as translatable, assume paragraphs - // to be localized (host entity expects different paragraphs for - // different languages) - elseif ($items->getFieldDefinition()->isTranslatable()) { - $paragraphs_entity = $this->cloneReferencedEntity($paragraphs_entity, $langcode); - } - - // Translated Paragraphs - // If the parent field is not translatable, assume the paragraph - // entity itself (rather the fields within it) are marked as - // translatable. (host entity expects same paragraphs in different - // languages). - else { - // Add translation if missing for the target language. - if (!$paragraphs_entity->hasTranslation($langcode)) { - // Get the selected translation of the paragraph entity. - $entity_langcode = $paragraphs_entity->language()->getId(); - $source = $form_state->get(['content_translation', 'source']); - $source_langcode = $source ? $source->getId() : $entity_langcode; - $paragraphs_entity = $paragraphs_entity->getTranslation($source_langcode); - // The paragraphs entity has no content translation source field if - // no paragraph entity field is translatable, even if the host is. - if ($paragraphs_entity->hasField('content_translation_source')) { - // Initialise the translation with source language values. - $paragraphs_entity->addTranslation($langcode, $paragraphs_entity->toArray()); - $translation = $paragraphs_entity->getTranslation($langcode); - $manager = \Drupal::service('content_translation.manager'); - $manager->getTranslationMetadata($translation)->setSource($paragraphs_entity->language()->getId()); - } - } - // If any paragraphs type is translatable do not switch. - if ($paragraphs_entity->hasField('content_translation_source')) { - // Switch the paragraph to the translation. - $paragraphs_entity = $paragraphs_entity->getTranslation($langcode); - } - } + $paragraphs_entity = $this->prepareEntity($paragraphs_entity, $items, $form_state); $element_parents = $parents; $element_parents[] = $field_name; @@ -1137,6 +1083,82 @@ class InlineParagraphsWidget extends WidgetBase { } /** + * Prepares the paragraph entity for translation. + * + * @param \Drupal\paragraphs\Entity\Paragraph $entity + * The paragraph entity. + * @param \Drupal\Core\Field\FieldItemListInterface $items + * The field items list that hosts this paragraph. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. + * + * @return \Drupal\paragraphs\Entity\Paragraph + * The prepared paragraph. + * + * @see \Drupal\Core\Entity\ContentEntityForm::initFormLangcodes(). + */ + protected function prepareEntity(Paragraph $entity, FieldItemListInterface $items, FormStateInterface $form_state) { + // Detect if we are translating. + $this->initIsTranslating($form_state, $items->getEntity()); + $langcode = $form_state->get('langcode'); + + if (!$this->isTranslating) { + // Set the langcode if we are not translating. + if ($entity->get('langcode') != $langcode) { + // If a translation in the given language already exists, switch to + // that. If there is none yet, update the language. + if ($entity->hasTranslation($langcode)) { + $entity = $entity->getTranslation($langcode); + } + else { + $entity->set('langcode', $langcode); + } + } + } + + // Localised Paragraphs. + // If the parent field is marked as translatable, assume paragraphs + // to be localized (host entity expects different paragraphs for + // different languages) + elseif ($items->getFieldDefinition()->isTranslatable()) { + $entity = $this->cloneReferencedEntity($entity, $langcode); + } + + // Translated Paragraphs + // If the parent field is not translatable, assume the paragraph + // entity itself (rather the fields within it) are marked as + // translatable. (host entity expects same paragraphs in different + // languages). + else { + // Add translation if missing for the target language. + if (!$entity->hasTranslation($langcode)) { + // Get the selected translation of the paragraph entity. + $entity_langcode = $entity->language()->getId(); + $source = $form_state->get(['content_translation', 'source']); + $source_langcode = $source ? $source->getId() : $entity_langcode; + $entity = $entity->getTranslation($source_langcode); + // The paragraphs entity has no content translation source field if + // no paragraph entity field is translatable, even if the host is. + if ($entity->hasField('content_translation_source')) { + // Initialise the translation with source language values. + $entity->addTranslation($langcode, $entity->toArray()); + $translation = $entity->getTranslation($langcode); + $manager = \Drupal::service('content_translation.manager'); + $manager->getTranslationMetadata($translation) + ->setSource($entity->language()->getId()); + } + } + // If any paragraphs type is translatable do not switch. + if ($entity->hasField('content_translation_source')) { + // Switch the paragraph to the translation. + $entity = $entity->getTranslation($langcode); + } + } + + return $entity; + } + +/** * Initializes the translation form state. * * @param \Drupal\Core\Form\FormStateInterface $form_state @@ -1262,4 +1284,4 @@ class InlineParagraphsWidget extends WidgetBase { // default? return in_array($entity_type_id, ['field_collection_item', 'paragraph']); } -} \ No newline at end of file +}