Skip to content

Commit f9126ce

Browse files
authored
[Classification Store] Add search term (#995)
* Add search Filter * Apply php-cs-fixer changes * Make it private --------- Co-authored-by: martineiber <11687066+martineiber@users.noreply.github.com>
1 parent b75dd35 commit f9126ce

18 files changed

Lines changed: 222 additions & 15 deletions

config/classification_store.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ services:
2525
Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\KeyGroupRelationServiceInterface:
2626
class: Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\KeyGroupRelationService
2727

28+
Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\SearchHelperServiceInterface:
29+
class: Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\SearchHelperService
30+
2831

2932
#
3033
# Repositories

src/ClassificationStore/Controller/GetCollectionsController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ public function __construct(
9393
required: true,
9494
example: 'technicalAttributes'
9595
)]
96+
#[TextFieldParameter(
97+
name: 'searchTerm',
98+
description: 'Search Term',
99+
required: false,
100+
example: 'search term'
101+
)]
96102
#[DefaultResponses([
97103
HttpResponseCodes::FORBIDDEN,
98104
HttpResponseCodes::UNAUTHORIZED,

src/ClassificationStore/Controller/GetGroupsController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ public function __construct(
8585
namePrefix: 'object',
8686
required: false
8787
)]
88+
#[TextFieldParameter(
89+
name: 'searchTerm',
90+
description: 'Search Term',
91+
required: false,
92+
example: 'search term'
93+
)]
8894
#[PageParameter]
8995
#[PageSizeParameter]
9096
#[TextFieldParameter(

src/ClassificationStore/Controller/GetKeyGroupRelationsController.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ public function __construct(
8585
namePrefix: 'object',
8686
required: false
8787
)]
88+
#[TextFieldParameter(
89+
name: 'searchTerm',
90+
description: 'Search Term',
91+
required: false,
92+
example: 'search term'
93+
)]
8894
#[PageParameter]
8995
#[PageSizeParameter]
9096
#[TextFieldParameter(

src/ClassificationStore/MappedParameter/ListClassificationStoreParameter.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function __construct(
3434
#[NotBlank(message: 'The page size name must not be empty.')]
3535
private int $pageSize,
3636
private ?int $objectId = null,
37+
private ?string $searchTerm = null,
3738
) {
3839
}
3940

@@ -61,4 +62,9 @@ public function getPageSize(): int
6162
{
6263
return $this->pageSize;
6364
}
65+
66+
public function getSearchTerm(): ?string
67+
{
68+
return $this->searchTerm;
69+
}
6470
}

src/ClassificationStore/Repository/CollectionConfigRepository.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Repository;
1818

