custom/plugins/ChespackTheme/src/DataResolver/CategoryListingDataResolver.php line 44

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace ChespackTheme\DataResolver;
  3. use ChespackTheme\Struct\CategoryListingStruct;
  4. use Shopware\Core\Content\Category\CategoryCollection;
  5. use Shopware\Core\Content\Category\CategoryDefinition;
  6. use Shopware\Core\Content\Category\CategoryEntity;
  7. use Shopware\Core\Content\Category\Service\NavigationLoader;
  8. use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
  9. use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
  10. use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
  11. use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
  12. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
  13. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. class CategoryListingDataResolver extends AbstractCmsElementResolver
  16. {
  17.     private $navigationLoader;
  18.     public function __construct(NavigationLoader $navigationLoader)
  19.     {
  20.         $this->navigationLoader $navigationLoader;
  21.     }
  22.     public function getType(): string
  23.     {
  24.         return 'category-listing';
  25.     }
  26.     public function collect(CmsSlotEntity $slotResolverContext $resolverContext): ?CriteriaCollection
  27.     {
  28.         $config $slot->getFieldConfig();
  29.         $categoriesConfig $config->get('categories');
  30.         if (!$categoriesConfig || $categoriesConfig->isStatic()) {
  31.             return null;
  32.         }
  33.         $categoryIds $categoriesConfig->getValue();
  34.         $criteria = new Criteria($categoryIds);
  35.         $criteria->addAssociation('media');
  36.         $criteriaCollection = new CriteriaCollection();
  37.         $criteriaCollection->add('categories_' $slot->getUniqueIdentifier(), CategoryDefinition::class, $criteria);
  38.         return $criteriaCollection;
  39.     }
  40.     public function enrich(CmsSlotEntity $slotResolverContext $resolverContextElementDataCollection $result): void
  41.     {
  42.         $categoryListing = new CategoryListingStruct();
  43.         $slot->setData($categoryListing);
  44.         $config $slot->getFieldConfig();
  45.         $categories $config->get('categories');
  46.         if ($categories->isMapped()) {
  47.             $categoryCollection = new CategoryCollection();
  48.             $categoryListing->setCategories($categoryCollection);;
  49.             if(empty($config->get('categories')->getValue())) {
  50.                 $this->addChildCategories($resolverContext$categoryCollection);
  51.             } else {
  52.                 foreach ($categories->getValue() as $categoryId) {
  53.                     $this->addCategory($slot$categoryCollection$result$categoryId);
  54.                 }
  55.             }
  56.         }
  57.         if($rowClass $config->get('rowElementClassName')) {
  58.             $categoryListing->setRowElementClassName($rowClass->getValue());
  59.         }
  60.         if($colClass $config->get('colElementClassName')) {
  61.             $categoryListing->setColElementClassName($colClass->getValue());
  62.         }
  63.         if($headingPosition $config->get('headingPosition')) {
  64.             $categoryListing->setHeadingPosition($headingPosition->getValue());
  65.         }
  66.     }
  67.     private function addCategory(CmsSlotEntity $slotCategoryCollection $categoryCollectionElementDataCollection $resultstring $configId): void
  68.     {
  69.         $searchResult $result->get('categories_' $slot->getUniqueIdentifier());
  70.         if (!$searchResult) {
  71.             return;
  72.         }
  73.         $category $searchResult->get($configId);
  74.         if ($category instanceof CategoryEntity) {
  75.             $categoryCollection->add($category);
  76.         }
  77.     }
  78.     private function addChildCategories(ResolverContext $resolverContextCategoryCollection $categoryCollection): void
  79.     {
  80.         if($resolverContext instanceof EntityResolverContext) {
  81.             $category $resolverContext->getEntity();
  82.             if($category instanceof CategoryEntity) {
  83.                 $tree $this->navigationLoader->load($category->getId(), $resolverContext->getSalesChannelContext(), $category->getId(), 1);
  84.                 foreach($tree->getTree() as $child) {
  85.                     $categoryCollection->add($child->getCategory());
  86.                 }
  87.             }
  88.         }
  89.     }
  90. }