Skip to content

Commit

Permalink
MAGETWO-83399: Fix for remove 'product_list_toolbar' block from layou…
Browse files Browse the repository at this point in the history
…t in XML #9413 #11473
  • Loading branch information
ishakhsuvarov committed Nov 24, 2017
2 parents ad155f0 + 59d2086 commit 49dfa76
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 36 deletions.
140 changes: 104 additions & 36 deletions app/code/Magento/Catalog/Block/Product/ListProduct.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,20 @@
use Magento\Catalog\Api\CategoryRepositoryInterface;
use Magento\Catalog\Block\Product\ProductList\Toolbar;
use Magento\Catalog\Model\Category;
use Magento\Catalog\Model\Config;
use Magento\Catalog\Model\Layer;
use Magento\Catalog\Model\Layer\Resolver;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Catalog\Pricing\Price\FinalPrice;
use Magento\Eav\Model\Entity\Collection\AbstractCollection;
use Magento\Framework\App\ActionInterface;
use Magento\Framework\App\Config\Element;
use Magento\Framework\Data\Helper\PostHelper;
use Magento\Framework\DataObject\IdentityInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Pricing\Render;
use Magento\Framework\Url\Helper\Data;

/**
* Product list
Expand All @@ -40,17 +49,17 @@ class ListProduct extends AbstractProduct implements IdentityInterface
/**
* Catalog layer
*
* @var \Magento\Catalog\Model\Layer
* @var Layer
*/
protected $_catalogLayer;

/**
* @var \Magento\Framework\Data\Helper\PostHelper
* @var PostHelper
*/
protected $_postDataHelper;

/**
* @var \Magento\Framework\Url\Helper\Data
* @var Data
*/
protected $urlHelper;

Expand All @@ -61,18 +70,18 @@ class ListProduct extends AbstractProduct implements IdentityInterface

