Skip to content

Commit ad36906

Browse files
authored
[Bug] Add missing normalize methods to containers (#240)
* Add missing normalizers * Apply php-cs-fixer changes * fix: code style --------- Co-authored-by: lukmzig <[email protected]>
1 parent ebd345b commit ad36906

File tree

3 files changed

+173
-1
lines changed

3 files changed

+173
-1
lines changed

src/SearchIndexAdapter/OpenSearch/DataObject/FieldDefinitionAdapter/BlockAdapter.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
use InvalidArgumentException;
2020
use Pimcore\Model\DataObject\ClassDefinition\Data\Block;
21+
use Pimcore\Model\DataObject\Data\BlockElement;
2122

2223
/**
2324
* @internal
@@ -45,4 +46,34 @@ public function getIndexMapping(): array
4546
'properties' => $properties,
4647
];
4748
}
49+
50+
public function normalize(mixed $value): ?array
51+
{
52+
if (!is_array($value)) {
53+
return null;
54+
}
55+
56+
$resultItems = [];
57+
$fieldDefinition = $this->getFieldDefinition();
58+
if (!$fieldDefinition instanceof Block) {
59+
throw new InvalidArgumentException('FieldDefinition must be an instance of ' . Block::class);
60+
}
61+
$fieldDefinitions = $fieldDefinition->getFieldDefinitions();
62+
foreach ($value as $block) {
63+
$resultItem = [];
64+
65+
/** @var BlockElement $fieldValue */
66+
foreach ($block as $key => $fieldValue) {
67+
$blockDefinition = $fieldDefinitions[$key];
68+
$resultItems[$key] = $this->fieldDefinitionService->normalizeValue(
69+
$blockDefinition,
70+
$fieldValue->getData()
71+
);
72+
}
73+
74+
$resultItems[] = $resultItem;
75+
}
76+
77+
return $resultItems;
78+
}
4879
}

src/SearchIndexAdapter/OpenSearch/DataObject/FieldDefinitionAdapter/ClassificationStoreAdapter.php

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
use Exception;
2020
use InvalidArgumentException;
2121
use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\OpenSearch\AttributeType;
22+
use Pimcore\Bundle\GenericDataIndexBundle\Model\SearchIndexAdapter\MappingProperty;
23+
use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\LanguageServiceInterface;
2224
use Pimcore\Bundle\GenericDataIndexBundle\Traits\LoggerAwareTrait;
2325
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassificationStore\ServiceResolverInterface;
2426
use Pimcore\Model\DataObject\ClassDefinition\Data;
2527
use Pimcore\Model\DataObject\ClassDefinition\Data\Classificationstore;
28+
use Pimcore\Model\DataObject\Classificationstore as ClassificationstoreModel;
29+
use Pimcore\Model\DataObject\Classificationstore\DefinitionCache;
2630
use Pimcore\Model\DataObject\Classificationstore\GroupConfig;
2731
use Pimcore\Model\DataObject\Classificationstore\GroupConfig\Listing as GroupListing;
2832
use Pimcore\Model\DataObject\Classificationstore\KeyGroupRelation;
@@ -38,6 +42,8 @@ final class ClassificationStoreAdapter extends AbstractAdapter
3842

3943
private ServiceResolverInterface $classificationService;
4044

45+
private LanguageServiceInterface $languageService;
46+
4147
#[Required]
4248
public function setClassificationService(ServiceResolverInterface $serviceResolver): void
4349
{
@@ -66,6 +72,50 @@ public function getIndexMapping(): array
6672
];
6773
}
6874

75+
public function normalize(mixed $value): ?array
76+
{
77+
if (!$value instanceof ClassificationstoreModel) {
78+
return null;
79+
}
80+
81+
$validLanguages = $this->getValidLanguages();
82+
$resultItems = [];
83+
84+
foreach ($this->getActiveGroups($value) as $groupId => $groupConfig) {
85+
$resultItems[$groupConfig->getName()] = [];
86+
$keys = $this->getClassificationStoreKeysFromGroup($groupConfig);
87+
foreach ($validLanguages as $validLanguage) {
88+
foreach ($keys as $key) {
89+
$normalizedValue = $this->getNormalizedValue($value, $groupId, $key, $validLanguage);
90+
91+
if ($normalizedValue !== null) {
92+
$resultItems[$groupConfig->getName()][$validLanguage][$key->getName()] = $normalizedValue;
93+
}
94+
}
95+
}
96+
}
97+
98+
return $resultItems;
99+
}
100+
101+
/**
102+
* @return GroupConfig[]
103+
*/
104+
private function getActiveGroups(ClassificationstoreModel $value): array
105+
{
106+
$groups = [];
107+
foreach ($value->getActiveGroups() as $groupId => $active) {
108+
if ($active) {
109+
$groupConfig = GroupConfig::getById($groupId);
110+
if ($groupConfig) {
111+
$groups[$groupId] = $groupConfig;
112+
}
113+
}
114+
}
115+
116+
return $groups;
117+
}
118+
69119
/**
70120
* @param KeyGroupRelation[] $groupConfigs
71121
*/
@@ -116,4 +166,50 @@ private function getClassificationStoreKeysFromGroup(GroupConfig $groupConfig):
116166

