custom/plugins/UandiEfbDownloadCenter/src/MediaListing/MediaListingElementResolver.php line 88

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Uandi\UandiEfbDownloadCenter\MediaListing;
  3. use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
  4. use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
  5. use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
  6. use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
  7. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  8. use Shopware\Core\Content\Media\Aggregate\MediaFolder\MediaFolderDefinition;
  9. use Shopware\Core\Content\Media\Aggregate\MediaFolder\MediaFolderEntity;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. use Shopware\Core\System\SystemConfig\SystemConfigService;
  17. use Symfony\Component\HttpFoundation\Request;
  18. class MediaListingElementResolver extends AbstractCmsElementResolver
  19. {
  20.     private const FOLDER_PERMISSIONS_CUSTOM_FIELD 'folderPermissions';
  21.     private const FOLDER_KEY_PRICE_LISTS 'priceLists';
  22.     private const FOLDER_KEY_E_CATALOGS 'eCatalogs';
  23.     private const FOLDER_ROOT_CONFIG_KEY_PRICE_LISTS 'UandiEfbDownloadCenter.config.rootFolderPriceLists';
  24.     private const FOLDER_ROOT_CONFIG_KEY_E_CATALOGS 'UandiEfbDownloadCenter.config.rootFolderECatalogs';
  25.     private MediaListingLoader $loader;
  26.     private EntityRepositoryInterface $mediaFolderRepository;
  27.     private SystemConfigService $systemConfigService;
  28.     public function __construct(
  29.         EntityRepositoryInterface $mediaFolderRepository,
  30.         MediaListingLoader $loader,
  31.         SystemConfigService $systemConfigService
  32.     ) {
  33.         $this->mediaFolderRepository $mediaFolderRepository;
  34.         $this->loader $loader;
  35.         $this->systemConfigService $systemConfigService;
  36.     }
  37.     public function getType(): string
  38.     {
  39.         return 'media-listing';
  40.     }
  41.     public function collect(CmsSlotEntity $slotResolverContext $resolverContext): ?CriteriaCollection
  42.     {
  43.         $config $slot->getFieldConfig();
  44.         if (false === $config->has('mediaFolder')) {
  45.             return null;
  46.         }
  47.         $criteria = new CriteriaCollection();
  48.         $criteria->add(
  49.             $slot->getUniqueIdentifier(),
  50.             MediaFolderDefinition::class,
  51.             new Criteria([$config->get('mediaFolder')->getStringValue()])
  52.         );
  53.         return $criteria;
  54.     }
  55.     public function enrich(CmsSlotEntity $slotResolverContext $resolverContextElementDataCollection $result): void
  56.     {
  57.         $context $resolverContext->getSalesChannelContext();
  58.         $request $resolverContext->getRequest();
  59.         $result $result->get($slot->getUniqueIdentifier());
  60.         if (null === $result) {
  61.             return;
  62.         }
  63.         $mediaFolder $this->resolveMediaFolder(
  64.             $result->first(),
  65.             $context
  66.         );
  67.         $criteria = new Criteria();
  68.         $criteria->setTitle('cms::media-listing');
  69.         $this->handleSorting($request$criteria);
  70.         $this->handlePagination($request$criteria$context);
  71.         $searchResult $this->loader->load($mediaFolder$criteria$context);
  72.         $searchResult->setSorting($request->get('order'));
  73.         $searchResult->addCurrentFilters('navigationId'$this->getNavigationId($request$context));
  74.         $slot->setData($searchResult);
  75.     }
  76.     private function resolveMediaFolder(
  77.         ?MediaFolderEntity $mediaFolder,
  78.         SalesChannelContext $context
  79.     ): array {
  80.         if (null === $mediaFolder) {
  81.             return [];
  82.         }
  83.         $path[] = $mediaFolder->getId();
  84.         if ($mediaFolder->getPath()) {
  85.             $path array_merge($patharray_filter(explode('|'$mediaFolder->getPath())));
  86.         }
  87.         if (in_array($this->systemConfigService->get(self::FOLDER_ROOT_CONFIG_KEY_E_CATALOGS), $path)) {
  88.             $folderKey self::FOLDER_KEY_E_CATALOGS;
  89.         } elseif (in_array($this->systemConfigService->get(self::FOLDER_ROOT_CONFIG_KEY_PRICE_LISTS), $path)) {
  90.             $folderKey self::FOLDER_KEY_PRICE_LISTS;
  91.         }
  92.         if (false === isset($folderKey)) {
  93.             return [$mediaFolder->getId()];
  94.         }
  95.         $customer $context->getCustomer();
  96.         if (null === $customer) {
  97.             return [];
  98.         }
  99.         try {
  100.             $permittedFolders $customer->getCustomFields()[self::FOLDER_PERMISSIONS_CUSTOM_FIELD][$folderKey];
  101.         } catch (\Throwable $e) {
  102.             unset($permittedFolders);
  103.         }
  104.         $permittedFolders[] = $customer->getCustomerNumber();
  105.         $parentCriteria = (new Criteria())
  106.             ->addFilter(new EqualsFilter('parentId'$mediaFolder->getId()))
  107.             ->addFilter(new EqualsAnyFilter('name'$permittedFolders));
  108.         return $this->mediaFolderRepository->searchIds($parentCriteria$context->getContext())->getIds();
  109.     }
  110.     private function handleSorting(Request $requestCriteria $criteria): void
  111.     {
  112.         list($field$order) = explode('-'$this->getOrder($request));
  113.         $order strtoupper($order) === FieldSorting::DESCENDING FieldSorting::DESCENDING FieldSorting::ASCENDING;
  114.         $criteria->addSorting(new FieldSorting($field$order));
  115.         if ('title' === $field) {
  116.             $criteria->addSorting(new FieldSorting('fileName'$order));
  117.         }
  118.     }
  119.     private function handlePagination(Request $requestCriteria $criteriaSalesChannelContext $context): void
  120.     {
  121.         $limit $this->getLimit($request$context);
  122.         $page $this->getPage($request);
  123.         $criteria->setOffset(($page 1) * $limit);
  124.         $criteria->setLimit($limit);
  125.         $criteria->setTotalCountMode(Criteria::TOTAL_COUNT_MODE_EXACT);
  126.     }
  127.     private function getOrder(Request $request): string
  128.     {
  129.         $order $request->query->get('order');
  130.         if ($request->isMethod(Request::METHOD_POST)) {
  131.             $order $request->request->get('order'$order);
  132.         }
  133.         return $order ?? 'uandiMediaExtension.priority-desc';
  134.     }
  135.     private function getLimit(Request $requestSalesChannelContext $context): int
  136.     {
  137.         $limit $request->query->getInt('limit');
  138.         if ($request->isMethod(Request::METHOD_POST)) {
  139.             $limit $request->request->getInt('limit'$limit);
  140.         }
  141.         $limit $limit $limit $this->systemConfigService->getInt('core.listing.productsPerPage'$context->getSalesChannel()->getId());
  142.         return $limit <= 24 $limit;
  143.     }
  144.     private function getPage(Request $request): int
  145.     {
  146.         $page $request->query->getInt('p'1);
  147.         if ($request->isMethod(Request::METHOD_POST)) {
  148.             $page $request->request->getInt('p'$page);
  149.         }
  150.         return $page <= $page;
  151.     }
  152.     private function getNavigationId(Request $requestSalesChannelContext $context): string
  153.     {
  154.         if ($navigationId $request->get('navigationId')) {
  155.             return $navigationId;
  156.         }
  157.         $params $request->attributes->get('_route_params');
  158.         if ($params && isset($params['navigationId'])) {
  159.             return $params['navigationId'];
  160.         }
  161.         return $context->getSalesChannel()->getNavigationCategoryId();
  162.     }
  163. }