Sepete Ekle Etkinliğini İzleme - teklif öğesi kimliği boş


11

Bir öğe sepete eklendiğinde tetiklenen olayı yakalamaya çalışıyorum. Şu anda aşağıdaki etkinliği izliyorum: checkout_cart_product_add_after

Magento kaynağına göre bu olay, Alıntı için her şey yapıldıktan sonra tetiklenir. ancak alışveriş sepeti kimliğine ve teklif kimliğine eriştiğimde değerler boştur:

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

Sepette hiç öğe olmadığında yukarıdaki her iki kimlik için boş döner, alışveriş sepetinde zaten bir öğe varsa alışveriş sepeti kimliğinin değeri vardır, ancak quote_item_id değeri yoktur.

Bunun daha önce sorulduğuna dikkat edin, ancak soru asla çözülmedi ve tartışma bu sorundan saptı. Quote_item_id'e ihtiyacım var.


denemek$quoteItem = $observer->getEvent()->getQuoteItem();
Marius

Aynı şey, kimlik boş geliyor.
Nuno Furtado

Senin gözlemci bu ekleme Mage::log($quoteItem)ve gördüğünüz var/log/system.loggibi nasıl alıntı öğesi görünüyor. Belki oradan bir fikir edinirsiniz.
Marius

Bu büyük miktarda bilgi, kolayca içinde kaybolacak
Nuno Furtado

1
= D hala çok büyük, Mage :: getLog ($ quoteItem-> debug ()) denedim ve ortaya çıkan dizide hiçbir itemid olmadığını fark ettim. Quoteitem içindeki stock_item öğesinde bir item_id var gibi görünüyor ama bunun ne olduğundan bile emin değilim. Düzenleme: bu değil bu değer her zaman aynı değil
Nuno Furtado

Yanıtlar:


22

Bunu yapma.

Sorununuz, sepetin henüz kaydedilmemiş olması şuraya bakın:

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

Dinlemek istediğin şey checkout_cart_add_product_complete

Eğer hangi Bu raundu eklenen öğeler, sadece bayrak onları bilmek istiyorsanız checkout_cart_product_add_aftergibi $quoteItem->setIsNew()check-in yapabilirsiniz sonra checkout_cart_add_product_completeiçin$quoteItem->getIsNew()


Bunun olacağını düşündüm, sorun olayın sadece ürünü göndermesi. Sepeti oturumdan almak ve allitems dizisinin sonunu almak iyi bir fikir mi? bir tür yarış durumu olabileceğinden endişe
ediyorum

1
Cevabı düzenledi. Teklif öğelerinizi işaretlemeniz, ardından magento'yu kaydetmenize izin vermeniz gerekir, o zaman teklif öğenizi ve ürünü biliyorsunuz :)
Fabian Blechschmidt

@FabianBlechschmidt Sepeti güncellerken tetiklenecek bir olay var mı?
Kelebek

evet, çok, sadece dispatchEvent içine kanca ve kontrol edin: magento.stackexchange.com/a/9155/217 Ve ben yorum okuyun emin olun!
Fabian Blechschmidt

5

checkout_cart_product_add_afterEtkinliği şu şekilde kullanabilirsiniz :

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

Döndürülen veriler şuna benzer:

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

Bu Magento 1.9.1.0'da test edildi, ancak söyleyebileceğimden, bu 1.7 üzerinde çalışmalı


2

aşağıdaki etkinliği kullanabilirsiniz

sales_quote_item_set_product

ve bunun gibi gözlemciye öğe kimliği alın.

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

Bu etkinlik, alışveriş sepetinin her oluşturulduğunda, yalnızca sepete bir öğe eklendiğinde değil, her teklif öğesi için çağrılır.
Rooster242

1

$ Cart ve quoteItem üzerinde save arayarak bu sorunu çözdü. Bunun en iyi yöntem olduğundan emin değilim çünkü doğru olarak seçmiyorum.

Fabian Blechschmidt çözümü çok daha iyi, bunu kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.