Magento后端客户帐户DOB更新问题

时间:2010-12-25 06:32:27

标签: php magento dob

我正在尝试从磁电机后端更新客户的DOB。我要设置的DOB年份是1967年。好的,好吧,记录已成功更新,但当我进入数据库表并查看它包含2067年的DOB时。我很惊讶这是怎么回事。

我再次进入后端并将其设置为1971并更新客户记录。但是这次DOB在数据库表中是可以的。这是1971年。

我得出的结论是,不到1970年的DOB被错误地存储在数据库中。

是magento bug还是我的magento副本有问题。

由于

2 个答案:

答案 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开始,这仍然适用。安德烈可能是正确的,但没有提供有关如何实现这一点的任何细节。我试图这样做,因为我不能评论他的答案,但我会在这里发布:

  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));
    
  2. 在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);
    }
    
  3. 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;
      },
    };
    
  4. 最后,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') : '');
        }
    
  5. 我希望我得到了所有东西......虽然它仍然不是一个非常干净的方法来做到这一点;)。