Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ProductsList.php
Go to the documentation of this file.
1 <?php
8 
14 
21 {
26 
32  const PAGE_VAR_NAME = 'np';
33 
38 
42  const DEFAULT_SHOW_PAGER = false;
43 
49  protected $pager;
50 
54  protected $httpContext;
55 
62 
69 
73  protected $sqlBuilder;
74 
78  protected $rule;
79 
83  protected $conditionsHelper;
84 
88  private $priceCurrency;
89 
95  private $json;
96 
108  public function __construct(
109  \Magento\Catalog\Block\Product\Context $context,
110  \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
111  \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
112  \Magento\Framework\App\Http\Context $httpContext,
113  \Magento\Rule\Model\Condition\Sql\Builder $sqlBuilder,
114  \Magento\CatalogWidget\Model\Rule $rule,
115  \Magento\Widget\Helper\Conditions $conditionsHelper,
116  array $data = [],
117  Json $json = null
118  ) {
119  $this->productCollectionFactory = $productCollectionFactory;
120  $this->catalogProductVisibility = $catalogProductVisibility;
121  $this->httpContext = $httpContext;
122  $this->sqlBuilder = $sqlBuilder;
123  $this->rule = $rule;
124  $this->conditionsHelper = $conditionsHelper;
125  $this->json = $json ?: ObjectManager::getInstance()->get(Json::class);
126  parent::__construct(
127  $context,
128  $data
129  );
130  }
131 
137  protected function _construct()
138  {
139  parent::_construct();
140  $this->addColumnCountLayoutDepend('empty', 6)
141  ->addColumnCountLayoutDepend('1column', 5)
142  ->addColumnCountLayoutDepend('2columns-left', 4)
143  ->addColumnCountLayoutDepend('2columns-right', 4)
144  ->addColumnCountLayoutDepend('3columns', 3);
145 
146  $this->addData([
147  'cache_lifetime' => 86400,
148  'cache_tags' => [\Magento\Catalog\Model\Product::CACHE_TAG,
149  ], ]);
150  }
151 
157  public function getCacheKeyInfo()
158  {
159  $conditions = $this->getData('conditions')
160  ? $this->getData('conditions')
161  : $this->getData('conditions_encoded');
162 
163  return [
164  'CATALOG_PRODUCTS_LIST_WIDGET',
165  $this->getPriceCurrency()->getCurrency()->getCode(),
166  $this->_storeManager->getStore()->getId(),
167  $this->_design->getDesignTheme()->getId(),
168  $this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_GROUP),
169  intval($this->getRequest()->getParam($this->getData('page_var_name'), 1)),
170  $this->getProductsPerPage(),
171  $conditions,
172  $this->json->serialize($this->getRequest()->getParams()),
173  $this->getTemplate(),
174  $this->getTitle()
175  ];
176  }
177 
189  public function getProductPriceHtml(
190  \Magento\Catalog\Model\Product $product,
191  $priceType = null,
192  $renderZone = \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
193  array $arguments = []
194  ) {
195  if (!isset($arguments['zone'])) {
196  $arguments['zone'] = $renderZone;
197  }
198  $arguments['price_id'] = isset($arguments['price_id'])
199  ? $arguments['price_id']
200  : 'old-price-' . $product->getId() . '-' . $priceType;
201  $arguments['include_container'] = isset($arguments['include_container'])
202  ? $arguments['include_container']
203  : true;
204  $arguments['display_minimal_price'] = isset($arguments['display_minimal_price'])
205  ? $arguments['display_minimal_price']
206  : true;
207 
209  $priceRender = $this->getLayout()->getBlock('product.price.render.default');
210  if (!$priceRender) {
211  $priceRender = $this->getLayout()->createBlock(
212  \Magento\Framework\Pricing\Render::class,
213  'product.price.render.default',
214  ['data' => ['price_render_handle' => 'catalog_product_prices']]
215  );
216  }
217 
218  $price = $priceRender->render(
219  \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
220  $product,
221  $arguments
222  );
223 
224  return $price;
225  }
226 
232  protected function _beforeToHtml()
233  {
234  $this->setProductCollection($this->createCollection());
235  return parent::_beforeToHtml();
236  }
237 
243  public function createCollection()
244  {
246  $collection = $this->productCollectionFactory->create();
247  $collection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());
248 
250  ->addStoreFilter()
251  ->setPageSize($this->getPageSize())
252  ->setCurPage($this->getRequest()->getParam($this->getData('page_var_name'), 1));
253 
254  $conditions = $this->getConditions();
255  $conditions->collectValidatedAttributes($collection);
256  $this->sqlBuilder->attachConditionToCollection($collection, $conditions);
257 
262  $collection->distinct(true);
263 
264  return $collection;
265  }
266 
272  protected function getConditions()
273  {
274  $conditions = $this->getData('conditions_encoded')
275  ? $this->getData('conditions_encoded')
276  : $this->getData('conditions');
277 
278  if ($conditions) {
279  $conditions = $this->conditionsHelper->decode($conditions);
280  }
281 
282  foreach ($conditions as $key => $condition) {
283  if (!empty($condition['attribute'])
284  && in_array($condition['attribute'], ['special_from_date', 'special_to_date'])
285  ) {
286  $conditions[$key]['value'] = date('Y-m-d H:i:s', strtotime($condition['value']));
287  }
288  }
289 
290  $this->rule->loadPost(['conditions' => $conditions]);
291  return $this->rule->getConditions();
292  }
293 
299  public function getProductsCount()
300  {
301  if ($this->hasData('products_count')) {
302  return $this->getData('products_count');
303  }
304 
305  if (null === $this->getData('products_count')) {
306  $this->setData('products_count', self::DEFAULT_PRODUCTS_COUNT);
307  }
308 
309  return $this->getData('products_count');
310  }
311 
317  public function getProductsPerPage()
318  {
319  if (!$this->hasData('products_per_page')) {
320  $this->setData('products_per_page', self::DEFAULT_PRODUCTS_PER_PAGE);
321  }
322  return $this->getData('products_per_page');
323  }
324 
330  public function showPager()
331  {
332  if (!$this->hasData('show_pager')) {
333  $this->setData('show_pager', self::DEFAULT_SHOW_PAGER);
334  }
335  return (bool)$this->getData('show_pager');
336  }
337 
343  protected function getPageSize()
344  {
345  return $this->showPager() ? $this->getProductsPerPage() : $this->getProductsCount();
346  }
347 
353  public function getPagerHtml()
354  {
355  if ($this->showPager() && $this->getProductCollection()->getSize() > $this->getProductsPerPage()) {
356  if (!$this->pager) {
357  $this->pager = $this->getLayout()->createBlock(
358  \Magento\Catalog\Block\Product\Widget\Html\Pager::class,
359  'widget.products.list.pager'
360  );
361 
362  $this->pager->setUseContainer(true)
363  ->setShowAmounts(true)
364  ->setShowPerPage(false)
365  ->setPageVarName($this->getData('page_var_name'))
366  ->setLimit($this->getProductsPerPage())
367  ->setTotalLimit($this->getProductsCount())
368  ->setCollection($this->getProductCollection());
369  }
370  if ($this->pager instanceof \Magento\Framework\View\Element\AbstractBlock) {
371  return $this->pager->toHtml();
372  }
373  }
374  return '';
375  }
376 
382  public function getIdentities()
383  {
384  $identities = [];
385  if ($this->getProductCollection()) {
386  foreach ($this->getProductCollection() as $product) {
387  if ($product instanceof IdentityInterface) {
388  $identities = array_merge($identities, $product->getIdentities());
389  }
390  }
391  }
392 
393  return $identities ?: [\Magento\Catalog\Model\Product::CACHE_TAG];
394  }
395 
401  public function getTitle()
402  {
403  return $this->getData('title');
404  }
405 
412  private function getPriceCurrency()
413  {
414  if ($this->priceCurrency === null) {
416  ->get(PriceCurrencyInterface::class);
417  }
418  return $this->priceCurrency;
419  }
420 }
getData($key='', $index=null)
Definition: DataObject.php:119
$price
__construct(\Magento\Catalog\Block\Product\Context $context, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility, \Magento\Framework\App\Http\Context $httpContext, \Magento\Rule\Model\Condition\Sql\Builder $sqlBuilder, \Magento\CatalogWidget\Model\Rule $rule, \Magento\Widget\Helper\Conditions $conditionsHelper, array $data=[], Json $json=null)
$priceType
Definition: msrp.phtml:18
$arguments
_addProductAttributesAndPrices(\Magento\Catalog\Model\ResourceModel\Product\Collection $collection)
addColumnCountLayoutDepend($pageLayout, $columnCount)