From 7c2b1f5ab8e69259e4db5d371246d5efd76ba9ff Mon Sep 17 00:00:00 2001 From: Paula Iuga Date: Fri, 19 Jul 2024 15:16:09 +0300 Subject: [PATCH 1/3] refs#26028 fix files that create duplicates --- .../FieldWidget/FileMultiLanguageWidget.php | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php index cf572b8..e6e8121 100755 --- a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php +++ b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php @@ -106,6 +106,7 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f $elements['#type'] = 'details'; $elements['#open'] = TRUE; $elements['#title'] = $this->fieldDefinition->getLabel(); + $elements['#element_validate'] = [[$this, 'validate']]; $elements['languages'] = [ '#type' => 'horizontal_tabs', @@ -126,7 +127,8 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f $this->singleFieldIsRequired = $this->fieldDefinition->isRequired() && $language->isDefault(); if ($entity->hasTranslation($language->getId())) { - $translatedField = $entity->getTranslation($language->getId())->get($fieldName); + $translatedField = $entity->getTranslation($language->getId()) + ->get($fieldName); $elements['languages'][$language->getId()]['data'] = parent::formMultipleElements($translatedField, $form, $form_state); continue; } @@ -185,7 +187,8 @@ public function extractFormValues(FieldItemListInterface $items, array $form, Fo $entity->getTranslation($langcode) : $entity->addTranslation($langcode, $values); - $translationValues = array_column($translation->get($field_name)->getValue(), 'target_id'); + $translationValues = array_column($translation->get($field_name) + ->getValue(), 'target_id'); if (in_array($item['target_id'], $translationValues)) { continue; } @@ -282,6 +285,56 @@ public function extractFormValuesMultiLanguage(FieldItemListInterface $items, ar } } + /** + * Validates if the same file is added on different languages. + * + * @param array $element + * The widget form element. + * @param \Drupal\Core\Form\FormStateInterface $formState + * The form state. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + */ + public function validate(array $element, FormStateInterface $formState) { + $fileStorage = $this->entityTypeManager->getStorage('file'); + $value = $formState->getValue($this->fieldDefinition->getName()); + if (empty($value) || !isset($value['languages'])) { + return; + } + + $fileLangMap = []; + foreach ($value['languages'] as $langCode => $items) { + if (!isset($items['data'])) { + continue; + } + + foreach ($items['data'] as $item) { + foreach ($item['fids'] as $fid) { + /** @var \Drupal\file\Entity\File $file */ + $file = $fileStorage->load($fid); + $sha = hash_file('sha256', $file->getFileUri()); + if (!isset($fileLangMap[$sha])) { + $fileLangMap[$sha] = [$langCode]; + continue; + } + + if (!in_array($langCode, $fileLangMap[$sha])) { + $languages = [$this->languageManager->getLanguage($fileLangMap[$sha][0])->getName()]; + $languages[] = $this->languageManager->getLanguage($langCode)->getName(); + + $formState->setError($element, $this->t('Same file, %fileName, appears multiple times for different languages: %languages.', [ + '%fileName' => $file->getFilename(), + '%languages' => implode(', ', $languages), + ])); + return; + } + } + } + } + + } + /** * {@inheritdoc} */ From 305f4edffd2b5fa85fe793f90f6c9ecc3cbaa44a Mon Sep 17 00:00:00 2001 From: Paula Iuga Date: Mon, 29 Jul 2024 15:54:13 +0300 Subject: [PATCH 2/3] refs#26028 don't run validation if the form is not submitted yet --- .../Plugin/Field/FieldWidget/FileMultiLanguageWidget.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php index e6e8121..de2feae 100755 --- a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php +++ b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php @@ -299,6 +299,12 @@ public function extractFormValuesMultiLanguage(FieldItemListInterface $items, ar public function validate(array $element, FormStateInterface $formState) { $fileStorage = $this->entityTypeManager->getStorage('file'); $value = $formState->getValue($this->fieldDefinition->getName()); + $userInput = $formState->getUserInput(); + // Check if there is not an AJAX request. + if (!$formState->isSubmitted() || !empty($userInput['_drupal_ajax'])) { + return; + } + if (empty($value) || !isset($value['languages'])) { return; } From d4786584cd64509aaf5d67579d7ffb00e6e7e343 Mon Sep 17 00:00:00 2001 From: Paula Iuga Date: Tue, 30 Jul 2024 15:00:04 +0300 Subject: [PATCH 3/3] refs#26028 tried to fix widget values --- .../FieldWidget/FileMultiLanguageWidget.php | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php index de2feae..f80b364 100755 --- a/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php +++ b/modules/edw_document/src/Plugin/Field/FieldWidget/FileMultiLanguageWidget.php @@ -98,8 +98,8 @@ public static function create(ContainerInterface $container, array $configuratio protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) { $fieldName = $this->fieldDefinition->getName(); $languages = $this->languageManager->getLanguages(); + $selectedValues = $form_state->getValue($fieldName); $currentLangcode = $this->languageManager->getCurrentLanguage()->getId(); - /** @var \Drupal\Core\Entity\ContentEntityBase $entity */ $entity = $items->getEntity(); $elements = []; @@ -130,15 +130,46 @@ protected function formMultipleElements(FieldItemListInterface $items, array &$f $translatedField = $entity->getTranslation($language->getId()) ->get($fieldName); $elements['languages'][$language->getId()]['data'] = parent::formMultipleElements($translatedField, $form, $form_state); + $this->fixWidgetFileItems($elements, $selectedValues, $language->getId()); continue; } $elements['languages'][$language->getId()]['data'] = parent::formMultipleElements($this->getEmptyField($items), $form, $form_state); + $this->fixWidgetFileItems($elements, $selectedValues, $language->getId()); } + return $elements; } + public function fixWidgetFileItems(array &$element, ?array $selectedValues, $langCode) { + if (empty($selectedValues) || array_key_exists($langCode, $selectedValues['languages'])) { + return; + } + + foreach ($element['languages'][$langCode]['data'] as $key => $item) { + if (!is_array($item) || !isset($item['#default_value']['fids'])) { + continue; + } + + $foundFile = FALSE; + foreach ($selectedValues['languages'] as $languageFile) { + if ($foundFile) { + break; + } + + foreach ($languageFile['data'] as $selectedItem) { + $commonFids = array_intersect($selectedItem['fids'], $item['#default_value']['fids']); + if (!empty($commonFids)) { + unset($element['languages'][$langCode]['data'][$key]); + $foundFile = TRUE; + break; + } + } + } + } + } + /** * {@inheritdoc} * @@ -326,8 +357,12 @@ public function validate(array $element, FormStateInterface $formState) { } if (!in_array($langCode, $fileLangMap[$sha])) { - $languages = [$this->languageManager->getLanguage($fileLangMap[$sha][0])->getName()]; - $languages[] = $this->languageManager->getLanguage($langCode)->getName(); + $languages = [ + $this->languageManager->getLanguage($fileLangMap[$sha][0]) + ->getName(), + ]; + $languages[] = $this->languageManager->getLanguage($langCode) + ->getName(); $formState->setError($element, $this->t('Same file, %fileName, appears multiple times for different languages: %languages.', [ '%fileName' => $file->getFilename(),