Проблема обновления DOB учетной записи клиента Magento

Я пытаюсь обновить DOB клиента из бэкэнда магнето. Год DOB, который я собираюсь установить, - 1967. Хорошо, запись успешно обновлена, но когда я захожу в таблицу базы данных и вижу DOB, она содержит год 2067. Я удивлен, как это произошло.

Я снова захожу в бэкэнд и устанавливаю его на 1971 и обновляю запись клиента. Но на этот раз с DOB все в порядке в таблице базы данных. Это 1971 год.

Я пришел к выводу, что DOB менее 1970 года неправильно хранится в базе данных.

Это ошибка в magento или что-то не так с моей копией magento.

Спасибо

2 ответа

Решение

Это ошибка в Magento, и есть некоторый шанс, что эта ошибка будет исправлена ​​в следующем выпуске 1.5.0.0. Но я бы на это не полагался.

В настоящее время нет простого способа справиться с этим, поскольку логика для этого скрыта и разделена между абстрактными моделями атрибутов EAV и Customer. Основной подход заключается в
1) Показывать дату в бэкэнде в среднем формате с YYYY вместо YY

а затем либо
2) Напишите свой собственный фильтр проверки ввода, который будет проверять дату в среднем формате для DOB
3) Измените фильтр проверки ввода с даты по умолчанию на ваш (это сделано в таблице customer_eav_attribute)

или же
2) написать код для установки _dateFilterFormat атрибута 'dob' на средний

Начиная с 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. В приложении \ code \ core \ Mage \ Customer \ Model \ Attribute \ Data \ Abstract.php _dateFilterFormat после is_null(формат $)

    $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) часть в js\varien\js.js в DateElement.validate, где указано год<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 по-прежнему не сможет выводить DOB меньше 13 декабря 1901 года во внешнем интерфейсе, поскольку он переполняет возвращаемое значение 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') : '');
        }
    

Я надеюсь, что я получил все... хотя это все еще не очень чистый способ сделать это;).

Другие вопросы по тегам