You are here

function entity_translation_unified_form_build_field in Entity Translation Unified Form 8

Create a field definition from the existing one. Checks about the fields should have been done before calling this

1 call to entity_translation_unified_form_build_field()
entity_translation_unified_form_node_insert_other_language_fields in ./entity_translation_unified_form.module
Add all enabled language fields for a single field.

File

./entity_translation_unified_form.module, line 588

Code

function entity_translation_unified_form_build_field($form, $form_state, $entity, $entity_type, $bundle, $field_name, $langcode) {
  $language_manager = \Drupal::languageManager();
  $initial_language = $language_manager
    ->getConfigOverrideLanguage();
  $translate_labels = entity_translation_unified_form_translate_labels_enabled($entity_type, $bundle);

  // force language
  if ($translate_labels) {
    $language_manager
      ->setConfigOverrideLanguage($language_manager
      ->getLanguage($langcode));
    \Drupal::service("entity_field.manager")
      ->clearCachedFieldDefinitions();
  }

  // get data for language
  if ($entity
    ->hasTranslation($langcode)) {
    $entity = $entity
      ->getTranslation($langcode);
  }
  else {
    $entity = $entity
      ->addTranslation($langcode);
  }
  $form_display = EntityFormDisplay::collectRenderDisplay($entity, 'default');

  // get the items depending of the $entity
  if ($entity
    ->hasTranslation($langcode)) {
    if ($entity_type == 'node' && $entity
      ->isLatestRevision()) {

      // @todo Simplify this code that was written without sleep, for now, holding my nose.
      // LatestRevision default language is not the same revision id as other lang or vice versa.
      // Might want to add a check to see if content_moderation is activated for this content type.
      $storage = \Drupal::entityTypeManager()
        ->getStorage($entity_type);
      if (!empty($entity
        ->id())) {
        $latestTranslationAffectedRevisionId = $storage
          ->getLatestTranslationAffectedRevisionId($entity
          ->id(), $langcode);
        if (is_numeric($latestTranslationAffectedRevisionId)) {
          $entityOtherLangLatestRevision = $storage
            ->loadRevision($latestTranslationAffectedRevisionId);
        }
      }
      if (empty($entityOtherLangLatestRevision)) {
        $definition = $entity
          ->getFieldDefinition($field_name);
        if (isset($definition) && $definition
          ->isTranslatable()) {
          $items = $entity
            ->getTranslation($langcode)
            ->get($field_name);
        }
        else {
          $items = $entity
            ->get($field_name);
        }
      }
      else {
        $definitionLatest = $entityOtherLangLatestRevision
          ->getFieldDefinition($field_name);
        if (!empty($definitionLatest
          ->getType()) && $definitionLatest
          ->isTranslatable()) {

          // Now get the latest revision of $other_langcode.
          $items = $entityOtherLangLatestRevision
            ->getTranslation($langcode)
            ->get($field_name);
        }
        else {
          $items = $entityOtherLangLatestRevision
            ->get($field_name);
        }
      }
    }
    else {
      $items = $entity
        ->getTranslation($langcode)
        ->get($field_name);
    }
  }
  else {
    $items = $entity
      ->addTranslation($langcode)
      ->get($field_name);
  }
  $widget = $form_display
    ->getRenderer($field_name);
  if (empty($widget)) {

    // restore language
    if ($translate_labels) {
      $language_manager
        ->setConfigOverrideLanguage($initial_language);
      \Drupal::service("entity_field.manager")
        ->clearCachedFieldDefinitions();
    }
    return [];
  }
  $field_form = $widget
    ->form($items, $form, $form_state);

  // manage default value (because Drupal is not able to set the default_value that matches the
  // forced language, so it has to be done by hand…). This is probably incomplete.
  if ($entity
    ->isNew()) {

    // get default value (at least 'title' field don't have any definition)
    if (!$translate_labels) {

      // default value must come with forced language
      $language_manager
        ->setConfigOverrideLanguage($language_manager
        ->getLanguage($langcode));
      \Drupal::service("entity_field.manager")
        ->clearCachedFieldDefinitions();
    }
    $field_definition = \Drupal\field\Entity\FieldConfig::loadByName($entity_type, $bundle, $field_name);
    if ($field_definition) {
      $def = $field_definition
        ->getDefaultValue($entity);
    }
    else {
      $def = [];
    }
    if (!$translate_labels) {
      $language_manager
        ->setConfigOverrideLanguage($initial_language);
      \Drupal::service("entity_field.manager")
        ->clearCachedFieldDefinitions();
    }
    if (isset($def) and !empty($def)) {
      if (isset($field_form['widget']['#default_value'])) {
        $field_form['widget']['#default_value'] = entity_translation_unified_form_def_value($def, true);
      }
      else {
        foreach ($def as $idx => $cont) {
          if (isset($field_form['widget'][$idx]['value'])) {
            if (!empty($cont)) {
              $field_form['widget'][$idx]['value']['#default_value'] = entity_translation_unified_form_def_value($cont);
            }
          }
        }
      }
    }
  }

  // restore language
  if ($translate_labels) {
    $language_manager
      ->setConfigOverrideLanguage($initial_language);
    \Drupal::service("entity_field.manager")
      ->clearCachedFieldDefinitions();
  }
  return $field_form;
}