Viendo el evento Añadir al carrito: el ID del artículo de presupuesto está vacío

11

Estoy tratando de detectar el evento que se dispara una vez que se agrega un artículo al carrito. Actualmente estoy viendo el siguiente evento: checkout_cart_product_add_after

Según la fuente de magento, este evento se dispara después de que todo se hace para la Cotización. pero cuando accedo al identificador del carrito y al identificador de cotización, los valores están vacíos:

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

Lo anterior vuelve vacío para ambos identificadores cuando no hay artículos en el carrito, si el carrito ya tiene un artículo, la identificación del carrito tiene valor pero el quote_item_id no.

Tenga en cuenta que esto se ha preguntado antes, pero la pregunta nunca se resolvió, y la discusión terminó desviándose de este problema. Necesito el quote_item_id.

Nuno Furtado
fuente
probar con$quoteItem = $observer->getEvent()->getQuoteItem();
Marius
Lo mismo, la identificación viene vacía.
Nuno Furtado
Agregue esto en su observador Mage::log($quoteItem)y vea var/log/system.logcómo se ve el artículo de la cita. Quizás tengas una idea a partir de ahí.
Marius
esa es una gran cantidad de información, fácilmente me perderé en ella
Nuno Furtado
1
= D todavía es demasiado grande, probé Mage :: getLog ($ quoteItem-> debug ()) y noté que no hay ningún itemid en la matriz resultante. Parece que hay un item_id en el elemento stock_item dentro del quoteitem, pero ni siquiera estoy seguro de qué es eso. Editar: esto no es así, este valor es siempre el mismo
Nuno Furtado

Respuestas:

22

No hagas esto.

Su problema es que el carrito aún no está guardado, eche un vistazo aquí:

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

Lo que quieres es escuchar checkout_cart_add_product_complete

Si desea saber qué elementos se agregaron esta ronda, simplemente márquelos checkout_cart_product_add_aftercomo, $quoteItem->setIsNew()entonces puede registrarse checkout_cart_add_product_completepara$quoteItem->getIsNew()

Fabian Blechschmidt
fuente
Pensé que sería eso, el problema es que ese evento solo envía el producto. ¿Es una buena idea obtener el carrito de la sesión y obtener el último conjunto de allitems? me preocupa que pueda haber algún tipo de condición de carrera
Nuno Furtado
1
Editó la respuesta.
Debe
@FabianBlechschmidt ¿hay un evento que se activará al actualizar el carrito?
Mariposa
sí, muchos, puedes conectarte al evento de envío y verificarlo: magento.stackexchange.com/a/9155/217 ¡ Y asegúrate de leer el comentario de ben!
Fabian Blechschmidt
5

Puedes usar el checkout_cart_product_add_afterevento con esto:

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

Los datos devueltos se parecen a esto:

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

Esto fue probado en Magento 1.9.1.0, pero por lo que puedo decir, esto debería funcionar en 1.7

acarbonaro
fuente
2

puedes usar el siguiente evento

sales_quote_item_set_product

y obtener la identificación del elemento en un observador como este.

$quote_item = $observer->getEvent()->getQuoteItem();
$item_id = $quote_item->getItemId();
Ratnesh Kumar
fuente
Este evento se llama para cada artículo de presupuesto cada vez que se construye el carrito, no solo cuando se agrega un artículo al carrito.
Rooster242
1

Resolví este problema llamando a save en $ cart y en quoteItem. No seleccioné esto como correcto ya que no estoy seguro de que este sea el mejor método.

La solución de Fabian Blechschmidt es mucho mejor, usa esa.

Nuno Furtado
fuente