<?php declare(strict_types=1);
namespace Dvdw\Events\Content\DvdwEvent\Cms;
use Dvdw\Events\Content\DvdwEvent\SalesChannel\AbstractDvdwEventRoute;
use Dvdw\Events\Content\DvdwEvent\Struct\DvdwEventContextExtension;
use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
class CountdownEventCmsElementResolver extends AbstractCmsElementResolver
{
private AbstractDvdwEventRoute $listingRoute;
public function __construct(
AbstractDvdwEventRoute $listingRoute
)
{
$this->listingRoute = $listingRoute;
}
public function getType(): string
{
return 'countdown-event';
}
public function collect(CmsSlotEntity $slot, ResolverContext $resolverContext): ?CriteriaCollection
{
return null;
}
public function enrich(CmsSlotEntity $slot, ResolverContext $resolverContext, ElementDataCollection $result): void
{
$config = $slot->getConfig();
$context = $resolverContext->getSalesChannelContext();
$request = $resolverContext->getRequest();
if (isset($config['eventId'])) {
$criteria = new Criteria([$config['eventId']['value']]);
$criteria->setTitle('cms::event-moments-listing');
$event = $this->listingRoute->load($request, $criteria, $context)->getDvdwEvents()->first();
if ($event !== null) {
$slot->setData($event);
return;
}
}
/** @var DvdwEventContextExtension|null $extension */
$extension = $context->getExtension(DvdwEventContextExtension::KEY);
if ($extension !== null) {
$slot->setData($extension->getEvent());
return;
}
$criteria = new Criteria();
$criteria->setTitle('cms::event-moments-listing');
$criteria->addFilter(
new RangeFilter(
'endDate',
[RangeFilter::GTE => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT)]
)
);
$criteria->addFilter(new EqualsAnyFilter('salesChannelIds', [$context->getSalesChannelId()]));
$criteria->addSorting(new FieldSorting('endDate', FieldSorting::ASCENDING));
$event = $this->listingRoute
->load($request, $criteria, $resolverContext->getSalesChannelContext())
->getDvdwEvents()->first();
if ($event !== null) {
$slot->setData($event);
}
}
}