Skip to content

Commit 2f328d5

Browse files
committed
Merge branch '2026.1' into 2026.x
2 parents 5fa26ab + d6e51ca commit 2f328d5

18 files changed

Lines changed: 651 additions & 41 deletions

File tree

src/DataObject/Controller/Grid/GetController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidQueryTypeException;
2222
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\NotFoundException;
2323
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Property\GridCollection;
24-
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Request\GridRequestBody;
24+
use Pimcore\Bundle\StudioBackendBundle\Grid\Attribute\Request\DataObjectGridRequestBody;
2525
use Pimcore\Bundle\StudioBackendBundle\Grid\MappedParameter\GridParameter;
2626
use Pimcore\Bundle\StudioBackendBundle\Grid\Service\GridServiceInterface;
2727
use Pimcore\Bundle\StudioBackendBundle\OpenApi\Attribute\Parameter\Path\StringParameter;
@@ -65,7 +65,7 @@ public function __construct(
6565
summary: 'data_object_get_grid_summary',
6666
tags: [Tags::DataObjectsGrid->value]
6767
)]
68-
#[GridRequestBody]
68+
#[DataObjectGridRequestBody]
6969
#[SuccessResponse(
7070
description: 'data_object_get_grid_success_response',
7171
content: new CollectionJson(

src/ExecutionEngine/Util/StepConfig.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ enum StepConfig: string
4242
case CONFIG_TYPE_INT = 'int';
4343
case CONFIG_TYPE_STRING = 'string';
4444
case CONFIG_TYPE_BOOL = 'bool';
45+
case ITEMS_TO_RESTORE = 'items_to_restore';
4546
}
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: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\Grid\Column\Resolver\DataObject;
1515

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Lib\ToolResolverInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\DataObjectServiceResolverInterface;
19+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\LocalizedFieldResolverInterface;
1820
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\FieldContextData;
1921
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\InheritanceData;
2022
use Pimcore\Bundle\StudioBackendBundle\DataObject\Service\DataServiceInterface;
@@ -50,11 +52,24 @@ final class AdapterResolver implements
5052
public function __construct(
5153
private readonly DataServiceInterface $dataService,
5254
private readonly InheritanceServiceInterface $inheritanceService,
53-
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver
54-
55+
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver,
56+
private readonly ToolResolverInterface $toolResolver,
57+
private readonly LocalizedFieldResolverInterface $localizedFieldResolver,
5558
) {
5659
}
5760

