장바구니에 담기 이벤트-인용 항목 ID가 비어 있습니다


11

장바구니에 품목이 추가되면 발생하는 이벤트를 잡으려고합니다. 현재 다음 이벤트를보고 있습니다 : checkout_cart_product_add_after

마 젠토 소스에 따르면이 이벤트는 모든 것이 견적에 완료된 후에 시작됩니다. 그러나 장바구니 ID와 견적 ID에 액세스하면 값이 비어 있습니다.

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

카트에 아이템이없는 경우 위의 두 아이디에 대해 빈 값을 반환합니다. 카트에 이미 아이템이 있으면 카트 ID에는 값이 있지만 quote_item_id는 그렇지 않습니다.

이것은 이전에 요청되었지만 문제가 해결되지 않았으며 토론은이 문제에서 벗어났습니다. quote_item_id가 필요합니다.


함께 시도$quoteItem = $observer->getEvent()->getQuoteItem();
Marius

같은 것, 아이디가 비게됩니다.
Nuno Furtado

이것을 관찰자에 추가 하고 견적 항목이 어떻게 보이는지 Mage::log($quoteItem)확인하십시오 var/log/system.log. 어쩌면 거기에서 아이디어를 얻을 수 있습니다.
Marius

즉, 내가 쉽게에서 엄청난 양의 정보 분실 것입니다
누누 퍼 타도

1
= D는 여전히 너무 커서 Mage :: getLog ($ quoteItem-> debug ())를 시도했는데 결과 배열에 itemid가 없다는 것을 알았습니다. 따옴표 안의 stock_item 요소에 item_id가있는 것 같지만 그게 뭔지 잘 모르겠습니다. 편집 : 이것은이 값이 항상 동일하지 않습니다
Nuno Furtado

답변:


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
답변을 수정했습니다. 당신은 당신의 견적 항목을 플래그 다음 magento 그들을 저장, 당신은 당신의 견적 항목과 제품을 알고해야합니다 :)
Fabian Blechschmidt

@FabianBlechschmidt 장바구니를 업데이트하는 동안 트리거되는 이벤트가 있습니까?
Butterfly

예, 많은 사람들은 dispatchEvent에 연결하여 확인할 수 있습니다. magento.stackexchange.com/a/9155/217 그리고 벤의 의견을 읽어보십시오!
Fabian Blechschmidt

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

이와 같이 옵저버에서 아이템 ID를 얻습니다.

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

이 이벤트는 장바구니를 만들 때마다 품목이 장바구니에 추가 될 때뿐만 아니라 모든 견적 품목에 대해 호출됩니다.
Rooster242

1

$ cart 및 quoteItem에서 save를 호출하여이 문제를 해결했습니다. 이것이 최선의 방법인지 잘 모르겠 기 때문에 이것을 올바르게 선택하지 않았습니다.

Fabian Blechschmidt 솔루션이 훨씬 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.