Magento Bündelprodukte: Staffelpreise der einfachen Produkte nutzen

Ein Magento-Bug, der seit Jahren immer wieder im Magento-Forum und auf StackOverflow kursiert, ist, dass Staffelpreise mit Bündelprodukten nicht sauber zusammen funktionieren. Mit der Zeit gab es einige Verbesserungen, aber Stand heute (Magento CE 1.9) funktioniert folgendes immer noch nicht:

  • Einzelprodukte mit Staffelpreisen und Qty > 1 im Bündel
  • “Preis wie konfiguriert”-Anzeige in Bündelprodukten mit Staffelpreisen

Es gibt einige Vorschläge im Netz aber mehr Fragen als Antworten, also haben ich eine (hoffentlich) vollständige Lösung erstellt, die ohne Core-Hacks und nur mit einem minimal-invasiven Class Rewrite auskommt. Bis Magento es also selbst in den Griff bekommen hat, kann dieses Modul verwendet werden, um Bundles mit Staffelpreisen zu ermöglichen:

SGH_BundleTierPrices (getestet in Magento CE 1.8 und Magento CE 1.9)

Welche Änderungen im Detail vorgenommen wurden und wie, das möchte ich hier erläutern:

Bugfixes

Preisberechnung

Das Problem: bei Bündeloptionen, die selber Staffelpreise haben werden die Staffelpreise im Bündel nicht korrekt angewendet.

Der Übeltäter ist Mage_Bundle_Model_Product_Price::getSelectionFinalTotalPrice():

 if ($bundleProduct->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
    $price = $selectionProduct->getFinalPrice($takeTierPrice ? $selectionQty : 1);
}

Hier wird für die für die Preisberechnung die im Bündel konfigurierte Menge $selectionQty verwendet, aber die Menge des Bündels selbst ignoriert. Der Parameter von getFinalPrice() wird übrigens nur für die Staffelpreis-Berechnung verwendet, die Methode gibt immer einen Einzelpreis zurück.

Korrigiert sieht die Zeile so aus:

if ($bundleProduct->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
    $price = $selectionProduct->getFinalPrice($takeTierPrice ? $selectionQty * max(1, $bundleQty) : 1);
}

Wenn also die Menge des Bündels $bundleQty bekannt ist, wird sie multipliziert.

Damit der Preis nicht nur im Bündel sondern auch in der einzelnen Auswahl korrekt gespeichert wird, muss zusätzlich die Neuberechnung des Final Price für die Auswahl erzwungen werden, da dieser zumindest in einigen Fällen bereits vorher kalkuliert wurde. Dazu habe ich folgendes am Anfang der Methode hinzugefügt:

if ($takeTierPrice) {
    $selectionProduct->setFinalPrice(null);
}

Preisanzeige im Frontend

Das Problem: Bei Staffelpreisen funktioniert die dynamische Preisanzeige “Preis wie konfiguriert” nicht.

Der Übeltäter ist Mage_Catalog_Model_Product_Type_Price::getTierPrice(), die Methode gibt ein Array mit Staffelpreis-Informationen zurück. Die Array-Keys sind allerdings Strings in der Form {Kundengruppe}-{Menge}, generiert in Mage_Catalog_Model_Product_Attribute_Backend_Groupprice_Abstract::preparePriceData(). Wenn dieses Array nun für die dynamische Preisanzeige als JSON ausgegeben wird, wird es wegen der String-Schlüssel zu einem Objekt. Das JavaScript erwartet aber ein Array und versucht über numerische Indizes zu iterieren.

Wir müssen also erreichen, dass getTierPrice() ein numerisches Array zurückgibt. Das Backend-Model wollte ich lieber nicht ändern, die getTierPrice() Methode wird dagegen soweit ich es sehe nirgendwo verwendet, wo die String-Schlüssel relevant wären. Der Rewrite sieht also wie folgt aus:

public function getTierPrice($qty = null, $product)
{
    $tierPrice = parent::getTierPrice($qty, $product);
    if (is_array($tierPrice)) {
        return array_values($tierPrice);
    }
    return $tierPrice;
}

Installation der Extension

Mit Composer

    "require": {
        "sgh/bundletierprices": "dev-master",
    }
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/sgh-it/bundletierprices.git"
        }
    ]

Manuell

  1. Source Code herunterladen
  2. app in das Verzeichnis der Magento Installation kopieren (es werden keine Dateien überschrieben, nur hinzugefügt.)

7 Replies to “Magento Bündelprodukte: Staffelpreise der einfachen Produkte nutzen”

  1. Hallo Herr Schmengler,

    vielen dank für die super “Extension”. Folgende Frage jedoch noch, ist es auch möglich wenn man in die “Total”-Menge z.B. 20 einträgt, dass dann entsprechend neben den “Singleproducts” nicht der “normale” Einzelpreis steht, sondern auch direkt der richtige Staffelpreis für 20 Stk dort steht?

    Ist dies verständlich 🙂 Über eine Antwort würde ich mich sehr freuen

    1. Hallo Herr Boender,

      für diese Preise ist leider keine automatische Aktualisierung vorgesehen, das wird durch meinen Bugfix entsprechend auch nicht abgedeckt. Mit zusätzlicher eigener JavaScript-Entwicklung sollte es aber möglich sein, da die Daten ja nun korrekt im JSON-Objekt vorbereitet sind.

  2. Thanks for this!
    It works fine on 1.9.1 and it is exactly what i needed.
    Frenchman in France

  3. Thank you Fabian for producing this extension. I have installed it but am not getting the price to update dynamically. Would it be possible to contact you to troubleshoot this? I have budget to do this.

  4. Hey Fabian!

    This extension you’ve written is EXACTLY what I am looking for! However after installing, nothing appears to have changed. The items are showing the correct tier price next to the items, however when clicking them, the configured price just stays at $0.00, and you aren’t able to Add to Cart the selected options either. Any idea what could be going on? You can see what is going on in this image: http://i64.tinypic.com/de0djp.jpg .. Any insight would be greatly appreciated! Thanks!

Comments are closed.