7

注文から商品のカスタム オプションの値を更新することはできますか? 商品がカートに入っている場合 (チェックアウト前) に可能であることは知っていますが、注文時に可能かどうかはわかりません。

私たちのアプリはサービスを販売しており、チェックアウト後にのみ必要なデータが利用できる場合があります。

4

2 に答える 2

20

カスタマイズの目的によって異なります。Order Item にはシリアル化された配列として保存されたカスタム オプションがあり、いつでも変更することができます。

見積もりアイテムとは異なり、注文アイテムでは、それらを取得するための名前が異なります。メソッドが呼び出されますgetProductOptions()

また、それらを設定できる別の方法もありますsetProductOptions(array $options)

さまざまなテスト ケースでのこのメソッドの使用例を次に示します。

  1. 内部コードで使用するためだけに保存​​する必要がある場合は、配列 array にオプションを追加して元に戻すことができます:

    $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);
    

顧客に表示される 1 つのオプションとコードに必要な別のオプションが必要な場合は、これらの方法の両方を組み合わせることもできます。

また、変更を行った後は、注文/注文アイテムを保存することを忘れないでください。

アドバイス

注文を保存し、注文モデル自体を変更していない場合は、注文モデルにすべてのサブエンティティを強制的に保存させるために、少なくともその中のデータを変更する必要があります。これを可能にするために、存在しない属性を設定することさえできます。

保存操作が呼び出されない場合:

$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 に答える