Verwenden Sie Magento opConfig.reloadPrice () mit den Optionen jQuery und Custom

7

Ich versuche, das Magento reloadPrice()zu verwenden jQuery, um den Preis zu aktualisieren. Ich habe ein konfigurierbares Produkt mit benutzerdefinierten Optionen. Ohne lautet jQueryder SELECTCode für die Option:

<select id="select_281" class=" required-entry product-custom-option" title="" name="options[281]" onchange="opConfig.reloadPrice()">
<option value="0"></option>
<option rel="1" price="0" value="275"></option>
<option rel="2" price="0" value="276"></option>
</select>

Mit jQuery entferne ich den Prototype onchange-Code und versuche, den Preis für meine Option zu berechnen (z. B. 50 USD):

jQuery('#select_281').removeAttr('onchange').change(function(){

//Price of the option to add to a basic price of the conf product
price = 50;

optionsPrice.changePrice('opConfig', price);
optionsPrice.reload();

});

Preis des konfigurierbaren Produkts: $ 150.

Fügen Sie eine Option hinzu (SELECT): Wir fügen 50 US-Dollar hinzu.

Der neue Preis von 200 US-Dollar wird auf der Produktseite angezeigt, jedoch nicht auf der Warenkorbseite: Auf der Warenkorbseite werden nur 150 US-Dollar angezeigt, was nicht korrekt ist.

filtern
quelle

Antworten:

2

Der Javascript-Code wird nur auf der Clientseite ausgeführt.
Sie können also grundsätzlich alles mit den Preisen machen (wie Sie es bereits getan haben), aber dies hat keinen Einfluss auf die serverseitigen Berechnungen des Preises des Produkts, wenn es in den Warenkorb gelegt wird.
Wenn Sie eine benutzerdefinierte Logik für den Preis im Warenkorb wünschen, müssen Sie einen Code schreiben, der den Preis ändert.
Ich empfehle, eines dieser Ereignisse checkout_cart_save_beforeoder checkout_cart_add_product_completeoder zu beobachten catalog_product_get_final_price. Sehen Sie, was immer Ihren Bedürfnissen entspricht.

Marius
quelle
Mit 2 Beobachtern gelöst, checkout_cart_product_add_after Beobachter, um den Preis zu ändern, wenn das Produkt zum ersten Mal in den Warenkorb gelegt wird, und checkout_cart_update_items_after, um den Preis für jeden Artikel im Warenkorb zu ändern (wenn der Benutzer auf der Warenkorbseite auf die Schaltfläche "Warenkorb ändern" klickt). Klicken Sie auf der Warenkorbseite auf den Link "Bearbeiten". Die Produktseite wird angezeigt, damit der Benutzer die Menge ändern kann. Klicken Sie auf die Schaltfläche "Warenkorb aktualisieren" (wodurch der Preis nicht aktualisiert wird). So erzwingen Sie die Aktion "Warenkorb aktualisieren", um den Code in checkout_cart_product_add_after Observer zu verarbeiten ? Wird dieser Code nur ausgeführt, wenn das Produkt zum ersten Mal in den Warenkorb gelegt wird?
tokey
1

Die Lösung: Verwenden Sie 2 Beobachter:

//checkout_cart_product_add_after observer
    public function modifyPrice(Varien_Event_Observer $observer)
    {
        $item = $observer->getQuoteItem();
        $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
        $productType = $product->getTypeID();
        $price = 100;//Unit price of product without engraving, 100 for example

        //Unit price with engraving, depending of 2 custom options of configurable product
        if($productType == 'configurable'){
            //get custom options of config here
            .
            .
            $engravingPrice = 1.2;//Get unit price with engraving from a special MySQL table
            $finalUnitPrice = $price + $engravingPrice;//Final custom price

            //Modify the price
            $item->setCustomPrice($finalUnitPrice);
            $item->setOriginalCustomPrice($finalUnitPrice);
            $item->getProduct()->setIsSuperMode(true);
        }
    }

    //checkout_cart_update_items_after observer
    public function modifyCartItems(Varien_Event_Observer $observer)
    {
        foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item ) {
            if ($item->getParentItem()) {$item = $item->getParentItem();}
            $productType = $product->getTypeID();
            $productType = $product->getTypeID();
            $price = 100;//Unit price of product without engraving

            //Unit price with engraving, depending of 2 custom options of configurable product
            if($productType == 'configurable'){
                .
                .
                $engravingPrice = 1.2;//Get unit price with engraving from a special MySQL table
                $finalUnitPrice = $price + $engravingPrice;//Final custom price

                //Modify the price for the item
                $item->setCustomPrice($finalUnitPrice);
                $item->setOriginalCustomPrice($finalUnitPrice);
                $item->getProduct()->setIsSuperMode(true);
            }
        }
    }

Es läuft gut, aber ... eine Frage bleibt:

Wenn der Benutzer auf der Warenkorbseite auf den Link "Bearbeiten" klickt, um das Produkt auf der Produktseite zu bearbeiten, damit er die Menge ändern kann, und auf die Schaltfläche "Warenkorb aktualisieren" klickt, liest diese Aktualisierungsschaltfläche nicht den checkout_cart_product_add_after, um den Preis zu aktualisieren.

Wie kann diese Aktion "Warenkorb aktualisieren" erzwungen werden, um den Code in checkout_cart_product_add_after Observer zu verarbeiten? Wird dieser Code nur ausgeführt, wenn das Produkt zum ersten Mal in den Warenkorb gelegt wird?

Vielen Dank.

filtern

filtern
quelle