高级搜索中的Magento日期格式

时间:2014-03-02 16:47:23

标签: php magento

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

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

配置 - >常规下,我将区域设置设置为“法国”,并在配置 - >目录 - >日期&时间自定义选项我已将日期字段顺序设置为日/月/年。

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

真正奇怪的是:搜索仅适用于美国格式,但搜索验证器需要日期格式为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日期格式运行。最后一个问题是:在代码中,db查询是为高级搜索构建的,如何切换到另一种日期格式?似乎en_US日期格式是硬编码的。

2 个答案:

答案 0 :(得分:2)

我遇到类似日期过滤器的问题:)

在表单中实例化的日期时间

第1步: -

在Block Form类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 . '",

第2步: -

在高级搜索集合类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 

第3步: -

将类Mage_CatalogSearch_Model_Resource_Advanced_Collection中日期输入的值更改为任何格式或区域设置。

一切都很好。

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

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

问候!

答案 1 :(得分:0)

此问题之前让我们感到震惊...... Inchoo的这篇博文给我们带来了很多帮助。

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,因为它不是直接的替代品。