Estoy trabajando en un módulo de descuento de producto. Lo hice a través de un complemento y un observador. está funcionando bien en la página del producto y la página de la lista. Pero el filtro de precios no funciona según el precio actualizado del producto.
Aquí está mi código que estoy usando para personalizar el precio.
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 / 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: El precio con descuento está a nivel del cliente.
magento2
price
magento2.3
layered-navigation
Dhairya Shah
fuente
fuente
Respuestas:
Esta no es una solución, pero puede ser una explicación de cómo funcionan los filtros de precios. Esto podría ayudar a identificar una solución.
Los precios que se muestran en la lista de productos provienen de la
catalog_product_index_price
tabla.Si echa un vistazo a la selección que recupera la lista de productos, verá algo como esto:
en su caso, no funciona porque está cambiando el precio final del producto sobre la marcha, cuando el producto es exhibido. Pero en la tabla de índice de precios todavía tiene el precio original.
La indexación real ocurre (al menos para productos simples) en
Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex
.No puedo explicar completamente lo que sucede allí, pero tienes algo a lo que engancharte.
El método
prepareFinalPriceDataForType
de la misma clase se llama al comienzo del proceso de indexación.Este método termina con
$this->modifyPriceIndex($finalPriceTable);
Esto es algo que puede conectar a la compra creando una clase de modificador de precio y adjuntándola a la lista de modificadores de precio.
Puede crear un modificador de precio como este:
Puede encontrar un ejemplo de modificador de precio en
Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter
. Esto elimina los productos agotados del índice de precios si configura ocultar sus productos agotados.Ha creado su modificador de precio, ahora debe adjuntarlo a la lista existente de modificadores de precio.
Puede hacerlo desde su archivo di.xml con
Ahora debería poder modificar los precios en la tabla de índice como mejor le parezca mediante la implementación del método
modifyPrice
en la clase anterior.Eso es todo lo que tengo.
fuente
Según entiendo la estructura de flujo de Magento 2, cuando creamos una regla de precio de catálogo y guardamos y aplicamos esa regla. Después, debemos reindexar los datos para el precio de actualización. En ese momento, el precio se actualizará en el producto apropiado y se guardará en la
catalog_product_index_price
tabla.Pero, como entiendo la estructura de flujo de este módulo, no modifica la colección de productos que se procesó para el filtro de navegación en capas. Puede consultar aquí la función
vendor/magento/module-catalog/Model/Layer.php
getProductCollection () . Entonces, según la lógica del complemento, solo actualiza el valor que se muestra en el lado frontal. Pero no actualizó el valor del campo final_price y min_price en esa colección de productos ( datos de función getProductCollection () ).También puede verificar que el precio muestre cuál es su descuento personalizado. Pero el producto no se agregó en el carrito con un precio de descuento. Entonces, creo que no es una solución completa.
Por lo tanto, debe actualizar final_price y min_price del objeto de colección como, al igual que actualizar la regla de precio de catálogo.
Esperamos que sea útil para usted.
fuente