You are here

function entity_translation_unified_form_node_form_preview in Entity Translation Unified Form 8

Form submission handler for node_form_preview().

Configure entity translation node object for entity_translation_unified_form.

1 string reference to 'entity_translation_unified_form_node_form_preview'
entity_translation_unified_form_form_alter in ./entity_translation_unified_form.module
Add language fields to node forms.

File

./entity_translation_unified_form.module, line 818

Code

function entity_translation_unified_form_node_form_preview(array $form, FormStateInterface $form_state) {
  $language = \Drupal::languageManager()
    ->getCurrentLanguage();
  $langcode = $language
    ->getId();
  $other_languages = EtufHelper::getOtherEnabledLanguages();
  $form_object = $form_state
    ->getFormObject();
  $entity = NULL;
  if ($form_object instanceof EntityForm) {
    $entity = $form_object
      ->getEntity();
    $entity_type = $entity
      ->getEntityTypeId();
    $bundle = $entity
      ->bundle();
    $entityManager = \Drupal::service('entity_field.manager');
    $fields = $entityManager
      ->getFieldDefinitions($entity_type, $bundle);

    // Process the translated values.
    $values = $form_state
      ->getValues();
    $stateOtherLang = '';
    foreach ($other_languages as $other_langcode => $other_language) {

      // Get the existing translation, or create one if it doesn't currently exist.
      $action = 'add';
      if ($entity
        ->hasTranslation($other_langcode)) {
        $action = 'update';
        $translation = $entity
          ->getTranslation($other_langcode);
      }
      else {
        $translation = $entity
          ->addTranslation($other_langcode);
      }
      $translation
        ->setRevisionTranslationAffected(TRUE);
      foreach ($fields as $field_name => $field_definition) {
        $etuf_name = $field_name . '-etuf-' . $other_langcode;
        $field_type = $field_definition
          ->getType();

        // Copy the translated values from form_state to the entity translation.
        if (isset($values[$etuf_name])) {
          if ($field_type == 'metatag' && isset($values[$etuf_name])) {

            // Begin processing form for metatags into the expected format.
            $metatags_from_form = $values[$etuf_name];
            $metatags_reset_form = reset($metatags_from_form);
            $metatags_prep = [];
            foreach ($metatags_reset_form as $outer_key => $metatags_part) {
              if (is_array($metatags_part)) {
                foreach ($metatags_part as $key => $value) {

                  // Flatten metatags to key=>value.
                  $metatags_prep[$key] = $value;
                }
              }
            }

            // End of metatag transformation, now serialize.
            $metatags_serialized = serialize($metatags_prep);

            // Save the serialized metatags to the field.
            $translation
              ->set($field_name, $metatags_serialized);
          }
          elseif ($field_name == 'created' && $field_type == 'created') {

            // Fix date/time bug #3117164.
            // Part 1/4 fix date/time bug #3117164, would otherwise be 1970, copy from source.
            $dateObj = $values[$etuf_name][0]['value'];
            $translation
              ->set($field_name, $dateObj
              ->getTimestamp());
          }
          elseif ($field_type == 'image') {

            // Special treatment for managed files, not sure why? (core bug workaround?).
            if (isset($values[$etuf_name][0]['fids'][0])) {
              $numberOfFiles = count($values[$etuf_name]);
              if ($numberOfFiles == 1) {

                // Just one file/image to fix, otherwise seems ok.
                if (!isset($values[$etuf_name][0]['target_id'])) {
                  $values[$etuf_name][0]['target_id'] = $values[$etuf_name][0]['fids'][0];
                  unset($values[$etuf_name][0]['fids']);
                }
              }
              elseif ($numberOfFiles > 1) {
                for ($i = 0; $i < $numberOfFiles; $i++) {
                  if (!isset($values[$etuf_name][$i]['target_id']) && isset($values[$etuf_name][$i]['fids'][0])) {
                    $values[$etuf_name][$i]['target_id'] = $values[$etuf_name][$i]['fids'][0];
                    unset($values[$etuf_name][$i]['fids']);
                  }
                }
              }
            }
            $translation
              ->set($field_name, $values[$etuf_name]);
          }
          elseif (isset($field_name) && !is_null($translation)) {

            // Default.
            $translation
              ->set($field_name, $values[$etuf_name]);
          }
          elseif ($field_name == 'created' && $field_type == 'created' && isset($values[$field_name])) {

            // Fix date/time bug #3117164.
            // Part 2/4 fix date/time bug #3117164, would otherwise be 1970, copy from source.
            $dateObj = $values[$field_name][0]['value'];
            if (!is_null($dateObj)) {
              $translation
                ->set($field_name, $dateObj
                ->getTimestamp());
            }
          }
          elseif (isset($translation) && $field_name == 'revision_timestamp') {

            // Part 3/4 fix date/time bug #3117164, would otherwise be NULL.
            // $values[$field_name] = \Drupal::time()->getCurrentTime();
            $values[$etuf_name] = \Drupal::time()
              ->getCurrentTime();
          }
          elseif (isset($translation) && $field_name == 'changed' && $field_type == 'changed') {

            // Part 4/4 fix date/time bug #3117164, would otherwise be NULL.
            $values[$etuf_name] = \Drupal::time()
              ->getCurrentTime();
          }
        }
      }

      // End of foreach field_definition.
      if (!isset($once_only)) {
        $once_only = TRUE;
        if (!empty($stateOtherLang)) {

          // Content Moderation is enabled.
          // We must set this flag otherwise the translated revisions do not get the correct worfklow state.
          $entity
            ->setRevisionTranslationAffected(TRUE);
          $entity
            ->setChangedTime(time());
        }
      }

      // Fill in title, if it isn't set.
      if (method_exists($translation, 'getTitle') && empty($translation
        ->getTitle())) {
        $title = $entity
          ->getTitle();
        $translation
          ->setTitle($title);
      }
    }
  }
}