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;
}
}
Catatan: Harga diskon ada di tingkat pelanggan
magento2
price
magento2.3
layered-navigation
Dhairya Shah
sumber
sumber
Jawaban:
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_price
tabel.Jika Anda melihat pada pemilihan yang mengambil daftar produk Anda akan melihat sesuatu seperti ini:
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
prepareFinalPriceDataForType
dari 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:
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
Sekarang Anda harus dapat mengubah harga dalam tabel indeks yang Anda inginkan dengan menerapkan metode
modifyPrice
di kelas di atas.Hanya itu yang saya dapat.
sumber
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_price
tabel.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.
sumber