From 61215b5c6642076c7966a29a03cbe6bd98c0bfc3 Mon Sep 17 00:00:00 2001 From: Georg Wurz Date: Wed, 26 Apr 2023 12:08:38 +0200 Subject: [PATCH 1/7] [PimcoreComponent] add locale to SlugGenerationEvent --- .../Component/Pimcore/Event/SlugGenerationEvent.php | 6 ++++++ .../Pimcore/Slug/DataObjectSiteSlugGenerator.php | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Event/SlugGenerationEvent.php b/src/CoreShop/Component/Pimcore/Event/SlugGenerationEvent.php index f89ead1bd5..7a5125744f 100644 --- a/src/CoreShop/Component/Pimcore/Event/SlugGenerationEvent.php +++ b/src/CoreShop/Component/Pimcore/Event/SlugGenerationEvent.php @@ -29,6 +29,7 @@ public function __construct( protected string $slug, protected ?string $suffix = null, protected ?Site $site = null, + protected ?string $locale = null, ) { } @@ -56,4 +57,9 @@ public function getSite(): ?Site { return $this->site; } + + public function getLocale(): ?string + { + return $this->locale; + } } diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSiteSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSiteSlugGenerator.php index 1f4afe08a0..3c1d8c155c 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSiteSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSiteSlugGenerator.php @@ -34,7 +34,7 @@ public function __construct( public function generateSlugsForSite(SluggableInterface $sluggable, string $locale, ?Site $site = null): string { $slug = $this->slugger->slug($sluggable, $locale, null); - $slug = $this->dispatchSlugEvent($sluggable, $slug, null, $site); + $slug = $this->dispatchSlugEvent($sluggable, $slug, null, $site, $locale); $i = 1; @@ -47,7 +47,7 @@ public function generateSlugsForSite(SluggableInterface $sluggable, string $loca } $slug = $this->slugger->slug($sluggable, $locale, (string) $i); - $slug = $this->dispatchSlugEvent($sluggable, $slug, (string) $i, $site); + $slug = $this->dispatchSlugEvent($sluggable, $slug, (string) $i, $site, $locale); ++$i; } @@ -55,9 +55,9 @@ public function generateSlugsForSite(SluggableInterface $sluggable, string $loca return $slug; } - private function dispatchSlugEvent(SluggableInterface $sluggable, string $slug, string $prefix = null, ?Site $site = null) + private function dispatchSlugEvent(SluggableInterface $sluggable, string $slug, string $prefix = null, ?Site $site = null, ?string $locale = null) { - $event = new SlugGenerationEvent($sluggable, $slug, $prefix, $site); + $event = new SlugGenerationEvent($sluggable, $slug, $prefix, $site, $locale); $this->eventDispatcher->dispatch($event); return $event->getSlug(); From 529b81c207e6da5eda2afdb70de1d3196b195837 Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Fri, 28 Apr 2023 08:35:50 +0200 Subject: [PATCH 2/7] support field type "store" in grid --- .../StoreBundle/CoreExtension/Store.php | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php b/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php index 9a702eef66..8b788d61fa 100644 --- a/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php +++ b/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php @@ -20,6 +20,8 @@ use CoreShop\Bundle\ResourceBundle\CoreExtension\Select; use CoreShop\Component\Store\Model\StoreInterface; +use InvalidArgumentException; +use Pimcore\Model\DataObject\ClassDefinition\Helper\OptionsProviderResolver; /** * @psalm-suppress InvalidReturnType, InvalidReturnStatement @@ -33,6 +35,12 @@ class Store extends Select */ public $fieldtype = 'coreShopStore'; + /** @var array */ + public $options = []; + + /** @var string */ + public $optionsProviderClass = '@'.StoreOptionProvider::class; + protected function getRepository() { return \Pimcore::getContainer()->get('coreshop.repository.store'); @@ -57,4 +65,66 @@ public function getOptionsProviderClass() { return '@' . StoreOptionProvider::class; } + + public function getDataForGrid($data, $object = null, $params = []) + { + $optionsProvider = OptionsProviderResolver::resolveProvider( + $this->getOptionsProviderClass(), + OptionsProviderResolver::MODE_SELECT + ); + + if ($optionsProvider) { + $context = $params['context'] ?? []; + $context['object'] = $object; + if ($object) { + $context['class'] = $object->getClass(); + } + + $context['fieldname'] = $this->getName(); + $options = $optionsProvider->{'getOptions'}($context, $this); + $this->setOptions($options); + + if (isset($params['purpose']) && $params['purpose'] === 'editmode') { + $result = $data?->getId(); + } else { + $result = ['value' => $data?->getId(), 'options' => $this->getOptions()]; + } + + return $result; + } + + return $data?->getId(); + } + + /** + * @param array|null $options + * + * @return $this + */ + public function setOptions(?array $options) + { + if (is_array($options)) { + $this->options = []; + foreach ($options as $option) { + $option = (array)$option; + if (!array_key_exists('key', $option) || !array_key_exists('value', $option)) { + throw new InvalidArgumentException('Please provide select options as associative array with fields "key" and "value"'); + } + + $this->options[] = $option; + } + } else { + $this->options = null; + } + + return $this; + } + + /** + * @return array + */ + public function getOptions() + { + return $this->options; + } } From 21361c0e936c4b37865acc8b318bbe5a9cc4daee Mon Sep 17 00:00:00 2001 From: CoreShop Date: Mon, 1 May 2023 02:30:20 +0000 Subject: [PATCH 3/7] [CS] Refactor --- src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php | 2 +- .../DependencyInjection/CoreShopStorageListExtension.php | 1 - .../Bundle/StorageListBundle/EventListener/CacheListener.php | 4 ++-- .../Order/Cart/Rule/Action/CartItemActionProcessor.php | 3 +-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php index ba46cf6acc..ef3089f35e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php +++ b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php @@ -80,7 +80,7 @@ public function persistCart(OrderInterface $cart): void ); //$item->setPath($cart->getFullPath()); $item->setPublished(true); - $item->setKey((string)((int)$index + 1)); + $item->setKey((string) ((int) $index + 1)); $item->save(); } diff --git a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php index 6375ea3688..88c4651111 100644 --- a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php +++ b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php @@ -104,7 +104,6 @@ public function load(array $configs, ContainerBuilder $container): void $sessionSubscriber->addTag('kernel.event_subscriber'); $container->setDefinition('coreshop.storage_list.session_subscriber.' . $name, $sessionSubscriber); - } $cacheSubscriber = new Definition(CacheListener::class, [ diff --git a/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php index 95548aaf16..60c150bf37 100644 --- a/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php +++ b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php @@ -75,10 +75,10 @@ public function onKernelResponse(ResponseEvent $event): void continue; } - Cache::addIgnoredTagOnSave('object_'.$item->getId()); + Cache::addIgnoredTagOnSave('object_' . $item->getId()); } - Cache::addIgnoredTagOnSave('object_'.$list->getId()); + Cache::addIgnoredTagOnSave('object_' . $list->getId()); } } } diff --git a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php index e92d5072de..2e1e21654f 100644 --- a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php +++ b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php @@ -94,8 +94,7 @@ public function applyRule(OrderInterface $cart, array $configuration, PriceRuleI if (!$result) { $item->removePriceRule($priceRuleItem); - } - else if (!$existingPriceRule) { + } elseif (!$existingPriceRule) { $item->addPriceRule($priceRuleItem); } From cc691d221eee766f2b20e80ecdbcca207ba9b87a Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Tue, 2 May 2023 11:02:21 +0200 Subject: [PATCH 4/7] support field type "store" in grid --- src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php b/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php index 8b788d61fa..8290e6b2c2 100644 --- a/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php +++ b/src/CoreShop/Bundle/StoreBundle/CoreExtension/Store.php @@ -35,7 +35,7 @@ class Store extends Select */ public $fieldtype = 'coreShopStore'; - /** @var array */ + /** @var array|null */ public $options = []; /** @var string */ @@ -63,7 +63,7 @@ protected function getNullable(): bool public function getOptionsProviderClass() { - return '@' . StoreOptionProvider::class; + return $this->optionsProviderClass; } public function getDataForGrid($data, $object = null, $params = []) From 15c7452fbf602d5d26e7d5f46575adb5482a5649 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Wed, 3 May 2023 11:33:12 +0200 Subject: [PATCH 5/7] [WishlistBundle] make wishlist easier usable outside of CoreShop --- docker-compose.yaml | 2 + .../Pimcore/Repository/WishlistRepository.php | 4 +- .../CoreShopResourceExtension.php | 1 + .../Pimcore/Repository/WishlistRepository.php | 17 ++++ .../pimcore/classes/CoreShopWishlist.json | 77 +------------------ .../pimcore/classes/CoreShopWishlistItem.json | 8 -- .../WishlistRepositoryInterface.php | 3 +- 7 files changed, 25 insertions(+), 87 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 0e0f3badc8..67fccd6643 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -84,6 +84,7 @@ services: - db volumes: - .:/var/www/html:cached + - ./.docker/xdebug-config.ini:/usr/local/etc/php/conf.d/21-xdebug.ini environment: PHP_IDE_CONFIG: serverName=localhost XDEBUG_TRIGGER: PHPSTORM @@ -110,6 +111,7 @@ services: - db volumes: - .:/var/www/html:cached + - ./.docker/xdebug-config.ini:/usr/local/etc/php/conf.d/21-xdebug.ini environment: PHP_IDE_CONFIG: serverName=localhost COMPOSER_HOME: /var/www/html diff --git a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php index 71d7d9cc07..701d2c0594 100644 --- a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php +++ b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php @@ -18,12 +18,12 @@ namespace CoreShop\Bundle\CoreBundle\Pimcore\Repository; -use CoreShop\Component\Core\Wishlist\Repository\WishlistRepositoryInterface; +use CoreShop\Component\Core\Wishlist\Repository\WishlistRepositoryInterface as BaseWishlistRepository; use CoreShop\Component\Customer\Model\CustomerInterface; use CoreShop\Component\Store\Model\StoreInterface; use CoreShop\Component\Wishlist\Model\WishlistInterface; -class WishlistRepository extends \CoreShop\Bundle\WishlistBundle\Pimcore\Repository\WishlistRepository implements WishlistRepositoryInterface +class WishlistRepository extends BaseWishlistRepository implements WishlistRepositoryInterface { public function findLatestByStoreAndCustomer( StoreInterface $store, diff --git a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php index 40417cde3e..5ad09c38d1 100644 --- a/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php +++ b/src/CoreShop/Bundle/ResourceBundle/DependencyInjection/CoreShopResourceExtension.php @@ -76,6 +76,7 @@ public function load(array $configs, ContainerBuilder $container): void 'priority' => 10, ]); + $container->setParameter('coreshop.resources', []); $container->setDefinition('coreshop.body_listener', $bodyListener); $container diff --git a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php index b7ef20b40c..47ff435a6c 100644 --- a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php +++ b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php @@ -18,6 +18,7 @@ namespace CoreShop\Bundle\WishlistBundle\Pimcore\Repository; +use Carbon\Carbon; use CoreShop\Bundle\ResourceBundle\Pimcore\PimcoreRepository; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\Wishlist\Model\WishlistInterface; @@ -25,6 +26,22 @@ class WishlistRepository extends PimcoreRepository implements WishlistRepositoryInterface { + public function findExpiredStorageLists(int $days, array $params = []): array + { + $daysTimestamp = Carbon::now(); + $daysTimestamp->subDays($days); + $queryParams = [$daysTimestamp->getTimestamp()]; + + $list = $this->getList(); + $list->setCondition('o_modificationDate < ?', $queryParams); + + /** + * @var StorageListInterface[] $result + */ + $result = $list->getObjects(); + + return $result; + } public function findByStorageListId(int $id): ?StorageListInterface { return $this->find($id); diff --git a/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlist.json b/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlist.json index 5ca1747cb7..18d61783a9 100644 --- a/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlist.json +++ b/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlist.json @@ -42,31 +42,6 @@ "datatype": "layout", "permissions": null, "children": [ - { - "fieldtype": "input", - "width": "", - "defaultValue": null, - "columnLength": 190, - "regex": "", - "regexFlags": [], - "unique": false, - "showCharCount": false, - "name": "name", - "title": "Name", - "tooltip": "", - "mandatory": false, - "noteditable": false, - "index": false, - "locked": false, - "style": "", - "permissions": null, - "datatype": "data", - "relationType": false, - "invisible": false, - "visibleGridView": false, - "visibleSearch": false, - "defaultValueGenerator": "" - }, { "fieldtype": "input", "width": null, @@ -92,27 +67,9 @@ "visibleSearch": false, "defaultValueGenerator": "" }, - { - "fieldtype": "coreShopStore", - "allowEmpty": false, - "name": "store", - "title": "coreshop.order.store", - "tooltip": "", - "mandatory": false, - "noteditable": true, - "index": false, - "locked": false, - "style": "", - "permissions": null, - "datatype": "data", - "relationType": false, - "invisible": false, - "visibleGridView": false, - "visibleSearch": false - }, { "fieldtype": "coreShopRelations", - "stack": "coreshop.product", + "stack": "coreshop.wishlist_item", "relationType": true, "objectsAllowed": true, "assetsAllowed": false, @@ -139,38 +96,6 @@ "invisible": false, "visibleGridView": false, "visibleSearch": false - }, - { - "fieldtype": "coreShopRelation", - "stack": "coreshop.customer", - "relationType": true, - "objectsAllowed": true, - "assetsAllowed": false, - "documentsAllowed": false, - "returnConcrete": false, - "width": null, - "assetUploadPath": null, - "assetTypes": [], - "documentTypes": [], - "classes": [ - { - "classes": "CoreShopCustomer" - } - ], - "pathFormatterClass": "", - "name": "customer", - "title": "Customer", - "tooltip": "", - "mandatory": false, - "noteditable": false, - "index": false, - "locked": false, - "style": "", - "permissions": null, - "datatype": "data", - "invisible": false, - "visibleGridView": false, - "visibleSearch": false } ], "locked": false, diff --git a/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlistItem.json b/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlistItem.json index ea7c079b86..3807deab66 100644 --- a/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlistItem.json +++ b/src/CoreShop/Bundle/WishlistBundle/Resources/install/pimcore/classes/CoreShopWishlistItem.json @@ -55,9 +55,6 @@ "assetTypes": [], "documentTypes": [], "classes": [ - { - "classes": "CoreShopProduct" - } ], "pathFormatterClass": "", "name": "product", @@ -119,11 +116,6 @@ "invisible": false, "visibleGridView": false, "visibleSearch": false, - "classes": [ - { - "classes": "CoreShopWishlist" - } - ], "pathFormatterClass": "", "width": null, "assetUploadPath": null, diff --git a/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php b/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php index 25c7a6f9d5..6eafda5a91 100644 --- a/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php +++ b/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php @@ -18,11 +18,12 @@ namespace CoreShop\Component\Wishlist\Repository; +use CoreShop\Component\StorageList\Repository\ExpireAbleStorageListRepositoryInterface; use CoreShop\Component\StorageList\Repository\PimcoreStorageListRepositoryInterface; use CoreShop\Component\StorageList\Repository\ShareableStorageListRepositoryInterface; use CoreShop\Component\Wishlist\Model\WishlistInterface; -interface WishlistRepositoryInterface extends PimcoreStorageListRepositoryInterface, ShareableStorageListRepositoryInterface +interface WishlistRepositoryInterface extends PimcoreStorageListRepositoryInterface, ShareableStorageListRepositoryInterface, ExpireAbleStorageListRepositoryInterface { public function findByToken(string $token): ?WishlistInterface; } From 27e2efe7f7a257a83b5be3f3735abf413f8f6d66 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Wed, 3 May 2023 11:34:41 +0200 Subject: [PATCH 6/7] [WishlistBundle] make wishlist easier usable outside of CoreShop --- .../CoreBundle/Pimcore/Repository/WishlistRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php index 701d2c0594..1b115f7bc4 100644 --- a/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php +++ b/src/CoreShop/Bundle/CoreBundle/Pimcore/Repository/WishlistRepository.php @@ -18,11 +18,11 @@ namespace CoreShop\Bundle\CoreBundle\Pimcore\Repository; -use CoreShop\Component\Core\Wishlist\Repository\WishlistRepositoryInterface as BaseWishlistRepository; +use CoreShop\Component\Core\Wishlist\Repository\WishlistRepositoryInterface; use CoreShop\Component\Customer\Model\CustomerInterface; use CoreShop\Component\Store\Model\StoreInterface; use CoreShop\Component\Wishlist\Model\WishlistInterface; - +use CoreShop\Bundle\WishlistBundle\Pimcore\Repository\WishlistRepository as BaseWishlistRepository; class WishlistRepository extends BaseWishlistRepository implements WishlistRepositoryInterface { public function findLatestByStoreAndCustomer( From a7a274f2215bb52266ed43456c7882dec460bf7c Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Wed, 3 May 2023 12:11:34 +0200 Subject: [PATCH 7/7] [WishlistBundle] make wishlist easier usable outside of CoreShop - remove expire --- .../Pimcore/Repository/WishlistRepository.php | 16 ---------------- .../Repository/WishlistRepositoryInterface.php | 3 +-- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php index 47ff435a6c..635ea69ba3 100644 --- a/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php +++ b/src/CoreShop/Bundle/WishlistBundle/Pimcore/Repository/WishlistRepository.php @@ -26,22 +26,6 @@ class WishlistRepository extends PimcoreRepository implements WishlistRepositoryInterface { - public function findExpiredStorageLists(int $days, array $params = []): array - { - $daysTimestamp = Carbon::now(); - $daysTimestamp->subDays($days); - $queryParams = [$daysTimestamp->getTimestamp()]; - - $list = $this->getList(); - $list->setCondition('o_modificationDate < ?', $queryParams); - - /** - * @var StorageListInterface[] $result - */ - $result = $list->getObjects(); - - return $result; - } public function findByStorageListId(int $id): ?StorageListInterface { return $this->find($id); diff --git a/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php b/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php index 6eafda5a91..25c7a6f9d5 100644 --- a/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php +++ b/src/CoreShop/Component/Wishlist/Repository/WishlistRepositoryInterface.php @@ -18,12 +18,11 @@ namespace CoreShop\Component\Wishlist\Repository; -use CoreShop\Component\StorageList\Repository\ExpireAbleStorageListRepositoryInterface; use CoreShop\Component\StorageList\Repository\PimcoreStorageListRepositoryInterface; use CoreShop\Component\StorageList\Repository\ShareableStorageListRepositoryInterface; use CoreShop\Component\Wishlist\Model\WishlistInterface; -interface WishlistRepositoryInterface extends PimcoreStorageListRepositoryInterface, ShareableStorageListRepositoryInterface, ExpireAbleStorageListRepositoryInterface +interface WishlistRepositoryInterface extends PimcoreStorageListRepositoryInterface, ShareableStorageListRepositoryInterface { public function findByToken(string $token): ?WishlistInterface; }