Страница списка товаров Сортировка по большинству просмотров в magento 2.1
Нам нужно добавить наиболее просматриваемые, наиболее подписанные и последние параметры в меню сортировки на странице списка продуктов нашего приложения magento 2.1 (magento 2.1.7). Я уже ссылался на эту ссылку Страница списка продуктов Сортируется по большинству просмотров (можем ли мы отсортировать это по просмотрам/посещениям страниц) . Поскольку это относится к magento 1, большинство классов, таких как Mage, недоступны в моем приложении magento 2.1.
Пожалуйста, поделитесь своими предложениями по реализации этого в приложении magento 2.1 используя код.
3 answers
Если вы хотите добавить опцию в sort menu
, то вам нужно создать плагин , как я достиг
1) создайте файл di.xml
и приведенный ниже код
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\Config">
<plugin name="add_custom_sort" type="Test\MyMagento\Plugin\Catalog\CustomSort" sortOrder="10"/>
</type>
</config>
2) создайте файл CustomSort.php
и код blow
<?php
namespace Test\MyMagento\Plugin\Catalog;
class CustomSort
{
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['mostviewd'] = __('Mostveiwd');
return $options;
}
}
Ни один из этих ответов не является хорошим. Вот правильный способ сделать это, протестированный с помощью Magento 2.3:
1) Вам нужно создать два плагина. Один, который добавит фильтр "Наиболее просматриваемый" в качестве опции в раскрывающемся списке "Сортировать по" на странице просмотра категорий, и другой, который будет обработан after
методом setCollection()
Magento\Catalog\Block\Product\ProductList\Toolbar
, который будет отвечать за фактическую сортировку.
Для этого сначала объявите плагин в di.xml файл вашего модуля:
[Vendor]/[ModuleName]/etc/frontend/di.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\Config">
<plugin name="sortby_add_custom_option" type="[Vendor]\[ModuleName]\Plugin\Model\Config" />
</type>
<type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
<plugin name="sortby_extend_default_sort_filters" type="[Vendor]\[ModuleName]\Plugin\Block\Toolbar" />
</type>
</config>
2) Теперь создайте первый файл плагина:
[Vendor]\[ModuleName]\Plugin\Model\Config.php
:
<?php
namespace [Vendor]\[ModuleName]\Plugin\Model;
class Config
{
/**
* Add custom Sort By option
*
* @param \Magento\Catalog\Model\Config $catalogConfig
* @param array $options
* @return array []
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetAttributeUsedForSortByArray(\Magento\Catalog\Model\Config $catalogConfig, $options)
{
// new sorting option
$customOption['most_viewed'] = __('Most Viewed');
// merge default sorting options with custom options
$options = array_merge($customOption, $options);
return $options;
}
/**
* This method is optional. Use it to set Most Viewed as the default
* sorting option in the category view page
*
* @param \Magento\Catalog\Model\Config $catalogConfig
* @return string
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterGetProductListDefaultSortBy(\Magento\Catalog\Model\Config $catalogConfig)
{
return 'most_viewed';
}
}
3) А теперь второй файл плагина:
[Vendor]\[ModuleName]\Plugin\Block\Toolbar.php
:
<?php
namespace [Vendor]\[ModuleName]\Plugin\Block;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Select;
/**
* Product list toolbar plugin
*/
class Toolbar
{
const SORT_ORDER_DESC = 'DESC';
/**
* @var \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
*/
protected $_collection = null;
/**
* DB connection
*
* @var \Magento\Framework\DB\Adapter\AdapterInterface
*/
protected $_conn;
/**
* @var boolean
*/
protected $_subQueryApplied = false;
/**
* Constructor
*
* @param \Magento\Framework\App\ResourceConnection $resource
*/
public function __construct(ResourceConnection $resource)
{
$this->_conn = $resource->getConnection('catalog');
}
/**
* Plugin - Used to modify default Sort By filters
*
* @param \Magento\Catalog\Block\Product\ProductList\Toolbar $subject
* @param null $result
* @param \Magento\Framework\Data\Collection $collection
* @return Toolbar
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterSetCollection(\Magento\Catalog\Block\Product\ProductList\Toolbar $subject,
$result,
$collection
) {
$this->_collection = $collection;
if ($subject->getCurrentOrder() == 'most_viewed') {
if (!$this->_subQueryApplied) {
$reportEventTable = $this->_collection->getResource()->getTable('report_event');
$subSelect = $this->_conn->select()->from(
['report_event_table' => $reportEventTable],
'COUNT(report_event_table.event_id)'
)->where(
'report_event_table.object_id = e.entity_id'
);
$this->_collection->getSelect()->reset(Select::ORDER)->columns(
['views' => $subSelect]
)->order(
'views ' . self::SORT_ORDER_DESC
);
$this->_subQueryApplied = true;
}
}
return $this;
}
}
Вот и все. Наслаждайтесь!
У меня есть решение:
1) переопределите панель инструментов Magento\Каталог\Блок\Продукт\Список продуктов\
(См. Здесь, чтобы переопределить блок в magento 2: https://webkul.com/blog/overriding-rewriting-classes-magento2/)
А затем нужно скопировать все содержимое из Magento\Каталог\Блок\Продукт\Список продуктов\Панель инструментов в наш новый класс. Затем
2) Откройте наш новый переопределенный класс (для меня это Webkul\Catalog\Block\Rewrite\Product\ProductList\Toolbar)
, перейдите в getAvailableOrders()
, затем добавьте туда эти коды:
$this->addOrderToAvailableOrders('mostviewd', 'MOST POPULAR');
$this->addOrderToAvailableOrders('mostsold', 'MOST SOLD');
$this->addOrderToAvailableOrders('latest', 'LATEST');
По добавив это, мы можем получить эти параметры сортировки в $block->getAvailableOrders()
в ...\Magento_Catalog\templates\product\list\toolbar\sorter.phtml
3) Изменить функцию setCollection()
:
---------------------------
if ($this->getCurrentOrder()) {
if($this->getCurrentOrder()=='mostviewd') {
// echo 'if'; die;
$this->_collection->getSelect()->
joinInner('report_event AS _table_views',
' _table_views.object_id = e.entity_id',
'COUNT(_table_views.event_id) AS views')->
group('e.entity_id')->order('views DESC');
}
else if($this->getCurrentOrder()=='mostsold') {
$this->getCollection()->getSelect()
->joinLeft(
array('order_items' => $collection->getResource()->getTable('sales_order_item')),
'order_items.product_id = e.entity_id',
array('qty_ordered' => 'SUM(order_items.qty_ordered)')
)
->group('e.entity_id')
->order('qty_ordered DESC');
}
else if($this->getCurrentOrder()=='latest') {
$this->_collection->setOrder('entity_id', 'desc');
}
else{
$this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
}
................
Затем управляйте своим sorter.phtml
, чтобы отобразить опцию сортировки. Вот и все.
Надеюсь, это поможет кому-то еще. :)