Guardando Aggiungi al carrello Evento - ID articolo preventivo vuoto


11

Sto cercando di catturare l'evento che si attiva quando un articolo viene aggiunto al carrello. Attualmente sto guardando il seguente evento: checkout_cart_product_add_after

Secondo la fonte magento questo evento viene generato dopo che tutto è stato fatto per la citazione. ma quando accedo all'ID carrello e all'ID preventivo i valori sono vuoti:

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

Quanto sopra restituisce vuoto per entrambi gli ID quando non ci sono articoli nel carrello, se il carrello ha già un articolo, l'id del carrello ha valore, ma quote_item_id no.

Si noti che questo è stato chiesto prima, ma la domanda non è mai stata risolta e la discussione ha finito per deviare da questo problema. Ho bisogno di quote_item_id.


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

Stessa cosa, l'id diventa vuoto.
Nuno Furtado,

Aggiungi questo nel tuo osservatore Mage::log($quoteItem)e vedi var/log/system.logcome appare l'articolo della citazione. Forse hai un'idea da lì.
Marius

questa è un'enorme quantità di informazioni, mi perderò facilmente in essa
Nuno Furtado,

1
= D ancora troppo grande, ho provato Mage :: getLog ($ quoteItem-> debug ()) e noto che non vi sono itemid nell'array risultante. Sembra che ci sia un item_id nell'elemento stock_item all'interno del quoteitem ma non sono nemmeno sicuro di cosa si tratti. Modifica: non è questo questo valore è sempre lo stesso
Nuno Furtado

Risposte:


22

Non farlo

Il tuo problema è che il carrello non è stato ancora salvato, dai un'occhiata qui:

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

Quello che vuoi è ascoltare checkout_cart_add_product_complete

Se volete sapere quali elementi in cui aggiunte questo turno, solo la bandiera loro in checkout_cart_product_add_aftercome $quoteItem->setIsNew()allora si può check-in checkout_cart_add_product_completeper il$quoteItem->getIsNew()


Ho pensato che sarebbe stato, il problema è che l'evento invia solo il prodotto. È una buona idea ottenere il carrello dalla sessione e ottenere l'ultimo dell'array allitems? temo che ci potrebbe essere una sorta di condizione di gara
Nuno Furtado,

1
Modificata la risposta. Devi contrassegnare i tuoi articoli di preventivo, quindi lasciare che magento li salvi, quindi conosci il tuo articolo di preventivo e il prodotto :)
Fabian Blechschmidt,

@FabianBlechschmidt c'è un evento da attivare durante l'aggiornamento del carrello?
Butterfly,

sì, molti, puoi semplicemente collegarti a dispatchEvent e controllarlo: magento.stackexchange.com/a/9155/217 E assicurati di leggere il commento di ben!
Fabian Blechschmidt,

5

È possibile utilizzare l' checkout_cart_product_add_afterevento con questo:

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

I dati restituiti sono simili a questo:

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

Questo è stato testato su Magento 1.9.1.0, ma da quello che posso dire, dovrebbe funzionare su 1.7


2

puoi usare il seguente evento

sales_quote_item_set_product

e ottieni l'id oggetto nell'osservatore in questo modo.

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

Questo evento viene chiamato per ogni articolo preventivo ogni volta che viene creato il carrello, non solo quando viene aggiunto un articolo al carrello.
Rooster242,

1

Ho risolto questo problema chiamando save su $ cart e su quoteItem. Non selezionarlo come corretto poiché non sono sicuro che questo sia il metodo migliore.

La soluzione di Fabian Blechschmidt è molto meglio, usala.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.