61+
/** @see LocalizedValueTrait::doGetFallbackValues() */
62+
protected function doGetFallbackValues(): bool
63+
{
64+
return $this->localizedFieldResolver->doGetFallbackValues();
65+
}
66+
67+
/** @see LocalizedValueTrait::getDefaultLanguage() */
68+
protected function getDefaultLanguage(): ?string
69+
{
70+
return $this->toolResolver->getDefaultLanguage();
71+
}
72+
5873
/**
5974
* @throws Exception
6075
* @throws InvalidArgumentException

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
use Exception;
1717
use JsonException;
18+
use Pimcore\Bundle\StaticResolverBundle\Lib\ToolResolverInterface;
19+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\LocalizedFieldResolverInterface;
1820
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
1921
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\TransformerException;
2022
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnResolverInterface;
@@ -69,10 +71,24 @@ final class AdvancedColumnResolver implements
6971
public function __construct(
7072
private readonly TransformerLoaderInterface $transformerLoader,
7173
private readonly GridServiceInterface $gridService,
72-
private readonly ResolverTypeGuesserInterface $resolverTypeGuesser
74+
private readonly ResolverTypeGuesserInterface $resolverTypeGuesser,
75+
private readonly ToolResolverInterface $toolResolver,
76+
private readonly LocalizedFieldResolverInterface $localizedFieldResolver,
7377
) {
7478
}
7579

80+
/** @see LocalizedValueTrait::doGetFallbackValues() */
81+
protected function doGetFallbackValues(): bool
82+
{
83+
return $this->localizedFieldResolver->doGetFallbackValues();
84+
}
85+
86+
/** @see LocalizedValueTrait::getDefaultLanguage() */
87+
protected function getDefaultLanguage(): ?string
88+
{
89+
return $this->toolResolver->getDefaultLanguage();
90+
}
91+
7692
public function getType(): string
7793
{
7894
return 'dataobject.advanced';
@@ -211,7 +227,7 @@ private function resolveField(
211227
locale: $isLocalizable ? $column->getLocale() : null,
212228
type: $resolverType,
213229
group: $column->getGroup(),
214-
config: $column->getConfig()
230+
config: $column->getConfig(),
215231
);
216232

217233
$data = null;

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

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

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Lib\ToolResolverInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassificationStore\ServiceResolverInterface;
19+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\LocalizedFieldResolverInterface;
1820
use Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Repository\KeyGroupRelationRepositoryInterface;
1921
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\FieldContextData;
2022
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\InheritanceData;
@@ -55,10 +57,23 @@ public function __construct(
5557
private readonly KeyGroupRelationRepositoryInterface $keyGroupRelationRepository,
5658
private readonly ServiceResolverInterface $classificationStoreServiceResolver,
5759
private readonly DataServiceInterface $dataService,
58-
60+
private readonly ToolResolverInterface $toolResolver,
61+
private readonly LocalizedFieldResolverInterface $localizedFieldResolver,
5962
) {
6063
}
6164

65+
/** @see LocalizedValueTrait::doGetFallbackValues() */
66+
protected function doGetFallbackValues(): bool
67+
{
68+
return $this->localizedFieldResolver->doGetFallbackValues();
69+
}
70+
71+
/** @see LocalizedValueTrait::getDefaultLanguage() */
72+
protected function getDefaultLanguage(): ?string
73+
{
74+
return $this->toolResolver->getDefaultLanguage();
75+
}
76+
6277
/**
6378
* @throws Exception
6479
* @throws InvalidArgumentException

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

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

1616
use Exception;
17+
use Pimcore\Bundle\StaticResolverBundle\Lib\ToolResolverInterface;
1718
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassDefinitionResolverInterface;
1819
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\DataObjectServiceResolverInterface;
20+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\LocalizedFieldResolverInterface;
1921
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\Objectbrick\DefinitionResolverInterface;
2022
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\FieldContextData;
2123
use Pimcore\Bundle\StudioBackendBundle\DataObject\Data\Model\InheritanceData;
@@ -57,11 +59,24 @@ public function __construct(
5759
private readonly InheritanceServiceInterface $inheritanceService,
5860
private readonly DataObjectServiceResolverInterface $dataObjectServiceResolver,
5961
private readonly ObjectBrickServiceInterface $objectBrickService,
60-
private readonly DefinitionResolverInterface $definitionResolver
61-
62+
private readonly DefinitionResolverInterface $definitionResolver,
63+
private readonly ToolResolverInterface $toolResolver,
64+
private readonly LocalizedFieldResolverInterface $localizedFieldResolver,
6265
) {
6366
}
6467

68+
/** @see LocalizedValueTrait::doGetFallbackValues() */
69+
protected function doGetFallbackValues(): bool
70+
{
71+
return $this->localizedFieldResolver->doGetFallbackValues();
72+
}
73+
74+
/** @see LocalizedValueTrait::getDefaultLanguage() */
75+
protected function getDefaultLanguage(): ?string
76+
{
77+
return $this->toolResolver->getDefaultLanguage();
78+
}
79+
6580
/**
6681
* @throws Exception
6782
* @throws InvalidArgumentException

src/Grid/MappedParameter/GridParameter.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
public function __construct(
2424
private int $folderId,
2525
private array $columns,
26-
private ?FilterParameter $filters
26+
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/Service/GridService.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Exception;
1717
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\ClassDefinitionResolverInterface;
18+
use Pimcore\Bundle\StaticResolverBundle\Models\DataObject\LocalizedFieldResolverInterface;
1819
use Pimcore\Bundle\StaticResolverBundle\Models\Element\ServiceResolverInterface;
1920
use Pimcore\Bundle\StudioBackendBundle\DataIndex\Grid\GridSearchInterface;
2021
use Pimcore\Bundle\StudioBackendBundle\DataIndex\SearchResult\SearchResultItemInterface;
@@ -77,7 +78,8 @@ public function __construct(
7778
private readonly EventDispatcherInterface $eventDispatcher,
7879
private readonly SecurityServiceInterface $securityService,
7980
private readonly ServiceResolverInterface $serviceResolver,
80-
private readonly ClassDefinitionResolverInterface $classDefinitionResolver
81+
private readonly ClassDefinitionResolverInterface $classDefinitionResolver,
82+
private readonly LocalizedFieldResolverInterface $localizedFieldResolver,
8183
) {
8284
}
8385

@@ -130,11 +132,18 @@ public function getDataObjectGrid(
130132

131133
$result = $this->gridSearch->searchDataObjects($gridParameter);
132134

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

140149
/**

src/Grid/Util/Trait/LocalizedValueTrait.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,20 @@ trait LocalizedValueTrait
2424
private function getLocalizedValue(Column $column, ElementInterface $element): mixed
2525
{
2626
$getter = $this->getGetter($column->getKey());
27-
if ($column->getLocale()) {
28-
return $element->$getter($column->getLocale());
27+
if (!$column->getLocale()) {
28+
return $element->$getter();
2929
}
3030

31-
return $element->$getter();
31+
$value = $element->$getter($column->getLocale());
32+
33+
if ($this->isEmptyValue($value) && $this->doGetFallbackValues()) {
34+
$defaultLanguage = $this->getDefaultLanguage();
35+
if ($defaultLanguage !== null && $defaultLanguage !== $column->getLocale()) {
36+
$value = $element->$getter($defaultLanguage);
37+
}
38+
}
39+
40+
return $value;
3241
}
3342

3443
private function getLocalizedValueFromKey(string $key, ?string $locale, ElementInterface $element): mixed
@@ -45,4 +54,19 @@ private function getGetter(string $key): string
4554
{
4655
return 'get' . ucfirst($key);
4756
}
57+
58+
private function isEmptyValue(mixed $value): bool
59+
{
60+
return $value === null || $value === '';
61+
}
62+
63+
protected function doGetFallbackValues(): bool
64+
{
65+
return false;
66+
}
67+
68+
protected function getDefaultLanguage(): ?string
69+
{
70+
return null;
71+
}
4872
}

0 commit comments

Comments
 (0)