<?php declare(strict_types=1);
namespace MoorlMagazine\Storefront\Page\MagazineArticle;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Detail\AbstractMagazineArticleDetailRoute;
use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Detail\MagazineArticleDetailRoute;
use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\HttpFoundation\Request;
class MagazineArticlePageLoader
{
private GenericPageLoaderInterface $genericLoader;
private MagazineArticleDetailRoute $magazineArticleDetailRoute;
public function __construct(
GenericPageLoaderInterface $genericLoader,
AbstractMagazineArticleDetailRoute $magazineArticleDetailRoute
) {
$this->genericLoader = $genericLoader;
$this->magazineArticleDetailRoute = $magazineArticleDetailRoute;
}
/**
* @throws MissingRequestParameterException
* @throws PageNotFoundException
*/
public function load(Request $request, SalesChannelContext $context): MagazineArticlePage
{
$magazineArticleId = $request->attributes->get('magazineArticleId');
if (!$magazineArticleId) {
throw new MissingRequestParameterException('magazineArticleId', '/magazineArticleId');
}
$criteria = new Criteria();
$criteria->addAssociation('creator.avatar');
$result = $this->magazineArticleDetailRoute->load($magazineArticleId, $request, $context, $criteria);
$magazineArticle = $result->getMagazineArticle();
$page = $this->genericLoader->load($request, $context);
/** @var MagazineArticlePage $page */
$page = MagazineArticlePage::createFrom($page);
$page->setMagazineArticle($magazineArticle);
$page->setCreator($magazineArticle->getCreator());
$page->setCmsPage($magazineArticle->getCmsPage());
$this->loadMetaData($page);
return $page;
}
public function reload(Request $request, MagazineArticlePage $page, SalesChannelContext $context): MagazineArticlePage
{
$result = $this->magazineArticleDetailRoute->reload($request, $context, $page->getMagazineArticle());
$magazineArticle = $result->getMagazineArticle();
$page->setCmsPage($magazineArticle->getCmsPage());
return $page;
}
private function loadMetaData(MagazineArticlePage $page): void
{
$metaInformation = $page->getMetaInformation();
if (!$metaInformation) {
return;
}
$metaDescription = $page->getMagazineArticle()->getTranslation('metaDescription')
?? $page->getMagazineArticle()->getTranslation('description');
$metaInformation->setMetaDescription((string) $metaDescription);
$metaInformation->setMetaKeywords((string) $page->getMagazineArticle()->getTranslation('keywords'));
if ((string) $page->getMagazineArticle()->getTranslation('metaTitle') !== '') {
$metaInformation->setMetaTitle((string) $page->getMagazineArticle()->getTranslation('metaTitle'));
return;
}
$metaTitleParts = [$page->getMagazineArticle()->getTranslation('name')];
$metaInformation->setMetaTitle(implode(' | ', $metaTitleParts));
}
}