Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ExclusionStrategy.php
Go to the documentation of this file.
1 <?php
8 
17 use Magento\Customer\Model\Context as CustomerContext;
20 
30 {
34  private $resourceConnection;
35 
39  private $aliasResolver;
40 
44  private $storeManager;
45 
50  private $validFields = ['price', 'category_ids'];
51 
55  private $tableResolver;
56 
60  private $priceTableResolver;
61 
65  private $dimensionFactory;
66 
70  private $httpContext;
71 
81  public function __construct(
82  \Magento\Framework\App\ResourceConnection $resourceConnection,
83  \Magento\Store\Model\StoreManagerInterface $storeManager,
84  AliasResolver $aliasResolver,
85  TableResolver $tableResolver = null,
86  DimensionFactory $dimensionFactory = null,
87  IndexScopeResolverInterface $priceTableResolver = null,
88  Context $httpContext = null
89  ) {
90  $this->resourceConnection = $resourceConnection;
91  $this->storeManager = $storeManager;
92  $this->aliasResolver = $aliasResolver;
93  $this->tableResolver = $tableResolver ?: ObjectManager::getInstance()->get(TableResolver::class);
94  $this->dimensionFactory = $dimensionFactory ?: ObjectManager::getInstance()->get(DimensionFactory::class);
95  $this->priceTableResolver = $priceTableResolver ?: ObjectManager::getInstance()->get(
96  IndexScopeResolverInterface::class
97  );
98  $this->httpContext = $httpContext ?: ObjectManager::getInstance()->get(Context::class);
99  }
100 
104  public function apply(
105  \Magento\Framework\Search\Request\FilterInterface $filter,
106  \Magento\Framework\DB\Select $select
107  ) {
108  if (!in_array($filter->getField(), $this->validFields, true)) {
109  return false;
110  }
111 
112  if ($filter->getField() === 'price') {
113  return $this->applyPriceFilter($filter, $select);
114  } elseif ($filter->getField() === 'category_ids') {
115  return $this->applyCategoryFilter($filter, $select);
116  }
117  }
118 
128  private function applyPriceFilter(
129  \Magento\Framework\Search\Request\FilterInterface $filter,
130  \Magento\Framework\DB\Select $select
131  ) {
132  $alias = $this->aliasResolver->getAlias($filter);
133  $websiteId = $this->storeManager->getWebsite()->getId();
134  $tableName = $this->priceTableResolver->resolve(
135  'catalog_product_index_price',
136  [
137  $this->dimensionFactory->create(WebsiteDimensionProvider::DIMENSION_NAME, (string)$websiteId),
138  $this->dimensionFactory->create(
140  (string)$this->httpContext->getValue(CustomerContext::CONTEXT_GROUP)
141  )
142  ]
143  );
144  $mainTableAlias = $this->extractTableAliasFromSelect($select);
145 
146  $select->joinInner(
147  [
148  $alias => $tableName
149  ],
150  $this->resourceConnection->getConnection()->quoteInto(
151  sprintf('%s.entity_id = price_index.entity_id AND price_index.website_id = ?', $mainTableAlias),
152  $websiteId
153  ),
154  []
155  );
156 
157  return true;
158  }
159 
169  private function applyCategoryFilter(
170  \Magento\Framework\Search\Request\FilterInterface $filter,
171  \Magento\Framework\DB\Select $select
172  ) {
173  $alias = $this->aliasResolver->getAlias($filter);
174 
175  $catalogCategoryProductDimension = new Dimension(
176  \Magento\Store\Model\Store::ENTITY,
177  $this->storeManager->getStore()->getId()
178  );
179 
180  $tableName = $this->tableResolver->resolve(
182  [
183  $catalogCategoryProductDimension
184  ]
185  );
186  $mainTableAlias = $this->extractTableAliasFromSelect($select);
187 
188  $select->joinInner(
189  [
190  $alias => $tableName
191  ],
192  $this->resourceConnection->getConnection()->quoteInto(
193  sprintf(
194  '%s.entity_id = category_ids_index.product_id AND category_ids_index.store_id = ?',
195  $mainTableAlias
196  ),
197  $this->storeManager->getStore()->getId()
198  ),
199  []
200  );
201 
202  return true;
203  }
204 
211  private function extractTableAliasFromSelect(\Magento\Framework\DB\Select $select)
212  {
213  $fromArr = array_filter(
214  $select->getPart(\Magento\Framework\DB\Select::FROM),
215  function ($fromPart) {
216  return $fromPart['joinType'] === \Magento\Framework\DB\Select::FROM;
217  }
218  );
219 
220  return $fromArr ? array_keys($fromArr)[0] : null;
221  }
222 }
__construct(\Magento\Framework\App\ResourceConnection $resourceConnection, \Magento\Store\Model\StoreManagerInterface $storeManager, AliasResolver $aliasResolver, TableResolver $tableResolver=null, DimensionFactory $dimensionFactory=null, IndexScopeResolverInterface $priceTableResolver=null, Context $httpContext=null)
$tableName
Definition: trigger.php:13
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$storeManager
const FROM
Definition: Select.php:49
apply(\Magento\Framework\Search\Request\FilterInterface $filter, \Magento\Framework\DB\Select $select)
if(!trim($html)) $alias
Definition: details.phtml:20