【问题标题】:Magento date format in advanced search高级搜索中的 Magento 日期格式
【发布时间】:2014-03-02 16:47:22
【问题描述】:

我的版本是1.8.1.0(社区版)。

我对 magento 前端的日期格式有疑问,尤其是在高级搜索中。 我添加了一个自定义属性“event_date”,输入类型为“Date”。

Configuration->General 我已将语言环境设置为“France”,在 Configuration->Catalog->Date & Time Custom Options 我已将日期字段顺序到日/月/年。

但是当我在高级搜索中使用日期选择器在前端选择一个日期时,它会以美国格式添加它。 (月/日/年)

真正奇怪的是:搜索仅适用于美国格式,但搜索验证器需要 d/m/y 格式的日期。我发现日期格式是硬编码在“app/code/core/Mage/CatalogSearch/Block/Advanced/Form.php”中的。如果我在这个文件中更改它,日历和验证器以正确的格式工作,但我没有得到任何结果,因为搜索仍然需要美国格式。

那么强制 Magento 以指定的日期格式工作的最佳方法是什么?

更新:

我还发现,如果我将浏览器首选语言设置为 en_US,则验证适用于美国(月/日/年)格式。因此,Magento 似乎检查了客户端区域设置并将日期验证设置为它,而不是日历或搜索本身的日期格式。

更新 2:

在没有得到回复后,我在https://magento.stackexchange.com/questions/16257/date-format-in-advanced-search 下发布了相同的问题,但描述不同。

请到那里看看。最后,我可以解决 3 个问题中的 2 个问题,以便我的高级搜索现在以 en_US 日期格式运行。最后一个问题是:在代码中为高级搜索构建数据库查询的位置以及如何切换到另一种日期格式?似乎 en_US 日期格式是硬编码的。

【问题讨论】:

    标签: php magento


    【解决方案1】:

    我在使用日期过滤器时遇到了类似的问题 :)

    日期时间以这样的形式实例化的方式

    第一步:-

    在块形式类Mage_CatalogSearch_Block_Advanced_Form

    public function getDateInput($attribute, $part = 'from')
    {
        $name = $attribute->getAttributeCode() . '[' . $part . ']';
        $value = $this->getAttributeValue($attribute, $part);
    
        return $this->_getDateBlock()
            ->setName($name)
            ->setId($attribute->getAttributeCode() . ($part == 'from' ? '' : '_' . $part))
            ->setTitle($this->getAttributeLabel($attribute))
            ->setValue($value)
            ->setImage($this->getSkinUrl('images/calendar.gif'))
            ->setFormat('%m/%d/%y') //So you need change the Format here !!!!!
            ->setClass('input-text')
            ->getHtml();
    }
    

    所以你需要更改->setFormat('%m/%d/%y')行中日历的日期格式

    !在这里查看支持的日期时间格式http://www.dynarch.com/jscal/#sec34

    然后在下面的方法中使用它来生成块

    $block = $this->getLayout()->createBlock('core/html_date');
    $this->setData('_select_block', $block);
    

    在那个块类中Mage_Core_Block_Html_Date

    Line 40: $displayFormat = Varien_Date::convertZendToStrFtime($this->getFormat(), true, (bool)$this->getTime());
    .......
    Line53: ifFormat    : "' . $displayFormat . '",
    

    第二步:-

    在高级搜索集合类Mage_CatalogSearch_Model_Resource_Advanced_Collection

    您需要修改此方法以允许您需要新的语言环境或新的数据时间格式!

    Line43: public function addFieldsToFilter($fields) {
    .......
    .......
    .......
    .......
    Line96: if (!Zend_Date::isDate($conditionValue['from'])) {
    .......
    Line109:if (!Zend_Date::isDate($conditionValue['to'])) {
    .......
    }
    

    现在您需要使用新的日期时间格式修改这两行,您更改搜索块以允许验证此方法

    例如,我将 Javascript 日历格式修改为 %d-%m-%Y,这将在日历中生成日期,例如 (25-12-2014)

    然后我把上面集合类中的方法修改成这样

    if (!Zend_Date::isDate($conditionValue['from'], 'd-m-Y' )) { // I added the format for the validation 
    .......
    .......
    if (!Zend_Date::isDate($conditionValue['to'], 'd-m-Y' )) { // same as above one 
    

    第三步:-

    Mage_CatalogSearch_Model_Resource_Advanced_Collection 类中的日期输入值更改为任何格式或语言环境。

    一切正常。

    我制作了一个小模块,可以根据您需要的语言环境重写您需要修改的 2 个类

    看看https://github.com/Meabed/magento-advanced-search-datetime-field

    问候!

    【讨论】:

    • 如果您查看我的 UPDATE 2,您会发现我之前完全解决了这两件事。我现在尝试使用d-m-y 而不是d/m/y,瞧,它可以工作了。所以用斜杠作为分隔符它仍然不起作用。你知道为什么吗?
    • 我没有收到任何错误消息,我只是没有从高级搜索中得到任何结果。
    • 日期 [to] 和 [from] 是什么时候?
    • 例如05/02/2014(将日期格式设置为d/m/Y)我得到No items were found using the following search criteria. 但是使用05-02-2014(将日期格式设置为d-m-Y)它可以工作。顺便说一句:d-m-yd/m/y 都可以。 (2 位数年份)
    • 感谢您的帮助。最后我把d-m-Y 作为日期格式,因为它在法国也是一种常见的格式。
    【解决方案2】:

    这个问题以前曾困扰过我们。Incho 的这篇博文对我们帮助很大。

    http://inchoo.net/ecommerce/magento/magento-date-format/

    此外,您可以考虑将js/calendar.js 固定或完全替换(我推荐后一种建议)。那里有很多与语言环境相关的FIXME /todo 项目,您可能需要更现代的替代品。这是我们为一些客户使用过的非常好的和制作精良的:https://github.com/ChiperSoft/Kalendae

    validation.js for Date 但是已经按预期为当前浏览器区域设置验证它。但是用Abide from Zurb.. 之类的东西替换它也没有什么坏处。但是这也需要更多的工作来替换你的DOM,因为它不是直接替换。

    【讨论】:

    • 我知道这篇博文,但它并没有真正帮助我,因为我有 magento 社区版本,我没有“标准化日期”选项。请查看magento.stackexchange.com/questions/16257/… 我在哪里发布了同样的问题。所以我的问题是如何让前端的高级搜索以不同于 en_US 的日期格式运行。
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2013-10-23
    相关资源
    最近更新 更多