<?php declare(strict_types=1);
namespace MoorlCreator\Storefront\Page\Creator;
use MoorlCreator\Core\Content\Creator\SalesChannel\CreatorDetailRoute;
use MoorlCreator\MoorlCreator;
use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
use Shopware\Core\Content\Product\SalesChannel\Listing\AbstractProductListingRoute;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\GenericPageLoaderInterface;
use Symfony\Component\HttpFoundation\Request;
class CreatorPageLoader
{
private GenericPageLoaderInterface $genericLoader;
private CreatorDetailRoute $creatorDetailRoute;
private AbstractProductListingRoute $productListingRoute;
public function __construct(
GenericPageLoaderInterface $genericLoader,
CreatorDetailRoute $creatorDetailRoute,
AbstractProductListingRoute $productListingRoute
) {
$this->genericLoader = $genericLoader;
$this->creatorDetailRoute = $creatorDetailRoute;
$this->productListingRoute = $productListingRoute;
}
/**
* @throws MissingRequestParameterException
* @throws PageNotFoundException
*/
public function load(Request $request, SalesChannelContext $context): CreatorPage
{
$creatorId = $request->attributes->get('creatorId');
if (!$creatorId) {
throw new MissingRequestParameterException('creatorId', '/creatorId');
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('creators.id', $creatorId));
$result = $this->productListingRoute->load(MoorlCreator::NAME, $request, $context, $criteria);
$products = $result->getResult();
$criteria = new Criteria();
$result = $this->creatorDetailRoute->load($creatorId, $request, $context, $criteria);
$creator = $result->getCreator();
if (!$creator->getActive()) {
throw new PageNotFoundException($creator->getId());
}
$page = $this->genericLoader->load($request, $context);
/** @var CreatorPage $page */
$page = CreatorPage::createFrom($page);
$page->setProducts($products);
$page->setCreator($creator);
$page->setCmsPage($creator->getCmsPage());
$this->loadMetaData($page);
return $page;
}
private function loadMetaData(CreatorPage $page): void
{
$metaInformation = $page->getMetaInformation();
if (!$metaInformation) {
return;
}
$metaDescription = $page->getCreator()->getTranslation('teaser')
?? $page->getCreator()->getTranslation('teaser');
$metaInformation->setMetaDescription((string) $metaDescription);
if ((string) $page->getCreator()->getTranslation('name') !== '') {
$metaInformation->setMetaTitle((string) $page->getCreator()->getTranslation('name'));
return;
}
$metaTitleParts = [$page->getCreator()->getTranslation('name')];
$metaInformation->setMetaTitle(implode(' | ', $metaTitleParts));
}
}