/**
* @param Context $context
* @param \Magento\Framework\Data\Helper\PostHelper $postDataHelper
* @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
* @param PostHelper $postDataHelper
* @param Resolver $layerResolver
* @param CategoryRepositoryInterface $categoryRepository
* @param \Magento\Framework\Url\Helper\Data $urlHelper
* @param Data $urlHelper
* @param array $data
*/
public function __construct(
\Magento\Catalog\Block\Product\Context $context,
\Magento\Framework\Data\Helper\PostHelper $postDataHelper,
\Magento\Catalog\Model\Layer\Resolver $layerResolver,
Context $context,
PostHelper $postDataHelper,
Resolver $layerResolver,
CategoryRepositoryInterface $categoryRepository,
\Magento\Framework\Url\Helper\Data $urlHelper,
Data $urlHelper,
array $data = []
) {
$this->_catalogLayer = $layerResolver->get();
Expand Down Expand Up @@ -113,7 +122,7 @@ protected function _getProductCollection()
/**
* Get catalog layer model
*
* @return \Magento\Catalog\Model\Layer
* @return Layer
*/
public function getLayer()
{
Expand All @@ -137,7 +146,35 @@ public function getLoadedProductCollection()
*/
public function getMode()
{
return $this->getChildBlock('toolbar')->getCurrentMode();
if ($this->getChildBlock('toolbar')) {
return $this->getChildBlock('toolbar')->getCurrentMode();
}

return $this->getDefaultListingMode();
}

/**
* Get listing mode for products if toolbar is removed from layout.
* Use the general configuration for product list mode from config path catalog/frontend/list_mode as default value
* or mode data from block declaration from layout.
*
* @return string
*/
private function getDefaultListingMode()
{
// default Toolbar when the toolbar layout is not used
$defaultToolbar = $this->getToolbarBlock();
$availableModes = $defaultToolbar->getModes();

// layout config mode
$mode = $this->getData('mode');

if (!$mode || !isset($availableModes[$mode])) {
// default config mode
$mode = $defaultToolbar->getCurrentMode();
}

return $mode;
}

/**
Expand All @@ -148,28 +185,60 @@ public function getMode()
protected function _beforeToHtml()
{
$collection = $this->_getProductCollection();
$this->configureToolbar($this->getToolbarBlock(), $collection);

$this->addToolbarBlock($collection);

$collection->load();

return parent::_beforeToHtml();
}

/**
* Retrieve Toolbar block
* Add toolbar block from product listing layout
*
* @param Collection $collection
*/
private function addToolbarBlock(Collection $collection)
{
$toolbarLayout = $this->getToolbarFromLayout();

if ($toolbarLayout) {
$this->configureToolbar($toolbarLayout, $collection);
}
}

/**
* Retrieve Toolbar block from layout or a default Toolbar
*
* @return Toolbar
*/
public function getToolbarBlock()
{
$block = $this->getToolbarFromLayout();

if (!$block) {
$block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
}

return $block;
}

/**
* Get toolbar block from layout
*
* @return bool|Toolbar
*/
private function getToolbarFromLayout()
{
$blockName = $this->getToolbarBlockName();

$toolbarLayout = false;

if ($blockName) {
$block = $this->getLayout()->getBlock($blockName);
if ($block) {
return $block;
}
$toolbarLayout = $this->getLayout()->getBlock($blockName);
}
$block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
return $block;

return $toolbarLayout;
}

/**
Expand Down Expand Up @@ -203,7 +272,7 @@ public function setCollection($collection)
}

/**
* @param array|string|integer|\Magento\Framework\App\Config\Element $code
* @param array|string|integer| Element $code
* @return $this
*/
public function addAttribute($code)
Expand All @@ -223,7 +292,7 @@ public function getPriceBlockTemplate()
/**
* Retrieve Catalog Config object
*
* @return \Magento\Catalog\Model\Config
* @return Config
*/
protected function _getConfig()
{
Expand All @@ -233,8 +302,8 @@ protected function _getConfig()
/**
* Prepare Sort By fields from Category Data
*
* @param \Magento\Catalog\Model\Category $category
* @return \Magento\Catalog\Block\Product\ListProduct
* @param Category $category
* @return $this
*/
public function prepareSortableFieldsByCategory($category)
{
Expand Down Expand Up @@ -278,38 +347,38 @@ public function getIdentities()
/**
* Get post parameters
*
* @param \Magento\Catalog\Model\Product $product
* @param Product $product
* @return string
*/
public function getAddToCartPostParams(\Magento\Catalog\Model\Product $product)
public function getAddToCartPostParams(Product $product)
{
$url = $this->getAddToCartUrl($product);
return [
'action' => $url,
'data' => [
'product' => $product->getEntityId(),
\Magento\Framework\App\ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
]
];
}

/**
* @param \Magento\Catalog\Model\Product $product
* @param Product $product
* @return string
*/
public function getProductPrice(\Magento\Catalog\Model\Product $product)
public function getProductPrice(Product $product)
{
$priceRender = $this->getPriceRender();

$price = '';
if ($priceRender) {
$price = $priceRender->render(
\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
FinalPrice::PRICE_CODE,
$product,
[
'include_container' => true,
'display_minimal_price' => true,
'zone' => \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
'zone' => Render::ZONE_ITEM_LIST,
'list_category_page' => true
]
);
Expand All @@ -322,7 +391,7 @@ public function getProductPrice(\Magento\Catalog\Model\Product $product)
* Specifies that price rendering should be done for the list of products
* i.e. rendering happens in the scope of product list, but not single product
*
* @return \Magento\Framework\Pricing\Render
* @return Render
*/
protected function getPriceRender()
{
Expand All @@ -348,7 +417,7 @@ protected function getPriceRender()
private function initializeProductCollection()
{
$layer = $this->getLayer();
/* @var $layer \Magento\Catalog\Model\Layer */
/* @var $layer Layer */
if ($this->getShowRootCategory()) {
$this->setCategoryId($this->_storeManager->getStore()->getRootCategoryId());
}
Expand Down Expand Up @@ -386,9 +455,8 @@ private function initializeProductCollection()
if ($origCategory) {
$layer->setCurrentCategory($origCategory);
}

$toolbar = $this->getToolbarBlock();
$this->configureToolbar($toolbar, $collection);

$this->addToolbarBlock($collection);

$this->_eventManager->dispatch(
'catalog_block_product_list_collection',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ public function testToolbarCoverage()
$parent = $this->_getLayout()->createBlock(\Magento\Catalog\Block\Product\ListProduct::class, 'parent');

/* Prepare toolbar block */
$this->_getLayout()
->createBlock(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, 'product_list_toolbar');
$parent->setToolbarBlockName('product_list_toolbar');

$toolbar = $parent->getToolbarBlock();
$this->assertInstanceOf(\Magento\Catalog\Block\Product\ProductList\Toolbar::class, $toolbar, 'Default Toolbar');

Expand Down

0 comments on commit 49dfa76

Please sign in to comment.