オブザーバーを使用してカートに製品を追加したばかりのカスタムオプションと賞品を作成する


15

オブザーバーのcheckoutCartProductAddAfterイベントを監視するオブザーバーを使用してquoteitemにカスタムオプションを追加し、商品がカートに追加された後に起動します。

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

オブザーバーは機能していますが、追加した製品にカスタムオプションを追加できません。追加した製品にオブザーバーを使用してカスタムオプションを追加するためのヘルプを提供してください。


オブザーバーで製品のカスタム価格を変更することもできます。カスタム価格をゼロに追加したい。事前に感謝
キーアーパテル

回答:


19

@Timは週末にこの問題について講演しました:https ://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

必要なのは方法2: Config.xmlに次のイベントを追加する

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

Observer.phpに次のメソッドを追加します

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

このトピックの詳細は次のとおりです。

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

もっと:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266


1
最初:新しい回答の代わりにコメントを使用してください。そして、ループに製品のチェックを挿入し、目的の製品のみがオプションを取得できるようにします。
ファビアンBlechschmidt

1
このすばらしいデバッグの回答をご覧に
Fabian Blechschmidt

1
これは、上記の手順で可能です
ファビアンBlechschmidt

2
提案していただきありがとうございます。カートに追加すると、構成可能な製品を使用し、最後の見積もりアイテムを更新することで問題を解決したため、2つのアイテムを取得しました。
ミロプル社14

1
どちらでもないが、リンクを更新した。ありがとう!
ファビアンBlechschmidt

3

その場でカスタムオプションを追加するための適切なイベントはcatalog_product_type_prepare_full_options、カスタムオプションを持つ製品が見積もり項目に変換される直前にトリガーされます。

独自のbuyRequestデータが製品の属性またはオプションに影響を及ぼす場合、イベントのオブザーバー catalog_product_type_prepare_{$processMode}_optionsが適切な選択$processModeです。検証モードは「フル」または「ライト」です。「フル」モードは、製品が定期的にカートに追加されるときに使用され、すべての必要なオプションが設定され、構成全体が有効かどうかを検証します。「ライト」モードでは、リクエストに含まれるオプションのみが検証され、製品をウィッシュリストに追加するときに使用されますが、バックエンドから注文を作成するときにも使用できます。いずれの場合でもデータを処理するには、両方のイベントのオブザーバーを登録できます。検証がある場合は、もちろんイベントを区別する必要があります。

イベントはMage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions()でトリガーされ、次のパラメーターが使用可能です。

  • transport:すべてのカスタムオプションのオブジェクトを転送します(ただし、バンドルオプションなどの他のオプションはありません)。したがって、オブザーバーで変更できます。transport-> optionsは、option_id => option_valueの形式の配列です。注意、トランスポート自体は、ご想像のとおりVarien_Objectのインスタンスではなく、stdClassオブジェクトです。したがって、transport-> optionsにはgetterおよびsetterメソッドはありません。
  • buy_request:buyRequestオブジェクト。ここで読むことができますが、それでも変更できます。
  • product:後で見積品目に変換される製品。ここで、属性を操作したり、動的に追加したりできます。ただし、変換プロセスではそれらを考慮する必要があります。これに使用されるイベントはsales_quote_product_add_after、後でのみトリガーされます。

ソース: Magento buyRequestオブジェクト-リファレンス

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

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

この動的に追加されたカスタムオプションの価格を設定することはできませんが、次のcatalog_product_get_final_priceように2番目のオブザーバーを使用して見積品目の価格を変更できます。

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.