<?php declare(strict_types=1);
namespace DvdwDirectory\Content\Category\SalesChannel;
use Shopware\Core\Content\Category\SalesChannel\AbstractCategoryRoute;
use Shopware\Core\Content\Category\SalesChannel\CategoryRouteResponse;
use Shopware\Core\Content\Cms\Aggregate\CmsBlock\CmsBlockEntity;
use Shopware\Core\Content\Cms\CmsPageEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
use Shopware\Core\Framework\Routing\Annotation\Since;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route(defaults={"_routeScope"={"store-api"}})
*/
class RandomSortCategoryListingRoute extends AbstractCategoryRoute
{
private AbstractCategoryRoute $decorated;
public function __construct(
AbstractCategoryRoute $decorated
)
{
$this->decorated = $decorated;
}
public function getDecorated(): AbstractCategoryRoute
{
return $this->decorated;
}
/**
* @Since("6.2.0.0")
* @Route("/store-api/category/{navigationId}", name="store-api.category.detail", methods={"GET","POST"})
*/
public function load(string $navigationId, Request $request, SalesChannelContext $context): CategoryRouteResponse
{
$response = $this->getDecorated()->load($navigationId, $request, $context);
$page = $response->getCategory()->getCmsPage();
if (($result = $this->getResult($page)) === null) {
return $response;
}
$result->sort(
static function () {
return rand(0, 1) === 0 ? -1 : 1;
}
);
return $response;
}
private function getResult(?CmsPageEntity $page): ?EntitySearchResult
{
if ($page === null) {
return null;
}
if (($sections = $page->getSections()) === null) {
return null;
}
if (($blocks = $sections->getBlocks()) === null) {
return null;
}
/** @var CmsBlockEntity|null $listingBlock */
if (($listingBlock = $blocks->filter(function (CmsBlockEntity $block) {
return $block->getType() === 'shop-directory-list';
})->first()) === null) {
return null;
}
if (($slots = $listingBlock->getSlots()) === null) {
return null;
}
if (($slot = $slots->getSlot('content')) === null) {
return null;
}
if (($data = $slot->getData()) === null) {
return null;
}
$data = $data->getVars();
if (!isset($data['listing'])) {
return null;
}
return $data['listing'];
}
}