Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 02.12.2022)
90090
осіб
280
літаків
262
гелікоптерів
2916
танків
5883
ББМ
1905
артилерія
210
ППО
395
РСЗВ
4464
машин
16
кораблі і катери
Як змінити сортування товарів за замовчуванням в Magento 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. Як розробнику, вона дасть вам можливість вносити значні зміни в структуру сайту за допомогою всього лише кількох рядків коду, а ці знання допоможуть вам швидко знайти рішення для ваших практичних завдань!

 

 

Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься.