vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/FilterService/FilterService.php line 78

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\EcommerceFrameworkBundle\FilterService;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\Exception\FilterTypeNotFoundException;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\FilterType\AbstractFilterType;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
  18. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractFilterDefinition;
  19. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\AbstractFilterDefinitionType;
  20. class FilterService
  21. {
  22.     /**
  23.      * @var FilterGroupHelper
  24.      */
  25.     protected $filterGroupHelper;
  26.     /**
  27.      * @var AbstractFilterType[]
  28.      */
  29.     protected $filterTypes = [];
  30.     /**
  31.      * @param FilterGroupHelper $filterGroupHelper
  32.      * @param AbstractFilterType[] $filterTypes
  33.      */
  34.     public function __construct(FilterGroupHelper $filterGroupHelper, array $filterTypes)
  35.     {
  36.         $this->filterGroupHelper $filterGroupHelper;
  37.         foreach ($filterTypes as $name => $filterType) {
  38.             $this->registerFilterType($name$filterType);
  39.         }
  40.     }
  41.     protected function registerFilterType(string $nameAbstractFilterType $filterType)
  42.     {
  43.         $this->filterTypes[$name] = $filterType;
  44.     }
  45.     public function getFilterType(string $name): AbstractFilterType
  46.     {
  47.         if (!isset($this->filterTypes[$name])) {
  48.             throw new FilterTypeNotFoundException(sprintf('Filter type "%s" is not registered'$name));
  49.         }
  50.         return $this->filterTypes[$name];
  51.     }
  52.     public function getFilterGroupHelper(): FilterGroupHelper
  53.     {
  54.         return $this->filterGroupHelper;
  55.     }
  56.     /**
  57.      * Initializes the FilterService, adds all conditions to the ProductList and returns an array of the currently set
  58.      * filters
  59.      *
  60.      * @param AbstractFilterDefinition $filterObject filter definition object to use
  61.      * @param ProductListInterface $productList              product list to use and add conditions to
  62.      * @param array $params                          request params with eventually set filter conditions
  63.      *
  64.      * @return array returns set filters
  65.      */
  66.     public function initFilterService(AbstractFilterDefinition $filterObjectProductListInterface $productList$params = [])
  67.     {
  68.         $currentFilter = [];
  69.         if ($filterObject->getFilters()) {
  70.             foreach ($filterObject->getFilters() as $filter) {
  71.                 $currentFilter $this->addCondition($filter$productList$currentFilter$params);
  72.             }
  73.             //do this in a separate loop in order to make sure that all filters are set when group by values are prepared
  74.             foreach ($filterObject->getFilters() as $filter) {
  75.                 //prepare group by filters
  76.                 $this->getFilterType($filter->getType())->prepareGroupByValues($filter$productList);
  77.             }
  78.         }
  79.         if ($filterObject->getConditions()) {
  80.             foreach ($filterObject->getConditions() as $condition) {
  81.                 $this->addCondition($condition$productList$currentFilter, [], true);
  82.             }
  83.         }
  84.         return $currentFilter;
  85.     }
  86.     /**
  87.      * Returns filter frontend script for given filter type (delegates)
  88.      *
  89.      * @param AbstractFilterDefinitionType $filterDefinition filter definition to get frontend script for
  90.      * @param ProductListInterface $productList current product list (with all set filters) to get available options and counts
  91.      * @param array $currentFilter current filter for this filter definition
  92.      *
  93.      * @return string view snippet
  94.      */
  95.     public function getFilterFrontend(AbstractFilterDefinitionType $filterDefinitionProductListInterface $productList$currentFilter)
  96.     {
  97.         return $this
  98.             ->getFilterType($filterDefinition->getType())
  99.             ->getFilterFrontend($filterDefinition$productList$currentFilter);
  100.     }
  101.     /**
  102.      * Returns filter data for given filter type (delegates)
  103.      *
  104.      * @param AbstractFilterDefinitionType $filterDefinition filter definition to get frontend script for
  105.      * @param ProductListInterface $productList current product list (with all set filters) to get available options and counts
  106.      * @param array $currentFilter current filter for this filter definition
  107.      *
  108.      * @return array
  109.      */
  110.     public function getFilterValues(AbstractFilterDefinitionType $filterDefinitionProductListInterface $productList, array $currentFilter): array
  111.     {
  112.         return $this
  113.             ->getFilterType($filterDefinition->getType())
  114.             ->getFilterValues($filterDefinition$productList$currentFilter);
  115.     }
  116.     /**
  117.      * Adds condition - delegates it to the AbstractFilterType instance
  118.      *
  119.      * @param AbstractFilterDefinitionType $filterDefinition
  120.      * @param ProductListInterface $productList
  121.      * @param array $currentFilter
  122.      * @param array $params
  123.      * @param bool $isPrecondition
  124.      *
  125.      * @return array updated currentFilter array
  126.      */
  127.     public function addCondition(AbstractFilterDefinitionType $filterDefinitionProductListInterface $productList$currentFilter$params$isPrecondition false)
  128.     {
  129.         return $this
  130.             ->getFilterType($filterDefinition->getType())
  131.             ->addCondition($filterDefinition$productList$currentFilter$params$isPrecondition);
  132.     }
  133. }