Смотреть событие Add to Cart - Цитата идентификатор элемента пуст
-
16-10-2019 - |
Вопрос
Я пытаюсь поймать событие, которое стреляет после добавления предмета в корзину. В настоящее время я смотрю следующее событие: CACKOUT_CART_PRODUCT_ADD_AFTER
Согласно источнику Magento, это событие запускается после того, как все сделано для цитаты. Но когда я получаю доступ к идентификатору корзины и идентификатору цитаты, значения пусты:
$quoteItem = $observer->getQuoteItem();
$quote_item_id = $quoteItem->getItemId();
$cart = Mage::getSingleton('checkout/session');
$quote_id= $cart->getQuoteId();
Вышеуказанное возвращается пустым для обоих идентификаторов, когда в тележеке нет элементов, если у тележки уже есть элемент, который идентификатор корзины имеет значение, но Quote_item_id нет.
Обратите внимание, что это было задано ранее, но вопрос никогда не был решен, и обсуждение в итоге исчезло от этого вопроса. Мне нужен QUOTE_ITEM_ID.
Решение
Не делай этого.
Ваша проблема в том, что тележка еще не сохранена, посмотрите здесь:
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()
Другие советы
Вы можете использовать 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
Вы можете использовать следующее событие
sales_quote_item_set_product
И получить идентификатор элемента в наблюдателе, как это.
$quote_item = $observer->getEvent()->getQuoteItem();
$item_id = $quote_item->getItemId();
Я решил эту проблему, позвонив по сохранению на корзину $ и на QuoteItem. Не выбирая это как правильное, так как я не уверен, что это лучший метод.
Решение Fabian Blechschmidt намного лучше, используйте это.