diff --git a/src/Synolia/Bundle/FavoriteBundle/Entity/Repository/FavoriteRepository.php b/src/Synolia/Bundle/FavoriteBundle/Entity/Repository/FavoriteRepository.php index c79c102..51b49f2 100644 --- a/src/Synolia/Bundle/FavoriteBundle/Entity/Repository/FavoriteRepository.php +++ b/src/Synolia/Bundle/FavoriteBundle/Entity/Repository/FavoriteRepository.php @@ -5,6 +5,7 @@ namespace Synolia\Bundle\FavoriteBundle\Entity\Repository; use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\Query; use Oro\Bundle\CustomerBundle\Entity\CustomerUser; use Oro\Bundle\OrganizationBundle\Entity\Organization; use Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper; @@ -12,12 +13,12 @@ class FavoriteRepository extends EntityRepository { - public function findAllFilteredByAcl(AclHelper $aclHelper): array + public function findAllFilteredByAcl(AclHelper $aclHelper, CustomerUser $user, Organization $organization): array { - return $aclHelper->apply($this->createQueryBuilder('f'))->getResult(); + return $aclHelper->apply($this->getFavoritesProductsCollection($user, $organization))->getResult(); } - public function getFavoritesProductsCollection(CustomerUser $user, Organization $organization): array + public function getFavoritesProductsCollection(CustomerUser $user, Organization $organization): Query { return $this->createQueryBuilder('f') ->resetDQLPart('select') @@ -28,29 +29,17 @@ public function getFavoritesProductsCollection(CustomerUser $user, Organization 'user' => $user, 'organization' => $organization, ]) - ->getQuery()->getArrayResult(); + ->getQuery(); } - public function getFavoritesProductsInSingleArray(CustomerUser $user, Organization $organization): array - { - $newArray = []; - $favorites = $this->getFavoritesProductsCollection($user, $organization); - - foreach ($favorites as $favorite) { - $newArray[] = $favorite['product_id']; - } - - return $newArray; - } - - public function findAllProductIdsFilteredByAcl(AclHelper $aclHelper): array + public function findAllProductIdsFilteredByAcl(AclHelper $aclHelper, CustomerUser $user, Organization $organization): array { $ids = []; - $favorites = $this->findAllFilteredByAcl($aclHelper); + $favorites = $this->findAllFilteredByAcl($aclHelper, $user, $organization); /** @var Favorite $favorite */ foreach ($favorites as $favorite) { - $ids[] = $favorite->getProduct()?->getId(); + $ids[] = $favorite['product_id']; } return $ids; diff --git a/src/Synolia/Bundle/FavoriteBundle/EventListener/FavoriteDatagridListener.php b/src/Synolia/Bundle/FavoriteBundle/EventListener/FavoriteDatagridListener.php index 4108c93..89c69a8 100644 --- a/src/Synolia/Bundle/FavoriteBundle/EventListener/FavoriteDatagridListener.php +++ b/src/Synolia/Bundle/FavoriteBundle/EventListener/FavoriteDatagridListener.php @@ -7,8 +7,11 @@ use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Exception\NotSupported; +use Oro\Bundle\CustomerBundle\Entity\CustomerUser; use Oro\Bundle\DataGridBundle\Event\BuildAfter; +use Oro\Bundle\OrganizationBundle\Entity\Organization; use Oro\Bundle\SearchBundle\Datagrid\Datasource\SearchDatasource; +use Oro\Bundle\SecurityBundle\Authentication\TokenAccessorInterface; use Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper; use Synolia\Bundle\FavoriteBundle\Entity\Favorite; use Synolia\Bundle\FavoriteBundle\Entity\Repository\FavoriteRepository; @@ -17,7 +20,8 @@ class FavoriteDatagridListener { public function __construct( protected EntityManager $entityManager, - protected AclHelper $aclHelper + protected AclHelper $aclHelper, + protected TokenAccessorInterface $tokenAccessor, ) { } @@ -33,8 +37,14 @@ public function onBuildAfter(BuildAfter $event): void /** @var FavoriteRepository $repo */ $repo = $this->entityManager->getRepository(Favorite::class); - - $favProductIds = $repo->findAllProductIdsFilteredByAcl($this->aclHelper); + $user = $this->tokenAccessor->getUser(); + $organization = $this->tokenAccessor->getOrganization(); + $favProductIds = []; + if ($user instanceof CustomerUser and $organization instanceof Organization) { + /** @var FavoriteRepository $favoriteRepo */ + $favoriteRepo = $this->entityManager->getRepository(Favorite::class); + $favProductIds = $favoriteRepo->findAllProductIdsFilteredByAcl($this->aclHelper, $user, $organization); + } if (empty($favProductIds)) { $favProductIds = [0]; diff --git a/src/Synolia/Bundle/FavoriteBundle/EventListener/FrontendProductFavoriteDatagridListener.php b/src/Synolia/Bundle/FavoriteBundle/EventListener/FrontendProductFavoriteDatagridListener.php index 56f37a3..0d928ac 100644 --- a/src/Synolia/Bundle/FavoriteBundle/EventListener/FrontendProductFavoriteDatagridListener.php +++ b/src/Synolia/Bundle/FavoriteBundle/EventListener/FrontendProductFavoriteDatagridListener.php @@ -5,9 +5,12 @@ namespace Synolia\Bundle\FavoriteBundle\EventListener; use Doctrine\ORM\EntityManager; +use Oro\Bundle\CustomerBundle\Entity\CustomerUser; use Oro\Bundle\DataGridBundle\Datasource\ResultRecord; use Oro\Bundle\DataGridBundle\Event\BuildBefore; use Oro\Bundle\DataGridBundle\Extension\Formatter\Property\PropertyInterface; +use Oro\Bundle\OrganizationBundle\Entity\Organization; +use Oro\Bundle\SecurityBundle\Authentication\TokenAccessorInterface; use Oro\Bundle\SearchBundle\Datagrid\Event\SearchResultAfter; use Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper; use Synolia\Bundle\FavoriteBundle\Entity\Favorite; @@ -17,7 +20,8 @@ class FrontendProductFavoriteDatagridListener { public function __construct( private readonly EntityManager $entityManager, - private readonly AclHelper $aclHelper + private readonly AclHelper $aclHelper, + private readonly TokenAccessorInterface $tokenAccessor, ) { } @@ -43,9 +47,14 @@ public function onResultAfter(SearchResultAfter $event): void return; } - /** @var FavoriteRepository $favoriteRepo */ - $favoriteRepo = $this->entityManager->getRepository(Favorite::class); - $favProductIds = $favoriteRepo->findAllProductIdsFilteredByAcl($this->aclHelper); + $user = $this->tokenAccessor->getUser(); + $organization = $this->tokenAccessor->getOrganization(); + $favProductIds = []; + if ($user instanceof CustomerUser and $organization instanceof Organization) { + /** @var FavoriteRepository $favoriteRepo */ + $favoriteRepo = $this->entityManager->getRepository(Favorite::class); + $favProductIds = $favoriteRepo->findAllProductIdsFilteredByAcl($this->aclHelper, $user, $organization); + } /** @var ResultRecord $record */ foreach ($records as $record) { $productId = $record->getValue('id'); diff --git a/src/Synolia/Bundle/FavoriteBundle/EventListener/ProductListAddFavoriteEventListener.php b/src/Synolia/Bundle/FavoriteBundle/EventListener/ProductListAddFavoriteEventListener.php index df52421..fe9151d 100644 --- a/src/Synolia/Bundle/FavoriteBundle/EventListener/ProductListAddFavoriteEventListener.php +++ b/src/Synolia/Bundle/FavoriteBundle/EventListener/ProductListAddFavoriteEventListener.php @@ -5,7 +5,10 @@ namespace Synolia\Bundle\FavoriteBundle\EventListener; use Doctrine\ORM\EntityManager; +use Oro\Bundle\CustomerBundle\Entity\CustomerUser; +use Oro\Bundle\OrganizationBundle\Entity\Organization; use Oro\Bundle\ProductBundle\Event\BuildResultProductListEvent; +use Oro\Bundle\SecurityBundle\Authentication\TokenAccessorInterface; use Oro\Bundle\SecurityBundle\ORM\Walker\AclHelper; use Synolia\Bundle\FavoriteBundle\Entity\Favorite; use Synolia\Bundle\FavoriteBundle\Entity\Repository\FavoriteRepository; @@ -14,7 +17,8 @@ class ProductListAddFavoriteEventListener { public function __construct( private readonly EntityManager $entityManager, - private readonly AclHelper $aclHelper + private readonly AclHelper $aclHelper, + private readonly TokenAccessorInterface $tokenAccessor, ) { } @@ -26,9 +30,14 @@ public function onBuildResult(BuildResultProductListEvent $event): void return; } - /** @var FavoriteRepository $favoriteRepo */ - $favoriteRepo = $this->entityManager->getRepository(Favorite::class); - $favProductIds = $favoriteRepo->findAllProductIdsFilteredByAcl($this->aclHelper); + $user = $this->tokenAccessor->getUser(); + $organization = $this->tokenAccessor->getOrganization(); + $favProductIds = []; + if ($user instanceof CustomerUser and $organization instanceof Organization) { + /** @var FavoriteRepository $favoriteRepo */ + $favoriteRepo = $this->entityManager->getRepository(Favorite::class); + $favProductIds = $favoriteRepo->findAllProductIdsFilteredByAcl($this->aclHelper, $user, $organization); + } foreach (array_keys($event->getProductData()) as $productId) { $productView = $event->getProductView($productId); diff --git a/src/Synolia/Bundle/FavoriteBundle/Resources/config/event_listeners.yml b/src/Synolia/Bundle/FavoriteBundle/Resources/config/event_listeners.yml index a615f04..537ff81 100644 --- a/src/Synolia/Bundle/FavoriteBundle/Resources/config/event_listeners.yml +++ b/src/Synolia/Bundle/FavoriteBundle/Resources/config/event_listeners.yml @@ -3,6 +3,7 @@ services: arguments: - '@doctrine.orm.entity_manager' - '@oro_security.acl_helper' + - '@oro_security.token_accessor' tags: - { name: kernel.event_listener, event: oro_datagrid.datagrid.build.before.frontend-product-search-grid, method: onBuildBefore } - { name: kernel.event_listener, event: oro_datagrid.search_datasource.result.after.frontend-product-search-grid, method: onResultAfter } @@ -11,6 +12,7 @@ services: arguments: - '@doctrine.orm.entity_manager' - '@oro_security.acl_helper' + - '@oro_security.token_accessor' tags: - { name: kernel.event_listener, event: oro_datagrid.datagrid.build.after.synolia-favorite-grid, method: onBuildAfter } @@ -18,5 +20,6 @@ services: arguments: - '@doctrine.orm.entity_manager' - '@oro_security.acl_helper' + - '@oro_security.token_accessor' tags: - { name: kernel.event_listener, event: oro_product.product_list.build_result, method: onBuildResult, priority: 10 }