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