Как изменить сортировку товаров по умолчанию в Magento 2

В Magento 2 по умолчанию порядок сортировки товаров установлен по возрастанию, но что делать, если вам нужно изменить его по умолчанию в порядке убывания? На первый взгляд эта простая задача решается небольшой настройкой конфигурации в админпанели, но здесь не обойтись и без редактирования XML-файла макета.

В сегодняшней статье мы рассмотрим практическое решение задачи по изменению порядка сортировки по умолчанию в списке товаров.

 

 

Метод сортировки товаров в каталоге по умолчанию можно изменить в административной панели сайта в разделе Магазины > Конфигурация > Каталог > Витрина магазина > Сортировка списка товаров (Stores > Config > Catalog > Catalog > Storefront > Product Listing Sort By). Дефолтное значение – это Позиция (Position), которое основывается на числовом весе, установленного для каждого отдельного товара. Для сортировки товаров в каталоге по цене, самый дешевый товар будет выводиться в самом верху списка, что не всегда устраивает владельцев интернет-магазинов. В основном, владельцам нужно, чтобы вверху списка товаров показывались самые дорогие товары.

 

 

Как изменить сортировку товаров по умолчанию в Magento 2

Мы рассмотрим все составляющие этого процесса. Хотя это может показаться немного скучным, на практике данный материал может вам пригодиться, и вы лучше будете понимать всю систему.

Если вы новичок в Magento 2, стоит потратить некоторое время на изучение базовых принципов работы модулей и получить основное представление о структуре системы. Magento 2 – это огромная и сложная система, для изучения и понимания которой требуется время. Надеемся, что наши уроки по Magento 2 помогут вам при первых шагах в изучении данной системы.



 

Блок с выпадающим меню сортировки товаров рендерится на странице каталога с помощью .phtml шаблона. Его файл находится здесь: vendor/magento/module-catalog/view/frontend/templates/product/list/toolbar.phtml. Внутри этого файла вы увидите вызов файла шаблона для сортировщика:

<?php if ($block->isExpanded()): ?>   <?php include ($block->getTemplateFile('Magento_Catalog::product/list/toolbar/sorter.phtml')) ?>  <?php endif; ?>  

 

 

Если этот код выглядит для вас новым, функция getTemplateFile() – это просто вспомогательная функция, которая вызывает указанный вами шаблон (кстати, это можно сделать и с помощью xml файла макета). Magento 2 использует сокращенную запись для этого файла, в итоге полный вызов шаблона осуществляется для этого файла: vendor/magento/module-catalog/view/frontend/templates/product/list/toolbar/sorter.phtml. В этом файле осуществляется проверка значения сортировки товаров по умолчанию:

<?php if ($block->getCurrentDirection() == 'desc'): ?>  

 

Этот метод определяется в следующем классе (@var $block \Magento\Catalog\Block\Product\ProductList\Toolbar). Открыв файл класса по адресу vendor/magento/module-catalog/Block/Product/ProductList/Toolbar.php, мы видим следующее:

/**  * Retrieve current direction  *  * @return string  */  public function getCurrentDirection()  {   $dir = $this->_getData('_current_grid_direction');   if ($dir) {    return $dir;   }   $directions = ['asc', 'desc'];   $dir = strtolower($this->_toolbarModel->getDirection());   if (!$dir || !in_array($dir, $directions)) {    $dir = $this->_direction;   }   if ($dir != $this->_direction) {    $this->_memorizeParam('sort_direction', $dir);   }   $this->setData('_current_grid_direction', $dir);   return $dir;  }  

 

 

Этот код геттера сначала проверяет _getData(), чтобы найти установленное направление сортировки. Если оно не указано, тогда вызывается метод getDirection() в _toolbarModel(). Исследуя метод getDirection(), мы обнаруживаем, что он проверяет набор констант в Модели vendor/magento/module-catalog/Model/Product/ProductList/Toolbar.php. Если направление не указано там, оно проверяет константу, установленную в Хелпере (vendor/magento/module-catalog/Helper/Product/ProductList.php) через $this->_direction.

Учитывая эту структуру, мы ищем метод установки (сеттер) порядка сортировки по умолчанию. При таком поиске, может быть полезно узнать все доступные методы Блока, например, так:

<?php var_dump(get_class_methods($block)); ?>  

 

Поместите этот код в нужном шаблоне (в нашем случае это vendor/magento/module-catalog/view/frontend/templates/product/list/toolbar.phtml), обновите страницу каталога товара, и вы увидите большой список доступных для вызова методов Блока в данном шаблоне.

 

В итоге мы находим сеттер в следующем классе:

Magento\Catalog\Block\Product\ProductList\Toolbar.php  /**  * Set default sort direction  *  * @param string $dir  * @return $this  */  public function setDefaultDirection($dir)  {   if (in_array(strtolower($dir), ['asc', 'desc'])) {    $this->_direction = strtolower($dir);   }   return $this;  }  

 

Этот метод выглядит многообещающе, но его нельзя настроить напрямую для объекта $block. Вместо этого мы будем использовать XML-файл конфигурации для вызова Блок класса и передачи значения там.

 

Для этого создайте в вашей теме следующий файл

app/design/frontend/{VENDOR}/{THEME}/Magento_Catalog/layout/catalog_category_view.xml  

 

В этот файл скопируйте приведенный ниже код. Если в вашей теме уже есть этот файл, возможно, там уже указаны основные ноды. В этом случае вам просто нужно добавить блок referenceBlock.

<?xml version="1.0"?>  <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">   <referenceContainer name="content">    <referenceBlock class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list">     <action method="setDefaultDirection">      <argument name="dir" xsi:type="string">desc</argument>     </action>    </referenceBlock>   </referenceContainer>  </page>  

 

 

Давайте разберем этот код. Мы ссылаемся на основной контейнер содержимого страницы catalog_category_view. Внутри этого нода у нас есть вызов класса Блока, что имеет метод, который мы хотим установить, и мы вызываем этот метод с помощью нода <action method="setDefaultDirection"> </action>.

 

Если поначалу этот синтаксис выглядит немного запутанным, позднее вы к нему привыкнете. Данный нод является базовым эквивалентом вызова $block->setDefaultDirection(). В котором мы должны передать нужное значение.

Если мы вернемся назад, для метода setDefaultDirection($dir) значение должно быть передано в виде строки. XML-версия этого аргумента – desc. Нод определяет все, что нужно знать Magento: имя, которое мы ему даем (произвольное, но с учетом простого соглашения об именах), тип данных значения (в нашем случае, строка) и само значение.

Если вы сохраните файл и обновите страницу каталога, вы увидите стрелку сортировки, которая по умолчанию установлена по убыванию (т.е, товары будут сортироваться от большего к меньшему). Если вы не видите изменений, обязательно очистите кэш.

Вот и все!

 

 

 

Краткий итог

Надеемся, что сегодняшний урок дал вам шанс по-новому оценить мощь системы конфигурации с помощью XML, которой обладает Magento 2. Как разработчику, она даст вам возможность вносить значительные изменения в структуру сайта с помощью всего лишь нескольких строк кода, а эти знания помогут вам быстро найти решение для ваших практических задач!