Skip to content

Commit 8169ee8

Browse files
Merge pull request #182 from synolia/feature/import-text-asset-attribute
Import "text" type asset attributes
2 parents faed305 + 33806e2 commit 8169ee8

9 files changed

+192
-76
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute;
6+
7+
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface;
8+
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetAttributeTypeMatcherProviderInterface;
9+
use Synolia\SyliusAkeneoPlugin\TypeMatcher\Asset\Attribute\TextAssetAttributeTypeMatcher;
10+
11+
final class TextAssetAttributeValueBuilder implements AssetAttributeValueBuilderInterface
12+
{
13+
public function __construct(
14+
private AssetAttributeTypeMatcherProviderInterface $assetAttributeTypeMatcherProvider,
15+
private AkeneoAssetAttributePropertiesProviderInterface $akeneoAssetAttributePropertiesProvider,
16+
) {
17+
}
18+
19+
public function support(string $assetFamilyCode, string $attributeCode): bool
20+
{
21+
return $this->assetAttributeTypeMatcherProvider->match($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)) instanceof TextAssetAttributeTypeMatcher;
22+
}
23+
24+
public function build(
25+
string $assetFamilyCode,
26+
string $assetCode,
27+
?string $locale,
28+
?string $scope,
29+
mixed $value,
30+
): array {
31+
return ['value' => $value];
32+
}
33+
}

src/Processor/Asset/Attribute/AkeneoAssetAttributeAttributeProcessor.php

+48-32
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@
55
namespace Synolia\SyliusAkeneoPlugin\Processor\Asset\Attribute;
66

77
use Doctrine\ORM\EntityManagerInterface;
8+
use Psr\Log\LoggerInterface;
89
use Sylius\Component\Resource\Factory\FactoryInterface;
910
use Sylius\Component\Resource\Repository\RepositoryInterface;
1011
use Synolia\SyliusAkeneoPlugin\Entity\Asset;
12+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException;
13+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException;
14+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException;
1115
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributeDataProviderInterface;
1216
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface;
1317
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetValueBuilderProviderInterface;
@@ -25,6 +29,7 @@ public function __construct(
2529
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
2630
private ProductFilterRulesProviderInterface $productFilterRulesProvider,
2731
private AssetValueBuilderProviderInterface $assetAttributeValueBuilder,
32+
private LoggerInterface $akeneoLogger,
2833
) {
2934
}
3035

@@ -77,39 +82,50 @@ private function handleAsset(
7782
array $queryParam,
7883
array $assetAttributeResource,
7984
): void {
80-
$asset = $this->assetRepository->findOneBy($queryParam);
81-
82-
if (!$asset instanceof Asset) {
83-
/** @var Asset $asset */
84-
$asset = $this->assetFactory->createNew();
85-
$this->entityManager->persist($asset);
86-
$asset->setFamilyCode($assetFamilyCode);
87-
$asset->setAssetCode($assetCode);
88-
$asset->setAttributeCode($attributeCode);
89-
$asset->setLocale($queryParam['locale']);
90-
$asset->setScope($queryParam['scope']);
91-
$asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode));
92-
}
93-
9485
$akeneoLocale = $this->syliusAkeneoLocaleCodeProvider->getAkeneoLocale($queryParam['locale']);
9586

96-
$assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData(
97-
$assetFamilyCode,
98-
$attributeCode,
99-
$assetAttributeResource,
100-
$akeneoLocale,
101-
$queryParam['scope'],
102-
);
103-
104-
/** @var array $data */
105-
$data = $this->assetAttributeValueBuilder->build(
106-
$assetFamilyCode,
107-
$attributeCode,
108-
$akeneoLocale,
109-
$queryParam['scope'],
110-
$assetAttributeValue,
111-
);
112-
113-
$asset->setContent($data);
87+
try {
88+
$asset = $this->assetRepository->findOneBy($queryParam);
89+
90+
if (!$asset instanceof Asset) {
91+
/** @var Asset $asset */
92+
$asset = $this->assetFactory->createNew();
93+
$this->entityManager->persist($asset);
94+
$asset->setFamilyCode($assetFamilyCode);
95+
$asset->setAssetCode($assetCode);
96+
$asset->setAttributeCode($attributeCode);
97+
$asset->setLocale($queryParam['locale']);
98+
$asset->setScope($queryParam['scope']);
99+
$asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode));
100+
}
101+
102+
$assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData(
103+
$assetFamilyCode,
104+
$attributeCode,
105+
$assetAttributeResource,
106+
$akeneoLocale,
107+
$queryParam['scope'],
108+
);
109+
110+
/** @var array $data */
111+
$data = $this->assetAttributeValueBuilder->build(
112+
$assetFamilyCode,
113+
$attributeCode,
114+
$akeneoLocale,
115+
$queryParam['scope'],
116+
$assetAttributeValue,
117+
);
118+
119+
$asset->setContent($data);
120+
} catch (MissingLocaleTranslationException|MissingLocaleTranslationOrScopeException|MissingScopeException) {
121+
$this->akeneoLogger->debug('Error processing asset', [
122+
'family_code' => $assetFamilyCode,
123+
'attribute_code' => $attributeCode,
124+
'asset_code' => $assetCode,
125+
'scope' => $queryParam['scope'],
126+
'akeneo_locale' => $akeneoLocale,
127+
'resource' => $assetAttributeResource,
128+
]);
129+
}
114130
}
115131
}

