vendor/store.shopware.com/netzpblog6/src/Resolver/BlogElementResolver.php line 184

Open in your IDE?
  1. <?php
  2. namespace NetzpBlog6\Resolver;
  3. use NetzpBlog6\Controller\StoreApi\BlogListing\AbstractBlogListingRoute;
  4. use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
  5. use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
  6. use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
  7. use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
  8. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Aggregation\Metric\EntityAggregation;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  14. use Shopware\Core\Framework\Struct\ArrayEntity;
  15. use Shopware\Core\Framework\Uuid\Uuid;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Shopware\Core\System\SystemConfig\SystemConfigService;
  18. use Symfony\Component\HttpFoundation\Request;
  19. class BlogElementResolver extends AbstractCmsElementResolver
  20. {
  21.     private $systemConfig;
  22.     private $blogListingRoute;
  23.     public function getType(): string
  24.     {
  25.         return 'netzp-blog6';
  26.     }
  27.     public function __construct(
  28.         SystemConfigService $systemConfig,
  29.         AbstractBlogListingRoute $blogListingRoute)
  30.     {
  31.         $this->systemConfig $systemConfig;
  32.         $this->blogListingRoute $blogListingRoute;
  33.     }
  34.     public function collect(CmsSlotEntity $slotResolverContext $resolverContext): ?CriteriaCollection
  35.     {
  36.         return null;
  37.     }
  38.     private function getPageNumber(Request $request): int
  39.     {
  40.         $pageNumber $request->query->getInt('p'1);
  41.         if ($request->isMethod(Request::METHOD_POST)) {
  42.             $pageNumber $request->query->getInt('p'$pageNumber);
  43.         }
  44.         return $pageNumber <= $pageNumber;
  45.     }
  46.     private function setPagination(Criteria $criteria$page$maxNumberOfPosts)
  47.     {
  48.         $criteria->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_EXACT);
  49.         $criteria->setOffset(($page 1) * $maxNumberOfPosts);
  50.         $criteria->setLimit($maxNumberOfPosts);
  51.     }
  52.     private function setCategoryFilter(Criteria $criteriaRequest $request)
  53.     {
  54.         $criteria->addAggregation(
  55.             new EntityAggregation('categories''category.id''s_plugin_netzp_blog_category')
  56.         );
  57.         $ids $this->getCategoryIds($request);
  58.         if (empty($ids)) {
  59.             return;
  60.         }
  61.         $criteria->addPostFilter(
  62.             new MultiFilter(MultiFilter::CONNECTION_OR, [
  63.                 new EqualsAnyFilter('category.id'$ids),
  64.                 new EqualsAnyFilter('categories.id'$ids)
  65.             ])
  66.         );
  67.     }
  68.     private function setAuthorFilter(Criteria $criteriaRequest $request)
  69.     {
  70.         $criteria->addAggregation(
  71.             new EntityAggregation('authors''author.id''s_plugin_netzp_blog_author')
  72.         );
  73.         $ids $this->getAuthorIds($request);
  74.         if (empty($ids)) {
  75.             return;
  76.         }
  77.         $criteria->addPostFilter(
  78.             new MultiFilter(MultiFilter::CONNECTION_OR, [
  79.                 new EqualsAnyFilter('author.id'$ids)
  80.             ])
  81.         );
  82.     }
  83.     private function setTagsFilter(Criteria $criteriaRequest $request)
  84.     {
  85.         $criteria->addAggregation(
  86.             new EntityAggregation('tags''tags.id''tag')
  87.         );
  88.         $ids $this->getTagIds($request);
  89.         if (empty($ids)) {
  90.             return;
  91.         }
  92.         $criteria->addPostFilter(
  93.             new MultiFilter(MultiFilter::CONNECTION_OR, [
  94.                 new EqualsAnyFilter('tags.id'$ids)
  95.             ])
  96.         );
  97.     }
  98.     private function getCategoryIds(Request $request)
  99.     {
  100.         $ids $request->query->get('categories''');
  101.         if ($request->isMethod(Request::METHOD_POST)) {
  102.             $ids $request->query->get('categories''');
  103.         }
  104.         $ids explode('|'$ids);
  105.         return array_filter($ids);
  106.     }
  107.     private function getAuthorIds(Request $request)
  108.     {
  109.         $ids $request->query->get('authors''');
  110.         if ($request->isMethod(Request::METHOD_POST)) {
  111.             $ids $request->query->get('authors''');
  112.         }
  113.         $ids explode('|'$ids);
  114.         return array_filter($ids);
  115.     }
  116.     private function getTagIds(Request $request)
  117.     {
  118.         $ids $request->query->get('tags''');
  119.         if ($request->isMethod(Request::METHOD_POST)) {
  120.             $ids $request->query->get('tags''');
  121.         }
  122.         $ids explode('|'$ids);
  123.         return array_filter($ids);
  124.     }
  125.     public function enrich(CmsSlotEntity $slotResolverContext $resolverContextElementDataCollection $result): void
  126.     {
  127.         $salesChannelId $resolverContext->getSalesChannelContext()->getSalesChannel()->getId();
  128.         $config $slot->getFieldConfig();
  129.         $pluginConfig $this->systemConfig->get('NetzpBlog6.config'$salesChannelId);
  130.         $criteria = new Criteria();
  131.         $criteria->setTitle('cms::netzp-blog-listing');
  132.         $categoryId $config->has('category') ? $config->get('category')->getValue() : '00000000000000000000000000000000';
  133.         $categoryId $categoryId != null $categoryId '00000000000000000000000000000000';
  134.         $categoryId $resolverContext->getRequest()->query->get('c'$categoryId);
  135.         $authorId $config->has('author') ? $config->get('author')->getValue() : '00000000000000000000000000000000';
  136.         $authorId $authorId != null $authorId '00000000000000000000000000000000';
  137.         $authorId $resolverContext->getRequest()->query->get('a'$authorId);
  138.         $tags $config->has('tags') && $config->get('tags')->getValue() !== null $config->get('tags')->getValue() : [];
  139.         $sortOrder $config->get('sortOrder')->getValue();
  140.         $maxNumberOfPosts = (int)$config->get('numberOfPosts')->getValue();
  141.         $page $this->getPageNumber($resolverContext->getRequest());
  142.         if($maxNumberOfPosts 1$maxNumberOfPosts 99999// show "all"
  143.         $this->setPagination($criteria$page$maxNumberOfPosts);
  144.         $this->setCategoryFilter($criteria$resolverContext->getRequest());
  145.         $this->setAuthorFilter($criteria$resolverContext->getRequest());
  146.         $this->setTagsFilter($criteria$resolverContext->getRequest());
  147.         $request $resolverContext->getRequest();
  148.         $context $resolverContext->getSalesChannelContext();
  149.         $navigationId $this->getNavigationId($request$context);
  150.         $this->setCriteria($criteria$categoryId$authorId$tags); // set criteria early so that criteriaHash in cached route is set
  151.         $blogListingResponse $this->blogListingRoute->load(
  152.             $navigationId,
  153.             $criteria$resolverContext->getSalesChannelContext(),
  154.             $categoryId$authorId$tags$sortOrder);
  155.         $searchResult $blogListingResponse->getPosts();
  156.         $data = new ArrayEntity();
  157.         $data->setUniqueIdentifier(Uuid::randomHex()); // prevent "Notice: Undefined index: id" when HTTP Cache is enabled ;-(
  158.         $slot->setData($data);
  159.         $data->set('result'$searchResult);
  160.         $data->set('pluginConfig'$pluginConfig);
  161.     }
  162.     private function setCriteria(Criteria $criteria, ?string $categoryId, ?string $authorId, array $tags)
  163.     {
  164.         if($categoryId && $categoryId != '00000000000000000000000000000000') {
  165.             $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  166.                 new EqualsFilter('categoryid'$categoryId),
  167.                 new EqualsAnyFilter('categories.id', [$categoryId]),
  168.             ]));
  169.         }
  170.         if($authorId && $authorId != '00000000000000000000000000000000') {
  171.             $criteria->addFilter(
  172.                 new EqualsFilter('authorid'$authorId)
  173.             );
  174.         }
  175.         if($tags != null && is_array($tags) && count($tags) > 0) {
  176.             $criteria->addFilter(new EqualsAnyFilter('tags.id'$tags));
  177.         }
  178.     }
  179.     private function getNavigationId(Request $requestSalesChannelContext $salesChannelContext): string
  180.     {
  181.         if ($navigationId $request->attributes->get('navigationId')) {
  182.             return $navigationId;
  183.         }
  184.         $params $request->attributes->get('_route_params');
  185.         if ($params && isset($params['navigationId'])) {
  186.             return $params['navigationId'];
  187.         }
  188.         return $salesChannelContext->getSalesChannel()->getNavigationCategoryId();
  189.     }
  190. }