From 51c3d9254c7fdd0f9ffecf552d09fc54e72bdd15 Mon Sep 17 00:00:00 2001 From: Bartek Wajda Date: Thu, 10 Aug 2023 13:27:54 +0200 Subject: [PATCH] IBX-4031: Forced published non-translatable field to be shown in current field (#71) * IBX-4031: Forced published non-translatable field to be shown in current field * IBX-4031: Fixed Behat test * IBX-4031: Made `ContentUpdateMapperTest` final --- .../Behat/Context/UserRegistrationContext.php | 4 +- .../View/Filter/ContentEditViewFilter.php | 22 ++-- src/lib/Data/Mapper/ContentUpdateMapper.php | 10 +- .../Data/Mapper/ContentUpdateMapperTest.php | 108 ++++++++++++++++++ 4 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 tests/lib/Data/Mapper/ContentUpdateMapperTest.php diff --git a/src/lib/Behat/Context/UserRegistrationContext.php b/src/lib/Behat/Context/UserRegistrationContext.php index 0ec48caa..557747d9 100644 --- a/src/lib/Behat/Context/UserRegistrationContext.php +++ b/src/lib/Behat/Context/UserRegistrationContext.php @@ -305,8 +305,8 @@ public function addUserRegistrationConfiguration(PyStringNode $extraConfiguratio { $extraConfigurationString = str_replace( '', - $this->customUserGroup->id, - $extraConfigurationString + (string)$this->customUserGroup->id, + $extraConfigurationString->getRaw() ); $this->yamlConfigurationContext->addConfiguration(Yaml::parse($extraConfigurationString)); diff --git a/src/lib/Content/View/Filter/ContentEditViewFilter.php b/src/lib/Content/View/Filter/ContentEditViewFilter.php index b884322e..b191c7d2 100644 --- a/src/lib/Content/View/Filter/ContentEditViewFilter.php +++ b/src/lib/Content/View/Filter/ContentEditViewFilter.php @@ -74,18 +74,26 @@ public function handleContentEditForm(FilterViewBuilderParametersEvent $event) $request = $event->getRequest(); $languageCode = $request->attributes->get('language'); + $contentId = $request->attributes->getInt('contentId'); $contentDraft = $this->contentService->loadContent( - $request->attributes->getInt('contentId'), + $contentId, [$languageCode], // @todo: rename to languageCode in 3.0 $request->attributes->getInt('versionNo') ); + $currentContent = $this->contentService->loadContent($contentId); + $currentFields = $currentContent->getFields(); $contentType = $this->contentTypeService->loadContentType( $contentDraft->contentInfo->contentTypeId, $this->languagePreferenceProvider->getPreferredLanguages() ); - $contentUpdate = $this->resolveContentEditData($contentDraft, $languageCode, $contentType); + $contentUpdate = $this->resolveContentEditData( + $contentDraft, + $languageCode, + $contentType, + $currentFields, + ); $form = $this->resolveContentEditForm( $contentUpdate, $languageCode, @@ -99,22 +107,20 @@ public function handleContentEditForm(FilterViewBuilderParametersEvent $event) } /** - * @param \eZ\Publish\API\Repository\Values\Content\Content $content - * @param string $languageCode - * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType - * - * @return \EzSystems\EzPlatformContentForms\Data\Content\ContentUpdateData + * @param array<\eZ\Publish\API\Repository\Values\Content\Field> $currentFields */ private function resolveContentEditData( Content $content, string $languageCode, - ContentType $contentType + ContentType $contentType, + array $currentFields ): ContentUpdateData { $contentUpdateMapper = new ContentUpdateMapper(); return $contentUpdateMapper->mapToFormData($content, [ 'languageCode' => $languageCode, 'contentType' => $contentType, + 'currentFields' => $currentFields, ]); } diff --git a/src/lib/Data/Mapper/ContentUpdateMapper.php b/src/lib/Data/Mapper/ContentUpdateMapper.php index 6864a007..93d226fe 100644 --- a/src/lib/Data/Mapper/ContentUpdateMapper.php +++ b/src/lib/Data/Mapper/ContentUpdateMapper.php @@ -31,17 +31,23 @@ public function mapToFormData(ValueObject $contentDraft, array $params = []) $params = $optionsResolver->resolve($params); $languageCode = $params['languageCode']; + $currentFields = $params['currentFields']; + $mappedCurrentFields = array_column($currentFields, null, 'fieldDefIdentifier'); $data = new ContentUpdateData(['contentDraft' => $contentDraft]); $data->initialLanguageCode = $languageCode; $fields = $contentDraft->getFieldsByLanguage($languageCode); + foreach ($params['contentType']->fieldDefinitions as $fieldDef) { + $isNonTranslatable = $fieldDef->isTranslatable === false; $field = $fields[$fieldDef->identifier]; $data->addFieldData(new FieldData([ 'fieldDefinition' => $fieldDef, 'field' => $field, - 'value' => $field->value, + 'value' => $isNonTranslatable + ? $mappedCurrentFields[$fieldDef->identifier]->value + : $field->value, ])); } @@ -51,7 +57,7 @@ public function mapToFormData(ValueObject $contentDraft, array $params = []) private function configureOptions(OptionsResolver $optionsResolver) { $optionsResolver - ->setRequired(['languageCode', 'contentType']) + ->setRequired(['languageCode', 'contentType', 'currentFields']) ->setAllowedTypes('contentType', ContentType::class); } } diff --git a/tests/lib/Data/Mapper/ContentUpdateMapperTest.php b/tests/lib/Data/Mapper/ContentUpdateMapperTest.php new file mode 100644 index 00000000..8c583210 --- /dev/null +++ b/tests/lib/Data/Mapper/ContentUpdateMapperTest.php @@ -0,0 +1,108 @@ + 'name', + 'fieldTypeIdentifier' => 'ezstring', + 'languageCode' => 'eng-GB', + 'value' => 'Name', + ]), + new APIField([ + 'fieldDefIdentifier' => 'short_name', + 'fieldTypeIdentifier' => 'ezstring', + 'languageCode' => 'eng-DE', + 'value' => $expectedShortName = 'Nontranslateable short name', + ]), + ]; + $content = new Content([ + 'versionInfo' => new VersionInfo([ + 'contentInfo' => new ContentInfo([ + 'remoteId' => 'foo', + 'mainLanguage' => new Language([ + 'languageCode' => 'eng-GB', + ]), + 'alwaysAvailable' => true, + 'sectionId' => 2, + 'section' => new Section([ + 'id' => 2, + 'identifier' => 'foo_section_identifier', + ]), + 'publishedDate' => new \DateTime('2020-10-30T11:40:09+00:00'), + 'modificationDate' => new \DateTime('2020-10-30T11:40:09+00:00'), + 'mainLocation' => new APILocation([ + 'parentLocationId' => 1, + 'hidden' => true, + 'sortField' => 9, + 'sortOrder' => 0, + 'priority' => 1, + ]), + ]), + ]), + 'contentType' => $contentType = new ContentType([ + 'identifier' => 'folder', + 'fieldDefinitions' => new FieldDefinitionCollection([ + new FieldDefinition([ + 'identifier' => 'name', + 'isTranslatable' => true, + 'defaultValue' => '', + ]), + new FieldDefinition([ + 'identifier' => 'short_name', + 'isTranslatable' => false, + 'defaultValue' => '', + ]), + ]), + ]), + 'internalFields' => [ + new APIField([ + 'fieldDefIdentifier' => 'name', + 'fieldTypeIdentifier' => 'ezstring', + 'languageCode' => 'ger-DE', + 'value' => $expectedName = 'GER name', + ]), + new APIField([ + 'fieldDefIdentifier' => 'short_name', + 'fieldTypeIdentifier' => 'ezstring', + 'languageCode' => 'ger-DE', + 'value' => '', + ]), + ], + ]); + + $data = (new ContentUpdateMapper())->mapToFormData($content, [ + 'languageCode' => 'ger-DE', + 'contentType' => $contentType, + 'currentFields' => $currentFields, + ]); + + $fieldsData = $data->fieldsData; + + self::assertSame($expectedName, $fieldsData['name']->value); + self::assertSame($expectedShortName, $fieldsData['short_name']->value); + } +}