自定义选项仅作为选项 ID 和值存储在报价单中。每次渲染选项时,它们基本上都是从数据库中重新加载的。
如果您修改这些值,则需要保存它们,这将为每个人设置它们。
也就是说,我通过使用事件观察器即时添加具有修改值的附加自定义选项来解决此问题。为此,我使用了其他选项。
然后我从报价项中删除原始自定义选项。
直到 1.4 Magento 完成了其余的工作,但从那时起,您需要手动将附加选项复制到订单项目,并且如果重新订购项目,还需要注意重新设置它。
所以这里是一个示例观察者配置。
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>checkoutCartProductAddAfter</method>
</customoptions>
</observers>
</checkout_cart_product_add_after>
<sales_convert_quote_item_to_order_item>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</customoptions>
</observers>
</sales_convert_quote_item_to_order_item>
</events>
</frontend>
其余的在观察者类中处理。
/**
* Add additional options to order item product options (this is missing in the core)
*
* @param Varien_Event_Observer $observer
*/
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);
}
}
/**
* Manipulate the custom product options
*
* @param Varien_Event_Observer $observer
* @return void
*/
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$item = $observer->getQuoteItem();
$infoArr = array();
if ($info = $item->getProduct()->getCustomOption('info_buyRequest')) {
$infoArr = unserialize($info->getValue());
}
// Set additional options in case of a reorder
if ($infoArr && isset($infoArr['additional_options'])) {
// An additional options array is set on the buy request - this is a reorder
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($infoArr['additional_options'])
));
return;
}
$options = Mage::helper('catalog/product_configuration')->getCustomOptions($item);
foreach ($options as $option)
{
// The only way to identify a custom option without
// hardcoding ID's is the label :-(
// But manipulating options this way is hackish anyway
if ('Size' === $option['label'])
{
$optId = $option['option_id'];
// Add replacement custom option with modified value
$additionalOptions = array(array(
'code' => 'my_code',
'label' => $option['label'],
'value' => $option['value'] . ' YOUR EXTRA TEXT',
'print_value' => $option['print_value'] . ' YOUR EXTRA TEXT',
));
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($additionalOptions),
));
// Update info_buyRequest to reflect changes
if ($infoArr &&
isset($infoArr['options']) &&
isset($infoArr['options'][$optId]))
{
// Remove real custom option
unset($infoArr['options'][$optId]);
// Add replacement additional option for reorder (see above)
$infoArr['additional_options'] = $additionalOptions;
$info->setValue(serialize($infoArr));
$item->addOption($info);
}
// Remove real custom option id from option_ids list
if ($optionIdsOption = $item->getProduct()->getCustomOption('option_ids')) {
$optionIds = explode(',', $optionIdsOption->getValue());
if (false !== ($idx = array_search($optId, $optionIds))) {
unset($optionIds[$idx]);
$optionIdsOption->setValue(implode(',', $optionIds));
$item->addOption($optionIdsOption);
}
}
// Remove real custom option
$item->removeOption('option_' . $optId);
}
}
简而言之就是这样。添加错误检查并处理特殊情况,例如根据需要再次将相同产品添加到购物车。
希望这能让您开始使用自定义产品选项。一旦你熟悉了它们,还不错。