オブザーバーを使用してカートに製品を追加するだけのカスタムオプションと賞品を作成する
-
16-10-2019 - |
質問
Observer CheckOutCartProductAddafterイベントを使用して、CARTに追加された後の火災を使用して、COOTITEMにカスタムオプションを追加したいと思います。
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;
}
私のオブザーバーは機能していますが、製品を追加するためにカスタムオプションを追加することはできません。 Observerを使用して製品を追加してカスタムオプションを追加するためのヘルプを提供してください。
解決
@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),
)
);
}
}
このトピックの詳細は次のとおりです。
もっと:
他のヒント
その場でカスタムオプションを追加するAppropiateイベントは catalog_product_type_prepare_full_options
, 、カスタムオプションを備えた製品の直前にトリガーされ、見積アイテムに変換されます。
独自のBuyRequestデータが製品属性またはオプションに影響を与える場合、イベントのオブザーバー
catalog_product_type_prepare_{$processMode}_options
どこで良い選択です$processMode
検証モードであり、「フル」または「ライト」にすることができます。製品が定期的にカートに追加され、必要なすべてのオプションが設定され、構成全体が有効である場合、「フル」モードが使用されます。 「Lite」モードでは、リクエストに含まれるオプションのみが検証され、製品をウィッシュリストに追加するときに使用されますが、バックエンドから注文を作成するときにも可能です。いずれにせよデータを処理するには、両方のイベントのオブザーバーを登録できます。検証がある場合は、もちろんイベントを区別する必要があります。イベントはmage_catalog_model_product_type_abstract :: _ prepareoptions()でトリガーされ、次のパラメーターが利用可能です。
transport
: :すべてのカスタムオプションのオブジェクトを輸送します(ただし、バンドルオプションなど、他のオプションはありません)。そのため、オブザーバーで変更できます。 Transport-> Optionsはフォームの配列ですoption_id => option_value。注意、トランスポート自体は、varien_objectのインスタンスではなく、stdclassオブジェクトです。したがって、トランスポート>オプションのためのゲッターとセッターの方法はありません。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';
}
}
この動的に追加されたカスタムオプションの価格を設定することはできませんが、2番目のオブザーバーを使用して見積アイテムの価格を変更できます catalog_product_get_final_price
このような:
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);
}
}