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

 

Share
Published by
SebWeo
Tags: Magento2

Recent Posts

Кому сегодня стоит купить iPhone 14 Pro Max?

Модели последних серий компании Apple пользуются большой популярностью, в том числе и iPhone 14 Pro…

21 час ago

Вуди Аллен

Если хочешь узнать человека, не слушай, что о нем говорят другие, послушай, что он говорит…

3 дня ago

Эрих Мария Ремарк

Извинение — не означает, что ты не прав, а другой человек прав. Это всего лишь…

2 недели ago

Джим Керри

Тот, кто умеет улыбаться каждый день, умеет жить Джим Керри  

3 недели ago

Хань Сян-цзы

Помогая ленивым людям, ты помогаешь им сесть на свою шею Хань Сян-цзы  

3 недели ago

Как работает электронная книга

Атмосферу бумажной книги, запах свежих чернил и чуть залежавшейся бумаги сложно заменить гаджетами. Но электронные…

3 недели ago