カートに追加イベントを監視しています-見積もりアイテムIDが空です


11

アイテムがカートに追加されたときに発生するイベントをキャッチしようとしています。私は現在、次のイベントを見ています。checkout_cart_product_add_after

magentoのソースによると、このイベントはすべての見積もりが完了した後に発生します。しかし、カートIDと見積もりIDにアクセスすると、値が空になります。

$quoteItem = $observer->getQuoteItem();
$quote_item_id = $quoteItem->getItemId();
$cart = Mage::getSingleton('checkout/session');
$quote_id= $cart->getQuoteId();

カートにアイテムがない場合、上記は両方のIDに対して空を返します。カートにすでにアイテムが含まれている場合、カートIDには値がありますが、quote_item_idにはありません。

これは以前に尋ねられたことがあるが、質問は解決されておらず、議論はこの問題からはずれていることに注意してください。quote_item_idが必要です。


試してみる$quoteItem = $observer->getEvent()->getQuoteItem();
マリウス

同じことで、IDは空になります。
Nuno Furtado 2013

これをオブザーバーに追加して、見積もり項目がどのように見えるかMage::log($quoteItem)を確認してくださいvar/log/system.log。たぶんそこからアイデアを得るでしょう。
マリウス

それは膨大な量の情報です。私はすぐに迷子になります
Nuno Furtado 2013

1
= Dが大きすぎるため、Mage :: getLog($ quoteItem-> debug())を試してみたところ、結果の配列にitemidがないことに気付きました。quoteitem内のstock_item要素にitem_idがあるようですが、それが何であるかさえわかりません。編集:これはそうではありませんこの値は常に同じです
Nuno Furtado 2013

回答:


22

これを行わないでください。

あなたの問題は、カートがまだ保存されていないことです、ここを見てください:

https://github.com/LokeyCoding/magento-mirror/blob/magento-1.7/app/code/core/Mage/Checkout/controllers/CartController.php#L201-L206

public function addAction()
{
// ...
        $cart->addProduct($product, $params); // <-- you are inside this method
        if (!empty($related)) {
            $cart->addProductsByIds(explode(',', $related));
        }

        $cart->save(); // here is the saving, and therefore after this line,
                       //  quote and items have an id
// ...
        Mage::dispatchEvent('checkout_cart_add_product_complete',
            array('product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse())
        );

あなたが聞きたいことは checkout_cart_add_product_complete

あなたがでているこのラウンドを追加した項目だけフラグそれらを知りたい場合checkout_cart_product_add_afterのような$quoteItem->setIsNew()あなたがチェックすることができ、その後checkout_cart_add_product_completeのために$quoteItem->getIsNew()


私はそれがそれであると考えました、問題はイベントが製品を送るだけであるということです。セッションからカートを取得し、allitems配列の最後を取得することは良い考えですか?なんらかの競合状態があるのではないかと心配しています
Nuno Furtado 2013年

1
回答を編集しました。見積もりアイテムにフラグを付け、magentoにそれらを保存させると、見積もりアイテムと製品がわかります。)
Fabian Blechschmidt 2013年

@FabianBlechschmidtカートの更新中にトリガーされるイベントはありますか?
バタフライ

はい、多くの、あなただけのdispatchEventにフックすることができますし、それを確認してください。magento.stackexchange.com/a/9155/217をとベンからのコメントを読んでください!
Fabian Blechschmidt 2016

5

checkout_cart_product_add_afterこれでイベントを使用できます:

$observer->getEvent()->getQuoteItem()->getProduct()->getData()

返されるデータは次のようになります。

Array
(
    [store_id] => 1
    [entity_id] => 1
    [entity_type_id] => 4
    [attribute_set_id] => 4
    [type_id] => simple
    [sku] => TESTSKU
    [has_options] => 0
    [required_options] => 0
    [created_at] => 2015-02-10T12:11:50-05:00
    [updated_at] => 2015-02-10 17:18:47
    [name] => Demo Product
    [url_key] => demo-product
    [country_of_manufacture] => 
    [msrp_enabled] => 2
    [msrp_display_actual_price_type] => 4
    [meta_title] => 
    [meta_description] => 
    [image] => no_selection
    [small_image] => no_selection
    [thumbnail] => no_selection
    [custom_design] => 
    [page_layout] => 
    [options_container] => container1
    [gift_message_available] => 
    [url_path] => demo-product.html
    [weight] => 1.0000
    [price] => 12.9900
    [special_price] => 
    [msrp] => 
    [status] => 1
    [visibility] => 4
    [tax_class_id] => 2
    [is_recurring] => 0
    [description] => It's a sample product, what do you want?
    [short_description] => It's a demo product
    [meta_keyword] => 
    [custom_layout_update] => 
    [news_from_date] => 
    [news_to_date] => 
    [special_from_date] => 
    [special_to_date] => 
    [custom_design_from] => 
    [custom_design_to] => 
    [group_price] => Array
        (
        )

    [group_price_changed] => 0
    [media_gallery] => Array
        (
            [images] => Array
                (
                )

            [values] => Array
                (
                )

        )

    [tier_price] => Array
        (
        )

    [tier_price_changed] => 0
    [stock_item] => Mage_CatalogInventory_Model_Stock_Item Object
    (
        // Crazy recursion happens here
    )
    [is_in_stock] => 1
    [is_salable] => 1
    [website_ids] => Array
        (
            [0] => 1
        )
    [cart_qty] => 1
    [qty] => 1
    [stick_within_parent] => 
    [customer_group_id] => 0
    [final_price] => 
)

これはMagento 1.9.1.0でテストされましたが、私の知る限り、1.7で動作するはずです。


2

次のイベントを使用できます

sales_quote_item_set_product

このようにオブザーバーでアイテムIDを取得します。

$quote_item = $observer->getEvent()->getQuoteItem();
$item_id = $quote_item->getItemId();

このイベントは、カートにアイテムが追加されたときだけでなく、カートが作成されるたびにすべての見積もりアイテムに対して呼び出されます。
Rooster242 2017年

1

$ cartとquoteItemでsaveを呼び出すことにより、この問題を解決しました。これが最良の方法かどうかわからないので、これを正しいものとして選択しないでください。

Fabian Blechschmidtソリューションの方がはるかに優れています。それを使用してください。

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