Estou trabalhando em um módulo de desconto de produto. Eu fiz isso via plugin e observador. está funcionando bem na página do produto e na página da lista. Mas o filtro de preço não está funcionando de acordo com o preço atualizado do produto.
Aqui está o meu código que estou usando para personalizar o preço.
Nome do fornecedor / Nome do módulo / 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>
Nome do fornecedor / Nome do módulo / etc / 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;
}
}
Nota: o preço com desconto está no nível do cliente
magento2
price
magento2.3
layered-navigation
Dhairya Shah
fonte
fonte
Respostas:
Esta não é uma solução, mas pode ser uma explicação de como os filtros de preços funcionam. Isso pode ajudar a identificar uma solução.
Os preços exibidos na lista de produtos vêm da
catalog_product_index_price
tabela.Se você der uma olhada no select que recupera a lista de produtos, verá algo parecido com isto:
no seu caso, ele não funciona porque você está alterando o preço final do produto rapidamente, quando o produto é expaly. Mas na tabela de índices de preços você ainda tem o preço original.
A indexação real acontece (pelo menos para produtos simples) em
Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex
.Não posso explicar completamente o que acontece lá, mas você tem algo a que se agarrar.
O método
prepareFinalPriceDataForType
da mesma classe é chamado no início do processo de indexação.Esse método termina com
$this->modifyPriceIndex($finalPriceTable);
Isso é algo que você pode conectar-se à compra, criando uma classe de modificadores de preços e anexando-a à lista de modificadores de preços.
Você pode criar um modificador de preço como este:
Você pode encontrar um exemplo de modificador de preço em
Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter
. Isso remove os produtos fora de estoque do índice de preços, se você definir ocultar seus produtos fora de estoque.Você criou seu modificador de preços, agora precisa anexá-lo à lista existente de modificadores de preços.
Você pode fazer isso no seu arquivo di.xml com
Agora você deve poder modificar os preços na tabela de índices como achar melhor, implementando o método
modifyPrice
na classe acima.Isso é tudo o que eu tenho.
fonte
Pelo que entendi a estrutura de fluxo do Magento 2, quando criamos uma regra de preço de catálogo e salvamos e aplicamos essa regra. Depois, precisamos reindexar os dados para atualizar o preço. Nesse momento, o preço será atualizado no produto apropriado e salvo na
catalog_product_index_price
tabela.Mas, como eu entendo essa estrutura de fluxo do módulo, não é possível modificar a coleção de produtos que foi renderizada para o filtro de navegação em camadas. Você pode verificar aqui a função
vendor/magento/module-catalog/Model/Layer.php
getProductCollection () . Portanto, conforme a lógica do plug-in, basta atualizar o valor exibido no lado frontal. Mas, você não atualizar final_price e MIN_PRICE valor do campo em que (colecção de produtos de dados função getProductCollection () ).Você também pode verificar a exibição do preço com seu desconto personalizado. Mas, o produto não foi adicionado ao carrinho com um preço com desconto. Então, acho que não é uma solução completa.
Portanto, você precisa atualizar final_price e min_price do objeto de coleção, assim como a regra de preço de catálogo atualiza isso.
Espero que seja útil para você.
fonte