2012-07-27 10 views
6

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

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

答えて

17

カスタマイズの目的によって異なります。 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の開発を

+0

ありがとうございました。私はこの仕事のために約1週間を過ごしました。そのうまくいく。もう一度ありがとう – DRAJI

+0

@ Ivan Chepurnyi:私はあなたも "$ orderItem-> setProductOptions($ existentOptions);" "$ orderItem-> setProductOptions($ existentOptions) - > save();"に変更します。 –

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()); 
    } 
関連する問題