<?php declare(strict_types=1);
namespace Acris\ProductTab\Components\ProductTab;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\OrFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
class ProductTabGateway
{
/**
* @var EntityRepositoryInterface
*/
private $productTabRepository;
/**
* @var EntityRepositoryInterface
*/
private $productStreamMappingRepository;
public function __construct(
EntityRepositoryInterface $productTabRepository,
EntityRepositoryInterface $productStreamMappingRepository
) {
$this->productTabRepository = $productTabRepository;
$this->productStreamMappingRepository = $productStreamMappingRepository;
}
public function getProductDetailProductTab(string $productId, array $productStreamIds, SalesChannelContext $context): EntitySearchResult
{
$productFilter = [new EqualsFilter('productId', $productId)];
if(!empty($productStreamIds)){
$productFilter[] = new MultiFilter(MultiFilter::CONNECTION_AND, [
new EqualsAnyFilter('productStreams.id', $productStreamIds),
new NotFilter(NotFilter::CONNECTION_AND, [
new EqualsFilter('productStreams.id', null)
])
]);
}
return $this->productTabRepository->search((new Criteria())
->addAssociation('productStreams')
->addAssociation('rules')
->addAssociation('cmsPage')
->addSorting(new FieldSorting('priority',FieldSorting::DESCENDING, true))
->addFilter(new EqualsFilter('active', true))
->addFilter(new OrFilter([new EqualsFilter('rules.id', null), new EqualsAnyFilter('rules.id', $context->getRuleIds())]))
->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, $productFilter)),
$context->getContext());
}
public function getProductStreamIds(array $productIds, Context $context): array
{
$productStreamIds = [];
$idSearchResult = $this->productStreamMappingRepository->searchIds((new Criteria())->addFilter(new EqualsAnyFilter('productId', $productIds)), $context);
if ($idSearchResult->getTotal() > 0) {
foreach ($idSearchResult->getIds() as $ids) {
if (!empty($ids) && is_array($ids) && array_key_exists('productStreamId', $ids) && !empty($ids['productStreamId'])) {
$productStreamIds[] = $ids['productStreamId'];
}
}
}
return $productStreamIds;
}
}