Magento 2: Filter Harga Navigasi Berlapis Tidak Berfungsi Setelah Diskon Produk Kustom Diterapkan

13

Saya mengerjakan modul diskon produk. Saya melakukannya melalui plugin dan pengamat. itu berfungsi dengan baik pada halaman produk dan halaman daftar. Tetapi filter harga tidak berfungsi sesuai dengan harga produk yang diperbarui.

Berikut adalah kode saya yang saya gunakan untuk menyesuaikan harga.

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;
    }
}

Diskon 20% Diterapkan

Filter Harga Tidak Berfungsi Dengan Harga Diskon

Catatan: Harga diskon ada di tingkat pelanggan

Dhairya Shah
sumber
HI Jika Anda ingin memberikan diskon. Jadi saya menyarankan Anda untuk menggunakan "Aturan Harga Katalog"
Ravi Soni
@ravi Soni Kami telah membuat modul khusus. kita tidak bisa menggunakan aturan harga katalog untuk itu.
Dhairya Shah
@Rohan Menggunakan versi yang sama dan tidak berfungsi.
Priyank
Saya mencari solusi karena hampir 4 tahun tanpa solusi, saya harap Anda akan menemukan satu, masalah utama adalah harga dalam navigasi berlapis datang dari tabel langsung, dan Anda mengubah harga dengan cepat
WISAM HAKIM
@WISAMHAKIM Tidak ada solusi yang tepat. Semoga beberapa orang tim inti Magento dapat melihat ini dan menyarankan beberapa solusi :)
Priyank

Jawaban:

5

Ini bukan solusi, tetapi mungkin penjelasan tentang cara kerja filter harga. Ini mungkin membantu mengidentifikasi solusi.

Harga yang ditampilkan dalam daftar produk berasal dari catalog_product_index_pricetabel.
Jika Anda melihat pada pemilihan yang mengambil daftar produk Anda akan melihat sesuatu seperti ini:

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 ...

dalam kasus Anda, itu tidak berfungsi karena Anda mengubah harga akhir produk dengan cepat, ketika produk tersebut dibubarkan. Tetapi dalam tabel indeks harga Anda masih memiliki harga asli.

Pengindeksan aktual terjadi (setidaknya untuk produk sederhana) di Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex.
Saya tidak dapat sepenuhnya menjelaskan apa yang terjadi di sana, tetapi Anda memiliki sesuatu untuk dihubungkan.

Metode prepareFinalPriceDataForTypedari kelas yang sama disebut pada awal proses pengindeksan.
Metode ini diakhiri dengan $this->modifyPriceIndex($finalPriceTable);
Ini adalah sesuatu yang dapat Anda kaitkan ke buy menciptakan kelas pengubah harga dan melampirkannya ke daftar pengubah harga.
Anda dapat membuat pengubah harga seperti ini:

<?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.
     }
}

Anda dapat menemukan contoh pengubah harga di Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter. Ini menghilangkan produk yang tidak ada stok dari indeks harga jika Anda mengatur untuk menyembunyikan produk Anda yang sudah habis.

Anda telah membuat pengubah harga, sekarang Anda harus melampirkannya ke daftar pengubah harga yang ada.

Anda dapat melakukannya dari file di.xml Anda dengan

<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>

Sekarang Anda harus dapat mengubah harga dalam tabel indeks yang Anda inginkan dengan menerapkan metode modifyPricedi kelas di atas.

Hanya itu yang saya dapat.

Marius
sumber
Penjelasan yang bagus. tapi itu tidak berfungsi untuk saya karena harga diskon di tingkat pelanggan.
Dhairya Shah
1
ya. Magento tidak cocok dengan harga di tingkat pelanggan. Di sisi lain, Anda dapat menggunakan grup pelanggan. Ini mungkin berarti Anda mendapatkan banyak grup yang akan membuat pengindeksan lebih lambat. Sayangnya saya tidak punya solusi bersih lain. Atau yang kotor dalam hal ini.
Marius
Tidak punya solusi yang saya cari. Tetapi karena Anda adalah orang pertama yang menjawab dengan penjelasan tentang aliran ingin memberi Anda poin hadiah.
Priyank
2

Seperti yang saya pahami struktur aliran Magento 2, Saat kami membuat aturan harga katalog dan menyimpan & menerapkan aturan itu. Setelah itu, kita harus memasukkan kembali data untuk harga pembaruan. Pada saat itu, harga akan diperbarui pada produk yang sesuai dan disimpan dalam catalog_product_index_pricetabel.

Tapi, seperti yang saya pahami struktur aliran modul ini, itu tidak mengubah koleksi produk yang dibuat untuk filter navigasi berlapis. Anda dapat memeriksa di sini fungsi vendor/magento/module-catalog/Model/Layer.php getProductCollection () . Jadi, sesuai logika plugin, Anda hanya memperbarui nilai yang ditampilkan di sisi ujung depan. Tapi, Anda tidak memperbarui final_price dan MIN_PRICE nilai field dalam koleksi produk ( getProductCollection () fungsi Data ).

Anda juga dapat memeriksa tampilan harga yang diskon khusus Anda. Namun, produk itu tidak menambahkan keranjang dengan harga diskon. Jadi, saya pikir itu bukan solusi lengkap.

Jadi, Anda perlu memperbarui final_price dan min_price objek koleksi seperti pembaruan aturan harga katalog itu.

Semoga bermanfaat bagi Anda.

Rohan Hapani
sumber