【问题标题】:Get ID of the last product added to the cart in magento在magento中获取添加到购物车的最后一个产品的ID
【发布时间】:2011-08-26 17:49:58
【问题描述】:

我正在尝试获取最近添加到用户购物车中的产品的 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 文件,但我似乎找不到函数的定义。我还查看了它的父类定义,但在那里也找不到。

如果我无法使用此方法,是否有其他方法可以检索最近添加的项目?我知道这些项目是按顺序添加的,我也许可以从购物车中获取项目列表的最后一项,但是在用户将相同的项目添加到购物车的情况下,这实际上是增加了数量而不是实际数量商品本身(例如,用户在购物车中添加了一台笔记本电脑)

【问题讨论】:

标签: php magento e-commerce


【解决方案1】:

来电

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

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

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

【讨论】:

  • Lee,您能否帮助我们大家学习并告诉我们您是如何发现 getLastAddedProductId 使用了一个神奇的 __call 方法的?我目前知道的唯一识别方法是根本无法在代码中找到“function getLastAddedProductId”。
  • 好吧,正如您所说,它不存在于该类的祖先中的任何地方,并且由于该类是 Varien_Object 的后代,而是被该类中的 __call 魔术方法拾取。没有巫毒,只是侦探工作。
【解决方案2】:

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

grep '>setLastAddedProductId' app/code -rsn

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2015-03-31
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2018-06-03
      相关资源
      最近更新 更多