Можно ли создать плагин для Magento 2, который отображает HTML-уведомление на основе определенных условий? Моя текущая проблема в том, что моё предупреждение статично.

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

Я использую два файла для вывода предупреждения:

extra.html(https://i.sstatic.net/IYo7wvWk.png)
data.html(https://i.sstatic.net/TMabfFrJ.png)

Вот что я получаю, но это статично, я хочу, чтобы это было условным:
введите описание изображения здесь

Это предупреждение должно фильтроваться между некоторыми артиклами и категориями, чтобы сначала проверить совместимости.
Если совместимости нет, оно должно выводиться.

Я сам создал плагин с помощью GPT, но он не влияет на поведение текста, который я добавляю в корзину.

Мой плагин:

<?php
namespace Webkul\MiniCart\Plugin\Checkout\CustomerData;

use Magento\Checkout\Model\Cart;
use Magento\Framework\Message\ManagerInterface;
use Magento\Framework\Session\SessionManagerInterface;

class MiniCartPlug {
    protected $messageManager;
    protected $sessionManager;
    protected $compatibilities = [
        '951-0080' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Glock', 'models' => ['17', '19', '43']],
        '951-0082' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Taurus', 'models' => ['G2C', 'G3C', 'G3']],
        '951-0087' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Sig Sauer', 'models' => ['P365 Macro']],
        '951-0079' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Sig Sauer', 'models' => ['P365 Macro']],
        '951-0091' => ['compatible_accessories' => ['930-0038', '931-0038'], 'brand' => 'Springfield', 'models' => ['Hellcat Pro']],
        '951-0072' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Sig Sauer', 'models' => ['P320']],
        '951-0090' => ['compatible_accessories' => ['930-0038', '931-0038'], 'brand' => 'Springfield', 'models' => ['Hellcat Pro']],
        '951-0077' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Sig Sauer', 'models' => ['P365 Macro']],
        '951-0074' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Sig Sauer', 'models' => ['P320']],
        '951-0068' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Springfield', 'models' => ['Hellcat']],
        '951-0059' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Sig Sauer', 'models' => ['P320']],
        '951-0065' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Sig Sauer', 'models' => ['P365 Macro']],
        '951-0067' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Taurus', 'models' => ['G2C', 'G3C', 'G3']],
        '951-0066' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Springfield', 'models' => ['Hellcat Pro']],
        '951-0069' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Glock', 'models' => ['17', '19', '43']],
        '951-0053' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Springfield', 'models' => ['Hellcat']],
        '951-0063' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Taurus', 'models' => ['G2C', 'G3C', 'G3']],
        '951-0054' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Taurus', 'models' => ['G2C', 'G3C', 'G3']],
        '951-0055' => ['compatible_accessories' => ['930-0024', '930-0025'], 'brand' => 'Springfield', 'models' => ['Hellcat Pro']],
        '951-0057' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Glock', 'models' => ['17', '19', '43']],
        '951-0058' => ['compatible_accessories' => ['930-0026', '930-0027'], 'brand' => 'Springfield', 'models' => ['Hellcat Pro']],
        '952-0003' => ['compatible_accessories' => ['930-0001', '930-0006', '930-0007'], 'brand' => 'Glock', 'models' => ['19', '19X', '45', '23', '29', '32', '38']],
        '952-0007' => ['compatible_accessories' => ['930-0001', '930-0006', '930-0007'], 'brand' => 'Palmetto State Armory', 'models' => [' PS9 Dagger']],
        '951-0081' => ['compatible_accessories' => ['912-0026'], 'brand' => 'Taurus', 'models' => ['G3', 'G3c', 'G3X', 'G2c', 'G2 PT111']],
        '951-0004' => ['compatible_accessories' => ['912-0026'], 'brand' => 'Taurus', 'models' => ['G3', 'G3c', 'G3X', 'G2c', 'G2 PT111']],
        '951-0011' => ['compatible_accessories' => ['912-0029', '912-0079'], 'brand' => 'Springfield', 'models' => ['Hellcat/Hellcat OSP (NOT RDP)']],
        '951-0003' => ['compatible_accessories' => ['912-0026'], 'brand' => 'Taurus', 'models' => ['G3', 'G3c', 'G3X', 'G2c', 'G2 PT111']],
        '951-0093' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365 XL']],
        '951-0092' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365 XL']],
        '951-0071' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0070' => ['compatible_accessories' => ['912-0049', '912-0050'], 'brand' => 'Palmetto State Armory', 'models' => ['']],
        '951-0061' => ['compatible_accessories' => ['912-0049', '912-0050'], 'brand' => 'Palmetto State Armory', 'models' => ['']],
        '951-0021' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0031' => ['compatible_accessories' => ['912-0077'], 'brand' => 'Springfield', 'models' => ['Hellcat PRO']],
        '951-0015' => ['compatible_accessories' => ['912-0043'], 'brand' => 'Taurus', 'models' => ['GX4']],
        '951-0019' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365']],
        '951-0028' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365']],
        '951-0086' => ['compatible_accessories' => ['912-0003'], 'brand' => 'Taurus', 'models' => ['G3', 'G3c', 'G3X', 'G2c', 'G2 PT111']],
        '951-0027' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365']],
        '951-0010' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0013' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0022' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0012' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365']],
        '951-0009' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0014' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0026' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365']],
        '951-0084' => ['compatible_accessories' => ['912-0003'], 'brand' => 'Taurus', 'models' => ['G3', 'G3c', 'G3X', 'G2c', 'G2 PT111']],
        '951-0020' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0033' => ['compatible_accessories' => ['912-0077'], 'brand' => 'Springfield', 'models' => ['Hellcat PRO']],
        '951-0037' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0040' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0073' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0041' => ['compatible_accessories' => ['912-0077'], 'brand' => 'Springfield', 'models' => ['Hellcat PRO']],
        '951-0051' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365 XL']],
        '951-0064' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365 XL']],
        '951-0075' => ['compatible_accessories' => ['912-0045'], 'brand' => 'Ruger', 'models' => ['MAX9']],
        '951-0076' => ['compatible_accessories' => ['912-0030', '912-0078'], 'brand' => 'Sig Sauer', 'models' => ['P365 XL']],
        '951-0088' => ['compatible_accessories' => ['912-0071'], 'brand' => 'Ruger', 'models' => ['LCP MAX']],
        '951-0083' => ['compatible_accessories' => ['930-0015'], 'brand' => '', 'models' => ['']]
    ];

    // Идентификаторы категорий "Лазеры и огни" и "Кобуры"
    const LASERS_LIGHTS_CATEGORY_ID = 3; // Реальный ID категории "Лазеры и огни"
    const HOLSTERS_CATEGORY_ID = 2;      // Реальный ID категории "Кобуры"

    public function __construct(
        ManagerInterface $messageManager,
        SessionManagerInterface $sessionManager
    ) {
        $this->messageManager = $messageManager;
        $this->sessionManager = $sessionManager;
    }

    public function beforeAddProduct(Cart $subject, $productInfo, $requestInfo = null)
    {
        // Получаем продукты, которые уже в корзине
        $items = $subject->getQuote()->getAllItems();
        $productToAddSku = $productInfo->getSku();
        $categoryToAdd = $this->getProductCategory($productInfo);

        // Продолжаем только в том случае, если продукт принадлежит к одной из категорий, которые мы мониторим
        if ($categoryToAdd == self::LASERS_LIGHTS_CATEGORY_ID || $categoryToAdd == self::HOLSTERS_CATEGORY_ID) {
            foreach ($items as $item) {
                $skuInCart = $item->getSku();
                $categoryInCart = $this->getProductCategory($item->getProduct());

                // Проверяем, разные ли категории и несовместимы ли они согласно нашему массиву
                if ($categoryToAdd !== $categoryInCart && !$this->isCompatible($skuInCart, $productToAddSku)) {
                    // Сохраняем сообщение предупреждения в сессии
                    $warningMessage = __("Продукт %1 не совместим с продуктом %2 в вашей корзине.", $productToAddSku, $skuInCart);
                    $this->sessionManager->setCompatibilityWarning($warningMessage);
                }
            }
        }

        // ВАЖНО: Убедитесь, что вы возвращаете аргументы
        return [$productInfo, $requestInfo];
    }

    protected function isCompatible($sku1, $sku2)
    {
        // Проверяем, есть ли у продукта 1 совместимые аксессуары в массиве совместимостей
        if (isset($this->compatibilities[$sku1]) && in_array($sku2, $this->compatibilities[$sku1]['compatible_accessories'])) {
            return true;
        }
        return false;
    }

    protected function getProductCategory($product)
    {
        // Получаем первую категорию продукта
        $categoryIds = $product->getCategoryIds();
        if (!empty($categoryIds)) {
            return $categoryIds[0];
        }
        return null;
    }
}

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

