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% छूट लागू

कीमत फ़िल्टर डिस्काउंटेड प्राइस के साथ काम नहीं कर रहा है

नोट: रियायती मूल्य ग्राहक के स्तर पर है


HI अगर आप छूट देना चाहते हैं। तो मैं आपको "कैटलॉग प्राइस रूल" का उपयोग करने का सुझाव दे रहा हूं
रवि सोनी

@ श्रवी सोनी हमने एक कस्टम मॉड्यूल बनाया है। हम उसके लिए कैटलॉग मूल्य नियम का उपयोग नहीं कर सकते।
धािर्य शाह

@ रोहन एक ही संस्करण का उपयोग कर रहा है और इसके काम नहीं कर रहा है।
प्रियांक

मैं बिना किसी समाधान के लगभग 4 वर्षों से एक समाधान की तलाश कर रहा हूं, मुझे आशा है कि आप एक पाएंगे, मुख्य समस्या यह है कि स्तरित नेविगेशन में कीमतें सीधे टेबल से आ रही हैं, और आप मक्खी पर कीमत बदल रहे हैं
WISAM HAKIM

@ISAMHAKIM कोई उचित समाधान नहीं है। उम्मीद है कि कुछ Magento कोर टीम का आदमी इस पर गौर कर सकता है और कुछ समाधान सुझा सकता है :)
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ऊपर की कक्षा में विधि को लागू करके फिट देखते हैं ।

मुझे बस यही मिला।


महान व्याख्या। लेकिन यह मेरे लिए काम नहीं कर रहा है क्योंकि ग्राहक स्तर पर रियायती मूल्य।
धीर्या शाह Dha

1
हाँ। Magento ग्राहक स्तर पर कीमतों के साथ अच्छा नहीं खेलती है। दूसरी ओर, आप ग्राहक समूहों का उपयोग कर सकते हैं। इसका मतलब यह हो सकता है कि आपको बहुत सारे समूह मिलते हैं जो अनुक्रमण को धीमा कर देगा। दुर्भाग्य से मेरे पास एक और साफ समाधान नहीं है। या उस बात के लिए एक गंदा।
मेरियस

जिस समाधान की मुझे तलाश थी, वह नहीं मिला। लेकिन चूंकि आप प्रवाह के कुछ स्पष्टीकरण के साथ जवाब देने वाले पहले व्यक्ति थे, इसलिए आप बाउंटी अंक देना चाहेंगे।
प्रियांक

2

जैसा कि मैं Magento 2 प्रवाह संरचना को समझता हूं, जब हम कैटलॉग मूल्य नियम बनाते हैं और उस नियम को सहेजते हैं और लागू करते हैं। इसके बाद, हमें अपडेट मूल्य के लिए डेटा को फिर से लिखना होगा। उस समय, मूल्य उचित उत्पाद पर अद्यतन किया जाएगा और catalog_product_index_priceतालिका में सहेजा जाएगा ।

लेकिन, जैसा कि मैं इस मॉड्यूल प्रवाह संरचना को समझता हूं यह उस उत्पाद संग्रह को संशोधित नहीं करता है जो स्तरित नेविगेशन फ़िल्टर के लिए प्रस्तुत किया गया था। आप यहां vendor/magento/module-catalog/Model/Layer.php getProductCollection () फंक्शन देख सकते हैं। इसलिए, प्लगइन लॉजिक के अनुसार, आप केवल उस वैल्यू को अपडेट करते हैं जो फ्रंट एंड साइड पर प्रदर्शित होती है। लेकिन, आपने उस उत्पाद संग्रह में get_price और min_price फ़ील्ड मान अद्यतन नहीं किया ( getProductCollection () डेटा डेटा )।

आप उस मूल्य प्रदर्शन की भी जांच कर सकते हैं जो आपकी कस्टम छूट है। लेकिन, उत्पाद छूट की कीमत के साथ कार्ट में नहीं जोड़ा गया। इसलिए, मुझे लगता है कि यह पूर्ण समाधान नहीं है।

तो, आपको कैटलॉग प्राइस रूल अपडेट की तरह कलेक्शन ऑब्जेक्ट के फाइनल_प्राइस और मिन_प्राइस को अपडेट करना होगा।

आशा है, यह आपके लिए उपयोगी होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.