【发布时间】:2012-09-22 15:32:50
【问题描述】:
tl;dr:似乎没有其他现成的机制可以删除从未转换为订单的报价记录。
Mage_Sales 模块有一个计划的作业来清理过期的报价,但这只会删除标记为非活动的sales_flat_quote 记录(即is_active = 0)。据我所知,只有当报价转换为订单时,报价才会被标记为无效。如果是这样的话,那么报价表只会越来越大。
参考Mage_Sales_Model_Observer::cleanExpiredQuotes()
class Mage_Sales_Model_Observer
{
//...
public function cleanExpiredQuotes($schedule)
{
Mage::dispatchEvent('clear_expired_quotes_before', array('sales_observer' => $this));
$lifetimes = Mage::getConfig()->getStoresConfigByPath('checkout/cart/delete_quote_after');
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
/** @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes = Mage::getModel('sales/quote')->getCollection();
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 0);
foreach ($this->getExpireQuotesAdditionalFilterFields() as $field => $condition) {
$quotes->addFieldToFilter($field, $condition);
}
$quotes->walk('delete');
}
return $this;
}
//...
}
【问题讨论】:
-
我向 Magento Suport 开了一张票(作为 Magento 企业客户和银牌合作伙伴)。第一个回应是:给我们你所有的 ssh/db 细节来检查......他们花了一段时间才明白我真正指的是什么(他们的支持人员没有 Magento 编码经验)。他们说 Magento 无法检查报价是否仍然有效,这就是它不会被删除的原因。如果客户返回,他将找不到他的报价。当然,我们的一位客户在数据库中有数百万条报价,添加到购物车受到很大影响。
-
@FlorinelChis,Ben 问题不是那么容易解决,Magento 的人是对的,他们无法确定可以删除哪个引用。首先是支付方式中的问题,即在不改变 is_active 状态的情况下将客户重定向到第三方网站,但另一个问题是,即使是像 Paypal 这样的核心模块也在做同样的事情:)。 is_active 的问题,如果此标志等于 1,您偶尔可以删除登录客户的报价,该客户刚刚为后者保存产品。
-
@IvanChepurnyi - RE 保存的购物车 - 我认为可能有时间限制 - 客户在添加到购物车后 1-2 个月多久转换一次(不确定)?我确实忘记了回调支付方式,但这似乎也很容易处理,例如任何超过 6 个月的有效报价都可能是无效报价。即使对于回调支付方式,订单是否已创建且购物车“已死”?
-
@benmarks 这仍然是一个问题,magento 是否计划在某个时候解决这个问题?
-
@Erfan - 它没有。请参阅 [this answer] (stackoverflow.com/a/12545295/833795) 获取解决方案。
标签: magento