Magento目录价格规则在晚上消失

12

我已经在Magento平台上开发了在线商店。除了促销目录价格规则之外,一切正常。我创建了一个简单的规则,对所有产品应用15%的折扣。当我保存并应用规则时,它整天都有效。但是到了晚上12点后,促销就不再可见。我尝试通过在管理面板上点击应用规则来应用规则,但在晚上甚至不允许我手动应用规则。我可以在第二天早上应用规则,这时它又可以正常工作,但直到晚上12点又失败。

我已尝试以下操作。 我删除了在产品上单独定义的特价,因此仅通过价格规则实现销售。 我设置了cron作业,但夜间也不起作用。 我检查了规则的日期和时间。

我发现这可能是由于时间设置引起的。我正在使用GMT +5.有什么方法可以使规则在昼夜中保持有效吗?

谢谢

5个回答

24

是的,这是Magento中的一个错误(或一些我无法理解的逻辑)。当Magento在前端显示产品时,它会检查是否存在与此日期相关的目录规则。用于此检查的日期是您的本地日期,因此在您的情况下为GMT+5。但是,在应用目录规则时,它使用GMT日期。这意味着在早上5点之前,您将无法应用规则。

问题出在Mage_CatalogRule_Model_Action_Index_Refresh::execute()方法中。您将不得不在您的扩展中重写此函数/类,或通过文件的本地版本来重写它。

文件位置:app/code/core/Mage/CatalogRule/Model/Action/Index/Refresh.php

您需要替换第121行:

$timestamp = $coreDate->gmtTimestamp('Today');

使用这行代码:

$timestamp = Mage::app()->getLocale()->date(null, null, null, true)->get(Zend_Date::TIMESTAMP);

之后,您应该能够应用这些规则。


谢谢您的回复。创建本地版本,是指在app/code/local/Mage中创建相同的层次结构吗? - Mehak
是的。我应用了这个解决方案,它非常有效。价格规则在12之后仍然保持启用状态。非常感谢。 - Mehak
请问您能指出原始文件的路径吗? - Mike
你应该因这个答案而获得奖章!你是救星!太棒了,找到并修复了问题! - Abul Hassan
找出核心错误加1分。我想指出$timestamp = $coreDate->gmtTimestamp();将产生相同的效果。传递给strtotime的参数“今天”会导致问题。 - Mladen Ilić
显示剩余2条评论

4
在Magento 1.9.2.2中,这对我来说没有用。我安装了AOE调度程序,并使用它将catalogrule_apply_all的cron表达式从0 1 * * *更改为30 */6 * * *,然后它开始工作了。希望这能帮助到某些人。

1
如@Alexei-Zerofezev所述,问题在于索引器。
我也遇到了这个问题,当本地时区的偏移量大于+01:00时,问题就存在了。
基本上,因为Magento在规则日期中使用了gmtTimestamp,在上述情况下导致了昨天之前的那一天。
因此,我开发了一个小模块https://github.com/Chuvisco88/Chuvisco_CatalogRuleFix来解决这个问题。如果有人遇到这个问题,请试试。

这是感谢您的模块。我遇到了完全相同的问题,它完美地解决了它。再次非常感谢您,您是本周的英雄 :-) - Dr. Gianluigi Zane Zanettini

0

延伸lakshin-karunaratne的答案。

确保将cataloguerule_apply_all从午夜之后移动,但在catalog_product_index_price_reindex_all之前。

来自“解决Magento”
“重要的是规则价格必须计算为当前日期之前目录价格重新索引开始。否则,观察者将无法获得任何活动规则价格以增强价格指数。”

因此,您需要计算与GMT时间的偏移量,以确保cataloguerule_apply_allcatalog_product_index_price_reindex_all在同一天执行。

这可以通过使用AOE Scheduler https://github.com/AOEpeople/Aoe_Scheduler轻松实现。


0

我使用了一个shell脚本,而不是@Lakshin Karunaratne建议的(巨大的)AOE页面。

require_once 'abstract.php';

class X043_Shell_PriceRuleSetter extends Mage_Shell_Abstract
{
    public function run()
    {
        // stuff and thingies
        umask(0);
        Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
        setlocale(LC_ALL, 'en_US.UTF-8'); 

        try {
            Mage::getModel('catalogrule/rule')->applyAll();
            Mage::getModel('catalogrule/flag')->loadSelf()
                ->setState(0)
                ->save();
        } catch (Mage_Core_Exception $e) {
            Mage::logException($e);
        } catch (Exception $e) {
            Mage::logException($e);
        }

        return $this;
    }
}

$shell = new X043_Shell_PriceRuleSetter();
$shell->run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接