Magento 2: Фільтр багатошарових навігаційних цін не працює після застосованої спеціальної знижки


13

Я працюю над модулем знижки на товар. Я зробив це через плагін і спостерігач. це добре працює на сторінці продукту та на сторінці списку. Але ціновий фільтр не працює відповідно до оновленої ціни на продукт.

Ось мій код, який я використовую для налаштування ціни.

VendorName / ModuleName / etc / di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Pricing\Price\FinalPrice">
        <plugin name="custom_discount_catalog_pricing_price_finalprice" type="VendorName\ModuleName\Plugin\FinalPrice" />
    </type>
</config>

VendorName / ModuleName / тощо / events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <event name='catalog_product_get_final_price'>
        <observer name='customdiscount_finalprice' instance='VendorName\ModuleName\Observer\ProcessFinalPrice'/>
    </event>
</config>

VendorName / ModuleName / Observer / ProcessFinalPrice.php

<?php

namespace VendorName\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class ProcessFinalPrice implements ObserverInterface
{
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $observer->getEvent()->getProduct();
        $old = $product->getData('final_price');
        $discountedPrice = $old - ($old * 0.20);
        $product->setData('final_price',$discountedPrice);
    }
}

VendorName / ModuleName / Plugin / FinalPrice.php

<?php

namespace VendorName\ModuleName\Plugin;

class FinalPrice
{
    public function afterGetValue(\Magento\Catalog\Pricing\Price\FinalPrice $subject, $result)
    {
        $discountedPrice = $result - ($result * 0.20);
        return $discountedPrice;
    }
}

Знижка 20%

Фільтр цін не працює зі ціною зі знижкою

Примітка: Ціна зі знижкою визначається на рівні клієнта


HI Якщо ви хочете дати знижку. Тому я пропоную вам скористатися "Правилом ціни в каталозі"
Раві Соні

@ravi Soni Ми створили спеціальний модуль. ми не можемо використовувати для цього правило ціни ціни.
Dhairya Shah

@Rohan Використання тієї ж версії, яка не працює.
Priyank

Я шукаю рішення майже 4 роки без жодного рішення, сподіваюсь, ви знайдете його, головна проблема - ціни на багатошарову навігацію, що надходять зі столу безпосередньо, і ви змінюєте ціну на льоту
WISAM HAKIM

@WISAMHAKIM Немає правильного рішення. Сподіваюся , що деякі основної команди Magento хлопець може дивитися на це і запропонувати якесь - то рішення :)
Priyank

Відповіді:


5

Це не є рішенням, але це може бути поясненням роботи цінових фільтрів. Це може допомогти визначити рішення.

Ціни, що відображаються у списку товарів, походять із catalog_product_index_priceтаблиці.
Якщо ви подивитеся на вибір, який отримує список продуктів, ви побачите щось подібне:

SELECT 
  `e`.*, 
  `cat_index`.`position` AS `cat_index_position`, 
  `price_index`.`price`, 
  `price_index`.`tax_class_id`, 
  `price_index`.`final_price`, 
  IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, 
  `price_index`.`min_price`, 
  `price_index`.`max_price`, 
  `price_index`.`tier_price` 
FROM `catalog_product_entity` AS `e` 
INNER JOIN `catalog_category_product_index_store1` AS `cat_index` ON cat_index.product_id=e.entity_id AND ....
INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND ...

у вашому випадку це не працює, оскільки ви змінюєте остаточну ціну товару під час руху, коли продукт розсилається. Але в таблиці індексу цін у вас все ще є початкова ціна.

Фактична індексація відбувається (принаймні для простих продуктів) в Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex.
Я не можу повністю пояснити, що відбувається там, але у вас є на що зачепитися.

Метод prepareFinalPriceDataForTypeз того ж класу називається на початку процесу індексації.
Цей метод закінчується. $this->modifyPriceIndex($finalPriceTable);
Це те, що ви можете підключити до створення класу модифікаторів цін та додавання його до списку модифікаторів цін.
Ви можете створити модифікатор ціни таким чином:

<?php
namespace Vendor\Module\Indexer\Price;

use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceModifierInterface;
use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\IndexTableStructure;

class CustomPriceModifier implements PriceModifierInterface
{
     public function modifyPrice(IndexTableStructure $priceTable, array $entityIds = []) : void
     {
         //code here that modifies your price.
     }
}

Ви можете знайти приклад модифікатора цін у Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter. Це вилучає продукти, що не є на складі, з індексу цін, якщо ви хочете приховати свої товари, що не продаються.

Ви створили свій модифікатор ціни, тепер вам потрібно приєднати його до існуючого списку модифікаторів цін.

Це можна зробити з файлу di.xml за допомогою

<type name="Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\PriceInterface">
    <arguments>
        <argument name="priceModifiers" xsi:type="array">
            <item name="customPriceModifier" xsi:type="object">Vendor\Module\Indexer\Price\CustomPriceModifier</item>
        </argument>
    </arguments>
</type>

Тепер ви маєте змогу змінювати ціни в таблиці індексів, як вважаєте за потрібне, застосовуючи метод modifyPriceу класі вище.

Це все, що я отримав.


Чудове пояснення. але це не працює для мене, оскільки знижена ціна на рівні клієнтів.
Dhairya Shah

1
так. magento не грає добре з цінами на рівні клієнтів. З іншого боку, ви можете використовувати групи клієнтів. Це може означати, що ви отримуєте багато груп, які індексуватимуть повільніше. На жаль, у мене немає іншого чистого рішення. Або брудний з цього приводу.
Маріус

Дін не отримав рішення, яке я шукав. Але оскільки ви були першими, хто відповів на якесь пояснення потоку, хотіли б надати вам банальні бали.
Priyank

2

Як я розумію структуру потоку Magento 2, коли ми створюємо правило ціни ціни та зберігаємо та застосовуємо це правило. Після цього нам потрібно повторно встановити дані для ціни оновлення. Тоді ціна буде оновлена ​​на відповідний товар і збережена в catalog_product_index_priceтаблиці.

Але, як я розумію, ця структура потоку модуля не змінює колекцію продуктів, яка була відображена для багатошарового навігаційного фільтра. Ви можете перевірити тут vendor/magento/module-catalog/Model/Layer.php функцію getProductCollection () . Отже, відповідно до логіки плагіна, ви просто оновлюєте значення, яке відображається на передній стороні. Але ви не оновили значення final_price та min_price у цій колекції продуктів (дані функції функцій getProductCollection () ).

Ви також можете перевірити, що відображається ціна, на яку ви користуєтеся знижкою. Але товар не додали у кошик із ціною зі знижкою. Отже, я думаю, що це не повне рішення.

Отже, вам потрібно оновити final_price та min_price об'єкта колекції так, як оновити правило цінових правил каталогу.

Сподіваюся, це буде вам корисно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.