Skip to content

Commit 42d512f

Browse files
committed
MAGETWO-83399: Fix for remove 'product_list_toolbar' block from layout in XML magento#9413 magento#11473
- Merge Pull Request magento#11473 from mariuscris/magento2:issue-9413 - Merged commits: 1. 42072dd 2. 9dbe444 3. 49fdfae 4. b6ed2d9 5. 9cd20c0 6. 2adefdf 7. cbda7b8 8. 992b3a1 9. 4e937a3 10. c303e4d 11. cd7dc56 12. 6162464
2 parents b05a957 + 6162464 commit 42d512f

File tree

26 files changed

+1245
-517
lines changed

26 files changed

+1245
-517
lines changed

app/code/Magento/Catalog/Block/Product/ListProduct.php

Lines changed: 104 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,20 @@
99
use Magento\Catalog\Api\CategoryRepositoryInterface;
1010
use Magento\Catalog\Block\Product\ProductList\Toolbar;
1111
use Magento\Catalog\Model\Category;
12+
use Magento\Catalog\Model\Config;
13+
use Magento\Catalog\Model\Layer;
14+
use Magento\Catalog\Model\Layer\Resolver;
1215
use Magento\Catalog\Model\Product;
1316
use Magento\Catalog\Model\ResourceModel\Product\Collection;
17+
use Magento\Catalog\Pricing\Price\FinalPrice;
1418
use Magento\Eav\Model\Entity\Collection\AbstractCollection;
19+
use Magento\Framework\App\ActionInterface;
20+
use Magento\Framework\App\Config\Element;
21+
use Magento\Framework\Data\Helper\PostHelper;
1522
use Magento\Framework\DataObject\IdentityInterface;
1623
use Magento\Framework\Exception\NoSuchEntityException;
24+
use Magento\Framework\Pricing\Render;
25+
use Magento\Framework\Url\Helper\Data;
1726

1827
/**
1928
* Product list
@@ -40,17 +49,17 @@ class ListProduct extends AbstractProduct implements IdentityInterface
4049
/**
4150
* Catalog layer
4251
*
43-
* @var \Magento\Catalog\Model\Layer
52+
* @var Layer
4453
*/
4554
protected $_catalogLayer;
4655

4756
/**
48-
* @var \Magento\Framework\Data\Helper\PostHelper
57+
* @var PostHelper
4958
*/
5059
protected $_postDataHelper;
5160

5261
/**
53-
* @var \Magento\Framework\Url\Helper\Data
62+
* @var Data
5463
*/
5564
protected $urlHelper;
5665

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

