Страница списка товаров Сортировка по большинству просмотров в magento 2.1


Нам нужно добавить наиболее просматриваемые, наиболее подписанные и последние параметры в меню сортировки на странице списка продуктов нашего приложения magento 2.1 (magento 2.1.7). Я уже ссылался на эту ссылку Страница списка продуктов Сортируется по большинству просмотров (можем ли мы отсортировать это по просмотрам/посещениям страниц) . Поскольку это относится к magento 1, большинство классов, таких как Mage, недоступны в моем приложении magento 2.1.

Пожалуйста, поделитесь своими предложениями по реализации этого в приложении magento 2.1 используя код.

Author: Hari, 2017-09-25

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;

 }

}
 3
Author: Mohammad Maheboob, 2017-09-25 09:35:55

Ни один из этих ответов не является хорошим. Вот правильный способ сделать это, протестированный с помощью 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;
    }
}

Вот и все. Наслаждайтесь!

 2
Author: Daniel Kratohvil, 2019-02-19 11:10:59

У меня есть решение:

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, чтобы отобразить опцию сортировки. Вот и все. Надеюсь, это поможет кому-то еще. :)

 -1
Author: Hari, 2017-09-25 14:15:55