Magento 提供了添加不是产品属性或产品自定义选项的选项的功能。它们在产品和报价单上设置,带有选项代码。additional_options
您需要执行两个步骤,每个步骤都可以通过事件观察器进行处理。如果您希望其他选项进行重新排序,则还需要观察第三个事件。
向报价单项目添加选项
第一步是添加事件观察者,以便在将已加载的产品添加到购物车之前设置其他选项。一种选择是使用事件。catalog_product_load_after
<catalog_product_load_after>
<observers>
<extra_options>
<type>model</type>
<class>extra_options/observer</class>
<method>catalogProductLoadAfter</method>
</extra_options>
</observers>
</catalog_product_load_after>
在事件观察者中,您可以添加其他检查,请求的页面确实是添加到购物车的操作。此观察器方法的要点是将特殊选项的选择添加到产品模型上的选项中。additional_options
public function catalogProductLoadAfter(Varien_Event_Observer $observer)
{
// set the additional options on the product
$action = Mage::app()->getFrontController()->getAction();
if ($action->getFullActionName() == 'checkout_cart_add')
{
// assuming you are posting your custom form values in an array called extra_options...
if ($options = $action->getRequest()->getParam('extra_options'))
{
$product = $observer->getProduct();
// add to the additional options array
$additionalOptions = array();
if ($additionalOption = $product->getCustomOption('additional_options'))
{
$additionalOptions = (array) unserialize($additionalOption->getValue());
}
foreach ($options as $key => $value)
{
$additionalOptions[] = array(
'label' => $key,
'value' => $value,
);
}
// add the additional options array with the option code additional_options
$observer->getProduct()
->addCustomOption('additional_options', serialize($additionalOptions));
}
}
}
附加选项将自动从产品移动到报价单项。有了这个观察者,您的选项将显示在购物车和结帐评论中。
添加选项以订购商品
为了让它们持续存在,需要一个额外的观察者(仅在Magento 1.5之后)。
<sales_convert_quote_item_to_order_item>
<observers>
<extra_options>
<type>model</type>
<class>extra_options/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</extra_options>
</observers>
</sales_convert_quote_item_to_order_item>
在这里,我们将选项从报价单项移动到订单项。
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
$quoteItem = $observer->getItem();
if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
$orderItem = $observer->getOrderItem();
$options = $orderItem->getProductOptions();
$options['additional_options'] = unserialize($additionalOptions->getValue());
$orderItem->setProductOptions($options);
}
}
从此时起,其他选项将显示在前端的客户订单历史记录和订单电子邮件中,以及管理界面订单视图,发票,发货,信用记录和PDF中。
添加对重新订购的支持
为了在重新订购期间将oprions带到新订单,您需要注意复制它们。这是使用该事件的一种可能性。checkout_cart_product_add_after
<checkout_cart_product_add_after>
<observers>
<extra_options>
<type>singleton</type>
<class>extra_options/observer</class>
<method>checkoutCartProductAddAfter</method>
</extra_options>
</observers>
</checkout_cart_product_add_after>
应将额外选项的解析和生成其他选项数组移到单独的函数中,以避免代码重复,但对于此示例,为了清楚起见,我将保留每个方法所需的逻辑。
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$action = Mage::app()->getFrontController()->getAction();
if ($action->getFullActionName() == 'sales_order_reorder')
{
$item = $observer->getQuoteItem();
$buyInfo = $item->getBuyRequest();
if ($options = $buyInfo->getExtraOptions())
{
$additionalOptions = array();
if ($additionalOption = $item->getOptionByCode('additional_options'))
{
$additionalOptions = (array) unserialize($additionalOption->getValue());
}
foreach ($options as $key => $value)
{
$additionalOptions[] = array(
'label' => $key,
'value' => $value,
);
}
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($additionalOptions)
));
}
}
}
译本:
没有适当的机制来转换这些选项标签或值。以下是一些在这方面可能有用的想法。
在quote_item_load_after事件观察器中,获取附加选项数组并设置 。如果设置了,Magento 将使用它来渲染显示。
订单项也可以这样做。$option['print_value'] = $helper->__($option['value']);
print_value
没有这样的东西,但您可以设置一个自定义索引(也许)并使用该索引作为源来动态设置标签,例如.print_label
label_source
$option['label'] = $helper->__($option['label_source']);
除此之外,您可能不得不求助于修改模板(grep for )或覆盖块类(grep)。getItemOptions()
additional_options