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;
}