Magento 2: Katmanlı Navigasyon Fiyat Filtresi Uygulanan Özel Ürün İndirimi Sonrası Çalışmıyor


13

Bir ürün indirim modülü üzerinde çalışıyorum. Eklenti ve gözlemci ile yaptım. ürün sayfasında ve liste sayfasında iyi çalışıyor. Ancak fiyat filtresi güncellenen ürün fiyatına göre çalışmıyor.

İşte fiyatı özelleştirmek için kullandığım kodum.

SatıcıAdı / 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>

SatıcıAdı / 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>

SatıcıAdı / modulename / Gözlemci / 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);
    }
}

SatıcıAdı / modulename / Eklenti / 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 İndirim Uygulandı

Fiyat Filtresi İndirimli Fiyatla Çalışmıyor

Not: indirimli fiyat müşteri düzeyinde


HI Bir indirim vermek istiyorsanız. Bu yüzden size "Katalog Fiyat Kuralı" kullanmanızı öneriyorum
Ravi Soni

@ravi Soni Özel bir modül oluşturduk. bunun için katalog fiyat kuralını kullanamayız.
Dhairya Şah

@ Rohan Aynı sürümü kullanarak ve çalışmıyor.
Priyank

Neredeyse 4 yıldan beri herhangi bir çözüm olmadan bir çözüm arıyorum, umarım bir tane bulacaksınız, asıl sorun katmanlı navigasyondaki fiyatlar doğrudan masadan geliyor ve fiyatı anında değiştiriyorsunuz
WISAM HAKIM

@WISAMHAKIM Hayır uygun bir çözüm yok. Umarım bazı Magento çekirdeği ekibi buna bakar ve çözüm önerebilir :)
Priyank

Yanıtlar:


5

Bu bir çözüm değildir, ancak fiyat filtrelerinin nasıl çalıştığının bir açıklaması olabilir. Bu bir çözümün tanımlanmasına yardımcı olabilir.

Ürünler listesinde gösterilen fiyatlar catalog_product_index_pricetablodan alınmıştır.
Ürün listesini alan seçime bakarsanız şöyle bir şey görürsünüz:

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

sizin durumunuzda, işe yaramaz çünkü ürün elden çıkarıldığında ürünün nihai fiyatını anında değiştirirsiniz. Ancak fiyat endeksi tablosunda hala orijinal fiyatınız var.

Gerçek indeksleme işlemi (en azından basit ürünler için) içinde gerçekleşir Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex.
Orada ne olduğunu tam olarak açıklayamıyorum, ama takacağınız bir şey var.

prepareFinalPriceDataForTypeAynı sınıftan yöntem dizin oluşturma işleminin başında çağrılır.
Bu yöntem ile biter $this->modifyPriceIndex($finalPriceTable);
Bu, bir fiyat değiştirici sınıfı oluşturmak ve fiyat değiştirici listesine eklemek için satın almanız gereken bir şeydir.
Bunun gibi bir fiyat değiştirici oluşturabilirsiniz:

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

İçinde fiyat değiştirici örneği bulabilirsiniz Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter. Bu, stokta olmayan ürünlerinizi gizlemeye ayarladıysanız stokta olmayan ürünleri fiyat endeksinden kaldırır.

Fiyat değiştiricinizi oluşturdunuz, şimdi mevcut fiyat değiştiriciler listesine eklemeniz gerekiyor.

Bunu di.xml dosyanızdan

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

Şimdi modifyPriceyukarıdaki sınıftaki yöntemi uygulayarak endeks tablosundaki fiyatları uygun gördüğünüz şekilde değiştirebilmelisiniz .

Tüm sahip olduğum bu.


Harika bir açıklama. ama müşteri için indirimli fiyat çünkü benim için çalışmıyor.
Dhairya Shah

1
Evet. magento, müşteri seviyesindeki fiyatlar ile iyi oynamıyor. Öte yandan, müşteri gruplarını kullanabilirsiniz. Bu, dizine eklemeyi yavaşlatacak birçok grup alacağınız anlamına gelebilir. Maalesef başka bir temiz çözümüm yok. Veya bu konu için kirli olanı.
Marius

Aradığım çözümü bulamadım. Ama siz bazı akış açıklamalarıyla ilk cevapladığınız için size lütuf puanı vermek istersiniz.
Priyank

2

Magento 2 akış yapısını anladığım gibi, katalog fiyat kuralı oluşturduğumuzda ve bu kuralı kaydedip uyguladığımızda. Ardından, güncelleme fiyatı için verileri yeniden endekslememiz gerekir. O zaman, fiyat uygun üründe güncellenecek ve catalog_product_index_pricetabloya kaydedilecektir.

Ancak, bu modül akış yapısını anladığım gibi, katmanlı gezinme filtresi için oluşturulan ürün koleksiyonunu değiştirmez. vendor/magento/module-catalog/Model/Layer.php GetProductCollection () işlevini buradan kontrol edebilirsiniz . Yani, eklenti mantığına göre, sadece ön uçta görüntülenen değeri güncellersiniz. Ancak, bu ürün koleksiyonundaki ( getProductCollection () işlev verileri ) final_price ve min_price alan değerlerini güncellemediniz .

Ayrıca özel indirim hangi fiyat ekranını kontrol edebilirsiniz. Ancak, ürün indirimli fiyatla sepete eklemedi. Bence bu tam bir çözüm değil.

Bu nedenle, koleksiyon nesnesinin final_price ve min_price değerlerini katalog fiyat kuralı güncellemesi gibi güncellemeniz gerekir.

Umut, sizin için yararlı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.