Menonton Acara Add to Cart - id item kutipan kosong

11

Saya mencoba menangkap peristiwa yang memanas setelah item ditambahkan ke troli. Saya sedang menonton acara berikut: checkout_cart_product_add_after

Menurut sumber magento, acara ini dipecat setelah semuanya dilakukan pada Penawaran. tetapi ketika saya mengakses id keranjang dan id kutipan nilainya kosong:

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

Di atas mengembalikan kosong untuk kedua id ketika tidak ada item di troli, jika troli sudah memiliki item id keranjang memiliki nilai tetapi quote_item_id tidak.

Perhatikan ini telah ditanyakan sebelumnya, tetapi pertanyaannya tidak pernah diselesaikan, dan akhirnya diskusi menyimpang dari masalah ini. Saya membutuhkan quote_item_id.

Nuno Furtado
sumber
coba dengan$quoteItem = $observer->getEvent()->getQuoteItem();
Marius
Hal yang sama, id menjadi kosong.
Nuno Furtado
Tambahkan ini di pengamat Anda Mage::log($quoteItem)dan lihat var/log/system.logbagaimana item kutipan itu terlihat. Mungkin Anda mendapat ide dari sana.
Marius
itu adalah sejumlah besar informasi, saya akan dengan mudah tersesat di dalamnya
Nuno Furtado
1
= D masih terlalu besar, saya mencoba Mage :: getLog ($ quoteItem-> debug ()) dan saya perhatikan bahwa tidak ada itemid di array yang dihasilkan. Tampaknya ada item_id di elemen stock_item di dalam quoteitem tapi saya bahkan tidak yakin apa itu. Sunting: ini bukan nilai ini sama saja
Nuno Furtado

Jawaban:

22

Jangan lakukan ini.

Masalah Anda adalah, bahwa kereta belum disimpan, lihat di sini:

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())
        );

Yang Anda inginkan adalah mendengarkan checkout_cart_add_product_complete

Jika Anda ingin tahu mana item mana ditambahkan babak ini, hanya bendera mereka dalam checkout_cart_product_add_afterseperti $quoteItem->setIsNew()maka Anda dapat memeriksa di checkout_cart_add_product_completeuntuk$quoteItem->getIsNew()

Fabian Blechschmidt
sumber
Saya pikir akan seperti itu, masalahnya adalah acara hanya mengirim produk keluar. Apakah ide yang bagus untuk mendapatkan troli dari sesi dan mendapatkan yang terakhir dari array allitems? Saya khawatir bahwa mungkin ada semacam kondisi balapan
Nuno Furtado
1
Diedit jawabannya. Anda perlu menandai item kutipan Anda, lalu biarkan Magento menyimpannya, kemudian Anda tahu item penawaran Anda dan produknya :)
Fabian Blechschmidt
@FabianBlechschmidt apakah ada acara yang akan dipicu saat memperbarui keranjang?
Butterfly
ya, banyak, Anda bisa langsung menghubungkan ke dispatchEvent dan memeriksanya: magento.stackexchange.com/a/9155/217 Dan pastikan untuk membaca komentar dari ben!
Fabian Blechschmidt
5

Anda dapat menggunakan checkout_cart_product_add_afteracara ini dengan ini:

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

Data yang dikembalikan terlihat mirip dengan ini:

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

Ini diuji di Magento 1.9.1.0, tetapi dari apa yang saya tahu, ini harus bekerja pada 1,7

acarbonaro
sumber
2

Anda dapat menggunakan acara berikut

sales_quote_item_set_product

dan dapatkan item id di observer seperti ini.

$quote_item = $observer->getEvent()->getQuoteItem();
$item_id = $quote_item->getItemId();
Ratnesh Kumar
sumber
Acara ini dipanggil untuk setiap item kutipan setiap kali troli dibuat, tidak hanya ketika item ditambahkan ke troli.
Rooster242
1

Saya memecahkan masalah ini dengan menelepon save on $ cart dan pada quoteItem. Tidak memilih ini sebagai benar karena saya tidak yakin ini adalah metode terbaik.

Solusi Fabian Blechschmidt jauh lebih baik, gunakan yang itu.

Nuno Furtado
sumber