1

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

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

我的想法有两个问题:

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

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

4

2 回答 2

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 以了解基本架构,然后使用实时Commerce Bug演示来确定您要使用的控制器。(上面链接的两个项目都是我的,自我链接,买家小心等)

于 2010-07-08T22:40:23.830 回答
0

由于我需要实时了解访客离开结帐的那一刻,因此我使用了一个名为IsUserInCheckout. 这设置为true结帐的 indexAction() 执行时。

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

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

于 2010-07-13T19:25:10.390 回答