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

zour9fqk  于 2023-01-17  发布在  其他
关注(0)|答案(3)|浏览(203)

是否可以从订单中更新产品自定义选项值?我知道当商品在购物车中(结账前)时可以,但我不确定是否可以在订单中更新。
我们的应用程序正在销售一项服务,我们有一个案件时,所需的数据是在结帐后才可用。

s4chpxco

s4chpxco1#

这取决于您的自定义目的。订单项目具有存储为序列化数组的自定义选项,您可以随时对其进行修改。
与报价项不同,在订单项中,它有不同的名称来检索它们。该方法称为getProductOptions()
此外,还有另一种方法,允许您设置它们setProductOptions(array $options)
以下是在不同测试用例中使用此方法的一些示例:
1.如果只需要存储它以供内部代码使用,则只需将option添加到array array中,然后将其设置回去即可:

$existentOptions = $orderItem->getProductOptions();
$existentOptions['your_custom_option'] = $yourCustomValue;
$orderItem->setProductOptions($existentOptions);

1.如果你需要在打印文档中显示你的自定义选项,你需要将你的自定义选项添加到选项的特殊选项中,这些选项具有在前端,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开发

vltsax25

vltsax252#

你可以在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());
    }
yi0zb3m4

yi0zb3m43#

我回复了一个旧帖子。它可能会帮助一些人。
为了改进Ivan的回答,你需要在更新后保存条目。
这里我的代码:

$orderId = "your_order_id";
$order = Mage::getModel('sales/order')->load($orderId);
$orderAllItems = $order->getAllItems();
foreach ($orderAllItems as $item) {

    $existentOptions = $item->getProductOptions();
    if (!isset($existentOptions['additional_options'])) {
        $existentOptions['additional_options'] = array(); 
    }

    $existentOptions['additional_options'][] = array(
        'label' => "Group option title",
        'value' => "Select option title + for example price",
    );
    $item->setProductOptions($existentOptions);
    $item->save();

}

此外,对于您的测试,您可以通过运行以下命令清除测试顺序的选项:

$existentOptions['additional_options'] = array();

最后,您可以在订购的产品中找到定制选项数据,以完成您的$existentOptions ['additional_options'] []:

$orderAllItems = $order->getAllItems();
foreach ($orderAllItems as $item) {

    $product = Mage::getModel('catalog/product')->load($item->getProductId());
    foreach ($product->getOptions() as $o) {
        // ...
    }
}

Axel

相关问题