vendor/store.shopware.com/netzpblog6/src/Helper/BlogHelper.php line 130

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