<?php declare(strict_types=1);
namespace MoorlMagazine\Core\Content\MagazineArticle\Cms;
use MoorlFoundation\Core\Content\Cms\FoundationListingCmsElementResolver;
use MoorlMagazine\Core\Content\MagazineArticle\MagazineArticleEntity;
use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
class MagazineArticleListingCmsElementResolver extends FoundationListingCmsElementResolver
{
public function getType(): string
{
return 'magazine-article-listing';
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$data = new MagazineArticleListingStruct();
$slot->setData($data);
$request = $resolverContext->getRequest();
$salesChannelContext = $resolverContext->getSalesChannelContext();
$navigationId = $this->getNavigationId($resolverContext);
$criteria = new Criteria();
$criteria->addAssociation('media');
$criteria->addAssociation('creator.avatar');
$this->enrichCmsElementResolverCriteriaV2($slot, $criteria, $resolverContext);
/* Enrich additional filters */
$config = $slot->getFieldConfig();
$listingSourceConfig = $config->get('listingSource');
if ($listingSourceConfig && $listingSourceConfig->getValue() === 'static') {
$magazineCategoryIdConfig = $config->get('magazineCategoryId');
if ($magazineCategoryIdConfig && $magazineCategoryIdConfig->getValue()) {
$criteria->addFilter(new EqualsFilter(
'moorl_magazine_article.categories.id',
$magazineCategoryIdConfig->getValue()
));
}
}
/* If slider on article detail page, hide articles from other sw categories */
if ($resolverContext instanceof EntityResolverContext && $resolverContext->getEntity() instanceof MagazineArticleEntity) {
/** @var MagazineArticleEntity $magazineArticle */
$magazineArticle = $resolverContext->getEntity();
if ($magazineArticle->getSwCategories()->count()) {
$ids = array_values($magazineArticle->getSwCategories()->getIds());
$criteria->addFilter(new EqualsAnyFilter('moorl_magazine_article.swCategories.id', $ids));
$criteria->addState('swCategories');
}
}
$listing = $this->listingRoute
->load($navigationId, $request, $salesChannelContext, $criteria)
->getResult();
$data->setListing($listing);
}
}