<?php declare(strict_types=1);
namespace MoorlMagazine\Core\Content\MagazineArticle\SalesChannel;
use MoorlFoundation\Core\System\EntityListingExtension;
use MoorlFoundation\Core\System\EntityListingInterface;
use MoorlMagazine\Core\Content\MagazineArticle\MagazineArticleDefinition;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleListingCriteriaEvent;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleListingResultEvent;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleSearchCriteriaEvent;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleSearchResultEvent;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleSuggestCriteriaEvent;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Events\MagazineArticleSuggestResultEvent;
use Shopware\Core\Content\Product\Events\ProductSearchResultEvent;
use Shopware\Core\Content\Product\Events\ProductSuggestResultEvent;
use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingResult;
use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingRouteResponse;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
class MagazineArticleListing extends EntityListingExtension implements EntityListingInterface
{
public function getEntityName(): string
{
return MagazineArticleDefinition::ENTITY_NAME;
}
public function getTitle(): string
{
return 'magazine-article-listing';
}
public function getSnippet(): ?string
{
return 'moorl-magazine.articles';
}
public function getElementConfig(): array
{
if ($this->isSearch() && $this->systemConfigService->get('MoorlMagazine.config.searchConfigActive')) {
return $this->systemConfigService->get('MoorlMagazine.config.searchConfig') ?: parent::getElementConfig();
} elseif ($this->isSuggest() && $this->systemConfigService->get('MoorlMagazine.config.suggestConfigActive')) {
return $this->systemConfigService->get('MoorlMagazine.config.suggestConfig') ?: parent::getElementConfig();
}
return parent::getElementConfig();
}
public function isActive(): bool
{
if ($this->isSearch()) {
return $this->systemConfigService->get('MoorlMagazine.config.searchActive') ? true : false;
} elseif ($this->isSuggest()) {
return $this->systemConfigService->get('MoorlMagazine.config.suggestActive') ? true : false;
}
return true;
}
public function getLimit(): int
{
if ($this->isSearch()) {
return $this->systemConfigService->get('MoorlMagazine.config.searchLimit') ?: 12;
} elseif ($this->isSuggest()) {
return $this->systemConfigService->get('MoorlMagazine.config.suggestLimit') ?: 6;
}
return 1;
}
public function processCriteria(Criteria $criteria): void
{
$criteria->addAssociation('tags');
$criteria->addAssociation('media');
$criteria->addAssociation('products.cover');
$criteria->addAssociation('categories');
$criteria->addFilter(new MagazineArticleAvailableFilter($this->salesChannelContext));
$criteria->addFilter(new EqualsFilter('moorl_magazine_article.invisible', false));
if ($this->event instanceof ProductSuggestResultEvent) {
$eventClass = MagazineArticleSuggestCriteriaEvent::class;
} elseif ($this->event instanceof ProductSearchResultEvent) {
$eventClass = MagazineArticleSearchCriteriaEvent::class;
} elseif ($this->isWidget()) {
$eventClass = MagazineArticleSearchCriteriaEvent::class;
} else {
$eventClass = MagazineArticleListingCriteriaEvent::class;
}
$this->eventDispatcher->dispatch(
new $eventClass($this->request, $criteria, $this->salesChannelContext)
);
}
public function processSearchResult(ProductListingResult $searchResult): void
{
if ($this->event instanceof ProductSuggestResultEvent) {
$eventClass = MagazineArticleSuggestResultEvent::class;
} elseif ($this->event instanceof ProductSearchResultEvent) {
$eventClass = MagazineArticleSearchResultEvent::class;
} elseif ($this->isWidget()) {
$eventClass = MagazineArticleSearchResultEvent::class;
} else {
$eventClass = MagazineArticleListingResultEvent::class;
}
$this->eventDispatcher->dispatch(
new $eventClass($this->request, $searchResult, $this->salesChannelContext)
);
}
public function listingRoute(Criteria $criteria, ?string $categoryId = null): ProductListingRouteResponse
{
if ($categoryId && !$criteria->hasState('swCategories')) {
$criteria->addFilter(new MultiFilter(
MultiFilter::CONNECTION_OR, [
new EqualsFilter('moorl_magazine_article.swCategories.id', null),
new EqualsFilter('moorl_magazine_article.swCategories.id', $categoryId)
]
));
}
return parent::listingRoute($criteria, $categoryId);
}
}