是否可以从订单中更新产品自定义选项值?我知道商品在购物车中时(结帐前)是可能的,但我不确定订单中是否可能。
我们的应用程序正在销售一项服务,并且我们有一个案例,即仅在结帐后才提供所需数据。
是否可以从订单中更新产品自定义选项值?我知道商品在购物车中时(结帐前)是可能的,但我不确定订单中是否可能。
我们的应用程序正在销售一项服务,并且我们有一个案例,即仅在结帐后才提供所需数据。
这取决于您定制的目的。Order Item 具有存储为序列化数组的自定义选项,您可以随时对其进行修改。
与报价项目不同,在订单项目中,它具有不同的名称来检索它们。该方法被称为getProductOptions()
还有另一种方法可以让您设置它们setProductOptions(array $options)
。
以下是在不同测试用例中使用此方法的一些示例:
如果您只需要存储它以供内部代码使用,您只需将选项添加到数组数组中并将其设置回来:
$existentOptions = $orderItem->getProductOptions();
$existentOptions['your_custom_option'] = $yourCustomValue;
$orderItem->setProductOptions($existentOptions);
如果您需要在打印文档中显示自定义选项,则需要将自定义选项添加到选项的特殊选项中,这些选项具有在前端、pdf 文档、项目列表中显示其值的结构
$existentOptions = $orderItem->getProductOptions();
if (!isset($existentOptions['additional_options'])) {
// If special options of options array is set before, create it.
$existentOptions['additional_options'] = array();
}
// Adding visible options value
$existentOptions['additional_options'][] = array(
'label' => 'Your Option Label',
'value' => 'Your Option Value',
// The last one that is optional (if not set, value is used)
'print_value' => 'Your Option Value shown in printed documents'
);
$orderItem->setProductOptions($existentOptions);
如果您需要一个对客户可见的选项和另一个代码所需的选项,这两种方法甚至可以组合使用。
在您进行修改后,不要忘记保存您的订单/订单项目。
建议
如果您保存订单并且没有修改订单模型本身,您至少需要更改其中的一些数据,以强制订单模型保存所有子实体。为了使这成为可能,您甚至可以设置一些不存在的属性。
不调用保存操作的情况:
$order->load($id);
$orderItem->getItemById($itemId);
$orderItem->setSomething(111);
$order->save(); // Order Item will not be saved!!
将调用保存操作的情况:
$order->load($id);
$orderItem->getItemById($itemId);
$orderItem->setSomething(111);
$order->setSomeNonExistentProperty(true);
$order->save(); // Now it will be saved
享受 Magento 开发的乐趣
您可以在订购前在 addProduct 功能上执行此操作。
try {
$cart = Mage::getModel('checkout/cart');
$previousItemCount = $cart->getQuote()->getItemsCount();
if ($previousItemCount <= 0) {
$cart->init();
}
$params = $this->getRequest()->getParams();
$product = Mage::getModel('catalog/product')->load($params['product_id']);
$date = explode('/', $params['product_dtinvoice']);
$date = array(
'month' => $date[0],
'day' => $date[1],
'year' => $date[2],
);
$cart->addProduct(
$product,
new Varien_Object(array(
'product' => $product->getId(),
'qty' => 1,
'options' => array(
'4' => array(
'month' => $date['month'],
'day' => $date['day'],
'year' => $date['year']
),
'2' => $params['product_ean'],
'3' => $params['product_serialnumber'],
'1' => $params['product_seller'],
),
))
);
$cart->save();
if ($previousItemCount < $cart->getQuote()->getItemsCount()) {
$return = array('result' => true, 'msg' => '');
} else {
$return = array('result' => false, 'msg' => 'Did not possible to add this product to cart. Please contact the administrator');
}
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($return));
} catch(Exception $e) {
Mage::throwException($e->getMessage());
}