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

Recent Posts

Вілл Сміт

Хороші люди принесуть вам щастя, погані люди нагородять вас досвідом, найгірші — дадуть вам урок,…

6 днів ago

Особливості та переваги iPhone 14 Plus

Вихід айфонів 15 і 16 покоління — не привід забути про пристрої 14-го ряду моделей,…

1 тиждень ago

Як уберегти свої картинки на сайті від незаконного використання (крадіжки)

Дуже неприємно виходить, коли ви доклали багато зусиль, праці та сил, щоб створити картинку, а…

1 тиждень ago

Чи є альтернативи у гамбургер-меню для навігації по сайту?

Переважну частку всього світового веб-трафіку займає трафік з мобільних пристроїв (включно з планшетами), тож цей…

2 тижні ago

Джон Брейн

Не варто псувати нерви через те, що світ влаштований так, а не інакше Джон Брейн…

3 тижні ago

Кому сьогодні варто придбати iPhone 14 Pro Max?

Історично склалося так, що очікування версій Pro Max у всіх попередніх поколінь iPhone було інтригуючим.…

4 тижні ago