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.
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.