Перегляд Додати в кошик Подія - ідентифікатор елемента цитати порожній


11

Я намагаюся зафіксувати подію, яка спрацьовує, коли товар додається до кошика. Зараз я переглядаю таку подію: checkout_cart_product_add_after

За інформацією джерела magento, ця подія закінчується після того, як все буде зроблено для Котирування. але коли я отримую доступ до ідентифікатора кошика та ідентифікатора, ці значення порожні:

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

Вищевказане повертається порожнім для обох ідентифікаторів, коли в кошику немає елементів, якщо в кошику вже є елемент, котрий має значення ідентифікатора кошика, але це не_визначення.

Зауважте, що про це вже задавались, але це питання ніколи не було вирішено, і обговорення закінчилося відхиленням від цього питання. Мені потрібен quo_item_id.


спробуйте$quoteItem = $observer->getEvent()->getQuoteItem();
Маріус

Те саме, ідентифікатор стає порожнім.
Нуно Фуртадо

Додайте це до свого спостерігача Mage::log($quoteItem)і подивіться, var/log/system.logяк виглядає елемент цитати. Можливо, ви звідти отримаєте ідею.
Маріус

це величезна кількість інформації, я легко заблукаю в ній
Nuno Furtado

1
= D все ще занадто великий, я спробував Mage :: getLog ($ quoteItem-> debug ()), і я помітив, що в отриманому масиві немає itemid. Здається, що елемент element_id всередині quoitem є, але я навіть не впевнений, що це таке. Редагувати: це не це значення завжди однакове
Нуно Фуртадо

Відповіді:


22

Не робіть цього.

Ваша проблема полягає в тому, що візок ще не збережений, подивіться тут:

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

Що ви хочете, це слухати checkout_cart_add_product_complete

Якщо ви хочете знати , які пункти , де додали цей раунд, просто позначте їх в checkout_cart_product_add_afterяк $quoteItem->setIsNew()то ви можете перевірити в checkout_cart_add_product_completeпротягом$quoteItem->getIsNew()


Я подумав, що це було б, проблема полягає в тому, що подія лише відправляє продукт. Це гарна ідея взяти кошик із сеансу та отримати останній з масиву allitems? я хвилююся, що може бути якась умова гонки
Нуно Фуртадо

1
Редагував відповідь. Вам потрібно позначити свої цитати, а потім дозволити їх зберегти, тоді ви знаєте свою цитату та товар :)
Fabian Blechschmidt

@FabianBlechschmidt Чи може бути подія, яку слід викликати під час оновлення кошика?
Метелик

так, багато, ви можете просто зачепитись у dispatchEvent і перевірити це: magento.stackexchange.com/a/9155/217 І обов'язково прочитайте коментар від ben!
Фабіан Блешшмідт

5

Ви можете використовувати checkout_cart_product_add_afterподію для цього:

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

Дані, що повертаються, виглядають приблизно так:

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

Це було протестовано на Magento 1.9.1.0, але, як я можу сказати, це повинно працювати на 1.7


2

Ви можете використовувати наступну подію

sales_quote_item_set_product

і отримати ідентифікатор елемента у такого спостерігача.

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

Ця подія називається для кожного предмета котирування щоразу, коли кошик складається, а не лише тоді, коли товар додається до кошика.
Rooster242

1

Я вирішив цю проблему, зателефонувавши зберегти на $ cart та quotitem. Не вибираючи це як правильне, оскільки я не впевнений, що це найкращий метод.

Рішення Fabian Blechschmidt набагато краще, використовуйте це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.