custom/plugins/AcrisProductTabCS/src/Components/ProductTab/ProductTabGateway.php line 37

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\ProductTab\Components\ProductTab;
  3. use Shopware\Core\Framework\Context;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\OrFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  13. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  14. class ProductTabGateway
  15. {
  16.     /**
  17.      * @var EntityRepositoryInterface
  18.      */
  19.     private $productTabRepository;
  20.     /**
  21.      * @var EntityRepositoryInterface
  22.      */
  23.     private $productStreamMappingRepository;
  24.     public function __construct(
  25.         EntityRepositoryInterface $productTabRepository,
  26.         EntityRepositoryInterface $productStreamMappingRepository
  27.     ) {
  28.         $this->productTabRepository = $productTabRepository;
  29.         $this->productStreamMappingRepository = $productStreamMappingRepository;
  30.     }
  31.     public function getProductDetailProductTab(string $productId, array $productStreamIds, SalesChannelContext $context): EntitySearchResult
  32.     {
  33.         $productFilter = [new EqualsFilter('productId', $productId)];
  34.         if(!empty($productStreamIds)){
  35.             $productFilter[] = new MultiFilter(MultiFilter::CONNECTION_AND, [
  36.                 new EqualsAnyFilter('productStreams.id', $productStreamIds),
  37.                 new NotFilter(NotFilter::CONNECTION_AND, [
  38.                     new EqualsFilter('productStreams.id', null)
  39.                 ])
  40.             ]);
  41.         }
  42.         return $this->productTabRepository->search((new Criteria())
  43.             ->addAssociation('productStreams')
  44.             ->addAssociation('rules')
  45.             ->addAssociation('cmsPage')
  46.             ->addSorting(new FieldSorting('priority',FieldSorting::DESCENDING, true))
  47.             ->addFilter(new EqualsFilter('active', true))
  48.             ->addFilter(new OrFilter([new EqualsFilter('rules.id', null), new EqualsAnyFilter('rules.id', $context->getRuleIds())]))
  49.             ->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, $productFilter)),
  50.         $context->getContext());
  51.     }
  52.     public function getProductStreamIds(array $productIds, Context $context): array
  53.     {
  54.         $productStreamIds = [];
  55.         $idSearchResult = $this->productStreamMappingRepository->searchIds((new Criteria())->addFilter(new EqualsAnyFilter('productId', $productIds)), $context);
  56.         if ($idSearchResult->getTotal() > 0) {
  57.             foreach ($idSearchResult->getIds() as $ids) {
  58.                 if (!empty($ids) && is_array($ids) && array_key_exists('productStreamId', $ids) && !empty($ids['productStreamId'])) {
  59.                     $productStreamIds[] = $ids['productStreamId'];
  60.                 }
  61.             }
  62.         }
  63.         return $productStreamIds;
  64.     }
  65. }