Kurzinfo


Andreas von Studnitz

mehr »

Andreas von Studnitz arbeitet seit 2012 als Geschäftsführer und Entwickler für die Magento-Agentur integer_net GmbH. Aktuelle Informationen finden Sie unter www.integer-net.de

Kontakt

Bitte kontaktieren Sie mich über die Website von integer_net.

mehr »

< Magento: Schnelles Auslesen von Attributen

Magento: Umsetzung von flexiblen Preisen

01.11.2010 23:18

Produktpreise sind nicht immer fest, sondern können von den verschiedensten Parametern festhängen. Inhalt dieses Beitrags ist nicht die Berechnung der Preise, sondern die Übernahme in den Magento-Bestellprozess. Im Warenkorb und in allen weiteren Schritten darf nicht der Original Produkt-Preis stehen, sondern der berechnete, ausgelesene oder generierte. 

Ich gehe dabei davon aus, dass der Preis auf der Produktseite generiert wird (oder an einer anderen Stelle mit einem entsprechenden Formular zum Hinzufügen eines Produkts zum Warenkorb). In diesem Formular können weitere Eingabe-Felder hinzugefügt, auf deren Basis die Preisberechnung erfolgt. Diese können z.B. auch versteckt sein und ausschließlich der Berechnung dienen. Für dieses Beispiel setzen wir ein Eingabefeld namens "price" ein - für den produktiven Einsatz ist das nicht empfohlen, da das Feld durch den Benutzer veränderbar ist.

Jedes Eingabefeld wird automatisch in die Produktoption "info_buyRequest" übernommen. Dort kann es für die Preisberechnung wieder ausgelesen werden. Die Preisberechnung findet in der Method getFinalPrice der Klasse Mage_Catalog_Model_Product_Type_Price statt. Dort findet sich auch ein Event namens "catalog_product_get_final_price", das wir nutzen können.

Für dieses Event nutzen wir also einen Observer. Dieser wird in der config.xml eines eigenen Moduls definiert:

<global>
    [...]
    <events>
        <catalog_product_get_final_price>
            <observers>
                <modulename_catalog_product_get_final_price>
                    <type>singleton</type>
                    <class>Namespace_Modulename_Model_Observer</class>
                    <method>getFinalPrice</method>
                </modulename_catalog_product_get_final_price>
            </observers>
        </catalog_product_get_final_price>
    </events>
</global>

Die zugehörige Methode getFinalPrice in der Klasse Namespace_Modulename_Model_Observer sieht wie folgt aus:

/**
 * Update price for product items
*
* @param Varien_Event_Observer $observer
*/
public function getFinalPrice($observer) {

    /* @var Mage_Catalog_Model_Product $product */
    $product = $observer->getEvent()->getProduct();

    if ($buyRequest = $product->getCustomOption('info_buyRequest')) {

        $buyRequest = unserialize($buyRequest->getValue());

        if (is_array($buyRequest) && isset($buyRequest['price'])) {

            $product->setFinalPrice(floatval($buyRequest['price']));
        }
    }
}

Kommentare