观看添加到购物车事件-报价项目ID为空


11

我正在尝试捕获将商品添加到购物车后触发的事件。我目前正在观看以下事件:checkout_cart_product_add_after

根据magento消息来源,在对Quote进行所有操作后,将触发此事件。但是当我访问购物车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

Answers:


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

1
编辑答案。您需要标记报价单,然后让magento保存它们,然后知道报价单和产品:)
Fabian Blechschmidt

@FabianBlechschmidt更新购物车时是否有事件要触发?
蝴蝶

是的,很多,您可以直接挂入dispatchEvent并对其进行检查:magento.stackexchange.com/a/9155/217并请确保阅读来自ben的评论!
Fabian Blechschmidt's

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年

1

我通过在$ cart和quoteItem上调用save解决了此问题。由于我不确定这是最好的方法,因此没有选择正确的方法。

Fabian Blechschmidt解决方案要好得多,请使用该解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.