Hier ist ein Ansatz, den ich gewählt habe, um eine bessere Fehlermeldung für zwei bestimmte Filter einzufügen: das von Datum und bis Datum.
Diese Filter sind ziemlich einfach im Vergleich zu den tatsächlichen Regelbedingungen wie Zwischensummen, wie Sie in Ihrer Frage erwähnt haben, aber ich denke, sie bieten immer noch eine signifikante Verbesserung der Benutzerfreundlichkeit mit einer ziemlich einfachen Implementierung.
Es gibt zwei ziemlich saubere Umschreibungen, die durchgeführt werden können, um dies zu erreichen.
Mage_SalesRule_Model_Resource_Rule_Collection :: addWebsiteGroupDateFilter
Überladen Sie die Methode addWebsiteGroupDateFilter, um zu verhindern, dass Regeln, die nicht mit dem Datumsfilter übereinstimmen, vollständig von den verarbeiteten Regeln ausgeschlossen werden.
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
Überladen Sie die Methode _canProcessRule, um die Daten zu überprüfen und der Sitzung eine bestimmte Fehlermeldung hinzuzufügen.
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;
}
}