Skip to content

Commit dd926fc

Browse files
committed
fix: move applyFallbackLanguages to request body level and use core Localizedfield fallback mechanism
1 parent cc5c7da commit dd926fc

10 files changed

Lines changed: 130 additions & 47 deletions

File tree

src/DataObject/Controller/Grid/GetController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
2020
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\NotFoundException;
2121
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Property\GridCollection;
22-
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Request\GridRequestBody;
22+
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Request\DataObjectGridRequestBody;
2323
use Pimcore\Bundle\StudioBackendBundle\Grid\MappedParameter\GridParameter;
2424
use Pimcore\Bundle\StudioBackendBundle\Grid\Service\GridServiceInterface;
2525
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Path\StringParameter;
@@ -61,7 +61,7 @@ public function __construct(
6161
summary: 'data_object_get_grid_summary',
6262
tags: [Tags::DataObjectsGrid->value]
6363
)]
64-
#[GridRequestBody]
64+
#[DataObjectGridRequestBody]
6565
#[SuccessResponse(
6666
description: 'data_object_get_grid_success_response',
6767
content: new CollectionJson(
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/**
5+
* This source file is available under the terms of the
6+
* Pimcore Open Core License (POCL)
7+
* Full copyright and license information is available in
8+
* LICENSE.md which is distributed with this source code.
9+
*
10+
* @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
11+
* @license Pimcore Open Core License (POCL)
12+
*/
13+
14+
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Request;
15+
16+
use Attribute;
17+
use OpenApi\Attributes\Items;
18+
use OpenApi\Attributes\JsonContent;
19+
use OpenApi\Attributes\Property;
20+
use OpenApi\Attributes\RequestBody;
21+
use Pimcore\Bundle\StudioBackendBundle\Grid\Schema\Column;
22+
use Pimcore\Bundle\StudioBackendBundle\Grid\Schema\Filter;
23+
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Property\SingleInteger;
24+
25+
/**
26+
* @internal
27+
*/
28+
#[Attribute(Attribute::TARGET_METHOD)]
29+
final class DataObjectGridRequestBody extends RequestBody
30+
{
31+
public function __construct()
32+
{
33+
parent::__construct(
34+
required: true,
35+
content: new JsonContent(
36+
required: ['folderId'],
37+
properties: [
38+
new SingleInteger(propertyName: 'folderId'),
39+
new Property(
40+
property: 'applyFallbackLanguages',
41+
description: 'When true, empty localized values fall back to configured fallback languages',
42+
type: 'boolean',
43+
default: false
44+
),
45+
new Property(
46+
property: 'columns',
47+
type: 'array',
48+
items: new Items(ref: Column::class)
49+
),
50+
new Property(
51+
property: 'filters',
52+
ref: Filter::class,
53+
type: 'object'
54+
),
55+
],
56+
type: 'object',
57+
),
58+
);
59+
}
60+
}

src/Grid/Column/Resolver/DataObject/AdapterResolver.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Column\Resolver\DataObject;
1515

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Contract\Lib\ToolResolverContractInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\DataObjectServiceResolverInterface;
1819
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\FieldContextData;
1920
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\InheritanceData;
@@ -50,11 +51,16 @@ final class AdapterResolver implements
5051
public function __construct(
5152
private readonly DataServiceInterface $dataService,
5253
private readonly InheritanceServiceInterface $inheritanceService,
53-
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver
54-
54+
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver,
55+
private readonly ToolResolverContractInterface $toolResolver,
5556
) {
5657
}
5758

59+
protected function getDefaultLanguage(): ?string
60+
{
61+
return $this->toolResolver->getDefaultLanguage();
62+
}
63+
5864
/**
5965
* @throws Exception
6066
* @throws InvalidArgumentException

src/Grid/Column/Resolver/DataObject/AdvancedColumnResolver.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\CoreElementColumnResolverInterface;
2222
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ExportResolverInterface;
2323
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\Resolver\ResolverTypeGuesserInterface;
24+
use Pimcore\Bundle\StaticResolverBundle\Contract\Lib\ToolResolverContractInterface;
2425
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\TransformerInterface;
2526
use Pimcore\Bundle\StudioBackendBundle\Grid\Schema\AdvancedColumnConfig\RelationFieldConfig;
2627
use Pimcore\Bundle\StudioBackendBundle\Grid\Schema\AdvancedColumnConfig\SimpleFieldConfig;
@@ -69,10 +70,16 @@ final class AdvancedColumnResolver implements
6970
public function __construct(
7071
private readonly TransformerLoaderInterface $transformerLoader,
7172
private readonly GridServiceInterface $gridService,
72-
private readonly ResolverTypeGuesserInterface $resolverTypeGuesser
73+
private readonly ResolverTypeGuesserInterface $resolverTypeGuesser,
74+
private readonly ToolResolverContractInterface $toolResolver,
7375
) {
7476
}
7577

78+
protected function getDefaultLanguage(): ?string
79+
{
80+
return $this->toolResolver->getDefaultLanguage();
81+
}
82+
7683
public function getType(): string
7784
{
7885
return 'dataobject.advanced';
@@ -212,7 +219,6 @@ private function resolveField(
212219
type: $resolverType,
213220
group: $column->getGroup(),
214221
config: $column->getConfig(),
215-
applyFallbackLanguages: $column->getApplyFallbackLanguages()
216222
);
217223

218224
$data = null;

src/Grid/Column/Resolver/DataObject/ClassificationStoreResolver.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Column\Resolver\DataObject;
1515

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Contract\Lib\ToolResolverContractInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassificationStore\ServiceResolverInterface;
1819
use Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Repository\KeyGroupRelationRepositoryInterface;
1920
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\FieldContextData;
@@ -55,10 +56,15 @@ public function __construct(
5556
private readonly KeyGroupRelationRepositoryInterface $keyGroupRelationRepository,
5657
private readonly ServiceResolverInterface $classificationStoreServiceResolver,
5758
private readonly DataServiceInterface $dataService,
58-
59+
private readonly ToolResolverContractInterface $toolResolver,
5960
) {
6061
}
6162

63+
protected function getDefaultLanguage(): ?string
64+
{
65+
return $this->toolResolver->getDefaultLanguage();
66+
}
67+
6268
/**
6369
* @throws Exception
6470
* @throws InvalidArgumentException

src/Grid/Column/Resolver/DataObject/ObjectBrickResolver.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Column\Resolver\DataObject;
1515

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Contract\Lib\ToolResolverContractInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassDefinitionResolverInterface;
1819
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\DataObjectServiceResolverInterface;
1920
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\Objectbrick\DefinitionResolverInterface;
@@ -57,11 +58,16 @@ public function __construct(
5758
private readonly InheritanceServiceInterface $inheritanceService,
5859
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver,
5960
private readonly ObjectBrickServiceInterface $objectBrickService,
60-
private readonly DefinitionResolverInterface $definitionResolver
61-
61+
private readonly DefinitionResolverInterface $definitionResolver,
62+
private readonly ToolResolverContractInterface $toolResolver,
6263
) {
6364
}
6465

66+
protected function getDefaultLanguage(): ?string
67+
{
68+
return $this->toolResolver->getDefaultLanguage();
69+
}
70+
6571
/**
6672
* @throws Exception
6773
* @throws InvalidArgumentException

src/Grid/MappedParameter/GridParameter.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public function __construct(
2424
private int $folderId,
2525
private array $columns,
2626
private ?FilterParameter $filters,
27+
private bool $applyFallbackLanguages = false,
2728
) {
2829
}
2930

@@ -41,4 +42,9 @@ public function getFilters(): FilterParameter
4142
{
4243
return $this->filters ?? new FilterParameter();
4344
}
45+
46+
public function getApplyFallbackLanguages(): bool
47+
{
48+
return $this->applyFallbackLanguages;
49+
}
4450
}

src/Grid/Schema/Column.php

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ public function __construct(
5454
),
5555
example: ['key' => 'value'])]
5656
private array $config,
57-
#[Property(description: 'When true, empty localized values fall back to configured fallback languages', type: 'boolean', default: false)]
58-
private bool $applyFallbackLanguages = false,
5957
) {
6058
}
6159

@@ -84,11 +82,6 @@ public function getConfig(): array
8482
return $this->config;
8583
}
8684

87-
public function getApplyFallbackLanguages(): bool
88-
{
89-
return $this->applyFallbackLanguages;
90-
}
91-
9285
public function getAdvancedColumnConfig(): AdvancedColumnConfig
9386
{
9487
$configs = [];

src/Grid/Service/GridService.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
use Pimcore\Bundle\StudioBackendBundle\Util\Constant\ElementTypes;
4343
use Pimcore\Bundle\StudioBackendBundle\Util\Trait\ElementProviderTrait;
4444
use Pimcore\Model\DataObject\ClassDefinition;
45+
use Pimcore\Model\DataObject\Localizedfield;
4546
use Pimcore\Model\UserInterface;
4647
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
4748
use function array_key_exists;
@@ -131,11 +132,18 @@ public function getDataObjectGrid(
131132

132133
$result = $this->gridSearch->searchDataObjects($gridParameter);
133134

134-
return $this->getCollectionFromSearchResult(
135-
$result,
136-
$gridParameter,
137-
ElementTypes::TYPE_OBJECT
138-
);
135+
$fallbackBackup = Localizedfield::getGetFallbackValues();
136+
Localizedfield::setGetFallbackValues($gridParameter->getApplyFallbackLanguages());
137+
138+
try {
139+
return $this->getCollectionFromSearchResult(
140+
$result,
141+
$gridParameter,
142+
ElementTypes::TYPE_OBJECT
143+
);
144+
} finally {
145+
Localizedfield::setGetFallbackValues($fallbackBackup);
146+
}
139147
}
140148

141149
/**
@@ -326,7 +334,7 @@ private function appendLocale(string $key, Column $column): string
326334
* @throws InvalidArgumentException
327335
*/
328336
private function getConfigurationFromArray(
329-
array $config,
337+
array $config
330338
): ColumnCollection {
331339

332340
$columns = [];
@@ -337,8 +345,7 @@ private function getConfigurationFromArray(
337345
locale: $column['locale'] ?? null,
338346
type: $column['type'],
339347
group: $column['group'] ?? null,
340-
config: $column['config'],
341-
applyFallbackLanguages: $column['applyFallbackLanguages'] ?? false
348+
config: $column['config']
342349
);
343350
} catch (Exception) {
344351
throw new InvalidArgumentException('Invalid column configuration');

src/Grid/Util/Trait/LocalizedValueTrait.php

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Util\Trait;
1515

1616
use Pimcore\Bundle\StudioBackendBundle\Grid\Schema\Column;
17+
use Pimcore\Model\DataObject\Localizedfield;
1718
use Pimcore\Model\Element\ElementInterface;
18-
use Pimcore\Tool;
1919

2020
/**
2121
* @internal
@@ -25,32 +25,20 @@ trait LocalizedValueTrait
2525
private function getLocalizedValue(Column $column, ElementInterface $element): mixed
2626
{
2727
$getter = $this->getGetter($column->getKey());
28-
if ($column->getLocale()) {
29-
$value = $element->$getter($column->getLocale());
28+
if (!$column->getLocale()) {
29+
return $element->$getter();
30+
}
3031

31-
if ($column->getApplyFallbackLanguages() && $this->isEmptyValue($value)) {
32-
// Walk configured fallback languages, then the system default as last resort
33-
$fallbackLocales = Tool::getFallbackLanguagesFor($column->getLocale());
34-
$defaultLanguage = Tool::getDefaultLanguage();
35-
if ($defaultLanguage !== null
36-
&& $defaultLanguage !== $column->getLocale()
37-
&& !in_array($defaultLanguage, $fallbackLocales, true)
38-
) {
39-
$fallbackLocales[] = $defaultLanguage;
40-
}
32+
$value = $element->$getter($column->getLocale());
4133

42-
foreach ($fallbackLocales as $fallbackLocale) {
43-
$value = $element->$getter($fallbackLocale);
44-
if (!$this->isEmptyValue($value)) {
45-
break;
46-
}
47-
}
34+
if ($this->isEmptyValue($value) && Localizedfield::doGetFallbackValues()) {
35+
$defaultLanguage = $this->getDefaultLanguage();
36+
if ($defaultLanguage !== null && $defaultLanguage !== $column->getLocale()) {
37+
$value = $element->$getter($defaultLanguage);
4838
}
49-
50-
return $value;
5139
}
5240

53-
return $element->$getter();
41+
return $value;
5442
}
5543

5644
private function getLocalizedValueFromKey(string $key, ?string $locale, ElementInterface $element): mixed
@@ -70,6 +58,11 @@ private function getGetter(string $key): string
7058

7159
private function isEmptyValue(mixed $value): bool
7260
{
73-
return $value === null || $value === '' || $value === [];
61+
return $value === null || $value === '';
62+
}
63+
64+
protected function getDefaultLanguage(): ?string
65+
{
66+
return null;
7467
}
7568
}

0 commit comments

Comments
 (0)