<?php declare(strict_types=1);
namespace NetzpBlog6\Storefront\Page;
use NetzpBlog6\Controller\StoreApi\BlogPost\AbstractBlogPostRoute;
use NetzpBlog6\Core\Content\Blog\BlogEntity;
use Psr\EventDispatcher\EventDispatcherInterface;
use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Shopware\Storefront\Page\MetaInformation;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class BlogPageLoader
{
private $genericPageLoader;
private $cmsPageLoader;
private $eventDispatcher;
private $blogRoute;
private $config;
public function __construct(
GenericPageLoaderInterface $genericPageLoader,
SalesChannelCmsPageLoaderInterface $cmsPageLoader,
EventDispatcherInterface $eventDispatcher,
AbstractBlogPostRoute $blogRoute,
SystemConfigService $config
)
{
$this->genericPageLoader = $genericPageLoader;
$this->cmsPageLoader = $cmsPageLoader;
$this->eventDispatcher = $eventDispatcher;
$this->blogRoute = $blogRoute;
$this->config = $config;
}
public function load(Request $request, SalesChannelContext $context, string $postId): BlogPage
{
$criteria = new Criteria([$postId]);
$post = $this->blogRoute->load($postId, $criteria, $context)->getBlogPost();
if(! $post) {
throw new NotFoundHttpException('Blog post not found');
}
$config = $this->config->get('NetzpBlog6.config', $context->getSalesChannelId());
$category = $post->getCategory();
if($category && $category->getCmspageid()) {
$cmsPageId = $category->getCmspageid();
}
else {
$cmsPageId = array_key_exists('cmspage', $config) && $config['cmspage'] !== '' ? $config['cmspage'] : null;
}
if($cmsPageId !== null || $cmsPageId != '') {
$page = $this->loadCmsPage($request, $context, $cmsPageId, $post);
}
else {
$page = $this->loadNormalPage($request, $context, $post);
}
$page->setPost($post);
$this->eventDispatcher->dispatch(
new BlogPageLoadedEvent($page, $context, $request)
);
return $page;
}
private function loadCmsPage(Request $request,
SalesChannelContext $salesChannelContext,
$cmsPageId,
BlogEntity $post)
{
$cmsPage = $this->cmsPageLoader->load($request, new Criteria([$cmsPageId]), $salesChannelContext)->first();
$page = BlogPage::createFrom($this->genericPageLoader->load($request, $salesChannelContext));
$page->setCmsPage($cmsPage);
$page->setMetaInformation($this->getMetaInformation($post));
return $page;
}
private function loadNormalPage(Request $request,
SalesChannelContext $salesChannelContext,
BlogEntity $post)
{
$page = $this->genericPageLoader->load($request, $salesChannelContext);
$page = BlogPage::createFrom($page);
$page->setMetaInformation($this->getMetaInformation($post));
return $page;
}
private function getMetaInformation(BlogEntity $post)
{
$meta = new MetaInformation();
$meta->setMetaTitle($post->getTranslation('metatitle') ?? $post->getTranslation('title'));
$meta->setMetaDescription($post->getTranslation('metadescription') ?? '');
if ($post->getAuthor()) {
$meta->setAuthor($post->getAuthor()->getTranslation('name') ?? '');
}
if ($post->getNoindex()) {
$meta->setRobots('noindex, nofollow');
}
else {
$meta->setRobots('all');
}
return $meta;
}
}