custom/plugins/NetzpBlog6/src/Helper/BlogHelper.php line 118

  1. <?php
  2. namespace NetzpBlog6\Helper;
  3. use NetzpBlog6\Core\Content\Blog\BlogEntity;
  4. use Shopware\Core\Content\ProductStream\Service\ProductStreamBuilderInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Grouping\FieldGrouping;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\Framework\Context;
  16. use Shopware\Core\Framework\Uuid\Uuid;
  17. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  18. use Symfony\Component\DependencyInjection\ContainerInterface;
  19. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  20. class BlogHelper
  21. {
  22.     public function __construct(private readonly ContainerInterface $container,
  23.                                 private readonly ProductStreamBuilderInterface $productStreamBuilder,
  24.                                 private readonly EntityRepository $productRepository)
  25.     {
  26.     }
  27.     public function getPublicBlogPosts(SalesChannelContext $salesChannelContextContext $context$limit null$offset null,
  28.                                        $rssCategoryOnly false)
  29.     {
  30.         $repo $this->container->get('s_plugin_netzp_blog.repository');
  31.         $criteria = new Criteria();
  32.         $this->addBlogDateFilterAndSorting($criteriatrue);
  33.         $criteria->addAssociation('category');
  34.         $criteria->addAssociation('tags');
  35.         $criteria->addAssociation('items');
  36.         $criteria->addAssociation('blogmedia');
  37.         $criteria->addFilter(new EqualsFilter('noindex'false));
  38.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  39.             new EqualsFilter('categoryid''00000000000000000000000000000000'),
  40.             new EqualsFilter('category.onlyloggedin'false),
  41.         ]));
  42.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  43.             new EqualsFilter('category.saleschannelid'null),
  44.             new EqualsFilter('category.saleschannelid''00000000000000000000000000000000'),
  45.             new EqualsFilter('category.saleschannelid'$salesChannelContext->getSalesChannel()->getId()),
  46.         ]));
  47.         if($rssCategoryOnly) {
  48.             $criteria->addFilter(new EqualsFilter('category.includeinrss'true));
  49.         }
  50.         $criteria->addSorting(new FieldSorting('items.number'FieldSorting::ASCENDING));
  51.         $criteria->addSorting(new FieldSorting('blogmedia.number'FieldSorting::ASCENDING));
  52.         if($limit) {
  53.             $criteria->setLimit($limit);
  54.         }
  55.         if($offset) {
  56.             $criteria->setOffset($offset);
  57.         }
  58.         $posts $repo->search($criteria$context)->getEntities();
  59.         return $posts;
  60.     }
  61.     public function isPluginActive($pluginNameContext $context)
  62.     {
  63.         $pluginRepo $this->container->get('plugin.repository');
  64.         $pluginCriteria = new Criteria();
  65.         $pluginCriteria->addFilter(new EqualsFilter('name'$pluginName));
  66.         $plugin $pluginRepo->search($pluginCriteria$context)->getEntities()->first();
  67.         return $plugin && $plugin->getActive();
  68.     }
  69.     public function getBlogPosts(Criteria $criteriaSalesChannelContext $salesChannelContext,
  70.                                  ?string $categoryId, ?string $authorId, ?array $tags, ?string $sortOrder)
  71.     {
  72.         $repo $this->container->get('s_plugin_netzp_blog.repository');
  73.         $criteria->addAssociation('netzp_blog.translations');
  74.         $criteria->addAssociation('category');
  75.         $criteria->addAssociation('categories');
  76.         $criteria->addAssociation('tags');
  77.         $this->addBlogDateFilterAndSorting($criteriafalse); // without sorting
  78.         $this->addRestrictionsFilter($criteria$salesChannelContext);
  79.         if($categoryId && $categoryId != '00000000000000000000000000000000') {
  80.             $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  81.                 new EqualsFilter('categoryid'$categoryId),
  82.                 new EqualsAnyFilter('categories.id', [$categoryId]),
  83.             ]));
  84.         }
  85.         if($authorId && $authorId != '00000000000000000000000000000000') {
  86.             $criteria->addFilter(
  87.                 new EqualsFilter('authorid'$authorId)
  88.             );
  89.         }
  90.         if($tags != null && is_array($tags) && count($tags) > 0) {
  91.             $criteria->addFilter(new EqualsAnyFilter('tags.id'$tags));
  92.         }
  93.         $criteria->addSorting(new FieldSorting('sticky'FieldSorting::DESCENDING));
  94.         $criteria->addSorting(new FieldSorting(
  95.                 'postdate'$sortOrder == 'asc' FieldSorting::ASCENDING FieldSorting::DESCENDING)
  96.         );
  97.         $criteria->addSorting(new FieldSorting('title'FieldSorting::ASCENDING));
  98.         $results $repo->search($criteria$salesChannelContext->getContext());
  99.         return $results;
  100.     }
  101.     public function getBlogPost($postIdSalesChannelContext $salesChannelContextContext $context)
  102.     {
  103.         if( ! Uuid::isValid($postId)) {
  104.             throw new NotFoundHttpException('No valid UUID');
  105.         }
  106.         $repo $this->container->get('s_plugin_netzp_blog.repository');
  107.         $criteria = new Criteria();
  108.         $criteria->addAssociation('products.event');
  109.         $criteria->addAssociation('category');
  110.         $criteria->addAssociation('categories');
  111.         $criteria->addAssociation('tags');
  112.         $criteria->addAssociation('items');
  113.         $criteria->getAssociation('items')->addSorting(new FieldSorting('number'FieldSorting::ASCENDING));
  114.         $criteria->addAssociation('blogmedia');
  115.         $criteria->getAssociation('blogmedia')->addSorting(new FieldSorting('number'FieldSorting::ASCENDING));
  116.         $criteria->addAssociation('blogmedia.media');
  117.         $criteria->addFilter(new EqualsFilter('id'$postId));
  118.         $this->addRestrictionsFilter($criteria$salesChannelContext);
  119.         $this->addBlogDateFilterAndSorting($criteria);
  120.         $post $repo->search($criteria$context)->getEntities()->first();
  121.         if( ! $post) {
  122.             throw new NotFoundHttpException('Blog post not found');
  123.         }
  124.         $assignedProducts = [];
  125.         $tmpProducts = [];
  126.         if($post->getIsProductStream() && $post->getProductStreamId() != null) {
  127.             try {
  128.                 $tmpProducts $this->collectByProductStream($context$post);
  129.             }
  130.             catch(\Exception) {
  131.                 //
  132.             }
  133.         }
  134.         else {
  135.             $tmpProducts $post->getProducts();
  136.         }
  137.         foreach ($tmpProducts as $product) {
  138.             array_push($assignedProducts$product->getId());
  139.         }
  140.         if(count($assignedProducts) > 0) {
  141.             $productRepository $this->container->get('sales_channel.product.repository');
  142.             $criteria2 = new Criteria($assignedProducts);
  143.             $criteria2->addAssociation('cover');
  144.             $criteria2->addAssociation('event');
  145.             $products $productRepository->search($criteria2$salesChannelContext)->getEntities();
  146.             $post->setProducts($products);
  147.         }
  148.         return $post;
  149.     }
  150.     public function addRestrictionsFilter(Criteria $criteriaSalesChannelContext $salesChannelContext)
  151.     {
  152.         $userLoggedIn $salesChannelContext->getCustomer() != null;
  153.         $userCustomerGroupId $salesChannelContext->getCurrentCustomerGroup()->getId();
  154.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  155.             new EqualsFilter('category.saleschannelid'null),
  156.             new EqualsFilter('category.saleschannelid''00000000000000000000000000000000'),
  157.             new EqualsFilter('category.saleschannelid'$salesChannelContext->getSalesChannel()->getId()),
  158.         ]));
  159.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  160.             new EqualsFilter('categoryid''00000000000000000000000000000000'),
  161.             new EqualsFilter('category.onlyloggedin'false),
  162.             new MultiFilter(MultiFilter::CONNECTION_AND, [
  163.                 new EqualsFilter('category.onlyloggedin'true),
  164.                 new EqualsFilter('category.onlyloggedin'$userLoggedIn)
  165.             ])
  166.         ]));
  167.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  168.             new EqualsFilter('category.customergroupid'null),
  169.             new EqualsFilter('category.customergroupid''00000000000000000000000000000000'),
  170.             new MultiFilter(MultiFilter::CONNECTION_AND, [
  171.                 new NotFilter(NotFilter::CONNECTION_AND, [
  172.                     new EqualsFilter('category.customergroupid''00000000000000000000000000000000')
  173.                 ]),
  174.                 new EqualsFilter('category.customergroupid'$userCustomerGroupId),
  175.             ])
  176.         ]));
  177.     }
  178.     public function addBlogDateFilterAndSorting(Criteria $criteriabool $addSorting false)
  179.     {
  180.         $now = (new \DateTime())->format('Y-m-d');
  181.         $criteria->addFilter(
  182.             new MultiFilter(
  183.                 MultiFilter::CONNECTION_OR, [
  184.                     new RangeFilter('showfrom', ['lte' => $now]),
  185.                     new EqualsFilter('showfrom'null)
  186.                 ]
  187.             )
  188.         );
  189.         $criteria->addFilter(
  190.             new MultiFilter(
  191.                 MultiFilter::CONNECTION_OR, [
  192.                     new RangeFilter('showuntil', ['gte' => $now]),
  193.                     new EqualsFilter('showuntil'null)
  194.                 ]
  195.             )
  196.         );
  197.         if($addSorting) {
  198.             $criteria->addSorting(new FieldSorting('sticky'FieldSorting::DESCENDING));
  199.             $criteria->addSorting(new FieldSorting('postdate''desc'));
  200.             $criteria->addSorting(new FieldSorting('title'FieldSorting::ASCENDING));
  201.         }
  202.     }
  203.     private function collectByProductStream(Context $contextBlogEntity $blogPost): EntityCollection
  204.     {
  205.         if (!$blogPost->getIsProductStream() || $blogPost->getProductStreamId() == null) {
  206.             return new EntityCollection();
  207.         }
  208.         $filters $this->productStreamBuilder->buildFilters($blogPost->getProductStreamId(), $context);
  209.         $criteria = new Criteria();
  210.         $criteria->addAssociation('options.group');
  211.         $criteria->addFilter(...$filters);
  212.         // Ensure storefront presentation settings of product variants, see ProductSliderCmsElementResolver
  213.         $criteria->addGroupField(new FieldGrouping('displayGroup'));
  214.         $criteria->addFilter(
  215.             new NotFilter(
  216.                 NotFilter::CONNECTION_AND,
  217.                 [new EqualsFilter('displayGroup'null)]
  218.             )
  219.         );
  220.         $criteria->addSorting(new FieldSorting('name'FieldSorting::ASCENDING));
  221.         return $this->productRepository->search($criteria$context)->getEntities();
  222.     }
  223. }