public function ContentTranslationHandler::entityFormAlter in Drupal 10
Same name and namespace in other branches
- 8 core/modules/content_translation/src/ContentTranslationHandler.php \Drupal\content_translation\ContentTranslationHandler::entityFormAlter()
- 9 core/modules/content_translation/src/ContentTranslationHandler.php \Drupal\content_translation\ContentTranslationHandler::entityFormAlter()
File
- core/modules/content_translation/src/ContentTranslationHandler.php, line 316
Class
- ContentTranslationHandler
- Base class for content translation handlers.
Namespace
Drupal\content_translation
Code
public function entityFormAlter(array &$form, FormStateInterface $form_state, EntityInterface $entity) {
$metadata = $this->manager
->getTranslationMetadata($entity);
$form_object = $form_state
->getFormObject();
$form_langcode = $form_object
->getFormLangcode($form_state);
$entity_langcode = $entity
->getUntranslated()
->language()
->getId();
$new_translation = $entity
->isNewTranslation();
$translations = $entity
->getTranslationLanguages();
if ($new_translation) {
unset($translations[$form_langcode]);
}
$is_translation = $new_translation || $entity
->language()
->getId() != $entity_langcode;
$has_translations = count($translations) > 1;
$languages = $this->languageManager
->getLanguages();
if (isset($languages[$form_langcode]) && ($has_translations || $new_translation)) {
$title = $this
->entityFormTitle($entity);
if ($is_translation) {
$t_args = [
'%language' => $languages[$form_langcode]
->getName(),
'%title' => $entity
->label(),
'@title' => $title,
];
$title = $new_translation ? t('Create %language translation of %title', $t_args) : t('@title [%language translation]', $t_args);
}
$form['#title'] = $title;
}
if ($has_translations && $new_translation) {
$source_langcode = $metadata
->getSource();
$form['source_langcode'] = [
'#type' => 'details',
'#title' => t('Source language: @language', [
'@language' => $languages[$source_langcode]
->getName(),
]),
'#tree' => TRUE,
'#weight' => -100,
'#multilingual' => TRUE,
'source' => [
'#title' => t('Select source language'),
'#title_display' => 'invisible',
'#type' => 'select',
'#default_value' => $source_langcode,
'#options' => [],
],
'submit' => [
'#type' => 'submit',
'#value' => t('Change'),
'#submit' => [
[
$this,
'entityFormSourceChange',
],
],
],
];
foreach ($this->languageManager
->getLanguages() as $language) {
if (isset($translations[$language
->getId()])) {
$form['source_langcode']['source']['#options'][$language
->getId()] = $language
->getName();
}
}
}
$langcode_key = $this->entityType
->getKey('langcode');
if (isset($form[$langcode_key])) {
$language_widget =& $form[$langcode_key];
}
if (isset($language_widget['widget'][0]['value']) && !$is_translation && $has_translations) {
$language_select =& $language_widget['widget'][0]['value'];
if ($language_select['#type'] == 'language_select') {
$options = [];
foreach ($this->languageManager
->getLanguages() as $language) {
if (empty($translations[$language
->getId()]) || $language
->getId() == $entity_langcode) {
$options[$language
->getId()] = $language
->getName();
}
}
$language_select['#options'] = $options;
}
}
if ($is_translation) {
if (isset($language_widget)) {
$language_widget['widget']['#access'] = FALSE;
}
if (!$new_translation) {
$weight = 100;
foreach ([
'delete',
'submit',
] as $key) {
if (isset($form['actions'][$key]['weight'])) {
$weight = $form['actions'][$key]['weight'];
break;
}
}
$delete_access = \Drupal::service('content_translation.delete_access')
->checkAccess($entity);
$access = $delete_access
->isAllowed() && ($this
->getTranslationAccess($entity, 'delete')
->isAllowed() || $entity
->access('delete') && $this->entityType
->hasLinkTemplate('delete-form'));
$form['actions']['delete_translation'] = [
'#type' => 'submit',
'#value' => t('Delete translation'),
'#weight' => $weight,
'#submit' => [
[
$this,
'entityFormDeleteTranslation',
],
],
'#access' => $access,
];
}
unset($form['actions']['delete']);
}
if ($new_translation || $has_translations) {
$form['content_translation'] = [
'#type' => 'details',
'#title' => t('Translation'),
'#tree' => TRUE,
'#weight' => 10,
'#access' => $this
->getTranslationAccess($entity, $new_translation ? 'create' : 'update')
->isAllowed(),
'#multilingual' => TRUE,
];
if (isset($form['advanced'])) {
$form['content_translation'] += [
'#group' => 'advanced',
'#weight' => 100,
'#attributes' => [
'class' => [
'entity-translation-options',
],
],
];
}
$status = $new_translation || $metadata
->isPublished();
$enabled = TRUE;
if ($status) {
$published = 0;
foreach ($entity
->getTranslationLanguages() as $langcode => $language) {
$published += $this->manager
->getTranslationMetadata($entity
->getTranslation($langcode))
->isPublished();
}
$enabled = $published > 1;
}
$description = $enabled ? t('An unpublished translation will not be visible without translation permissions.') : t('Only this translation is published. You must publish at least one more translation to unpublish this one.');
$form['content_translation']['status'] = [
'#type' => 'checkbox',
'#title' => t('This translation is published'),
'#default_value' => $status,
'#description' => $description,
'#disabled' => !$enabled,
];
$translate = !$new_translation && $metadata
->isOutdated();
$outdated_access = !ContentTranslationManager::isPendingRevisionSupportEnabled($entity
->getEntityTypeId(), $entity
->bundle());
if (!$outdated_access) {
$form['content_translation']['outdated'] = [
'#markup' => $this
->t('Translations cannot be flagged as outdated when content is moderated.'),
];
}
elseif (!$translate) {
$form['content_translation']['retranslate'] = [
'#type' => 'checkbox',
'#title' => t('Flag other translations as outdated'),
'#default_value' => FALSE,
'#description' => t('If you made a significant change, which means the other translations should be updated, you can flag all translations of this content as outdated. This will not change any other property of them, like whether they are published or not.'),
'#access' => $outdated_access,
];
}
else {
$form['content_translation']['outdated'] = [
'#type' => 'checkbox',
'#title' => t('This translation needs to be updated'),
'#default_value' => $translate,
'#description' => t('When this option is checked, this translation needs to be updated. Uncheck when the translation is up to date again.'),
'#access' => $outdated_access,
];
$form['content_translation']['#open'] = TRUE;
}
$uid = 0;
if ($new_translation) {
$uid = $this->currentUser
->id();
}
elseif (($account = $metadata
->getAuthor()) && $account
->id()) {
$uid = $account
->id();
}
$form['content_translation']['uid'] = [
'#type' => 'entity_autocomplete',
'#title' => t('Authored by'),
'#target_type' => 'user',
'#default_value' => User::load($uid),
'#validate_reference' => FALSE,
'#maxlength' => 60,
'#description' => t('Leave blank for %anonymous.', [
'%anonymous' => \Drupal::config('user.settings')
->get('anonymous'),
]),
];
$date = $new_translation ? REQUEST_TIME : $metadata
->getCreatedTime();
$form['content_translation']['created'] = [
'#type' => 'textfield',
'#title' => t('Authored on'),
'#maxlength' => 25,
'#description' => t('Format: %time. The date format is YYYY-MM-DD and %timezone is the time zone offset from UTC. Leave blank to use the time of form submission.', [
'%time' => $this->dateFormatter
->format(REQUEST_TIME, 'custom', 'Y-m-d H:i:s O'),
'%timezone' => $this->dateFormatter
->format(REQUEST_TIME, 'custom', 'O'),
]),
'#default_value' => $new_translation || !$date ? '' : $this->dateFormatter
->format($date, 'custom', 'Y-m-d H:i:s O'),
];
$form['#process'][] = [
$this,
'entityFormSharedElements',
];
}
$form['#entity_builders'][] = [
$this,
'entityFormEntityBuild',
];
$form['#validate'][] = [
$this,
'entityFormValidate',
];
if (isset($form['actions']['delete'])) {
$form['actions']['delete']['#submit'][] = [
$this,
'entityFormDelete',
];
}
foreach (Element::children($form['actions']) as $action) {
if (isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] == 'submit') {
array_unshift($form['actions'][$action]['#submit'], [
$this,
'entityFormSubmit',
]);
}
}
}