Я работаю над модулем скидок на товары. Я сделал это с помощью плагина и обозревателя. он отлично работает на странице продукта и на странице списка. Но ценовой фильтр не работает в соответствии с обновленной ценой продукта.
Вот мой код, который я использую, чтобы настроить цену.
Имя_вендора / ModuleName / и т.д. / 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>
Имя_вендора / 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>
Имя_вендор / ModuleName / наблюдатель / 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);
}
}
Имя_вендора / 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;
}
}
Примечание: цена со скидкой находится на уровне клиента
magento2
price
magento2.3
layered-navigation
Дхаирья Шах
источник
источник
Ответы:
Это не решение, но это может быть объяснение того, как работают ценовые фильтры. Это может помочь определить решение.
Цены, отображаемые в списке продуктов, взяты из
catalog_product_index_price
таблицы.Если вы посмотрите на выбор, который получает список продуктов, вы увидите что-то вроде этого:
в вашем случае это не работает, потому что вы меняете окончательную цену продукта на лету, когда продукт продается. Но в таблице индексов цен у вас все еще есть первоначальная цена.
Фактическая индексация происходит (по крайней мере, для простых продуктов) в
Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex
.Я не могу полностью объяснить, что там происходит, но у вас есть что зацепить.
Метод
prepareFinalPriceDataForType
из того же класса вызывается в начале процесса индексации.Этот метод заканчивается тем
$this->modifyPriceIndex($finalPriceTable);
, что вы можете зацепить его, создав класс модификатора цены и добавив его в список модификаторов цены.
Вы можете создать модификатор цены следующим образом:
Вы можете найти пример модификатора цены в
Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter
. Это удаляет товары, отсутствующие на складе, из индекса цен, если вы решили скрыть товары, которых нет на складе.Вы создали свой модификатор цены, теперь вам нужно присоединить его к существующему списку модификаторов цены.
Вы можете сделать это из вашего файла di.xml с помощью
Теперь вы должны иметь возможность изменять цены в таблице индексов по своему усмотрению, реализовав метод
modifyPrice
в классе выше.Это все, что я получил.
источник
Как я понимаю, структура потока Magento 2: Когда мы создаем правило цены каталога и сохраняем и применяем это правило. После этого нам необходимо переиндексировать данные для обновления цены. В это время цена будет обновлена на соответствующий товар и сохранена в
catalog_product_index_price
таблице.Но, как я понимаю, эта структура потока модуля не изменяет коллекцию продуктов, которая была отрисована для многоуровневого фильтра навигации. Вы можете проверить здесь
vendor/magento/module-catalog/Model/Layer.php
функцию getProductCollection () . Итак, согласно логике плагина, вы просто обновляете значение, которое отображается на внешней стороне. Но вы не обновили значения полей final_price и min_price в этой коллекции продуктов (данные функции getProductCollection () ).Вы также можете проверить ту цену, которая показывает ваши пользовательские скидки. Но товар не добавлен в корзину со скидкой. Так что я думаю, что это не полное решение.
Таким образом, вам нужно обновить final_price и min_price объекта коллекции, как обновляет это правило цены каталога.
Надеюсь, это будет полезно для вас.
источник