Oglądanie wydarzenia Dodaj do koszyka - identyfikator przedmiotu oferty jest pusty

11

Próbuję uchwycić zdarzenie, które jest uruchamiane po dodaniu przedmiotu do koszyka. Obecnie oglądam następujące wydarzenie: checkout_cart_product_add_after

Według źródła magento to wydarzenie jest uruchamiane po tym, jak wszystko zostanie zrobione do wyceny. ale kiedy uzyskuję dostęp do identyfikatora koszyka i identyfikatora oferty, wartości są puste:

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

Powyższe zwraca puste dla obu identyfikatorów, gdy w koszyku nie ma żadnych przedmiotów, jeśli koszyk ma już przedmiot, identyfikator koszyka ma wartość, ale identyfikator_doceny nie.

Zauważ, że zostało to zadane wcześniej, ale pytanie nigdy nie zostało rozwiązane, a dyskusja ostatecznie zbłądziła z tego problemu. Potrzebuję quote_item_id.

Nuno Furtado
źródło
spróbuj z$quoteItem = $observer->getEvent()->getQuoteItem();
Marius
To samo, identyfikator jest pusty.
Nuno Furtado,
Dodaj to do swojego obserwatora Mage::log($quoteItem)i zobacz, var/log/system.logjak wygląda cytat. Może masz pomysł stamtąd.
Marius
to ogromna ilość informacji, łatwo się
zgubię
1
= D wciąż jest za duży, próbowałem Mage :: getLog ($ quoteItem-> debug ()) i zauważam, że w wynikowej tablicy nie ma pozycji itemid. Wygląda na to, że w elemencie stock_item znajduje się element item_id, ale nie jestem nawet pewien, co to jest. Edycja: to nie jest to, że ta wartość jest zawsze taka sama
Nuno Furtado,

Odpowiedzi:

22

Nie rób tego

Twój problem polega na tym, że koszyk nie został jeszcze zapisany, spójrz tutaj:

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

To czego chcesz to słuchać checkout_cart_add_product_complete

Jeśli chcesz wiedzieć, które elementy gdzie dodawane tej rundzie tylko flaga je w checkout_cart_product_add_afterjak $quoteItem->setIsNew()to można sprawdzić w checkout_cart_add_product_completeza$quoteItem->getIsNew()

Fabian Blechschmidt
źródło
Pomyślałem, że tak, problem polega na tym, że wydarzenie tylko wysyła produkt. Czy dobrym pomysłem jest pobranie koszyka z sesji i pobranie ostatniego z tablicy allitems? obawiam się, że mogą istnieć jakieś warunki wyścigowe
Nuno Furtado,
1
Edytowałem odpowiedź. Musisz oflagować swoje artykuły z ofertą, a następnie pozwolić, aby magento je zapisało, a następnie znasz swoją ofertę i produkt :)
Fabian Blechschmidt
@FabianBlechschmidt czy istnieje jakieś zdarzenie, które zostanie wywołane podczas aktualizacji koszyka?
Butterfly
tak, wielu, wystarczy podłączyć się do dispatchEvent i sprawdzić: magento.stackexchange.com/a/9155/217 I koniecznie przeczytaj komentarz Ben!
Fabian Blechschmidt
5

Możesz użyć checkout_cart_product_add_afterwydarzenia z tym:

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

Zwrócone dane wyglądają podobnie do tego:

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

Zostało to przetestowane na Magento 1.9.1.0, ale z tego co mogę powiedzieć, powinno to działać na 1.7

acarbonaro
źródło
2

możesz użyć następującego wydarzenia

sales_quote_item_set_product

i uzyskaj identyfikator przedmiotu w takim obserwatorze.

$quote_item = $observer->getEvent()->getQuoteItem();
$item_id = $quote_item->getItemId();
Ratnesh Kumar
źródło
To zdarzenie jest wywoływane dla każdego elementu wyceny za każdym razem, gdy budowany jest koszyk, nie tylko po dodaniu przedmiotu do koszyka.
Rooster242
1

Rozwiązałem ten problem, dzwoniąc do save on $ cart i quoteItem. Nie wybranie tego jako poprawnego, ponieważ nie jestem pewien, czy jest to najlepsza metoda.

Rozwiązanie Fabiana Blechschmidta jest znacznie lepsze, użyj tego.

Nuno Furtado
źródło