Да, возможно создать плагин для Magento 2, который отображает предупреждение в формате HTML в зависимости от определённых условий. Однако, судя по вашему описанию, предупреждение, которое вы пытаетесь реализовать, отображается статически, что не соответствует вашим требованиям.

Для достижения цели, чтобы предупреждение было динамическим и отображалось только в случае несовместимости товаров в корзине, необходимо внести несколько изменений в ваш код плагина. Вот шаги, которые помогут вам правильно реализовать это:

1. Установка переменной предупреждения в сессии

Вы уже сохранили предупреждение в сессии с помощью метода $this->sessionManager->setCompatibilityWarning($warningMessage);. Убедитесь, что вы создали метод в вашем классе сессии для хранения а также получения этого сообщения.

2. Отображение предупреждения в шаблонах

Чтобы отображать предупреждение на фронте, вам необходимо интегрироваться с тем местом, где отображается мини-корзина. Обычно это mini-cart.php или аналогичный файл, отвечающий за отображение мини-корзины.

3. Пример реализации:

a. Измените класс вашего плагина для установки сообщения

// В текущем методе beforeAddProduct оставляем ваш код
if ($categoryToAdd == self::LASERS_LIGHTS_CATEGORY_ID || $categoryToAdd == self::HOLSTERS_CATEGORY_ID) {
    foreach ($items as $item) {
        $skuInCart = $item->getSku();
        $categoryInCart = $this->getProductCategory($item->getProduct());

        if ($categoryToAdd !== $categoryInCart && !$this->isCompatible($skuInCart, $productToAddSku)) {
            // Измените сюда, сохранить сообщение о несовместимости в сессии.
            $warningMessage = __("Предупреждение: продукт %1 не совместим с продуктом %2 в вашей корзине.", $productToAddSku, $skuInCart);
            $this->sessionManager->setCompatibilityWarning($warningMessage);
        }
    }
}

