custom/plugins/NetzpBlog6/src/Resolver/BlogElementResolver.php line 176

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