Проблема обновления DOB учетной записи клиента Magento - PullRequest
3 голосов
/ 25 декабря 2010

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

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

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 декабря 2010

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

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

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

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

2 голосов
/ 28 ноября 2012

По состоянию на 1.5.1 это все еще применяется.Андрей может быть прав, но не дает никаких подробностей о том, как это реализовать.Я пытался сделать это, и поскольку я пока не могу комментировать его ответ, я выложу его здесь:

  1. In 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. В app \ 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, используйте это: </p>

    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') : '');
        }
    

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

...