19+
use Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\SearchHelperServiceInterface;
1920
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\CollectionParametersInterface;
2021
use Pimcore\Model\DataObject\Classificationstore\CollectionConfig\Listing;
2122
use function count;
@@ -25,13 +26,19 @@
2526
*/
2627
final class CollectionConfigRepository implements CollectionConfigRepositoryInterface
2728
{
29+
public function __construct(
30+
private SearchHelperServiceInterface $searchHelperService
31+
) {
32+
}
33+
2834
/**
2935
* {@inheritDoc}
3036
*/
3137
public function getPaginatedCollectionsByStore(
3238
int $storeId,
3339
CollectionParametersInterface $collectionParameters,
34-
?array $collectionIds = null
40+
?array $collectionIds = null,
41+
?string $searchTerm = null
3542
): array {
3643
$list = new Listing();
3744

@@ -45,6 +52,10 @@ public function getPaginatedCollectionsByStore(
4552
$this->applyCollectionIdsFilter($list, $collectionIds);
4653
}
4754

55+
if ($searchTerm !== null) {
56+
$this->searchHelperService->applySearchTermFilter($list, $searchTerm);
57+
}
58+
4859
return $list->load();
4960
}
5061

src/ClassificationStore/Repository/CollectionConfigRepositoryInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ interface CollectionConfigRepositoryInterface
3232
public function getPaginatedCollectionsByStore(
3333
int $storeId,
3434
CollectionParametersInterface $collectionParameters,
35-
?array $collectionIds = null
35+
?array $collectionIds = null,
36+
?string $searchTerm = null
3637
): array;
3738

3839
public function getCountByStoreId(int $storeId): int;

src/ClassificationStore/Repository/GroupConfigRepository.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Repository;
1818

19+
use Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\SearchHelperServiceInterface;
1920
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\CollectionParametersInterface;
2021
use Pimcore\Model\DataObject\Classificationstore\GroupConfig\Listing;
2122
use function count;
@@ -25,13 +26,19 @@
2526
*/
2627
final class GroupConfigRepository implements GroupConfigRepositoryInterface
2728
{
29+
public function __construct(
30+
private SearchHelperServiceInterface $searchHelperService
31+
) {
32+
}
33+
2834
/**
2935
* {@inheritDoc}
3036
*/
3137
public function getPaginatedGroupsByStore(
3238
int $storeId,
3339
CollectionParametersInterface $collectionParameters,
34-
?array $groupIds = null
40+
?array $groupIds = null,
41+
?string $searchTerm = null
3542
): array {
3643
$listing = new Listing();
3744

@@ -41,6 +48,10 @@ public function getPaginatedGroupsByStore(
4148
$listing->setOrderKey('id');
4249
$listing->setCondition('storeId = ?', $storeId);
4350

51+
if ($searchTerm !== null) {
52+
$this->searchHelperService->applySearchTermFilter($listing, $searchTerm);
53+
}
54+
4455
if ($groupIds !== null) {
4556
$this->applyGroupIdsFilter($listing, $groupIds);
4657
}

src/ClassificationStore/Repository/GroupConfigRepositoryInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ interface GroupConfigRepositoryInterface
3232
public function getPaginatedGroupsByStore(
3333
int $storeId,
3434
CollectionParametersInterface $collectionParameters,
35-
?array $groupIds = null
35+
?array $groupIds = null,
36+
?string $searchTerm = null
3637
): array;
3738

3839
public function getAllGroupsByStore(

src/ClassificationStore/Repository/KeyGroupRelationRepository.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,21 @@
1616

1717
namespace Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Repository;
1818

19+
use Pimcore\Bundle\StudioBackendBundle\ClassificationStore\Service\SearchHelperServiceInterface;
1920
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\CollectionParametersInterface;
21+
use Pimcore\Model\DataObject\Classificationstore\GroupConfig\Dao as GroupConfigDao;
22+
use Pimcore\Model\DataObject\Classificationstore\KeyConfig\Dao as KeyConfigDao;
2023
use Pimcore\Model\DataObject\Classificationstore\KeyGroupRelation\Listing;
2124
use function count;
2225

2326
/**
2427
* @internal
2528
*/
26-
final class KeyGroupRelationRepository implements KeyGroupRelationRepositoryInterface
29+
final readonly class KeyGroupRelationRepository implements KeyGroupRelationRepositoryInterface
2730
{
2831
public function __construct(
29-
private GroupConfigRepositoryInterface $groupConfigRepository
32+
private GroupConfigRepositoryInterface $groupConfigRepository,
33+
private SearchHelperServiceInterface $searchHelperService
3034
) {
3135
}
3236

@@ -36,7 +40,8 @@ public function __construct(
3640
public function getPaginatedKeyGroupRelationByStore(
3741
int $storeId,
3842
CollectionParametersInterface $collectionParameters,
39-
?array $groupIds = null
43+
?array $groupIds = null,
44+
?string $searchTerm = null
4045
): array {
4146

4247
$groupIds = array_map(
@@ -50,7 +55,11 @@ public function getPaginatedKeyGroupRelationByStore(
5055
$listing->setOrderKey('sorter');
5156
$this->applyGroupIdsFilter($listing, $groupIds);
5257

53-
return $listing->load();
58+
if ($searchTerm !== null) {
59+
$this->applySearchTermFilter($listing, $searchTerm);
60+
}
61+
62+
return $listing->getList();
5463
}
5564

5665
public function getCountByStoreId(int $storeId, ?array $groupIds = null): int
@@ -66,6 +75,22 @@ public function getCountByStoreId(int $storeId, ?array $groupIds = null): int
6675
return $listing->count();
6776
}
6877

78+
private function applySearchTermFilter(Listing $list, string $searchTerm): void
79+
{
80+
$searchTerms = $this->searchHelperService->getTranslatedSearchFilterTerms($searchTerm);
81+
$searchFilterConditions = [];
82+
83+
foreach ($searchTerms as $term) {
84+
$searchFilterConditions[] =
85+
KeyConfigDao::TABLE_NAME_KEYS.'.name LIKE '.$list->quote('%'.$term.'%')
86+
.' OR '.GroupConfigDao::TABLE_NAME_GROUPS.'.name LIKE '.$list->quote('%'.$term.'%')
87+
.' OR '.KeyConfigDao::TABLE_NAME_KEYS.'.description LIKE '.$list->quote('%'.$term.'%');
88+
}
89+
$list->setResolveGroupName(true);
90+
91+
$list->addConditionParam(implode(' OR ', $searchFilterConditions));
92+
}
93+
6994
private function applyGroupIdsFilter(Listing $list, array $groupIds): void
7095
{
7196
$placeholders = implode(',', array_fill(0, count($groupIds), '?'));

0 commit comments

Comments
 (0)