7

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

我们的应用程序正在销售一项服务,并且我们有一个案例,即仅在结帐后才提供所需数据。

4

2 回答 2

20

这取决于您定制的目的。Order Item 具有存储为序列化数组的自定义选项,您可以随时对其进行修改。

与报价项目不同,在订单项目中,它具有不同的名称来检索它们。该方法被称为getProductOptions()

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

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

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

    $existentOptions = $orderItem->getProductOptions();
    $existentOptions['your_custom_option'] = $yourCustomValue;
    $orderItem->setProductOptions($existentOptions);
    
  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);
    

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

在您进行修改后,不要忘记保存您的订单/订单项目。

建议

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

不调用保存操作的情况:

$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 开发的乐趣

于 2012-07-27T14:08:11.053 回答
0

您可以在订购前在 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());
    }
于 2016-03-22T17:10:56.667 回答