// Верните аргументы, чтобы обеспечить нормальную работу
return [$productInfo, $requestInfo];

b. Получите сообщение в шаблоне мини-корзины

Теперь вам необходимо получить сообщение из сессии в вашем шаблоне мини-корзины. Если вы используете Knockout.js для обновления мини-корзины, вам нужно будет изменить соответствующий компонент.

Пример в mini-cart.php или соответствующем шаблоне:

<?php
// Получите предупреждение из сессии
$warningMessage = $this->sessionManager->getCompatibilityWarning();
if ($warningMessage) {
    // Выведите сообщение на экран
    echo '<div class="message warning">' . $this->escapeHtml($warningMessage) . '</div>';

    // Удалите предупреждение из сессии, чтобы оно не отображалось повторно
    $this->sessionManager->unsCompatibilityWarning();
}
?>

4. Завершение

Убедитесь, что кэш Magento очищен после всех изменений. Теперь при добавлении несовместимых товаров в корзину будет отображаться динамическое предупреждение, которое исчезает после обновления (или после того, как пользователь уберет товар).

Заключение

С помощью указанных выше шагов вы сможете создать плагин для Magento 2, который динамически отображает предупреждение в зависимости от условий, которые вы определили. Не забудьте также протестировать изменения и убедиться, что они работают как ожидается.

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

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