Regarder l'événement Ajouter au panier - l'id de l'article de devis est vide


11

J'essaie d'attraper l'événement qui se déclenche une fois qu'un article est ajouté au panier. Je regarde actuellement l'événement suivant: checkout_cart_product_add_after

Selon la source magento, cet événement est déclenché après que tout soit fait pour le devis. mais lorsque j'accède à l'identifiant du panier et à l'identifiant du devis, les valeurs sont vides:

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

Ce qui précède renvoie vide pour les deux identifiants lorsqu'il n'y a pas d'articles dans le panier, si le panier a déjà un article, l'identifiant du panier a de la valeur mais pas le quote_item_id.

Notez que cela a déjà été demandé, mais la question n'a jamais été résolue et la discussion a fini par s'écarter de ce problème. J'ai besoin du quote_item_id.


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

Même chose, l'id est vide.
Nuno Furtado

Ajoutez ceci dans votre observateur Mage::log($quoteItem)et voyez à var/log/system.logquoi ressemble l'élément de devis. Vous avez peut-être une idée à partir de là.
Marius

c'est une énorme quantité d'informations, je vais facilement me perdre
Nuno Furtado

1
= D toujours trop grand, j'ai essayé Mage :: getLog ($ quoteItem-> debug ()) et je remarque qu'il n'y a pas d'itemid dans le tableau résultant. Il semble y avoir un item_id dans l'élément stock_item à l'intérieur du quoteitem mais je ne suis même pas sûr de ce que c'est. Edit: ce n'est pas ça, cette valeur est toujours la même
Nuno Furtado

Réponses:


22

Ne fais pas ça.

Votre problème est que le panier n'est pas encore enregistré, jetez un œil ici:

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

Ce que tu veux c'est écouter checkout_cart_add_product_complete

Si vous voulez savoir quels articles où a ajouté ce tour, juste les signaler dans checkout_cart_product_add_aftercomme $quoteItem->setIsNew()vous pouvez vérifier dans checkout_cart_add_product_completepour$quoteItem->getIsNew()


J'ai pensé que ce serait ça, le problème est que l'événement envoie uniquement le produit. Est-ce une bonne idée d'obtenir le panier de la session et d'obtenir le dernier tableau des allitems? je crains qu'il puisse y avoir une sorte de condition de course
Nuno Furtado

1
Modifié la réponse. Vous devez marquer vos articles de devis, puis laissez magento les enregistrer, puis vous connaissez votre article de devis et le produit :)
Fabian Blechschmidt

@FabianBlechschmidt y a-t-il un événement à déclencher lors de la mise à jour du panier?
Butterfly

oui, beaucoup, vous pouvez simplement vous connecter au dispatchEvent et le vérifier: magento.stackexchange.com/a/9155/217 Et assurez-vous de lire le commentaire de ben!
Fabian Blechschmidt

5

Vous pouvez utiliser l' checkout_cart_product_add_afterévénement avec ceci:

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

Les données renvoyées ressemblent à ceci:

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

Cela a été testé sur Magento 1.9.1.0, mais d'après ce que je peux dire, cela devrait fonctionner sur 1.7


2

vous pouvez utiliser l'événement suivant

sales_quote_item_set_product

et obtenir l'identifiant de l'élément dans l'observateur comme celui-ci.

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

Cet événement est appelé pour chaque article de devis chaque fois que le panier est construit, pas seulement lorsqu'un article est ajouté au panier.
Rooster242

1

J'ai résolu ce problème en appelant save on $ cart et sur quoteItem. Ne pas sélectionner cela comme correct car je ne suis pas sûr que ce soit la meilleure méthode.

La solution Fabian Blechschmidt est bien meilleure, utilisez celle-ci.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.