Проблема обновления 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 это все еще применяется. Андрей может быть прав, но не дает никаких подробностей о том, как это реализовать. Я пытался это сделать, и поскольку я пока не могу комментировать его ответ, я опубликую его здесь:
В 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));
В приложении \ 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); }
Изменение 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; }, };
Наконец, 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') : ''); }
Я надеюсь, что я получил все... хотя это все еще не очень чистый способ сделать это;).