摘要
我想创建一个产品属性,该属性不保存到产品中,也不像普通产品属性一样显示在产品编辑页面上。相反,我希望将其保存到订单/报价项目中并显示在订单,发票等上。在将产品添加到购物车之前,客户还应该可以在前端对它进行配置。
细节
我的问题
<input>
更新1
我发现我可以在以下事件期间在catalog/product模型上运行该代码(可能sales/quote_item也可以)sales_quote_item_qty_set_after
catalog/product
sales/quote_item
sales_quote_item_qty_set_after
$infoBuyRequest = $product->getCustomOption('info_buyRequest'); $buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue())); $myData = $buyRequest->getMyData();
这样,我就可以<input>在产品页面上从我的客户提供的自定义数据中检索数据。
我怀疑这info_buyRequest与报价和订单项一起保存。如果是这样,这 部分 解决了我的问题1和2。但是,我仍然不知道在哪里运行此代码,并且我也不知道如何在后端订单/报价/报告页面上显示它。我也相信,因为这是作为序列化值存储在数据库中的,所以基于我的自定义数据来获取报价/订单项集合将是最困难的。
info_buyRequest
Magento提供了添加非产品属性或产品自定义选项的选项的功能。它们设置在产品上,并使用选项代码报价项目additional_options。
additional_options
您需要执行两个步骤,每个步骤都可以通过事件观察器进行处理。如果您希望其他选项能够进行重新排序,则还需要注意第三件事。
第一步是添加事件观察器,以便在将已加载产品添加到购物车之前在其上设置其他选项。一种选择是使用catalog_product_load_after事件。
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中可见。
为了在重新订购期间将Oprion转移到新订单,您需要注意将其复制。这是使用该checkout_cart_product_add_after事件的一种可能性。
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事件观察器中,获取其他选项数组并设置$option['print_value'] = $helper->__($option['value']);。如果print_value设置了,Magento将使用它来渲染显示。 订单项也可以这样做。
$option['print_value'] = $helper->__($option['value']);
print_value
没有a之类的东西print_label,但是您可以设置一个自定义索引(label_source也许),并使用该索引作为源即时设置标签,例如$option['label'] = $helper->__($option['label_source']);。
print_label
label_source
$option['label'] = $helper->__($option['label_source']);
除此之外,您可能还不得不诉诸于修改模板(grep为getItemOptions()),或覆盖块类(grep additional_options)。
getItemOptions()