<?php
namespace MbdusArticleSort\Subscriber;
use MbdusArticleSort\Product\CategoryIdHelper;
use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Doctrine\DBAL\Connection;
class ListingCriteria implements EventSubscriberInterface
{
/**
* @var CategoryIdHelper
*/
private $categoryIdHelper;
/**
* @var EntityRepositoryInterface
*/
private $categoryRepository;
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* @var Connection
*/
private $connection;
public function __construct(
CategoryIdHelper $categoryIdHelper,
EntityRepositoryInterface $categoryRepository,
SystemConfigService $systemConfigService,
Connection $connection
)
{
$this->categoryIdHelper = $categoryIdHelper;
$this->categoryRepository = $categoryRepository;
$this->systemConfigService = $systemConfigService;
$this->connection = $connection;
}
public static function getSubscribedEvents()
{
return [
ProductListingCriteriaEvent::class => 'addCriteria'
];
}
public function addCriteria(ProductListingCriteriaEvent $productListingCriteriaEvent)
{
$categoryId = $this->getNavigationId($productListingCriteriaEvent->getRequest(), $productListingCriteriaEvent->getSalesChannelContext());
if (empty($categoryId)) {
return;
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('categoryId', $categoryId));
$this->categoryIdHelper->setCategoryId($categoryId);
$request = $productListingCriteriaEvent->getRequest();
$defaultChannelOrder = $this->getSystemDefaultSorting($productListingCriteriaEvent->getSalesChannelContext());
$defaultSortOrder = $this->systemConfigService->get('MbdusArticleSort.config.mbdusDefaultSortOrder') ?? $defaultChannelOrder;
if($defaultSortOrder == "null"){
$defaultSortOrder = $defaultChannelOrder;
}
$order = $request->query->get('order');
$isManualSorted = $this->isManualSorted($categoryId);
echo $order."|".$defaultSortOrder."|".$defaultChannelOrder."<br>";
if((!$order || $defaultSortOrder == $order) && $isManualSorted){
$productListingCriteriaEvent->getCriteria()->resetSorting();
$productListingCriteriaEvent->getCriteria()->addSorting(
new FieldSorting('mbdusSort.sort', FieldSorting::ASCENDING)
);
}
}
public function isManualSorted($categoryId){
$query = $this->connection->createQueryBuilder();
$query->select('id');
$query->from('mbdus_productcategoriessort', 'sorting');
$query->where('HEX(sorting.category_id) LIKE :categoryId');
$query->setParameter('categoryId', $categoryId);
$result = $query->execute()->fetchAll();
if(empty($result)){
return false;
}
return true;
}
private function getSystemDefaultSorting(SalesChannelContext $context): string
{
return $this->systemConfigService->getString(
'core.listing.defaultSorting',
$context->getSalesChannel()->getId()
);
}
private function getNavigationId(Request $request, SalesChannelContext $salesChannelContext): string
{
$params = $request->attributes->get('_route_params');
if ($params && isset($params['navigationId'])) {
return $params['navigationId'];
}
return $salesChannelContext->getSalesChannel()->getNavigationCategoryId();
}
}