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 / 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 / สังเกตการณ์ / 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 / ปลั๊กอิน / 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% ถูกนำไปใช้

ตัวกรองราคาไม่ทำงานกับราคาส่วนลด

หมายเหตุ: ราคาที่ลดเป็นระดับลูกค้า


สวัสดีถ้าคุณต้องการให้ส่วนลด ดังนั้นฉันขอแนะนำให้คุณใช้ "กฎราคาแค็ตตาล็อก"
Ravi Soni

@ravi Soni เราได้สร้างโมดูลที่กำหนดเองแล้ว เราไม่สามารถใช้กฎราคาแคตตาล็อกสำหรับสิ่งนั้น
Dhairya Shah

@Rohan ใช้รุ่นเดียวกันและไม่ทำงาน
Priyank

ฉันกำลังมองหาวิธีแก้ปัญหาตั้งแต่เกือบ 4 ปีโดยไม่มีวิธีแก้ปัญหาใด ๆ ฉันหวังว่าคุณจะพบหนึ่งปัญหาหลักคือราคาในการนำทางแบบเลเยอร์มาจากตารางโดยตรงและคุณกำลังเปลี่ยนแปลงราคาได้ทันที
WISAM HAKIM

@WISAMHAKIM ไม่ไม่ได้แก้ปัญหาที่เหมาะสม หวังว่าทีมคอร์กลางของวีโอไอพีบางคนจะสามารถตรวจสอบเรื่องนี้และแนะนำวิธีแก้ปัญหาบางอย่าง :)
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
ใช่. คุณภาพเยี่ยมไม่ดีกับราคาในระดับลูกค้า ในทางกลับกันคุณสามารถใช้กลุ่มลูกค้า นี่อาจหมายความว่าคุณได้รับกลุ่มจำนวนมากที่จะทำให้การจัดทำดัชนีช้าลง น่าเสียดายที่ฉันไม่มีวิธีแก้ปัญหาที่สะอาดอีก หรือสิ่งสกปรกสำหรับเรื่องนั้น
Marius

ไม่พบวิธีแก้ปัญหาที่ฉันค้นหา แต่เนื่องจากคุณเป็นคนแรกที่ตอบด้วยคำอธิบายบางอย่างเกี่ยวกับการไหลต้องการให้คะแนนความโปรดปรานแก่คุณ
Priyank

2

ตามที่ฉันเข้าใจโครงสร้างการไหลของวีโอไอพี 2 เมื่อเราสร้างกฎราคาแคตตาล็อกและบันทึกและใช้กฎนั้น หลังจากนั้นเราจะต้องสร้างดัชนีข้อมูลใหม่เพื่อรับราคาอัพเดต ในเวลานั้นราคาจะถูกปรับปรุงบนผลิตภัณฑ์ที่เหมาะสมและบันทึกในcatalog_product_index_priceตาราง

แต่เนื่องจากฉันเข้าใจโครงสร้างการไหลของโมดูลนี้จึงไม่ได้ปรับเปลี่ยนการรวบรวมผลิตภัณฑ์ซึ่งสร้างการแสดงผลสำหรับตัวกรองการนำทางแบบเลเยอร์ คุณสามารถตรวจสอบได้ที่นี่ฟังก์ชั่นvendor/magento/module-catalog/Model/Layer.php getProductCollection () ดังนั้นตามตรรกะปลั๊กอินคุณเพียงแค่อัปเดตค่าที่จะแสดงที่ส่วนหน้า แต่คุณไม่ได้อัปเดfinal_priceและMIN_PRICEค่าเขตข้อมูลในการเก็บรวบรวมผลิตภัณฑ์ที่ ( getProductCollection (ข้อมูล) ฟังก์ชั่น )

คุณสามารถตรวจสอบราคาที่แสดงซึ่งเป็นส่วนลดที่คุณกำหนดเอง แต่ผลิตภัณฑ์ไม่ได้เพิ่มในรถเข็นพร้อมกับส่วนลด ดังนั้นฉันคิดว่ามันไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์

ดังนั้นคุณต้องอัปเดตfinal_priceและmin_priceของออบเจกต์คอลเลคชั่นเหมือนกฎราคาแคตตาล็อกอัพเดทที่

หวังว่ามันจะเป็นประโยชน์สำหรับคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.