2012-02-17 14 views
7

に追加する前に、私は、ドロップダウンすなわちMagentoの変更カスタムオプション値カート

サイズとして設定Magentoの中に私の製品のカスタムオプションを持っている:小、中、大

製品ページで私は、追加情報を表示します各オプションはjavascriptを使用しています。

スモール - ウエスト30、胸36、長さ42 ...
ミディアム - ウエスト32、胸38、長さ44 ...
ラージ - ウエスト34、胸40、長さ48 ...

カートに商品を追加すると、カート内でサイズのタイトル(小、中、大)が表示されますが、この追加情報(ウエスト30、チェスト36、レングス42 ...)を表示して、

どうすればいいですか?前もって感謝します。

+0

あなたは何とか、この追加データを保存していますか?注文の管理者を確認するときに、腰、胸、長さなどが表示されますか? – seanbreeden

+0

申し訳ありませんが、私は十分に明確でなかった場合。私はphtmlファイルでハードコードされているjavascriptの場合、この情報を表示します。たとえば、(val == small)then Waist 30、Chest 36、Length 42 ... を表示します。この追加情報を注文に追加して、アイテムごとに保存するようにします。 – Farrukh

答えて

0

Admin -> Catalog -> Attributes -> Manage Attributesにアクセスしてください。リストから属性を見つけます。あなたの場合はおそらくsizeです。それをクリックしてManage Labels/Optionsに行きます。そこから、各値に追加情報を追加することができます。ラベルを "Small - Waist 30、Chest 36、Length 42"に変更し、変更したい属性値ごとに繰り返すことができます。

+1

Sean、答えはありがたいですが属性ではなく、カスタムオプションです。残念ながら、この方法に従うことはできません。なぜなら、他の問題も記録されているからです。私がカスタムオプションの価値を問題にするように導くことができれば、それは私の人生をはるかに簡単にするでしょう。 – Farrukh

28

カスタムオプションは、オプションIDと値としてのみ引用符に格納されます。オプションがレンダリングされるたびに、基本的にデータベースからリロードされます。
値を変更する場合は、値を保存する必要があります。値を設定すると、すべてのユーザーに設定されます。

つまり、イベントオブザーバを使用して、修正された値を追加したカスタムオプションをオンザフライで追加することで、この問題を回避します。このために私は追加オプションを使用します。
次に、元のカスタムオプションを引用品目から削除します。

最大1.4 Magentoは残りの部分を処理しましたが、その後は追加オプションを手動で注文アイテムにコピーする必要があります。また、アイテムが並べ替えられた場合には再度設定するように注意する必要があります。

ここでは、オブザーバの設定例を示します。

<frontend> 
    <events> 
     <checkout_cart_product_add_after> 
      <observers> 
       <customoptions> 
        <type>singleton</type> 
        <class>customoptions/observer</class> 
        <method>checkoutCartProductAddAfter</method> 
       </customoptions> 
      </observers> 
     </checkout_cart_product_add_after> 
     <sales_convert_quote_item_to_order_item> 
      <observers> 
       <customoptions> 
        <type>singleton</type> 
        <class>customoptions/observer</class> 
        <method>salesConvertQuoteItemToOrderItem</method> 
       </customoptions> 
      </observers> 
     </sales_convert_quote_item_to_order_item> 
    </events> 
</frontend> 

残りはオブザーバークラスで処理されます。

/** 
* Add additional options to order item product options (this is missing in the core) 
* 
* @param Varien_Event_Observer $observer 
*/ 
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer) 
{ 
    $quoteItem = $observer->getItem(); 
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) { 
     $orderItem = $observer->getOrderItem(); 
     $options = $orderItem->getProductOptions(); 
     $options['additional_options'] = unserialize($additionalOptions->getValue()); 
     $orderItem->setProductOptions($options); 
    } 
} 

