获取magento中添加到购物车的最新产品的ID

时间:2011-08-26 17:49:59

标签: php magento e-commerce

我正在尝试获取最近添加到用户购物车的产品的ID。快速谷歌搜索显示此功能

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 个答案:

答案 0 :(得分:4)

致电

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

实际上是在读取后清除会话变量。 Magento广泛使用魔法。在这种情况下,您使用__call魔术方法,后者又使用getData()方法。在Mage_Core_Model_Session_Abstract_Varien中,您将看到它们覆盖了getData()的默认行为,以期望第二个参数是布尔值(getData的第一个参数是您要查找的值的键名)。该布尔值是一个标志,告诉会话在读取后清除变量。

您可以随时收听 checkout_cart_product_add_after 事件,并将该项添加到会话中您自己的变量中。该事件实际上是在调用setLastAddedProductId()之前在该行上触发的。

答案 1 :(得分:1)

尝试grep您正在寻找的变量。由于它们来自魔术方法,因此很难找到您所追求的确切功能,因此更容易看到数据设置的位置比使用它的位置

grep '>setLastAddedProductId' app/code -rsn

查看产品ID设置为该会话变量的位置

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

然后你可以问这个变量(如果设置为else())

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

您可以查看结帐/会话中的所有内容并验证数据是否存在。

var_dump(Mage::getSingleton('checkout/session'));

答案 2 :(得分:0)

不知道为什么它以这种方式工作但它在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);

显然你必须实例化核心/会话然后结帐/会话。我已经尝试过其他方式,但这是我发现它工作的唯一方法。也许有人可以解释为什么它会这样运作。希望这会帮助你!