我正在尝试获取最近添加到用户购物车的产品的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文件,我似乎找不到函数的定义。我也查看了它的父类定义,但也找不到它。
如果我无法使用此方法,是否有其他方法可以检索添加的最新项目?我知道这些项目是按顺序添加的,我可能只是从购物车中获取项目列表的最后一项,但是在用户将相同项目添加到购物车的情况下这实际上不会增加数量而不是实际项目本身(例如,用户在已经有一台笔记本电脑时添加一台笔记本电脑)
答案 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);
显然你必须实例化核心/会话然后结帐/会话。我已经尝试过其他方式,但这是我发现它工作的唯一方法。也许有人可以解释为什么它会这样运作。希望这会帮助你!