/** 
* Manipulate the custom product options 
* 
* @param Varien_Event_Observer $observer 
* @return void 
*/ 
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer) 
{ 
    $item = $observer->getQuoteItem(); 
    $infoArr = array(); 

    if ($info = $item->getProduct()->getCustomOption('info_buyRequest')) { 
     $infoArr = unserialize($info->getValue()); 
    } 

    // Set additional options in case of a reorder 
    if ($infoArr && isset($infoArr['additional_options'])) { 
     // An additional options array is set on the buy request - this is a reorder 
     $item->addOption(array(
      'code' => 'additional_options', 
      'value' => serialize($infoArr['additional_options']) 
     )); 
     return; 
    } 

    $options = Mage::helper('catalog/product_configuration')->getCustomOptions($item); 

    foreach ($options as $option) 
    { 
     // The only way to identify a custom option without 
     // hardcoding ID's is the label :-(
     // But manipulating options this way is hackish anyway 
     if ('Size' === $option['label']) 
     { 
      $optId = $option['option_id']; 

      // Add replacement custom option with modified value 
      $additionalOptions = array(array(
       'code' => 'my_code', 
       'label' => $option['label'], 
       'value' => $option['value'] . ' YOUR EXTRA TEXT', 
       'print_value' => $option['print_value'] . ' YOUR EXTRA TEXT', 
      )); 
      $item->addOption(array(
       'code' => 'additional_options', 
       'value' => serialize($additionalOptions), 
      )); 

      // Update info_buyRequest to reflect changes 
      if ($infoArr && 
       isset($infoArr['options']) && 
       isset($infoArr['options'][$optId])) 
       { 
       // Remove real custom option 
       unset($infoArr['options'][$optId]); 

       // Add replacement additional option for reorder (see above) 
       $infoArr['additional_options'] = $additionalOptions; 

       $info->setValue(serialize($infoArr)); 
       $item->addOption($info); 
      } 

      // Remove real custom option id from option_ids list 
      if ($optionIdsOption = $item->getProduct()->getCustomOption('option_ids')) { 
       $optionIds = explode(',', $optionIdsOption->getValue()); 
       if (false !== ($idx = array_search($optId, $optionIds))) { 
        unset($optionIds[$idx]); 
        $optionIdsOption->setValue(implode(',', $optionIds)); 
        $item->addOption($optionIdsOption); 
       } 
      } 

      // Remove real custom option 
      $item->removeOption('option_' . $optId); 
     } 
    } 

これは一言で言えば、エラーチェックを追加し、必要に応じてカートに同じ製品を再度追加するような特殊なケースを処理します。
希望すると、これでカスタム製品オプションの使用を開始できます。一度あなたがそれらに精通すると、半分悪くはありません。

+0

Vinaiにお手伝いいただきありがとうございます。私はこれを試してみる。 – Farrukh

+0

これは、少し違ったやり方で、このアプローチに基づいた別の答えです:http://stackoverflow.com/a/9496266/485589 – Vinai

+0

私はsales_quote_collect_totals_beforeに追加オプションを設定しています。私のsales_convert_quote_item_to_order_itemそれは呼び出していないので。すべて –

-1

Vinaiの素晴らしいソリューションに小さなフィックスを追加するだけです。 解決策は、製品ごとに見積もり項目を取得するロジックを解除します。

Mage_Sales_Model_Quote_ItemのgetItemByProduct関数は、quoteオプションとproductオプションを比較する関数representProductを呼び出します。両方のオブジェクトが同じオプションリストを持つ場合は、quoteオブジェクトを返します。そうでない場合はfalseを返します。

両方のオブジェクトに異なるオプションがあるので、カスタムオプションを追加したので、関数はfalseを返します。

この問題を解決する方法の1つは、Mage_Sales_Model_Quote_Itemクラス を書き換えて、カスタムオプションコードをコンストラクタのローカル変数$ _notRepresentOptionsに追加することです。

class Custom_Options_Model_Sales_Quote_Item extends Mage_Sales_Model_Quote_Item { 

/** 
* Initialize resource model 
* 
*/ 
protected function _construct() 
{   
    $this->_notRepresentOptions = array_merge($this->_notRepresentOptions, array('additional_options')); 

    parent::_construct(); 
} 

}

関連する問題