6271
/**
6372
* @param Context $context
64-
* @param \Magento\Framework\Data\Helper\PostHelper $postDataHelper
65-
* @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
73+
* @param PostHelper $postDataHelper
74+
* @param Resolver $layerResolver
6675
* @param CategoryRepositoryInterface $categoryRepository
67-
* @param \Magento\Framework\Url\Helper\Data $urlHelper
76+
* @param Data $urlHelper
6877
* @param array $data
6978
*/
7079
public function __construct(
71-
\Magento\Catalog\Block\Product\Context $context,
72-
\Magento\Framework\Data\Helper\PostHelper $postDataHelper,
73-
\Magento\Catalog\Model\Layer\Resolver $layerResolver,
80+
Context $context,
81+
PostHelper $postDataHelper,
82+
Resolver $layerResolver,
7483
CategoryRepositoryInterface $categoryRepository,
75-
\Magento\Framework\Url\Helper\Data $urlHelper,
84+
Data $urlHelper,
7685
array $data = []
7786
) {
7887
$this->_catalogLayer = $layerResolver->get();
@@ -113,7 +122,7 @@ protected function _getProductCollection()
113122
/**
114123
* Get catalog layer model
115124
*
116-
* @return \Magento\Catalog\Model\Layer
125+
* @return Layer
117126
*/
118127
public function getLayer()
119128
{
@@ -137,7 +146,35 @@ public function getLoadedProductCollection()
137146
*/
138147
public function getMode()
139148
{
140-
return $this->getChildBlock('toolbar')->getCurrentMode();
149+
if ($this->getChildBlock('toolbar')) {
150+
return $this->getChildBlock('toolbar')->getCurrentMode();
151+
}
152+
153+
return $this->getDefaultListingMode();
154+
}
155+
156+
/**
157+
* Get listing mode for products if toolbar is removed from layout.
158+
* Use the general configuration for product list mode from config path catalog/frontend/list_mode as default value
159+
* or mode data from block declaration from layout.
160+
*
161+
* @return string
162+
*/
163+
private function getDefaultListingMode()
164+
{
165+
// default Toolbar when the toolbar layout is not used
166+
$defaultToolbar = $this->getToolbarBlock();
167+
$availableModes = $defaultToolbar->getModes();
168+
169+
// layout config mode
170+
$mode = $this->getData('mode');
171+
172+
if (!$mode || !isset($availableModes[$mode])) {
173+
// default config mode
174+
$mode = $defaultToolbar->getCurrentMode();
175+
}
176+
177+
return $mode;
141178
}
142179

143180
/**
@@ -148,28 +185,60 @@ public function getMode()
148185
protected function _beforeToHtml()
149186
{
150187
$collection = $this->_getProductCollection();
151-
$this->configureToolbar($this->getToolbarBlock(), $collection);
188+
189+
$this->addToolbarBlock($collection);
190+
152191
$collection->load();
153192

154193
return parent::_beforeToHtml();
155194
}
156195

157196
/**
158-
* Retrieve Toolbar block
197+
* Add toolbar block from product listing layout
198+
*
199+
* @param Collection $collection
200+
*/
201+
private function addToolbarBlock(Collection $collection)
202+
{
203+
$toolbarLayout = $this->getToolbarFromLayout();
204+
205+
if ($toolbarLayout) {
206+
$this->configureToolbar($toolbarLayout, $collection);
207+
}
208+
}
209+
210+
/**
211+
* Retrieve Toolbar block from layout or a default Toolbar
159212
*
160213
* @return Toolbar
161214
*/
162215
public function getToolbarBlock()
216+
{
217+
$block = $this->getToolbarFromLayout();
218+
219+
if (!$block) {
220+
$block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
221+
}
222+
223+
return $block;
224+
}
225+
226+
/**
227+
* Get toolbar block from layout
228+
*
229+
* @return bool|Toolbar
230+
*/
231+
private function getToolbarFromLayout()
163232
{
164233
$blockName = $this->getToolbarBlockName();
234+
235+
$toolbarLayout = false;
236+
165237
if ($blockName) {
166-
$block = $this->getLayout()->getBlock($blockName);
167-
if ($block) {
168-
return $block;
169-
}
238+
$toolbarLayout = $this->getLayout()->getBlock($blockName);
170239
}
171-
$block = $this->getLayout()->createBlock($this->_defaultToolbarBlock, uniqid(microtime()));
172-
return $block;
240+
241+
return $toolbarLayout;
173242
}
174243

175244
/**
@@ -203,7 +272,7 @@ public function setCollection($collection)
203272
}
204273

205274
/**
206-
* @param array|string|integer|\Magento\Framework\App\Config\Element $code
275+
* @param array|string|integer| Element $code
207276
* @return $this
208277
*/
209278
public function addAttribute($code)
@@ -223,7 +292,7 @@ public function getPriceBlockTemplate()
223292
/**
224293
* Retrieve Catalog Config object
225294
*
226-
* @return \Magento\Catalog\Model\Config
295+
* @return Config
227296
*/
228297
protected function _getConfig()
229298
{
@@ -233,8 +302,8 @@ protected function _getConfig()
233302
/**
234303
* Prepare Sort By fields from Category Data
235304
*
236-
* @param \Magento\Catalog\Model\Category $category
237-
* @return \Magento\Catalog\Block\Product\ListProduct
305+
* @param Category $category
306+
* @return $this
238307
*/
239308
public function prepareSortableFieldsByCategory($category)
240309
{
@@ -278,38 +347,38 @@ public function getIdentities()
278347
/**
279348
* Get post parameters
280349
*
281-
* @param \Magento\Catalog\Model\Product $product
350+
* @param Product $product
282351
* @return string
283352
*/
284-
public function getAddToCartPostParams(\Magento\Catalog\Model\Product $product)
353+
public function getAddToCartPostParams(Product $product)
285354
{
286355
$url = $this->getAddToCartUrl($product);
287356
return [
288357
'action' => $url,
289358
'data' => [
290359
'product' => $product->getEntityId(),
291-
\Magento\Framework\App\ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
360+
ActionInterface::PARAM_NAME_URL_ENCODED => $this->urlHelper->getEncodedUrl($url),
292361
]
293362
];
294363
}
295364

296365
/**
297-
* @param \Magento\Catalog\Model\Product $product
366+
* @param Product $product
298367
* @return string
299368
*/
300-
public function getProductPrice(\Magento\Catalog\Model\Product $product)
369+
public function getProductPrice(Product $product)
301370
{
302371
$priceRender = $this->getPriceRender();
303372

304373
$price = '';
305374
if ($priceRender) {
306375
$price = $priceRender->render(
307-
\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
376+
FinalPrice::PRICE_CODE,
308377
$product,
309378
[
310379
'include_container' => true,
311380
'display_minimal_price' => true,
312-
'zone' => \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
381+
'zone' => Render::ZONE_ITEM_LIST,
313382
'list_category_page' => true
314383
]
315384
);
@@ -322,7 +391,7 @@ public function getProductPrice(\Magento\Catalog\Model\Product $product)
322391
* Specifies that price rendering should be done for the list of products
323392
* i.e. rendering happens in the scope of product list, but not single product
324393
*
325-
* @return \Magento\Framework\Pricing\Render
394+
* @return Render
326395
*/
327396
protected function getPriceRender()
328397
{
@@ -348,7 +417,7 @@ protected function getPriceRender()
348417
private function initializeProductCollection()
349418
{
350419
$layer = $this->getLayer();
351-
/* @var $layer \Magento\Catalog\Model\Layer */
420+
/* @var $layer Layer */
352421
if ($this->getShowRootCategory()) {
353422
$this->setCategoryId($this->_storeManager->getStore()->getRootCategoryId());
354423
}
@@ -386,9 +455,8 @@ private function initializeProductCollection()
386455
if ($origCategory) {
387456
$layer->setCurrentCategory($origCategory);
388457
}
389-
390-
$toolbar = $this->getToolbarBlock();
391-
$this->configureToolbar($toolbar, $collection);
458+
459+
$this->addToolbarBlock($collection);
392460

393461
$this->_eventManager->dispatch(
394462
'catalog_block_product_list_collection',

app/code/Magento/Catalog/Block/Product/ProductList/Toolbar.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,14 @@ public function setCollection($collection)
192192
$this->_collection->setPageSize($limit);
193193
}
194194
if ($this->getCurrentOrder()) {
195-
$this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
195+
if ($this->getCurrentOrder() == 'position') {
196+
$this->_collection->addAttributeToSort(
197+
$this->getCurrentOrder(),
198+
$this->getCurrentDirection()
199+
)->addAttributeToSort('entity_id', $this->getCurrentDirection());
200+
} else {
201+
$this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
202+
}
196203
}
197204
return $this;
198205
}

app/code/Magento/Catalog/Model/Indexer/Category/Flat/AbstractAction.php

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,25 +369,55 @@ protected function getAttributeValues($entityIds, $storeId)
369369
}
370370
$values = [];
371371

372-
foreach ($entityIds as $entityId) {
373-
$values[$entityId] = [];
372+
$linkIds = $this->getLinkIds($entityIds);
373+
foreach ($linkIds as $linkId) {
374+
$values[$linkId] = [];
374375
}
376+
375377
$attributes = $this->getAttributes();
376378
$attributesType = ['varchar', 'int', 'decimal', 'text', 'datetime'];
379+
$linkField = $this->getCategoryMetadata()->getLinkField();
377380
foreach ($attributesType as $type) {
378381
foreach ($this->getAttributeTypeValues($type, $entityIds, $storeId) as $row) {
379-
if (isset($row[$this->getCategoryMetadata()->getLinkField()]) && isset($row['attribute_id'])) {
382+
if (isset($row[$linkField]) && isset($row['attribute_id'])) {
380383
$attributeId = $row['attribute_id'];
381384
if (isset($attributes[$attributeId])) {
382385
$attributeCode = $attributes[$attributeId]['attribute_code'];
383-
$values[$row[$this->getCategoryMetadata()->getLinkField()]][$attributeCode] = $row['value'];
386+
$values[$row[$linkField]][$attributeCode] = $row['value'];
384387
}
385388
}
386389
}
387390
}
391+
388392
return $values;
389393
}
390394

395+
/**
396+
* Translate entity ids into link ids
397+
*
398+
* Used for rows with no EAV attributes set.
399+
*
400+
* @param array $entityIds
401+
* @return array
402+
*/
403+
private function getLinkIds(array $entityIds)
404+
{
405+
$linkField = $this->getCategoryMetadata()->getLinkField();
406+
if ($linkField === 'entity_id') {
407+
return $entityIds;
408+
}
409+
410+
$select = $this->connection->select()->from(
411+
['e' => $this->connection->getTableName($this->getTableName('catalog_category_entity'))],
412+
[$linkField]
413+
)->where(
414+
'e.entity_id IN (?)',
415+
$entityIds
416+
);
417+
418+
return $this->connection->fetchCol($select);
419+
}
420+
391421
/**
392422
* Return attribute values for given entities and store of specific attribute type
393423
*

app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Full.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,22 @@ protected function populateFlatTables(array $stores)
6464
}
6565
/** @TODO Do something with chunks */
6666
$categoriesIdsChunks = array_chunk($categoriesIds[$store->getRootCategoryId()], 500);
67+
6768
foreach ($categoriesIdsChunks as $categoriesIdsChunk) {
6869
$attributesData = $this->getAttributeValues($categoriesIdsChunk, $store->getId());
70+
$linkField = $this->categoryMetadata->getLinkField();
71+
6972
$data = [];
7073
foreach ($categories[$store->getRootCategoryId()] as $category) {
71-
if (!isset($attributesData[$category[$this->categoryMetadata->getLinkField()]])) {
74+
if (!isset($attributesData[$category[$linkField]])) {
7275
continue;
7376
}
7477
$category['store_id'] = $store->getId();
7578
$data[] = $this->prepareValuesToInsert(
76-
array_merge($category, $attributesData[$category[$this->categoryMetadata->getLinkField()]])
79+
array_merge($category, $attributesData[$category[$linkField]])
7780
);
7881
}
82+
7983
$this->connection->insertMultiple(
8084
$this->addTemporaryTableSuffix($this->getMainStoreTable($store->getId())),
8185
$data

0 commit comments

Comments
 (0)