<?php declare(strict_types=1);
namespace H1web\Blog\Storefront\Page\Tag;
use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
class TagPageLoader
{
/**
* @var GenericPageLoaderinterface
*/
private $genericLoader;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var EntityRepository
*/
private $tagRepository;
/**
* @var EntityRepository
*/
private $blogRepository;
public function __construct(
GenericPageLoaderinterface $genericLoader,
EventDispatcherInterface $eventDispatcher,
EntityRepository $tagRepository,
EntityRepository $blogRepository
) {
$this->eventDispatcher = $eventDispatcher;
$this->genericLoader = $genericLoader;
$this->tagRepository = $tagRepository;
$this->blogRepository = $blogRepository;
}
/**
* @throws PageNotFoundException
*/
public function load(string $tagId, Request $request, SalesChannelContext $context): TagPage
{
try {
$page = $this->genericLoader->load($request, $context);
$page = TagPage::createFrom($page);
$criteria = new Criteria();
$criteria->addAssociation('visibilities');
$criteria->addFilter(new ContainsFilter('tagIds', $tagId));
$criteria->addFilter(new MultiFilter(
MultiFilter::CONNECTION_AND, [
new EqualsFilter('visibilities.salesChannelId', $context->getSalesChannelId())
]
));
$this->eventDispatcher->dispatch(new TagPageCriteriaEvent($criteria, $context, $request));
/* @var EntityCollection $blogs */
$blogs = $this->blogRepository->search(
$criteria,
$context->getContext()
);
$page->setBlogs($blogs);
/* @var EntityCollection $entities */
$entities = $this->tagRepository->search(
new Criteria([$tagId]),
$context->getContext()
);
$page->setTag($entities->first());
$page->getMetaInformation()->setMetaTitle($entities->first()->getName());
$this->eventDispatcher->dispatch(new TagPageLoadedEvent($page, $context, $request));
return $page;
} catch (\Exception $e) {
throw new PageNotFoundException($tagId);
}
}
}