Получить идентификатор товара предложения после добавления в корзину


Я запускаю наблюдателя на Magento 1.9 в следующем событии:

Продажа_квоте_мерге_после

Это событие происходит, когда гость, у которого есть товары в корзине, входит в свою учетную запись. При этом идентификаторы номенклатуры предложения удаляются из текущего сеанса, а продукты добавляются заново с новыми идентификаторами. Что мне нужно знать (используя наблюдателя или иным образом), так это то, каким был идентификатор каждого элемента цитаты раньше и во что он превратился.

У меня есть пробовал бесчисленное количество наблюдателей в методе mage_sale_model_quote::additem, но Magento не возвращает идентификатор нового элемента цитаты ни в одном из методов, которые я видел.

В наблюдателе выше мне удалось заставить его передать исходную цитату и новую цитату в наблюдателя, но нет способа сопоставить идентификаторы элементов цитаты.

Я попытался добавить исходный идентификатор элемента предложения в качестве опции к элементу предложения, который работает, но как только выполняется слияние, параметры стерто!

$item->addOption(array(
                'code' => 'original_quote_item_id',
                'product' => $item->getProduct()->getId(),
                'value' => $item->getId()
            ));

Я остаюсь в недоумении, где попробовать дальше - любые советы или предложения будут очень признательны!

Author: Adam Moss, 2014-11-12

3 answers

Итак, основываясь на том, что вы сказали, у меня теперь есть решение, которое, как я полагаю, работает в 100% случаев и хорошо соответствует предметам.

При слиянии могут произойти 3 вещи.

  1. Когда товар находится в обеих кавычках, его количество объединяется с зарегистрированным товаром клиентов.
  2. Когда товар находится в предложении гостя, но не в предложении зарегистрированного клиента, новый товар клонируется в предложение зарегистрированного клиента, а идентификатор item_id добавляется позже (который я не смог закрепить точка)
  3. Товар находится только в зарегистрированном предложении клиента, ничего не меняется.

Поскольку для первых двух возможностей элемент находится в обеих кавычках, я использовал функцию сравнения, чтобы определить, когда элементы совпадали и заполняли новые идентификаторы и исходные идентификаторы в этот момент.

Затем мы можем сказать, что если не было совпадения, этого элемента не было в гостевой цитате, поэтому просто используйте новый идентификатор, так как не было оригинального идентификатора.

protected $_source;

/**
 * @param Varien_Event_Observer $observer
 * @return Training_Merge_Model_Observer
 */
public function salesQuoteMergeAfter(Varien_Event_Observer $observer)
{
    $this->_source = $observer->getEvent()->getSource();
}

public function controllerFrontSendResponseAfter(Varien_Event_Observer $observer){
    if($this->_source) {
        $newOldArray = array();

        //Quote = Customer Quote
        //Source = Guest Quote
        $quote = Mage::getSingleton('checkout/session')->getQuote();
        $source = $this->_source;

        foreach ($source->getAllVisibleItems() as $item) {
            foreach ($quote->getAllItems() as $quoteItem) {
                if ($quoteItem->compare($item)) {

                    $newId = $quoteItem->getData('item_id');
                    $originalId = $item->getData('item_id');

                    $newOldArray[] = array(
                        "newId" => $newId,
                        "originalId" => $originalId
                    );

                    $quoteItem->setIsMatch(1);

                }
            }
        }

        //If there was no match so far then it's a new item and there was
        //no similar item in the old quote, we can therefore just take the
        //newId and set the original to null
        foreach ($quote->getAllItems() as $quoteItem) {
            if (!$quoteItem->getIsMatch()) {
                $newId = $quoteItem->getData('item_id');

                $newOldArray[] = array(
                    "newId" => $newId,
                    "originalId" => null
                );

            }
        }
    }


    return $this;
}
 4
Author: James Anelay - TheExtensionLab, 2014-11-12 21:04:23

Возможно, вам также следует понаблюдать за событием sales_quote_merge_before.
используйте тот же класс наблюдателя, но другой метод, и объявите свой класс наблюдателя одноэлементным.
Затем вы можете запомнить идентификаторы из предложения до завершения слияния.
в sales_quote_merge_after снова получите все идентификаторы товаров в корзине и рассчитайте разницу. Вы должны получить недавно добавленные идентификаторы элементов.

 1
Author: Marius, 2014-11-12 12:41:25

Хорошо, в конце концов, это не идеально, но я использовал два события:

Sales_quote_merge_before - в наблюдателе я схватил старые пункты цитаты

public function setOldQuoteIntoSession($observer)
{
    $this->_source = $observer->getEvent()->getSource();
}

Controller_front_send_response_after - в наблюдателе я схватил новые элементы цитаты. Это одно из последних событий, и на этом этапе котировка обновляется и сохраняется.

public function updateQuoteItems($observer)
{
    if (isset($this->_source))
    {
        $oldQuote = $this->_source;
        $newQuote = Mage::getSingleton('checkout/session')->getQuote();

        // do code
    }
}

Это не идеально, потому что я не могу на 100% сопоставить старые идентификаторы с новыми идентификаторами - я буквально делаю это на основе продукта Идентификатор, установленный для каждого элемента предложения. Я исчерпал все другие возможности.

Magento, если вы читаете это, пожалуйста, объясните, почему нам приходится так долго ждать, прежде чем мы получим идентификаторы котировок от добавленных товаров? Я знаю, что нам нужно дождаться обновления Setcart(true), но должно быть что-то, что мы можем сделать.

 0
Author: Adam Moss, 2014-11-12 17:05:40