Вопрос или проблема
На странице списка категорий Magento 2.4.x я хочу переместить все продукты, которые не имеют изображений, в конец, то есть на последнюю страницу. Какова лучшая практика Magento 2 для достижения этой настройки? Нужно ли нам создавать плагин для этого? Или мы можем сделать это в файле list.phtml, который загружает $block->getLoadedProductCollection?
Если кто-либо когда-либо создавал сортировку подобным образом, пожалуйста, дайте мне знать.
Ответ или решение
Для достижения желаемого поведения, когда продукты без изображений отображаются в конце списка категорий в Magento 2.4.x, вы можете воспользоваться одним из нескольких подходов. Однако лучший способ сделать это — создать плагин (или модуль), так как это позволит сохранить обновляемость вашего кода и избежать изменений в ядре платформы. Ниже описаны шаги для реализации данного функционала.
Шаг 1: Создание собственного модуля
-
Создание структуры файлов модуля:
Создайте следующую структуру каталогов для вашего модуля:app/code/Vendor/NoImageSorting/ ├── registration.php ├── etc │ └── module.xml └── Plugin └── ProductCollectionPlugin.php
-
Файл
registration.php
:<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Vendor_NoImageSorting', __DIR__ );
- Файл
module.xml
:<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Vendor_NoImageSorting" setup_version="1.0.0"/> </config>
Шаг 2: Создание плагина для сортировки
-
Файл
ProductCollectionPlugin.php
:<?php namespace Vendor\NoImageSorting\Plugin; use Magento\Catalog\Model\ResourceModel\Product\Collection; class ProductCollectionPlugin { public function aroundLoad(Collection $subject, callable $proceed, ...$args) { // Вызов оригинального метода загрузки коллекции $proceed($args); // Получаем коллекцию продуктов $productCollection = $subject->getItems(); // Разделение на продукты с изображениями и без $productsWithImages = []; $productsWithoutImages = []; foreach ($productCollection as $product) { if ($product->getImage() || $product->getGallery()) { $productsWithImages[] = $product; } else { $productsWithoutImages[] = $product; } } // Объединяем коллекцию с продуктами с изображениямами и без в нужном порядке $sortedProducts = array_merge($productsWithImages, $productsWithoutImages); // Устанавливаем отсортированную коллекцию обратно в коллекцию $subject->clear()->addItems($sortedProducts); } }
Шаг 3: Включение модуля и очистка кеша
После создания модуля необходимо выполнить следующие команды в командной строке для его активации и настройки:
php bin/magento module:enable Vendor_NoImageSorting
php bin/magento setup:upgrade
php bin/magento cache:clean
php bin/magento cache:flush
Заключение
Теперь, когда вы отобразите категории на фронтэнде, все продукты без изображений будут отображаться в конце списка. Используя данный подход, вы сохраняете модульность и целостность вашего кода, а также следуете наилучшим практикам Magento 2.
Если у вас есть дополнительные вопросы или нужна помощь в настройке, не стесняйтесь обращаться!