如何在Magento中更新订单商品的自定义选项?

Ion*_*Ion 7 magento

是否可以从订单更新产品自定义选项值?我知道物品在购物车中(结账前)是可能的,但我不确定订单是否可行.

我们的应用程序正在销售服务,我们有一个案例,只有在结账后才能获得所需的数据.

Iva*_*nyi 19

这取决于您的自定义的目的.订单项具有存储为序列化数组的自定义选项,您可以随时修改它.

与报价项目不同,在订单项目中,它具有不同的名称以便检索它们.该方法被调用getProductOptions()

还有另一种方法可以让你设置它们setProductOptions(array $options).

以下是在不同测试用例中使用此方法的一些示例:

  1. 如果您只需要将其存储为内部代码使用,您只需将选项添加到数组数组并将其设置回:

    $existentOptions = $orderItem->getProductOptions();
    $existentOptions['your_custom_option'] = $yourCustomValue;
    $orderItem->setProductOptions($existentOptions);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果需要在打印文档中显示自定义选项,则需要将自定义选项添加到选项的特殊选项中,这些选项具有在前端,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);
    
    Run Code Online (Sandbox Code Playgroud)

如果您需要一个对客户可见的选项以及您的代码所需的另一个选项,这两种方法甚至可以组合使用.

另外,在您进行修改后,请不要忘记保存订单/订单项目.

忠告

如果您保存订单并且尚未修改订单模型本身,则至少需要更改其中的一些数据,以强制订单模型保存所有子实体.为了实现这一点,您甚至可以设置一些不存在的属性.

不调用保存操作的情况:

$order->load($id);
$orderItem->getItemById($itemId);
$orderItem->setSomething(111);
$order->save(); // Order Item will not be saved!!
Run Code Online (Sandbox Code Playgroud)

将调用保存操作的情况:

$order->load($id);
$orderItem->getItemById($itemId);
$orderItem->setSomething(111);
$order->setSomeNonExistentProperty(true); 
$order->save(); // Now it will be saved
Run Code Online (Sandbox Code Playgroud)

享受Magento开发的乐趣