src/Processor/ProductAttribute/AssetAttributeProcessor.php

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Sylius\Component\Product\Model\ProductAttributeValueInterface;
1212
use Sylius\Component\Resource\Factory\FactoryInterface;
1313
use Sylius\Component\Resource\Repository\RepositoryInterface;
14+
use Synolia\SyliusAkeneoPlugin\Checker\EditionCheckerInterface;
1415
use Synolia\SyliusAkeneoPlugin\Component\Attribute\AttributeType\AssetAttributeType;
1516
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException;
1617
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException;
@@ -36,6 +37,7 @@ public function __construct(
3637
private AkeneoAttributeDataProviderInterface $akeneoAttributeDataProvider,
3738
private AkeneoPimClientInterface $akeneoPimClient,
3839
private AssetProductAttributeProcessorInterface $akeneoAssetProductAttributeProcessor,
40+
private EditionCheckerInterface $editionChecker,
3941
) {
4042
}
4143

@@ -46,6 +48,12 @@ public static function getDefaultPriority(): int
4648

4749
public function support(string $attributeCode, array $context = []): bool
4850
{
51+
$isEnterprise = $this->editionChecker->isEnterprise() || $this->editionChecker->isSerenityEdition();
52+
53+
if (!$isEnterprise) {
54+
return false;
55+
}
56+
4957
$transformedAttributeCode = $this->akeneoAttributeToSyliusAttributeTransformer->transform($attributeCode);
5058

5159
/** @var AttributeInterface $attribute */

src/Processor/ProductAttribute/AssetProductAttributeProcessor.php

+49-33
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55
namespace Synolia\SyliusAkeneoPlugin\Processor\ProductAttribute;
66

77
use Doctrine\ORM\EntityManagerInterface;
8+
use Psr\Log\LoggerInterface;
89
use Sylius\Component\Core\Model\ProductInterface;
910
use Sylius\Component\Resource\Factory\FactoryInterface;
1011
use Sylius\Component\Resource\Repository\RepositoryInterface;
1112
use Synolia\SyliusAkeneoPlugin\Entity\Asset;
13+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException;
14+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException;
15+
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException;
1216
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributeDataProviderInterface;
1317
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface;
1418
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetValueBuilderProviderInterface;
@@ -26,6 +30,7 @@ public function __construct(
2630
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
2731
private ProductFilterRulesProviderInterface $productFilterRulesProvider,
2832
private AssetValueBuilderProviderInterface $assetAttributeValueBuilder,
33+
private LoggerInterface $akeneoLogger,
2934
) {
3035
}
3136

@@ -89,40 +94,51 @@ private function handleAsset(
8994
return;
9095
}
9196

92-
$asset = $this->assetRepository->findOneBy($queryParam);
93-
94-
if (!$asset instanceof Asset) {
95-
/** @var Asset $asset */
96-
$asset = $this->assetFactory->createNew();
97-
$this->entityManager->persist($asset);
98-
$asset->setFamilyCode($assetFamilyCode);
99-
$asset->setAssetCode($assetCode);
100-
$asset->setAttributeCode($attributeCode);
101-
$asset->setLocale($queryParam['locale']);
102-
$asset->setScope($queryParam['scope']);
103-
$asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode));
104-
}
105-
10697
$akeneoLocale = $this->syliusAkeneoLocaleCodeProvider->getAkeneoLocale($queryParam['locale']);
10798

108-
$assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData(
109-
$assetFamilyCode,
110-
$attributeCode,
111-
$assetAttributeResource,
112-
$akeneoLocale,
113-
$queryParam['scope'],
114-
);
115-
116-
/** @var array $data */
117-
$data = $this->assetAttributeValueBuilder->build(
118-
$assetFamilyCode,
119-
$attributeCode,
120-
$akeneoLocale,
121-
$queryParam['scope'],
122-
$assetAttributeValue,
123-
);
124-
125-
$asset->setContent($data);
126-
$model->addAsset($asset);
99+
try {
100+
$asset = $this->assetRepository->findOneBy($queryParam);
101+
102+
if (!$asset instanceof Asset) {
103+
/** @var Asset $asset */
104+
$asset = $this->assetFactory->createNew();
105+
$this->entityManager->persist($asset);
106+
$asset->setFamilyCode($assetFamilyCode);
107+
$asset->setAssetCode($assetCode);
108+
$asset->setAttributeCode($attributeCode);
109+
$asset->setLocale($queryParam['locale']);
110+
$asset->setScope($queryParam['scope']);
111+
$asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode));
112+
}
113+
114+
$assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData(
115+
$assetFamilyCode,
116+
$attributeCode,
117+
$assetAttributeResource,
118+
$akeneoLocale,
119+
$queryParam['scope'],
120+
);
121+
122+
/** @var array $data */
123+
$data = $this->assetAttributeValueBuilder->build(
124+
$assetFamilyCode,
125+
$attributeCode,
126+
$akeneoLocale,
127+
$queryParam['scope'],
128+
$assetAttributeValue,
129+
);
130+
131+
$asset->setContent($data);
132+
$model->addAsset($asset);
133+
} catch (MissingLocaleTranslationException|MissingLocaleTranslationOrScopeException|MissingScopeException) {
134+
$this->akeneoLogger->debug('Error processing asset', [
135+
'family_code' => $assetFamilyCode,
136+
'attribute_code' => $attributeCode,
137+
'asset_code' => $assetCode,
138+
'scope' => $queryParam['scope'],
139+
'akeneo_locale' => $akeneoLocale,
140+
'resource' => $assetAttributeResource,
141+
]);
142+
}
127143
}
128144
}

