В 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. Как разработчику, она даст вам возможность вносить значительные изменения в структуру сайта с помощью всего лишь нескольких строк кода, а эти знания помогут вам быстро найти решение для ваших практических задач!
На заре моей карьеры веб-разработчика все было относительно просто: установил локальный сервер (помните Denwer?), положил…
Если вы когда-либо интересовались, как ускорить свой сайт на WordPress, вы, наверное, слышали о "кешировании".…
Когда мы говорим о веб-разработке, первое, что приходит на ум — это HTML и CSS.…
В мире SEO есть фраза, которую повторяют так часто, что она уже стала клише: "Content…
Создание бизнеса — это как рождение ребенка. Вы вкладываете в него душу, время и деньги.…
Когда вы только начинаете работать с PHP, кажется, что все просто: вы пишете код, веб-сервер…