【问题标题】:Magento: How to determine if customer aborted checkout processMagento:如何确定客户是否中止了结帐过程
【发布时间】:2011-03-13 13:20:39
【问题描述】:

我正在开发一个自定义模块,该模块需要知道用户是否/何时中止了结帐过程。 “中止”仅仅意味着他们登陆了结帐的 indexAction 但没有完成该过程。知道这种情况是否/何时发生是绝对必要的。

我在想也许设置一个他们已经进入结帐的会话变量。在每次页面加载时,运行一段代码来检查这个变量。如果true,它将检查正在使用的控制器。如果不是结帐控制器,我会知道他们已经离开了。

我的想法有两个问题:

  1. 我不知道该把控制器检查代码放在哪里,以便它在每次页面加载时运行。
  2. 我不知道如何找到正在处理请求的控制器。

如果您能帮助回答这些问题,甚至提出更好的方法,我将不胜感激!

【问题讨论】:

    标签: zend-framework magento module controller checkout


    【解决方案1】:

    我会对废弃购物车问题采取稍微不同的方法。

    每次您通过添加产品“创建购物车”时,您都在创建 magento 存储在数据库中的 Mage_Sales_Model_Quote。每次完成订单时,都会创建一个 Mage_Sales_Model_Order 对象。 Mage_Sales_Model_Order 对象保留对其原始报价 ID 的引用。

    因此,您可以查询所有订单以获取报价 ID 列表,然后创建报价集合并过滤有订单的报价。这将为您提供每次放弃购物车的列表。

    //may start to degrade as orders pile up.  Add date filters to 
    //prevent or look into properly joining things in.
    $orders = Mage::getModel('sales/order')
    ->getCollection()
    ->addAttributeToSelect('*');
    
    var_dump('Order Count', count($orders));
    
    $quote_ids  = $orders->getColumnValues('quote_id');
    $quote_ids = array_filter($quote_ids, 'is_numeric');
    
    $carts      = Mage::getModel('sales/quote')
    ->getCollection();
    
    var_dump('All Cart Count:');
    var_dump(count($carts));
    
    $carts      = Mage::getModel('sales/quote')
    ->getCollection()
    ->addFieldToFilter('entity_id',array('nin'=>$quote_ids));
    
    var_dump('Filtered Cart Count:');
    var_dump(count($carts));
    
    foreach($carts as $cart)
    {
        var_dump('abandoned cart', $cart);
    }
    

    至于您的其他问题,它们过于复杂,无法涉及单个堆栈溢出问题。我会在 Magento 上使用read up 来感受一下基本架构,然后使用现场直播的Commerce Bug 演示来确定您要使用哪个控制器。 (上面链接的两个项目都是我的,自链接,买家小心等)

    【讨论】:

    • 感谢艾伦的详细帮助!不幸的是,我需要实时了解(仅针对当前用户),因此您的解决方案在这种情况下不实用。不过,我确实从中学到了很多东西,而且我真的很喜欢你的 Commerce Bug 模块!再次感谢:)
    • 感谢 Alan,如上所述,我也非常喜欢您的 Commerce Bug Extension!
    【解决方案2】:

    由于我需要实时了解访客离开结帐的那一刻,我使用了一个名为 IsUserInCheckout 的会话变量。当结帐的 indexAction() 执行时,它被设置为 true

    然后我创建了一个事件观察器,它在请求被分派到控制器之前运行。它检查正在调用哪个控制器。如果请求不是针对结帐控制器的,我会查看会话变量以查看用户是否已开始结帐。运行一些自定义逻辑后,我将会话变量 IsUserInCheckout 更改为 false

    我觉得它足够轻巧。它确实会在每次页面加载时运行,但 98% 的时间它只是读取会话变量,看到 false,什么也不做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多