117167
return $listing->getList();
118168
}
169+
170+
private function getNormalizedValue(
171+
ClassificationstoreModel $classificationstore,
172+
int $groupId,
173+
KeyGroupRelation $key,
174+
string $language
175+
): mixed {
176+
try {
177+
$value = $classificationstore->getLocalizedKeyValue(
178+
$groupId,
179+
$key->getKeyId(),
180+
$language,
181+
true,
182+
true
183+
);
184+
} catch (Exception $exception) {
185+
$this->logger->warning(sprintf(
186+
'Could not get localized value for key %s in group %s: %s',
187+
$key->getKeyId(),
188+
$groupId,
189+
$exception->getMessage()
190+
));
191+
192+
return null;
193+
}
194+
195+
$keyConfig = DefinitionCache::get($key->getKeyId());
196+
if ($keyConfig === null) {
197+
return null;
198+
}
199+
200+
$fieldDefinition = $this->classificationService->getFieldDefinitionFromKeyConfig($keyConfig);
201+
202+
return $this->fieldDefinitionService->normalizeValue($fieldDefinition, $value);
203+
}
204+
205+
private function getValidLanguages(): array
206+
{
207+
return array_merge([MappingProperty::NOT_LOCALIZED_KEY], $this->languageService->getValidLanguages());
208+
}
209+
210+
#[Required]
211+
public function setLanguageService(LanguageServiceInterface $languageService): void
212+
{
213+
$this->languageService = $languageService;
214+
}
119215
}

src/SearchIndexAdapter/OpenSearch/DataObject/FieldDefinitionAdapter/ObjectBrickAdapter.php

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,19 @@
1717
namespace Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\DataObject\FieldDefinitionAdapter;
1818

1919
use InvalidArgumentException;
20+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\Objectbrick\DefinitionResolverInterface;
2021
use Pimcore\Model\DataObject\ClassDefinition\Data\Objectbricks;
2122
use Pimcore\Model\DataObject\Objectbrick;
23+
use Pimcore\Model\DataObject\Objectbrick\Data\AbstractData;
24+
use Symfony\Contracts\Service\Attribute\Required;
2225

2326
/**
2427
* @internal
2528
*/
2629
final class ObjectBrickAdapter extends AbstractAdapter
2730
{
31+
private DefinitionResolverInterface $objectBrickDefinition;
32+
2833
public function getIndexMapping(): array
2934
{
3035
$objectBricks = $this->getFieldDefinition();
@@ -44,9 +49,43 @@ public function getIndexMapping(): array
4449
];
4550
}
4651

52+
public function normalize(mixed $value): ?array
53+
{
54+
if (!$value instanceof Objectbrick) {
55+
return null;
56+
}
57+
58+
$resultItems = [];
59+
$items = $value->getObjectVars();
60+
foreach ($items as $item) {
61+
if (!$item instanceof AbstractData) {
62+
continue;
63+
}
64+
65+
$type = $item->getType();
66+
$resultItems[$type] = [];
67+
$definition = $this->objectBrickDefinition->getByKey($type);
68+
if ($definition === null) {
69+
continue;
70+
}
71+
72+
$resultItems[$type] = [];
73+
foreach ($definition->getFieldDefinitions() as $fieldDefinition) {
74+
$getter = 'get' . ucfirst($fieldDefinition->getName());
75+
$value = $item->$getter();
76+
$resultItems[$fieldDefinition->getName()] = $this->fieldDefinitionService->normalizeValue(
77+
$fieldDefinition,
78+
$value
79+
);
80+
}
81+
}
82+
83+
return $resultItems;
84+
}
85+
4786
private function getMappingForObjectBrick(string $objectBrickType): array
4887
{
49-
$fieldDefinitions = Objectbrick\Definition::getByKey($objectBrickType)?->getFieldDefinitions();
88+
$fieldDefinitions = $this->objectBrickDefinition->getByKey($objectBrickType)?->getFieldDefinitions();
5089
$mapping = [];
5190
foreach ($fieldDefinitions as $fieldDefinition) {
5291
$adapter = $this->getFieldDefinitionService()->getFieldDefinitionAdapter($fieldDefinition);
@@ -57,4 +96,10 @@ private function getMappingForObjectBrick(string $objectBrickType): array
5796

5897
return $mapping;
5998
}
99+
100+
#[Required]
101+
public function setObjectBrickDefinition(DefinitionResolverInterface $definitionResolver): void
102+
{
103+
$this->objectBrickDefinition = $definitionResolver;
104+
}
60105
}

0 commit comments

Comments
 (0)