Zusatzinformationen für Produkte im Warenkorb anzeigen

Häufig braucht man eine Möglichkeit, um zusätzliche Informationen auf dem Quote-Item anzuzeigen. Das könnten Geschenktexte, Lieferinformationen oder andere wichtigen Dinge sein, welche man dem Kunden übersichtlich mit auf den Weg geben möchte. Magento hat dazu die sogenannten "additional options" auf Quote-Item-Ebene bereitgestellt.

Ich muss zugeben, dass ich diese sehr spät kennengelernt habe und in der Vergangenheit schon mehrere Anwendungsfälle für dieses Feature gehabt hätte. Statt dessen wird man häufig in Versuchung geführt, die einzelnen Informationen in zusätzlichen Spalten darzustellen und muss dafür sämtliche Templates überschreiben - das ist sehr viel Arbeit und erfordert eine Menge Änderungen (Warenkorb, Sichtkontrolle, Druck der Bestätigung, E-Mail-Templates, ...).

Aktuell entwickle ich gerade eine Erweiterung, mit welcher man Abo-Artikel abbilden kann. Dazu möchte ich je Artikel im Warenkorb natürlich anzeigen, ab wann das Abo losgeht, und vor allem wie oft es angestoßen wird. Hierzu nutzen wir das gleiche Event, wie schon beim Problem, jeden Artikel einzeln im Warenkorb aufzuführen.

<frontend>
    <events>
        <sales_quote_product_add_after>
            <observers>
                <webguys_betterrecurringprofiles>
                    <class>betterrecurringprofiles/observer</class>
                    <method>salesQuoteProductAddAfter</method>
                </webguys_betterrecurringprofiles>
            </observers>
        </sales_quote_product_add_after>
    </events>
</frontend>

/**
 * @param $observer Varien_Event_Observer
 */
public function salesQuoteProductAddAfter($observer)
{
    /** @var $helper Webguys_BetterRecurringProfiles_etc_Helper_Data */
    $helper = Mage::helper('betterrecurringprofiles');

    $items = $observer->getItems();

    /* @var $item Mage_Sales_Model_Quote_Item */
    foreach ($items AS $item) {

        $product = $item->getProduct();
        $item->addOption(
            new Varien_Object(
                array(
                    'product' => $product,
                    'code' => 'additional_options',
                    'value' => serialize(
                        array(
                            array(
                                'label' => 'Versandhäufigkeit',
                                'value' => $helper->__('%d Tage', $item->getRecurringItemInterval())
                            ),
                            array(
                                'label' => 'Termin',
                                'value' => Mage::helper('core')->formatDate($item->getRecurringItemNextDate(), 'short', false)
                            )
                        )
                    )
                )
            )
        );
    }
}

Wie man sieht, wird hier einfach die entsprechende Option hinzugefügt und fertig. Wirklich ganz einfach. Danach sieht man auch schon alle Optionen im Warenkorb.

AdditionalOptions-Cart

Leider merkt man nun schnell, dass nach Bestellabschluss all diese Optionen nicht mehr ersichtlich sind (seit Magento 1.5). Daher muss man diese mit in das Order-Item übernehmen. Mit einem Event-Observer und ein paar Zeilen ist auch das schnell erledigt.

<global>
    <events>
        <sales_convert_quote_item_to_order_item>
            <observers>
                <webguys_betterrecurringprofiles>
                    <class>betterrecurringprofiles/observer</class>
                    <method>salesConvertQuoteItemToOrderItem</method>
                </webguys_betterrecurringprofiles>
            </observers>
        </sales_convert_quote_item_to_order_item>
    </events>
</global>

/**
 * @param $observer Varien_Event_Observer
 */
public function salesConvertQuoteItemToOrderItem($observer)
{
    // Add additional options to order item
    // Otherwise they won't survive the conversion

    $quoteItem = $observer->getItem();
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
        $orderItem = $observer->getOrderItem();
        $options = $orderItem->getProductOptions();
        $options['additional_options'] = unserialize($additionalOptions->getValue());
        $orderItem->setProductOptions($options);
    }
}

Fertig! Ab jetzt findet man die entsprechenden Optionen überall wieder.

AdditionalOptions-Cart
AdditionalOptions-Admin


Ein Beitrag von Matthias Kleine
Matthias's avatar

Matthias Kleine hatte Mitte 2012 die ersten Kontakte mit Magento - dies geschah durch die Anstellung bei der code-x GmbH als Softwareentwickler. Seit dem bildet er sich ständig im Bereich eCommerce fort, schreibt eigene Extensions und stellt diese gerne auch als OpenSource-Projekte auf GitHub zur Verfügung. Seit Ende 2013 wird Matthias auch im Verzeichnis der zertifizierten Magento-Entwickler gelistet. @klein0r

Alle Beiträge von Matthias

Kommentare
Magento-Neuigkeiten #35 am

[…] Kleine zeigte, wie man Zusatzinformationen zu Warenkorbposten […]

Matthias Kleine am

Hi Simon,

nein das von dir genannte Beispiel beschreibt, wie man neue Spalten in der Tabelle Quote-Item zu einer gleichnamigen Spalte in Order-Item mitnimmt. In diesem speziellen Fall gibt es aber keine attribute_data unter dem order_item. Daher übernehmen wir diese Werte (siehe Observer) serialisiert mit in das Feld product_options.

Etwas verwirrend, aber nur so werden die Infos auch im Backend und auf den Mails ausgewertet. Ich nutze diese auch nur für reine Informationszwecke im Frontend/Backend. Die Daten liegen dann noch einmal in separaten Spalten, welche dann mittels XML (wie von dir beschrieben) übernommen werden. Ansonsten wäre es unglaublich anstrengend, immer mit dem serialisierten Feld zu arbeiten.

Simon Sprankel am

Cool, interessante Geschichte, danke für die Info. Müsste das Konvertieren zum Order Item aber nicht auch rein mit XML gehen? So wie z.B. hier ganz unten beschrieben: http://www.atwix.com/magento/custom-product-attribute-quote-order-item/ Oder geht das in diesem speziellen Fall nicht?

Dein Kommentar