123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Checkout\Block\Cart;
- /**
- * Block on checkout/cart/index page to display a pager on the cart items grid
- * The pager will be displayed if items quantity in the shopping cart > than number from
- * Store->Configuration->Sales->Checkout->Shopping Cart->Number of items to display pager and
- * custom_items weren't set to cart block
- *
- * @api
- * @since 100.1.7
- */
- class Grid extends \Magento\Checkout\Block\Cart
- {
- /**
- * Config settings path to determine when pager on checkout/cart/index will be visible
- */
- const XPATH_CONFIG_NUMBER_ITEMS_TO_DISPLAY_PAGER = 'checkout/cart/number_items_to_display_pager';
- /**
- * @var \Magento\Quote\Model\ResourceModel\Quote\Item\Collection
- */
- private $itemsCollection;
- /**
- * @var \Magento\Quote\Model\ResourceModel\Quote\Item\CollectionFactory
- *
- */
- private $itemCollectionFactory;
- /**
- * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface
- */
- private $joinAttributeProcessor;
- /**
- * Is display pager on shopping cart page
- *
- * @var bool
- */
- private $isPagerDisplayed;
- /**
- * Grid constructor.
- * @param \Magento\Framework\View\Element\Template\Context $context
- * @param \Magento\Customer\Model\Session $customerSession
- * @param \Magento\Checkout\Model\Session $checkoutSession
- * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrlBuilder
- * @param \Magento\Checkout\Helper\Cart $cartHelper
- * @param \Magento\Framework\App\Http\Context $httpContext
- * @param \Magento\Quote\Model\ResourceModel\Quote\Item\CollectionFactory $itemCollectionFactory
- * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor
- * @param array $data
- */
- public function __construct(
- \Magento\Framework\View\Element\Template\Context $context,
- \Magento\Customer\Model\Session $customerSession,
- \Magento\Checkout\Model\Session $checkoutSession,
- \Magento\Catalog\Model\ResourceModel\Url $catalogUrlBuilder,
- \Magento\Checkout\Helper\Cart $cartHelper,
- \Magento\Framework\App\Http\Context $httpContext,
- \Magento\Quote\Model\ResourceModel\Quote\Item\CollectionFactory $itemCollectionFactory,
- \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $joinProcessor,
- array $data = []
- ) {
- $this->itemCollectionFactory = $itemCollectionFactory;
- $this->joinAttributeProcessor = $joinProcessor;
- parent::__construct(
- $context,
- $customerSession,
- $checkoutSession,
- $catalogUrlBuilder,
- $cartHelper,
- $httpContext,
- $data
- );
- }
- /**
- * Prepare Quote Item Product URLs
- * When we don't have custom_items, items URLs will be collected for Collection limited by pager
- * Pager limit on checkout/cart/index is determined by configuration
- * Configuration path is Store->Configuration->Sales->Checkout->Shopping Cart->Number of items to display pager
- *
- * @return void
- * @since 100.1.7
- */
- protected function _construct()
- {
- if (!$this->isPagerDisplayedOnPage()) {
- parent::_construct();
- }
- if ($this->hasData('template')) {
- $this->setTemplate($this->getData('template'));
- }
- }
- /**
- * {@inheritdoc}
- * @since 100.1.7
- */
- protected function _prepareLayout()
- {
- parent::_prepareLayout();
- if ($this->isPagerDisplayedOnPage()) {
- $availableLimit = (int)$this->_scopeConfig->getValue(
- self::XPATH_CONFIG_NUMBER_ITEMS_TO_DISPLAY_PAGER,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- );
- $itemsCollection = $this->getItemsForGrid();
- /** @var \Magento\Theme\Block\Html\Pager $pager */
- $pager = $this->getLayout()->createBlock(\Magento\Theme\Block\Html\Pager::class);
- $pager->setAvailableLimit([$availableLimit => $availableLimit])->setCollection($itemsCollection);
- $this->setChild('pager', $pager);
- $itemsCollection->load();
- $this->prepareItemUrls();
- }
- return $this;
- }
- /**
- * Prepare quote items collection for pager
- *
- * @return \Magento\Quote\Model\ResourceModel\Quote\Item\Collection
- * @since 100.1.7
- */
- public function getItemsForGrid()
- {
- if (!$this->itemsCollection) {
- /** @var \Magento\Quote\Model\ResourceModel\Quote\Item\Collection $itemCollection */
- $itemCollection = $this->itemCollectionFactory->create();
- $itemCollection->setQuote($this->getQuote());
- $itemCollection->addFieldToFilter('parent_item_id', ['null' => true]);
- $this->joinAttributeProcessor->process($itemCollection);
- $this->itemsCollection = $itemCollection;
- }
- return $this->itemsCollection;
- }
- /**
- * {@inheritdoc}
- * @since 100.1.7
- */
- public function getItems()
- {
- if (!$this->isPagerDisplayedOnPage()) {
- return parent::getItems();
- }
- return $this->getItemsForGrid()->getItems();
- }
- /**
- * Verify if display pager on shopping cart
- * If cart block has custom_items and items qty in the shopping cart<limit from stores configuration
- *
- * @return bool
- */
- private function isPagerDisplayedOnPage()
- {
- if (!$this->isPagerDisplayed) {
- $availableLimit = (int)$this->_scopeConfig->getValue(
- self::XPATH_CONFIG_NUMBER_ITEMS_TO_DISPLAY_PAGER,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE
- );
- $this->isPagerDisplayed = !$this->getCustomItems() && $availableLimit < $this->getItemsCount();
- }
- return $this->isPagerDisplayed;
- }
- }
|