В Magento 2 по умолчанию порядок сортировки товаров установлен по возрастанию, но что делать, если вам нужно изменить его по умолчанию в порядке убывания? На первый взгляд эта простая задача решается небольшой настройкой конфигурации в админпанели, но здесь не обойтись и без редактирования XML-файла макета.
В сегодняшней статье мы рассмотрим практическое решение задачи по изменению порядка сортировки по умолчанию в списке товаров.
Метод сортировки товаров в каталоге по умолчанию можно изменить в административной панели сайта в разделе Магазины > Конфигурация > Каталог > Витрина магазина > Сортировка списка товаров (Stores > Config > Catalog > Catalog > Storefront > Product Listing Sort By). Дефолтное значение – это Позиция (Position), которое основывается на числовом весе, установленного для каждого отдельного товара. Для сортировки товаров в каталоге по цене, самый дешевый товар будет выводиться в самом верху списка, что не всегда устраивает владельцев интернет-магазинов. В основном, владельцам нужно, чтобы вверху списка товаров показывались самые дорогие товары.
Мы рассмотрим все составляющие этого процесса. Хотя это может показаться немного скучным, на практике данный материал может вам пригодиться, и вы лучше будете понимать всю систему.
Если вы новичок в 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. Как разработчику, она даст вам возможность вносить значительные изменения в структуру сайта с помощью всего лишь нескольких строк кода, а эти знания помогут вам быстро найти решение для ваших практических задач!
Модели последних серий компании Apple пользуются большой популярностью, в том числе и iPhone 14 Pro…
Если хочешь узнать человека, не слушай, что о нем говорят другие, послушай, что он говорит…
Извинение — не означает, что ты не прав, а другой человек прав. Это всего лишь…
Атмосферу бумажной книги, запах свежих чернил и чуть залежавшейся бумаги сложно заменить гаджетами. Но электронные…