Получить идентификатор последнего товара, добавленного в корзину в magento - PullRequest
4 голосов
/ 26 августа 2011

Я пытаюсь получить идентификатор продукта, который был недавно добавлен в корзину пользователя.Быстрый поиск в Google показал эту функцию

Mage::getSingleton('checkout/session')->getLastAddedProductId(true);

, которая также используется в Mage_Checkout_Block_Cart_Crosssell.Однако когда я пытаюсь вызвать функцию в моем собственном контроллере, она ничего не возвращает.Я попытался создать базовую сессию через

Mage::getSingleton('core/session', array('name'=>'frontend'))

, однако этот подход не работает.Я также пытался создать блок Crossell и сделать защищенный метод, охватывающий getLastAddedProductId, функцией public, однако, которая возвращает null, так же, как и при попытке вызвать его самостоятельно.

Есть ли что-то, что мне нужновызвать или создать экземпляр для использования этой функции?Вот мой список источников для справки.

class Mymodule_Addcartaftermath_ItemaddedController extends Mage_Core_Controller_Front_Action {
    public function generatemessageAction() {
        $parameters = $this->getRequest()->getParams();
        if (isset($parameters['ajax_call'])) {
            $latest_item_id = Mage::getSingleton('checkout/session')->getLastAddedProductId(true);
            $response = array('response' => $latest_item_id);
            echo json_encode($response);
        } else {
            $this->_redirect('/');
        }
    }
}

Я попытался просмотреть исходный код, в частности файл checkout / model / session.php в ядре, и я не могу найти определение функции.Я также посмотрел на определение класса его родителя, но не смог найти его там тоже.

Если этот метод мне не доступен, есть ли другой способ получить самый последний добавленный элемент?Я знаю, что элементы добавляются последовательно, и, возможно, я мог бы просто получить последний элемент списка элементов из корзины, однако это не сработает в случае, когда пользователь добавляет тот же элемент в корзину, существенно увеличивая количество, а не фактическоесам товар (например, пользователь добавляет ноутбук в корзину, когда он уже есть)

Ответы [ 3 ]

4 голосов
/ 27 августа 2011

Вызов

Mage::getSingleton('checkout/session')->getLastAddedProductId(true);

На самом деле очищает переменную сеанса после ее чтения.Magento широко использует магические методы.В этом случае вы используете магический метод __call, который в свою очередь использует метод getData ().В Mage_Core_Model_Session_Abstract_Varien вы увидите, что они переопределяют поведение getData () по умолчанию, ожидая, что второй параметр будет логическим (первый параметр getData - это имя ключа для значения, которое вы ищете).Это логическое значение - флаг, указывающий сеансу очистить переменную после чтения.

Вы всегда можете прослушать событие checkout_cart_product_add_after и добавить элемент в свою переменную в сеансе.Это событие фактически запускается в строке перед вызовом setLastAddedProductId ().

1 голос
/ 27 августа 2011

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

grep '>setLastAddedProductId' app/code -rsn

, чтобы увидеть, куда попадает идентификатор продуктаустановите эту переменную сеанса

app/code/core/Mage/Checkout/Model/Cart.php:255:        $this->getCheckoutSession()->setLastAddedProductId($product->getId());

, а затем вы можете задать эту переменную (если она установлена ​​иначе ())

Mage::getSingleton('checkout/session')->getLastAddedProductId();

, и вы сможете увидеть все, что воформить заказ / сеанс и проверить, есть ли данные.

var_dump(Mage::getSingleton('checkout/session'));
0 голосов
/ 25 ноября 2011

Понятия не имею, почему он работает таким образом, но он работает для меня в Magento 1.6 ...

<?php
require_once ( "app/Mage.php" );
umask(0);

Mage::app("default");

Mage::getSingleton('core/session', array('name'=>'frontend'));
$session = Mage::getSingleton('checkout/session');

$lastadded = $session->getData("last_added_product_id");

print_r($lastadded);

Очевидно, вам нужно создать экземпляр ядра / сеанса, а затем извлечения / сеанса.Я пробовал все по-другому, но это единственный способ, который я нашел, чтобы это работало.Возможно, кто-то может объяснить, почему это так работает.Надеюсь, это поможет вам!

...