Watch In Warenkorb-Ereignis - Die Artikel-ID des Angebots ist leer


11

Ich versuche, das Ereignis zu erfassen, das ausgelöst wird, sobald ein Artikel in den Warenkorb gelegt wird. Ich beobachte derzeit das folgende Ereignis: checkout_cart_product_add_after

Laut Magento-Quelle wird dieses Ereignis ausgelöst, nachdem alles mit dem Zitat getan wurde. aber wenn ich auf die Warenkorb-ID und die Angebots-ID zugreife, sind die Werte leer:

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

Die obigen Angaben sind für beide IDs leer, wenn sich keine Artikel im Warenkorb befinden. Wenn der Warenkorb bereits einen Artikel enthält, hat die Warenkorb-ID einen Wert, die quote_item_id jedoch nicht.

Beachten Sie, dass dies bereits gestellt wurde, die Frage jedoch nie gelöst wurde und die Diskussion von diesem Problem abwich. Ich brauche die quote_item_id.


versuchen Sie es mit$quoteItem = $observer->getEvent()->getQuoteItem();
Marius

Gleiches gilt, der Ausweis ist leer.
Nuno Furtado

Fügen Sie dies Ihrem Beobachter hinzu Mage::log($quoteItem)und sehen Sie, var/log/system.logwie das Angebot aussieht. Vielleicht bekommen Sie von dort eine Idee.
Marius

Das ist eine riesige Menge an Informationen, ich werde mich leicht darin verlieren
Nuno Furtado

1
= D immer noch zu groß, ich habe Mage :: getLog ($ quoteItem-> debug ()) ausprobiert und festgestellt, dass das resultierende Array keine itemid enthält. Es scheint eine item_id im stock_item-Element innerhalb des quoteitem zu geben, aber ich bin mir nicht einmal sicher, was das ist. Bearbeiten: das ist es nicht, dieser Wert ist immer der gleiche
Nuno Furtado

Antworten:


22

Tu das nicht.

Ihr Problem ist, dass der Warenkorb noch nicht gespeichert ist. Schauen Sie hier:

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

Was Sie wollen, ist zuzuhören checkout_cart_add_product_complete

Wenn Sie wissen möchten , welche Elemente in dem diese Runde hinzugefügt, gerade Flagge sie in checkout_cart_product_add_afterwie $quoteItem->setIsNew()dann können Sie überprüfen , in checkout_cart_add_product_completefür$quoteItem->getIsNew()


Ich dachte, das wäre es. Das Problem ist, dass das Ereignis nur das Produkt verschickt. Ist es eine gute Idee, den Warenkorb aus der Sitzung zu holen und den letzten Teil des Allitems-Arrays zu erhalten? Ich mache mir Sorgen, dass es eine Art Rennbedingung geben könnte
Nuno Furtado

1
Antwort bearbeitet. Sie müssen Ihre Angebotselemente kennzeichnen, dann von Magento speichern lassen, dann kennen Sie Ihr Angebotselement und das Produkt :)
Fabian Blechschmidt

@FabianBlechschmidt Gibt es ein Ereignis, das beim Aktualisieren des Warenkorbs ausgelöst werden muss?
Schmetterling

Ja, viele, Sie können sich einfach in das dispatchEvent einhaken und es überprüfen: magento.stackexchange.com/a/9155/217 Und lesen Sie unbedingt den Kommentar von ben!
Fabian Blechschmidt

5

Sie können das checkout_cart_product_add_afterEreignis folgendermaßen verwenden:

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

Die zurückgegebenen Daten sehen folgendermaßen aus:

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

Dies wurde auf Magento 1.9.1.0 getestet, aber soweit ich das beurteilen kann, sollte dies auf 1.7 funktionieren


2

Sie können folgendes Ereignis verwenden

sales_quote_item_set_product

und erhalten Sie die Artikel-ID im Beobachter wie folgt.

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

Dieses Ereignis wird bei jeder Erstellung des Warenkorbs für jeden Angebotsposten aufgerufen, nicht nur, wenn ein Artikel zum Warenkorb hinzugefügt wird.
Rooster242

1

Ich habe dieses Problem gelöst, indem ich save on $ cart und quoteItem aufgerufen habe. Ich wähle dies nicht als richtig aus, da ich nicht sicher bin, ob dies die beste Methode ist.

Fabian Blechschmidt Lösung ist viel besser, verwenden Sie diese.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.