Я хочу отобразить товары с пометкой “Нет изображений” внизу категории. Как мы можем достичь этого сортирования, используя лучшие практики Magento 2?

Вопрос или проблема

На странице списка категорий Magento 2.4.x я хочу переместить все продукты, которые не имеют изображений, в конец, то есть на последнюю страницу. Какова лучшая практика Magento 2 для достижения этой настройки? Нужно ли нам создавать плагин для этого? Или мы можем сделать это в файле list.phtml, который загружает $block->getLoadedProductCollection?

Если кто-либо когда-либо создавал сортировку подобным образом, пожалуйста, дайте мне знать.

Ответ или решение

Для достижения желаемого поведения, когда продукты без изображений отображаются в конце списка категорий в Magento 2.4.x, вы можете воспользоваться одним из нескольких подходов. Однако лучший способ сделать это — создать плагин (или модуль), так как это позволит сохранить обновляемость вашего кода и избежать изменений в ядре платформы. Ниже описаны шаги для реализации данного функционала.

Шаг 1: Создание собственного модуля

  1. Создание структуры файлов модуля:
    Создайте следующую структуру каталогов для вашего модуля:

    app/code/Vendor/NoImageSorting/
    ├── registration.php
    ├── etc
    │   └── module.xml
    └── Plugin
       └── ProductCollectionPlugin.php
  2. Файл registration.php:

    <?php
    \Magento\Framework\Component\ComponentRegistrar::register(
       \Magento\Framework\Component\ComponentRegistrar::MODULE,
       'Vendor_NoImageSorting',
       __DIR__
    );
  3. Файл 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: Создание плагина для сортировки

  1. Файл 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.

Если у вас есть дополнительные вопросы или нужна помощь в настройке, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...