我的版本是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日期格式是硬编码的。
答案 0 :(得分:2)
我遇到类似日期过滤器的问题:)
在表单中实例化的日期时间
在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')
然后在下面的方法中使用它来生成块
$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
问候!
答案 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,因为它不是直接的替代品。