カートに追加するときにアイテムのカスタムオプションを変更しますか?


8

アイテムがカートに追加されたときに通知するために、sales_quote_save_beforeイベントを聞いています。起動したら、次のようなアイテムオプションを繰り返し処理します。

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

ご覧のとおり、特定のオプション(例ではmyOptionA)に達したらすぐに、選択したオプションを変更したいと思います。したがって、myOptionAがドロップダウンであり、4つの可能な値があるとします。値1を選択した場合、その項目に値4を設定します。したがって、カートの読み込みが完了すると、myOptionAの値は4になります。その名前だけでなく、その価格も。どうすればできますか?


CMIIW、このループは、選択された値ではなく、使用可能な値を提供します。設定されている実際のカスタムオプションを取得するには、$ array_sku = explode( '-'、$ item-> getSku());を解析します。明らかに、最初は実際の製品のSKUです$ sku = reset($ array_sku); データを取得するためのソリューションはまだありません。
nicolallias 14年

私が見ている重要な点は、オプションの値の価格を設定できることです。私はこれをここ数日間見てきましたが、値の価格を設定する明確な方法がわかりません。見積もりアイテムはオプションを削除してリクエストから再構築する必要があるようです。
pspahn 2014

回答:


8

catalog_product_type_prepare_full_options代わりに、イベントのオブザーバーを記述できます。これは、製品が実際にカートに追加される前、およびカスタムオプションが準備された後の、カートに追加プロセスの最後のイベントです。

オブザーバーでは、次のパラメーターを使用できます。

  • transport:すべてのカスタムオプションのトランスポートオブジェクト。オブザーバーでtehemを変更できます。transport->optionsはの形式の配列option_id => option_valueです。予想どおり、トランスポート自体はstdClassのインスタンスではなくオブジェクトVarien_Objectです。したがって、のゲッターメソッドとセッターメソッドはありませんtransport->options
  • product:後で見積アイテムに変換される製品。
  • buy_request: buyRequestオブジェクト。ここで読み取り、変更することもできます。それVarien_Objectは他のものを含むものです:

    • product:製品ID
    • options:次の形式のカスタムオプションの配列:

      option_id => value

ソースと詳細: info_buyRequestリファレンス

したがって、オブザーバーは次のようになります。

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

最初の部分(変更$transport)は、オプションOPTION_A_IDの値を実際に変更することに関連しています。2番目の部分(変更$buyRequest)はオプションです。顧客が選択した値のすべての痕跡を削除し、注文を再注文すると、変更されたパラメーターで購入リクエストが「実行」されるため、新しい値がすぐに選択されます。それがあなたが望むものであるなら、あなたは決める必要があります。


同じイベントがmagento 2でも同様の目的で使用されます。
Bartosz Kubicki 2017

magento2では機能しません
Magento2 Devloper

0

コードを介して、つまりインストールスクリプトを使用して属性を設定した場合は、属性が sales_flat_quote_item

そこにある場合は、$ item変数にアクセスできるため、属性に関連するマジックメソッドを使用できるはずです。

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

この場合は、次のようにコードを簡略化できるはずです。

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

前述のように、このソリューションはプログラムで設定された見積もりアイテムの属性にのみ関係します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.