vendor/shopware/core/Content/Category/SalesChannel/CategoryRoute.php line 87

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Content\Category\SalesChannel;
  3. use OpenApi\Annotations as OA;
  4. use Shopware\Core\Content\Category\CategoryDefinition;
  5. use Shopware\Core\Content\Category\CategoryEntity;
  6. use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
  7. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
  8. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  9. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  12. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  13. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  14. use Shopware\Core\Framework\Routing\Annotation\Since;
  15. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. /**
  20.  * @RouteScope(scopes={"store-api"})
  21.  */
  22. class CategoryRoute extends AbstractCategoryRoute
  23. {
  24.     public const HOME 'home';
  25.     /**
  26.      * @var SalesChannelRepositoryInterface
  27.      */
  28.     private $categoryRepository;
  29.     /**
  30.      * @var SalesChannelCmsPageLoaderInterface
  31.      */
  32.     private $cmsPageLoader;
  33.     /**
  34.      * @var CategoryDefinition
  35.      */
  36.     private $definition;
  37.     public function __construct(
  38.         SalesChannelRepositoryInterface $categoryRepository,
  39.         SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  40.         CategoryDefinition $definition
  41.     ) {
  42.         $this->categoryRepository $categoryRepository;
  43.         $this->cmsPageLoader $cmsPageLoader;
  44.         $this->definition $definition;
  45.     }
  46.     public function getDecorated(): AbstractCategoryRoute
  47.     {
  48.         throw new DecorationPatternException(self::class);
  49.     }
  50.     /**
  51.      * @Since("6.2.0.0")
  52.      * @OA\Post(
  53.      *      path="/category/{categoryId}",
  54.      *      summary="Loads a category with the resolved cms page",
  55.      *      operationId="readCategory",
  56.      *      tags={"Store API", "Content"},
  57.      *      @OA\RequestBody(
  58.      *          required=true,
  59.      *          @OA\JsonContent(
  60.      *              @OA\Property(property="categoryId", description="Id of the category", type="string", format="uuid")
  61.      *          )
  62.      *      ),
  63.      *      @OA\Parameter(name="Api-Basic-Parameters"),
  64.      *      @OA\Parameter(name="categoryId", description="Category ID", @OA\Schema(type="string"), in="path", required=true),
  65.      *      @OA\Response(
  66.      *          response="200",
  67.      *          description="The loaded category with cms page",
  68.      *          @OA\JsonContent(ref="#/components/schemas/category_flat")
  69.      *     ),
  70.      *     @OA\Response(
  71.      *          response="404",
  72.      *          ref="#/components/responses/404"
  73.      *     ),
  74.      * )
  75.      *
  76.      * @Route("/store-api/v{version}/category/{navigationId}", name="store-api.category.detail", methods={"GET","POST"})
  77.      */
  78.     public function load(string $navigationIdRequest $requestSalesChannelContext $context): CategoryRouteResponse
  79.     {
  80.         if ($navigationId === self::HOME) {
  81.             $navigationId $context->getSalesChannel()->getNavigationCategoryId();
  82.             $request->attributes->set('navigationId'$navigationId);
  83.             $routeParams $request->attributes->get('_route_params', []);
  84.             $routeParams['navigationId'] = $navigationId;
  85.             $request->attributes->set('_route_params'$routeParams);
  86.         }
  87.         $category $this->loadCategory($navigationId$context);
  88.         $pageId $category->getCmsPageId();
  89.         if (!$pageId) {
  90.             return new CategoryRouteResponse($category);
  91.         }
  92.         $resolverContext = new EntityResolverContext($context$request$this->definition$category);
  93.         $pages $this->cmsPageLoader->load(
  94.             $request,
  95.             $this->createCriteria($pageId$request),
  96.             $context,
  97.             $category->getTranslation('slotConfig'),
  98.             $resolverContext
  99.         );
  100.         if (!$pages->has($pageId)) {
  101.             throw new PageNotFoundException($pageId);
  102.         }
  103.         $category->setCmsPage($pages->get($pageId));
  104.         return new CategoryRouteResponse($category);
  105.     }
  106.     private function loadCategory(string $categoryIdSalesChannelContext $context): CategoryEntity
  107.     {
  108.         $criteria = new Criteria([$categoryId]);
  109.         $criteria->setTitle('category::data');
  110.         $criteria->addAssociation('media');
  111.         $category $this->categoryRepository
  112.             ->search($criteria$context)
  113.             ->get($categoryId);
  114.         if (!$category) {
  115.             throw new CategoryNotFoundException($categoryId);
  116.         }
  117.         return $category;
  118.     }
  119.     private function createCriteria(string $pageIdRequest $request): Criteria
  120.     {
  121.         $criteria = new Criteria([$pageId]);
  122.         $criteria->setTitle('category::cms-page');
  123.         $slots $request->get('slots');
  124.         if (\is_string($slots)) {
  125.             $slots explode('|'$slots);
  126.         }
  127.         if (!empty($slots) && \is_array($slots)) {
  128.             $criteria
  129.                 ->getAssociation('sections.blocks')
  130.                 ->addFilter(new EqualsAnyFilter('slots.id'$slots));
  131.         }
  132.         return $criteria;
  133.     }
  134. }