Đang xem sự kiện Add to Cart - id mục trống


11

Tôi đang cố gắng để bắt sự kiện phát sinh khi một mặt hàng được thêm vào giỏ hàng. Tôi hiện đang xem sự kiện sau: checkout_cart_product_add_after

Theo nguồn magento, sự kiện này được thực hiện sau khi mọi thứ được thực hiện với Trích dẫn. nhưng khi tôi truy cập id giỏ hàng và id trích dẫn thì các giá trị trống:

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

Ở trên trả về trống cho cả hai id khi không có mục nào trong giỏ hàng, nếu giỏ hàng đã có một mục thì id giỏ hàng có giá trị nhưng quote_item_id thì không.

Lưu ý điều này đã được hỏi trước đó, nhưng câu hỏi không bao giờ được giải quyết, và cuộc thảo luận đã kết thúc đi lạc từ vấn đề này. Tôi cần quote_item_id.


thử với$quoteItem = $observer->getEvent()->getQuoteItem();
Marius

Điều tương tự, id đến trống rỗng.
Nuno Furtado

Thêm phần này vào trình quan sát của bạn Mage::log($quoteItem)và xem var/log/system.logmục trích dẫn trông như thế nào. Có lẽ bạn có một ý tưởng từ đó.
Marius

đó là một lượng thông tin khổng lồ, tôi sẽ dễ dàng bị lạc trong đó
Nuno Furtado

1
= D vẫn còn quá lớn, tôi đã thử Mage :: getLog ($ quoteItem-> debug ()) và tôi nhận thấy rằng không có itemid trong mảng kết quả. Dường như có một item_id trong phần tử stock_item bên trong quoteitem nhưng tôi thậm chí không chắc đó là gì. Chỉnh sửa: đây không phải là giá trị này là như nhau
Nuno Furtado

Câu trả lời:


22

Đừng làm điều này.

Vấn đề của bạn là, giỏ hàng chưa được lưu, hãy xem tại đây:

https://github.com/LokeyCoding/magento-mirror/blob/magento-1.7/app/code/core/Mage/Checkout/controllers/CartControll.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())
        );

Những gì bạn muốn là lắng nghe checkout_cart_add_product_complete

Nếu bạn muốn biết những mục nơi thêm vòng này, chỉ cần đánh dấu chúng trong checkout_cart_product_add_afternhư $quoteItem->setIsNew()sau đó bạn có thể kiểm tra trong checkout_cart_add_product_completecho$quoteItem->getIsNew()


Tôi đoán rằng sẽ là nó, vấn đề là sự kiện đó chỉ gửi sản phẩm ra. Có phải là một ý tưởng tốt để có được giỏ hàng từ phiên và nhận được cuối cùng của mảng allitems? tôi lo lắng rằng có thể có một số loại điều kiện chủng tộc
Nuno Furtado

1
Chỉnh sửa câu trả lời. Bạn cần gắn cờ các mục trích dẫn của mình, sau đó để magento lưu chúng, sau đó bạn biết mục báo giá và sản phẩm của mình :)
Fabian Blechschmidt

@FabianBlechschmidt có sự kiện nào được kích hoạt trong khi cập nhật giỏ hàng không?
Bướm

vâng, nhiều, bạn chỉ cần nối vào công cụEvent và kiểm tra nó: magento.stackexchange.com/a/9155/217 Và hãy chắc chắn đọc nhận xét từ ben!
Fabian Blechschmidt

5

Bạn có thể sử dụng checkout_cart_product_add_aftersự kiện này:

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

Dữ liệu được trả về trông tương tự như sau:

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] => 
)

Điều này đã được thử nghiệm trên Magento 1.9.1.0, nhưng từ những gì tôi có thể nói, điều này sẽ hoạt động trên 1.7


2

bạn có thể sử dụng sự kiện sau

sales_quote_item_set_product

và nhận id mục trong quan sát như thế này.

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

Sự kiện này được gọi cho mỗi mục báo giá mỗi khi giỏ hàng được xây dựng, không chỉ khi một mục được thêm vào giỏ hàng.
Dậu242

1

Tôi đã giải quyết vấn đề này bằng cách gọi lưu trên $ cart và trên quoteItem. Không chọn điều này là chính xác vì tôi không chắc đây là phương pháp tốt nhất.

Giải pháp Fabian Blechschmidt tốt hơn nhiều, sử dụng cái đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.