Вопрос или проблема
Я использую два файла для вывода предупреждения:
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, который динамически отображает предупреждение в зависимости от условий, которые вы определили. Не забудьте также протестировать изменения и убедиться, что они работают как ожидается.