function entity_translation_unified_form_node_form_submit in Entity Translation Unified Form 8
Same name and namespace in other branches
- 7 entity_translation_unified_form.module \entity_translation_unified_form_node_form_submit()
Form submission handler for node_form().
Configure entity translation node object for entity_translation_unified_form.
1 string reference to 'entity_translation_unified_form_node_form_submit'
- 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 952
Code
function entity_translation_unified_form_node_form_submit(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();
if ($entity instanceof RevisionLogInterface) {
$lastRevisionLogMessage[$langcode] = $entity
->getRevisionLogMessage();
}
$stateOtherLang = '';
foreach ($other_languages as $other_langcode => $other_language) {
if ($entity instanceof RevisionLogInterface) {
$lastRevisionLogMessage[$other_langcode] = $entity->revision_log->value;
}
// 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);
}
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 == 'moderation_state') {
// Handle moderation_state value.
$moderationArray = reset($values[$etuf_name]);
$stateOtherLang = $moderationArray['value'];
$translation
->getTranslation($other_langcode)
->set($field_name, $stateOtherLang);
}
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 (!is_null($translation)) {
if (!empty($stateOtherLang)) {
if ($entity instanceof RevisionLogInterface) {
// Retrieve the most recent revision log message.
$lastRevisionLogMessage[$other_langcode] = $translation
->getRevisionLogMessage();
}
// Set a new revision.
$translation
->getTranslation($other_langcode)
->setNewRevision(TRUE);
$entity
->getTranslation($langcode)
->set('moderation_state', $stateOtherLang);
$translation
->getTranslation($other_langcode)
->set('moderation_state', $stateOtherLang);
if ($translation instanceof RevisionLogInterface) {
$current_uid = \Drupal::currentUser()
->id();
$translation
->getTranslation($other_langcode)
->setRevisionCreationTime(\Drupal::time()
->getRequestTime());
if (empty($lastRevisionLogMessage[$other_langcode])) {
$revisionLogMsg = $lastRevisionLogMessage[$langcode];
}
else {
$revisionLogMsg = $lastRevisionLogMessage[$other_langcode];
}
$translation
->getTranslation($other_langcode)
->setRevisionLogMessage($revisionLogMsg);
$translation
->getTranslation($other_langcode)
->setRevisionUserId($current_uid);
}
// We must set this flag otherwise the translated revisions do not get the correct worfklow state.
// Content Moderation is enabled.
$translation
->setRevisionTranslationAffected(TRUE);
$translation
->setChangedTime(time());
}
drupal_register_shutdown_function('_custom_shutdown', $translation, $other_langcode, $stateOtherLang, $langcode);
}
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);
}
}
}
}