Коварная война россии против Украины. Ориентировочные потери врага
(по состоянию на 18.11.2022)
83460
солдат
278
самолетов
261
вертолетов
2879
танков
5808
ББМ
1865
артиллерия
209
ПВО
393
РСЗО
4366
машин
16
корабли и катера
Как изменить сортировку товаров по умолчанию в Magento 2

Как изменить сортировку товаров по умолчанию в 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. Как разработчику, она даст вам возможность вносить значительные изменения в структуру сайта с помощью всего лишь нескольких строк кода, а эти знания помогут вам быстро найти решение для ваших практических задач!

 

 

Добавить комментарий

Ваш адрес email не будет опубликован.