src/Provider/Asset/AkeneoAssetAttributeDataProvider.php

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace Synolia\SyliusAkeneoPlugin\Provider\Asset;
66

7-
use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\AssetAttributeValueBuilderInterface;
87
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException;
98
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException;
109
use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException;
@@ -16,7 +15,7 @@ final class AkeneoAssetAttributeDataProvider implements AkeneoAssetAttributeData
1615
public function __construct(
1716
private AkeneoAssetAttributePropertiesProvider $akeneoAssetAttributePropertiesProvider,
1817
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
19-
private AssetAttributeValueBuilderInterface $assetAttributeValueBuilder,
18+
private AssetValueBuilderProviderInterface $assetAttributeValueBuilderProvider,
2019
) {
2120
}
2221

@@ -70,7 +69,7 @@ private function getByScope(string $assetFamilyCode, string $attributeCode, arra
7069
continue;
7170
}
7271

73-
return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, null, $scope, $attributeValue['data']);
72+
return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, null, $scope, $attributeValue['data']);
7473
}
7574

7675
throw new MissingScopeException();
@@ -93,7 +92,7 @@ private function getByLocaleAndScope(
9392
continue;
9493
}
9594

96-
return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, $locale, $scope, $attributeValue['data']);
95+
return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, $locale, $scope, $attributeValue['data']);
9796
}
9897

9998
throw new MissingLocaleTranslationOrScopeException();
@@ -111,7 +110,7 @@ private function getByLocale(string $assetFamilyCode, string $attributeCode, arr
111110
continue;
112111
}
113112

114-
return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, $locale, null, $attributeValue['data']);
113+
return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, $locale, null, $attributeValue['data']);
115114
}
116115

117116
throw new MissingLocaleTranslationException();

src/Provider/Asset/AssetValueBuilderProvider.php

+11-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66

77
use Psr\Log\LoggerInterface;
88
use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\AssetAttributeValueBuilderInterface;
9+
use Synolia\SyliusAkeneoPlugin\Checker\EditionCheckerInterface;
910
use Synolia\SyliusAkeneoPlugin\Exceptions\UnsupportedAttributeTypeException;
1011

1112
final class AssetValueBuilderProvider implements AssetValueBuilderProviderInterface
1213
{
1314
/** @var array<AssetAttributeValueBuilderInterface> */
1415
private array $assetAttributeValueBuilders;
1516

16-
public function __construct(private LoggerInterface $akeneoLogger)
17-
{
17+
public function __construct(
18+
private LoggerInterface $akeneoLogger,
19+
private EditionCheckerInterface $editionChecker,
20+
) {
1821
}
1922

2023
public function addBuilder(AssetAttributeValueBuilderInterface $assetAttributeValueBuilder): void
@@ -56,6 +59,12 @@ public function findBuilderByClassName(string $className)
5659

5760
public function hasSupportedBuilder(string $assetFamilyCode, string $assetCode): bool
5861
{
62+
$isEnterprise = $this->editionChecker->isEnterprise() || $this->editionChecker->isSerenityEdition();
63+
64+
if (!$isEnterprise) {
65+
return false;
66+
}
67+
5968
foreach ($this->assetAttributeValueBuilders as $attributeValueBuilder) {
6069
try {
6170
if ($attributeValueBuilder->support($assetFamilyCode, $assetCode)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Synolia\SyliusAkeneoPlugin\TypeMatcher\Asset\Attribute;
6+
7+
use Sylius\Component\Attribute\AttributeType\TextAttributeType;
8+
use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\TextAssetAttributeValueBuilder;
9+
10+
final class TextAssetAttributeTypeMatcher implements AssetAttributeTypeMatcherInterface
11+
{
12+
private const SUPPORTED_TYPE = 'text';
13+
14+
public function getType(): string
15+
{
16+
return TextAttributeType::TYPE;
17+
}
18+
19+
public function support(string $akeneoType): bool
20+
{
21+
return self::SUPPORTED_TYPE === $akeneoType;
22+
}
23+
24+
public function getBuilder(): string
25+
{
26+
return TextAssetAttributeValueBuilder::class;
27+
}
28+
29+
public function getTypeClassName(): string
30+
{
31+
return TextAttributeType::class;
32+
}
33+
}

0 commit comments

Comments
 (0)