Получить идентификатор товара предложения после добавления в корзину
Я запускаю наблюдателя на Magento 1.9 в следующем событии:
Продажа_квоте_мерге_после
Это событие происходит, когда гость, у которого есть товары в корзине, входит в свою учетную запись. При этом идентификаторы номенклатуры предложения удаляются из текущего сеанса, а продукты добавляются заново с новыми идентификаторами. Что мне нужно знать (используя наблюдателя или иным образом), так это то, каким был идентификатор каждого элемента цитаты раньше и во что он превратился.
У меня есть пробовал бесчисленное количество наблюдателей в методе mage_sale_model_quote::additem, но Magento не возвращает идентификатор нового элемента цитаты ни в одном из методов, которые я видел.
В наблюдателе выше мне удалось заставить его передать исходную цитату и новую цитату в наблюдателя, но нет способа сопоставить идентификаторы элементов цитаты.
Я попытался добавить исходный идентификатор элемента предложения в качестве опции к элементу предложения, который работает, но как только выполняется слияние, параметры стерто!
$item->addOption(array(
'code' => 'original_quote_item_id',
'product' => $item->getProduct()->getId(),
'value' => $item->getId()
));
Я остаюсь в недоумении, где попробовать дальше - любые советы или предложения будут очень признательны!
3 answers
Итак, основываясь на том, что вы сказали, у меня теперь есть решение, которое, как я полагаю, работает в 100% случаев и хорошо соответствует предметам.
При слиянии могут произойти 3 вещи.
- Когда товар находится в обеих кавычках, его количество объединяется с зарегистрированным товаром клиентов.
- Когда товар находится в предложении гостя, но не в предложении зарегистрированного клиента, новый товар клонируется в предложение зарегистрированного клиента, а идентификатор item_id добавляется позже (который я не смог закрепить точка)
- Товар находится только в зарегистрированном предложении клиента, ничего не меняется.
Поскольку для первых двух возможностей элемент находится в обеих кавычках, я использовал функцию сравнения, чтобы определить, когда элементы совпадали и заполняли новые идентификаторы и исходные идентификаторы в этот момент.
Затем мы можем сказать, что если не было совпадения, этого элемента не было в гостевой цитате, поэтому просто используйте новый идентификатор, так как не было оригинального идентификатора.
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;
}
Возможно, вам также следует понаблюдать за событием sales_quote_merge_before
.
используйте тот же класс наблюдателя, но другой метод, и объявите свой класс наблюдателя одноэлементным.
Затем вы можете запомнить идентификаторы из предложения до завершения слияния.
в sales_quote_merge_after
снова получите все идентификаторы товаров в корзине и рассчитайте разницу. Вы должны получить недавно добавленные идентификаторы элементов.
Хорошо, в конце концов, это не идеально, но я использовал два события:
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), но должно быть что-то, что мы можем сделать.