Magento:如何确定客户是否中止了结账流程

时间:2010-07-08 20:00:01

标签: zend-framework magento module controller checkout

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

我在考虑设置一个他们输入结账的会话变量。在每个页面加载时,运行一个代码块来检查此变量。如果true,它将检查正在使用哪个控制器。如果它不是结账控制器,我会知道他们已离开。

我的想法有两个问题:

  1. 我没有丝毫知道在哪里放置这个控制器检查代码,因此它会在每个页面加载时运行。
  2. 我不知道如何找到处理请求的控制器。
  3. 如果您能帮助回答这些问题,甚至建议更好的方法,我将不胜感激!

2 个答案:

答案 0 :(得分:2)

我对弃车问题略有不同。

每次通过添加产品“创建购物车”时,您都会创建一个Mage_Sales_Model_Quote,magento存储在数据库中。每次完成订单时,您都要创建一个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演示来确定您所追求的控制器。 (与上述相关的项目均为我的,自我链接,买家提防等)。

答案 1 :(得分:0)

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

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

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