Magento 2:应用自定义产品折扣后,分层导航价格过滤器不起作用


13

我正在开发产品折扣模块。我是通过插件和观察者完成的。在产品页面和列表页面上都可以正常工作。但是价格过滤器无法根据更新的产品价格运行。

这是我用来自定义价格的代码。

供应商名称/模块名称/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;
    }
}

享受20%的折扣

价格过滤器不适用于折价

注意:折扣价在客户级别


HI如果您想打折。因此,我建议您使用“目录价格规则”
Ravi Soni,

@ravi Soni我们创建了一个自定义模块。我们不能为此使用目录价格规则。
Dhairya Shah

@Rohan使用相同的版本,并且不起作用。
Priyank

我正在寻找将近4年没有任何解决方案的解决方案,希望您能找到一个解决方案,主要问题是分层导航中的价格直接来自表格,而您正在即时更改价格
WISAM HAKIM

@WISAMHAKIM不,没有适当的解决方案。希望一些Magento核心团队成员可以调查一下并提出一些解决方案:)
Priyank

Answers:


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在客户级别的价格上表现不佳。另一方面,您可以使用客户组。这可能意味着您会有很多组,这会使索引变慢。不幸的是,我没有另一个干净的解决方案。还是肮脏的。
马里斯(Marius)

找不到我想要的解决方案。但是,由于您是第一个回答问题的人,因此想为您提供奖励。
Priyank

2

据我了解Magento 2的流程结构,当我们创建目录价格规则并保存并应用该规则时。之后,我们必须重新索引数据以获取更新价格。届时,价格将在相应产品上更新并保存在catalog_product_index_price表格中。

但是,据我所知,该模块流程结构不是修改为分层导航过滤器呈现的产品集合。您可以在此处检查vendor/magento/module-catalog/Model/Layer.php getProductCollection()函数。因此,按照插件逻辑,您只需更新前端显示的值即可。但是,您没有在该产品集合(getProductCollection()函数数据)中更新final_pricemin_price字段值。

您还可以查看价格显示中的自定义折扣。但是,该产品没有以折扣价添加到购物车中。因此,我认为这不是一个完整的解决方案。

因此,您需要更新集合对象的final_pricemin_price,就像目录价格规则更新那样。

希望对您有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.