我正在尝试从磁电机后端更新客户的DOB
。我要设置的DOB年份是1967年。好的,好吧,记录已成功更新,但当我进入数据库表并查看它包含2067年的DOB时。我很惊讶这是怎么回事。
我再次进入后端并将其设置为1971并更新客户记录。但是这次DOB在数据库表中是可以的。这是1971年。
我得出的结论是,不到1970年的DOB被错误地存储在数据库中。
是magento bug还是我的magento副本有问题。
由于
答案 0 :(得分:3)
这是Magento中的一个错误,并且有可能在下一版本1.5.0.0中修复此错误。但我不会依赖它。
目前没有简单的方法可以解决这个问题,因为它的逻辑隐藏在抽象的EAV和客户属性模型之间。基本方法是 1)以中等格式在后端显示日期,YYYY代替YY
然后要么
2)编写自定义输入验证过滤器,以DOB格式验证中等格式的日期
3)将输入验证过滤器从默认的“日期”更改为您的(在表customer_eav_attribute中完成)
或
2)编写代码将'dob'属性的_dateFilterFormat设置为medium
答案 1 :(得分:2)
从1.5.1开始,这仍然适用。安德烈可能是正确的,但没有提供有关如何实现这一点的任何细节。我试图这样做,因为我不能评论他的答案,但我会在这里发布:
在 app \ code \ core \ Mage \ Adminhtml \ Block \ Widget \ Form.php _setFieldset中,然后添加“FORMAT_TYPE_MEDIUM”
if($attribute->getName() == 'dob') $element->setFormat(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM));
在is_null($ format)之后的 app \ code \ core \ Mage \ Customer \ Model \ Attribute \ Data \ Abstract.php _dateFilterFormat
$a = $this->getAttribute();
if(!empty($a) && $a->getName() == 'dob') {
$this->_dateFilterFormat = Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM;
return Mage::app()->getLocale()->getDateFormat($this->_dateFilterFormat);
}
将 app \ code \ core \ Mage \ Customer \ Block \ Widget \ Dob.php getDateFormat更改为FORMAT_TYPE_MEDIUM并没有多大帮助。 JavaScript仍然会接受两个数字年,因为验证会替换日期模式的“y”忽略大小写,并使用“new Date()”来解释两个年份相同的年份。年度健全检查然后适用于至少1901年的解释年。
如果您想要硬编码四个数年,只需取消注释(在1.5.1中)DateElement.validate中 js \ varien \ js.js 中的部分,其中表示年份< 1900并抛出!this.validateData。或者如果你想确保只影响DOB,请使用:
Varien.DOB = Class.create();
Varien.DOB.prototype = {
initialize: function(selector, required, format) {
var el = $$(selector)[0];
var container = {};
container.day = Element.select(el, '.dob-day input')[0];
container.month = Element.select(el, '.dob-month input')[0];
container.year = Element.select(el, '.dob-year input')[0];
container.full = Element.select(el, '.dob-full input')[0];
container.advice = Element.select(el, '.validation-advice')[0];
this.child = new Varien.DateElement('container', container, required, format);
container.day.validate = this.validate.bind(this);
container.month.validate = this.validate.bind(this);
container.year.validate = this.validate.bind(this);
},
validate: function() {
if(this.child.validate()) {
var year = parseInt(this.child.year.value, 10);
if (!isNaN(year) && (year<1900 || year>this.child.curyear) ) {
errorType = this.child.validateDataErrorType;
valueError = this.child.validateDataErrorText;
error = valueError;
try {
error = Translator.translate(error);
}
catch (e) {}
this.child.advice.innerHTML = this.child.errorTextModifier(error);
this.child.advice.show();
return false;
}
return true;
}
return false;
},
};
最后,Magento仍然无法在前端输出小于1901年12月13日的DOB,因为它溢出了strtotime的返回值。因此,您必须更改 app \ code \ core \ Mage \ Customer \ Block \ Widget \ Dob.php 功能:
public function setDate($date)
{
$this->setTime($date ? strtotime($date) : false);
$this->setData('date', $date);
try {
$this->setDateTime(new DateTime($date));
}catch(Exception $e){}
return $this;
}
public function getDay()
{
return $this->getTime() ? date('d', $this->getTime()) : ($this->getDateTime() ? $this->getDateTime()->format('d') : '');
}
public function getMonth()
{
return $this->getTime() ? date('m', $this->getTime()) : ($this->getDateTime() ? $this->getDateTime()->format('m') : '');
}
public function getYear()
{
return $this->getTime() ? date('Y', $this->getTime()) : ($this->getDateTime() ? $this->getDateTime()->format('Y') : '');
}
我希望我得到了所有东西......虽然它仍然不是一个非常干净的方法来做到这一点;)。