From aef822b833147617b1ffa20fb0e449e152638756 Mon Sep 17 00:00:00 2001 From: Lorenzo Ruozzi Date: Thu, 14 Apr 2022 17:26:55 +0200 Subject: [PATCH] Handle boolean attribute option values (#106) --- .../ProductOptionValueHandlerSpec.php | 43 ++++++++++++++++++ .../WebgriffeSyliusAkeneoExtension.php | 2 +- .../ProductOptionValueHandler.php | 45 +++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/spec/ValueHandler/ProductOptionValueHandlerSpec.php b/spec/ValueHandler/ProductOptionValueHandlerSpec.php index 6d014e4f..8ecce944 100644 --- a/spec/ValueHandler/ProductOptionValueHandlerSpec.php +++ b/spec/ValueHandler/ProductOptionValueHandlerSpec.php @@ -400,4 +400,47 @@ public function it_supports_product_option_metrical_value( $productVariant->addOptionValue($productOptionValue)->shouldHaveBeenCalled(); $productOptionValueTranslationFactory->createNew()->shouldHaveBeenCalledOnce(); } + + public function it_supports_product_option_boolean_value( + ProductVariantInterface $productVariant, + ProductOptionValueInterface $productOptionValue, + ProductOptionValueTranslationInterface $englishProductOptionValueTranslation, + ProductOptionValueTranslationInterface $italianProductOptionValueTranslation, + ProductOptionInterface $productOption, + RepositoryInterface $productOptionValueRepository, + ApiClientInterface $apiClient, + FactoryInterface $productOptionValueTranslationFactory, + TranslatorInterface $translator + ): void { + $apiClient->findAttribute(self::OPTION_CODE)->willReturn( + [ + 'code' => self::OPTION_CODE, + 'type' => 'pim_catalog_boolean' + ] + ); + $value = [ + [ + 'scope' => null, + 'locale' => null, + 'data' => true, + ], + ]; + $translator->trans('sylius.ui.yes_label', [], null, 'en_US')->shouldBeCalledOnce()->willReturn('Yes'); + $translator->trans('sylius.ui.yes_label', [], null, 'it_IT')->shouldBeCalledOnce()->willReturn('Si'); + $productVariant->hasOptionValue($productOptionValue)->willReturn(false); + $productOptionValueRepository->findOneBy(['code' => 'option-code_1'])->willReturn(null); + + $this->handle($productVariant, self::OPTION_CODE, $value); + + $productOptionValue->setCode('option-code_1')->shouldHaveBeenCalled(); + $productOptionValue->setOption($productOption)->shouldHaveBeenCalled(); + $productOption->addValue($productOptionValue)->shouldHaveBeenCalled(); + $englishProductOptionValueTranslation->setValue('Yes')->shouldHaveBeenCalled(); + $italianProductOptionValueTranslation->setLocale('it_IT')->shouldHaveBeenCalled(); + $italianProductOptionValueTranslation->setValue('Si')->shouldHaveBeenCalled(); + $productOptionValue->addTranslation($englishProductOptionValueTranslation)->shouldHaveBeenCalled(); + $productOptionValue->addTranslation($italianProductOptionValueTranslation)->shouldHaveBeenCalled(); + $productVariant->addOptionValue($productOptionValue)->shouldHaveBeenCalled(); + $productOptionValueTranslationFactory->createNew()->shouldHaveBeenCalledOnce(); + } } diff --git a/src/DependencyInjection/WebgriffeSyliusAkeneoExtension.php b/src/DependencyInjection/WebgriffeSyliusAkeneoExtension.php index e3345178..d7d575ea 100644 --- a/src/DependencyInjection/WebgriffeSyliusAkeneoExtension.php +++ b/src/DependencyInjection/WebgriffeSyliusAkeneoExtension.php @@ -146,7 +146,7 @@ final class WebgriffeSyliusAkeneoExtension extends AbstractResourceExtension imp '$productOptionValueTranslationFactory' => 'sylius.factory.product_option_value_translation', '$productOptionValueRepository' => 'sylius.repository.product_option_value', '$translationLocaleProvider' => 'sylius.translation_locale_provider.admin', - '$translator' => 'translator' + '$translator' => 'translator', ], ], 'translatable_property' => [ diff --git a/src/ValueHandler/ProductOptionValueHandler.php b/src/ValueHandler/ProductOptionValueHandler.php index a897f24f..68af412e 100644 --- a/src/ValueHandler/ProductOptionValueHandler.php +++ b/src/ValueHandler/ProductOptionValueHandler.php @@ -147,6 +147,11 @@ public function handle($productVariant, string $optionCode, array $akeneoValue): Assert::isArray($akeneoValueData); $this->handleMetricOption($productOption, $optionCode, $akeneoValueData, $product, $productVariant); + break; + case 'pim_catalog_boolean': + Assert::boolean($akeneoValueData); + $this->handleBooleanOption($productOption, $optionCode, $akeneoValueData, $product, $productVariant); + break; default: throw new LogicException(sprintf('The Akeneo attribute type "%s" is not supported from the "%s"', $attributeType, self::class)); @@ -254,6 +259,46 @@ private function handleMetricOption(ProductOptionInterface $productOption, strin } } + private function handleBooleanOption(ProductOptionInterface $productOption, string $optionCode, bool $akeneoDataValue, ProductInterface $product, ProductVariantInterface $productVariant): void + { + $optionValueCode = $optionCode . '_' . $akeneoDataValue; + + $optionValue = $this->getOrCreateProductOptionValue($optionValueCode, $productOption); + + /** @var string[] $locales */ + $locales = []; + if ($this->translationLocaleProvider !== null) { + $locales = $this->translationLocaleProvider->getDefinedLocalesCodes(); + } else { + foreach ($product->getTranslations() as $translation) { + $locale = $translation->getLocale(); + if ($locale === null) { + continue; + } + $locales[] = $locale; + } + } + foreach ($locales as $localeCode) { + $label = (string) $akeneoDataValue; + if ($this->translator !== null) { + $label = $akeneoDataValue ? $this->translator->trans('sylius.ui.yes_label', [], null, $localeCode) : $this->translator->trans('sylius.ui.no_label', [], null, $localeCode); + } + $optionValueTranslation = $optionValue->getTranslation($localeCode); + if ($optionValueTranslation->getLocale() !== $localeCode) { + /** @var ProductOptionValueTranslationInterface $optionValueTranslation */ + $optionValueTranslation = $this->productOptionValueTranslationFactory->createNew(); + $optionValueTranslation->setLocale($localeCode); + } + $optionValueTranslation->setValue($label); + if (!$optionValue->hasTranslation($optionValueTranslation)) { + $optionValue->addTranslation($optionValueTranslation); + } + } + if (!$productVariant->hasOptionValue($optionValue)) { + $productVariant->addOptionValue($optionValue); + } + } + private function getProductOption(string $optionCode, ProductVariantInterface $productVariant, ProductInterface $product): ProductOptionInterface { /** @var ProductOptionInterface|null $productOption */