Pracuję nad modułem rabatu na produkty. Zrobiłem to za pomocą wtyczki i obserwatora. działa dobrze na stronie produktu i stronie listy. Ale filtr cen nie działa zgodnie ze zaktualizowaną ceną produktu.
Oto mój kod, którego używam do dostosowania ceny.
Nazwa dostawcy / nazwa modułu / 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;
}
}
Uwaga: obniżona cena jest na poziomie klienta
magento2
price
magento2.3
layered-navigation
Dhairya Shah
źródło
źródło
Odpowiedzi:
To nie jest rozwiązanie, ale może być wyjaśnieniem, jak działają filtry cen. Może to pomóc w znalezieniu rozwiązania.
Ceny wyświetlane na liście produktów pochodzą z
catalog_product_index_price
tabeli.Jeśli spojrzysz na wybór, który pobiera listę produktów, zobaczysz coś takiego:
w twoim przypadku nie działa, ponieważ zmieniasz ostateczną cenę produktu w locie, gdy produkt jest wysyłany. Ale w tabeli indeksu cen nadal masz oryginalną cenę.
Rzeczywiste indeksowanie ma miejsce (przynajmniej dla prostych produktów) w
Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice::reindex
.Nie potrafię w pełni wyjaśnić, co się tam dzieje, ale masz coś, na czym można się przyłączyć.
Metoda
prepareFinalPriceDataForType
z tej samej klasy jest wywoływana na początku procesu indeksowania.Ta metoda kończy się na:
$this->modifyPriceIndex($finalPriceTable);
To jest coś, do czego możesz się podłączyć, tworząc klasę modyfikatora ceny i dołączając ją do listy modyfikatorów ceny.
Możesz utworzyć taki modyfikator ceny:
Przykład modyfikatora ceny można znaleźć w
Magento\CatalogInventory\Model\Indexer\ProductPriceIndexFilter
. Spowoduje to usunięcie produktów z magazynu z indeksu cen, jeśli ustawisz ukrywanie produktów z magazynu.Utworzyłeś modyfikator ceny, teraz musisz dołączyć go do istniejącej listy modyfikatorów ceny.
Możesz to zrobić z pliku di.xml za pomocą
Teraz powinieneś być w stanie modyfikować ceny w tabeli indeksu według własnego uznania, wdrażając metodę
modifyPrice
w powyższej klasie.To wszystko co mam.
źródło
Jak rozumiem strukturę przepływu Magento 2, kiedy tworzymy regułę ceny katalogowej oraz zapisujemy i stosujemy tę regułę. Następnie musimy ponownieindeksować dane w celu aktualizacji ceny. W tym czasie cena zostanie zaktualizowana na odpowiednim produkcie i zapisana w
catalog_product_index_price
tabeli.Ale, jak rozumiem tę strukturę przepływu modułu, nie modyfikuje tej kolekcji produktów, która była renderowana dla warstwowego filtru nawigacji. Możesz sprawdzić tutaj
vendor/magento/module-catalog/Model/Layer.php
funkcję getProductCollection () . Tak więc, zgodnie z logiką wtyczek, po prostu aktualizujesz wartość wyświetlaną z przodu. Ale nie zaktualizowałeś wartości pola final_price i min_price w tej kolekcji produktów ( dane funkcji getProductCollection () ).Możesz także sprawdzić wyświetlaną cenę, która jest niestandardową zniżką. Ale produkt nie został dodany do koszyka z obniżoną ceną. Myślę więc, że to nie jest pełne rozwiązanie.
Musisz więc zaktualizować cenę końcową i cenę minimalną obiektu kolekcji, tak jak aktualizacja reguły ceny katalogowej.
Mam nadzieję, że ci się przyda.
źródło