Đây là một cách tiếp cận mà tôi đã thực hiện để đưa vào một thông báo lỗi tốt hơn cho hai bộ lọc cụ thể: từ ngày và đến ngày.
Các bộ lọc này khá đơn giản so với việc đào sâu vào các điều kiện quy tắc thực tế như tổng phụ, như bạn đã đề cập trong câu hỏi của mình, nhưng tôi nghĩ vẫn cung cấp một cải tiến khả năng sử dụng đáng kể với việc triển khai khá đơn giản.
Có hai cách viết khá sạch có thể được thực hiện để thực hiện điều này.
Mage_SalesRule_Model_Resource_Rule_Collection :: addWebsitegroupDateFilter
Quá tải phương thức addWebsitegroupDateFilter để ngăn các quy tắc không khớp với bộ lọc ngày bị loại trừ hoàn toàn khỏi các quy tắc được xử lý.
public function addWebsiteGroupDateFilter($websiteId, $customerGroupId, $now = null)
{
parent::addWebsiteGroupDateFilter($websiteId, $customerGroupId, $now);
$where = $this->_removeDateFilters();
$this->getSelect()->setPart('where', $where);
return $this;
}
protected function _removeDateFilters()
{
$where = $this->getSelect()->getPart('where');
foreach ($where as $index => $whereLine) {
if (strpos($whereLine, "from_date is null or from_date <") !== false) {
unset($where[$index]);
} elseif (strpos($whereLine, "to_date is null or to_date >") !== false) {
unset($where[$index]);
}
}
$where = array_values($where);
return $where;
}
Clean_Checkout_Model_SalesRule_Validator :: _ canProcessRule
Quá tải phương thức _canProcessRule để kiểm tra ngày và thêm thông báo lỗi cụ thể vào phiên.
protected function _canProcessRule($rule, $address)
{
if ($this->_isRuleExpired($rule, $address)) {
return false;
}
return parent::_canProcessRule($rule, $address);
}
protected function _isRuleExpired($rule, $address)
{
if ($rule->getFromDate() && date('Y-m-d', time()) < $rule->getFromDate()) {
$message = "This coupon won't be active until {$rule->getFromDate()}";
Mage::getSingleton('checkout/session')->addUniqueMessages(new Mage_Core_Model_Message_Error($message));
return true;
}
if ($rule->getToDate() && date('Y-m-d', time()) > $rule->getToDate()) {
$message = "This coupon expired on {$rule->getToDate()}";
Mage::getSingleton('checkout/session')->addUniqueMessages(new Mage_Core_Model_Message_Error($message));
return true;
}
}