*

Tirey

  • *
  • 15

Дата рождения при регистрации

Такой баг. На странице регистрации нового покупателя есть поле - Дата рождения. При клике на поле открывается элемент AktivX Календарь. Выбираем по календарю дату, заполняем остальные поля, жмем Продолжить. Появляется сообщение об ошибке, что дату нужно вводить в другом формате. Пробуем заполнить вручную, так как того просит предупреждение, опять заполняем поля пароля, жмем Продолжить, и появляется все то же сообщение об ошибке. В админке искал все опции связанные с форматом дат, так ничего и не нашел. Как исправить?

*

Spido

  • *
  • 1609

Попробуйте зарегистрироваться в нашей демо-версии (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Никаких проблем с датой нет.

*

Tirey

  • *
  • 15

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Попробуйте зарегистрироваться в нашей демо-версии (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Никаких проблем с датой нет.
Попробовал — та же самая история.
При этом, что интересно, в поле дата стоит в том формате, как требует магазин.

*

Spido

  • *
  • 1609

Если так нужна дата в регистрационной форме, то в файле includes\languages\russian.php найти строку:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);заменить на:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
    return substr($date, 3, 2) . substr($date, 0, 2) . substr($date, 6, 4);
В обычном магазине никто не спрашивает дату рождения, поэтому это поле выключено в админке.

*

Tirey

  • *
  • 15

Тогда еще вопрос. Можно ли сделать так, чтобы при желании, клиент мог вводить полные данные при регистрации, а при быстрой покупке, от него требовались бы только, скажем, мейл и номер телефона? Потому как, скажем, можно создавать программу лояльности в отношении клиентов, где можно бы было их поощрять подарками к Дню рождения. А если клиент хочет, скажем, что-то купить и забыть, то тут, конечно, дата рождения не нужна. А вот для оптовых покупателей, опять же, желательно.

*

Tirey

  • *
  • 15

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Если так нужна дата в регистрационной форме, то в файле includes\languages\russian.php найти строку:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);заменить на:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
    return substr($date, 3, 2) . substr($date, 0, 2) . substr($date, 6, 4);
В обычном магазине никто не спрашивает дату рождения, поэтому это поле выключено в админке.

Сделал. Не работает. Вылезает то же сообщение об ошибке и регистрация не происходит.

Причем, что интересно, на вашем демо-сайте работает. Может сессию нужно удалить и кэш почистить?

Вы бы не могли прикрепить сюда ваши файлы? Я бы просто ими заменил свои.

« Последнее редактирование: 15 Июль 2017 22:04:59 pm от Tirey »
*

Spido

  • *
  • 1609

Тогда целиком поменяйте этот код:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_TIME, 'ru_RU.UTF-8');

define('DATE_FORMAT_SHORT', '%d/%m/%Y');  // this is used for strftime()
define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
define('DATE_FORMAT', 'd/m/Y'); // this is used for date()
define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
define('JQUERY_DATEPICKER_I18N_CODE', 'ru'); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
define('JQUERY_DATEPICKER_FORMAT', 'dd/mm/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate

////
// Return date in raw format
// $date should be in format dd/mm/yyyy
// raw date is in format YYYYMMDD, or DDMMYYYY
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
  }
}
на этот:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_ALL, array('en_US.UTF-8', 'en_US.UTF8', 'enu_usa'));

define('DATE_FORMAT_SHORT', '%m/%d/%Y');  // this is used for strftime()
define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
define('DATE_FORMAT', 'm/d/Y'); // this is used for date()
define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
define('JQUERY_DATEPICKER_I18N_CODE', ''); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
define('JQUERY_DATEPICKER_FORMAT', 'mm/dd/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate

////
// Return date in raw format
// $date should be in format mm/dd/yyyy
// raw date is in format YYYYMMDD, or DDMMYYYY
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 3, 2) . substr($date, 0, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 0, 2) . substr($date, 3, 2);
  }
}

Теперь будет работать регистрация по дате, но как поведет себя локаль, зависит конкретно от серверной оси.
Вот о чём речь:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_ALL, array('en_US.UTF-8', 'en_US.UTF8', 'enu_usa'));

*

Spido

  • *
  • 1609

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Тогда еще вопрос. Можно ли сделать так, чтобы при желании, клиент мог вводить полные данные при регистрации, а при быстрой покупке, от него требовались бы только, скажем, мейл и номер телефона?

Посмотрите дополнение Purchase without Account (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)

*

Tirey

  • *
  • 15

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Тогда целиком поменяйте этот код:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_TIME, 'ru_RU.UTF-8');

define('DATE_FORMAT_SHORT', '%d/%m/%Y');  // this is used for strftime()
define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
define('DATE_FORMAT', 'd/m/Y'); // this is used for date()
define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
define('JQUERY_DATEPICKER_I18N_CODE', 'ru'); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
define('JQUERY_DATEPICKER_FORMAT', 'dd/mm/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate

////
// Return date in raw format
// $date should be in format dd/mm/yyyy
// raw date is in format YYYYMMDD, or DDMMYYYY
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
  }
}
на этот:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_ALL, array('en_US.UTF-8', 'en_US.UTF8', 'enu_usa'));

define('DATE_FORMAT_SHORT', '%m/%d/%Y');  // this is used for strftime()
define('DATE_FORMAT_LONG', '%A %d %B, %Y'); // this is used for strftime()
define('DATE_FORMAT', 'm/d/Y'); // this is used for date()
define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H:%M:%S');
define('JQUERY_DATEPICKER_I18N_CODE', ''); // leave empty for en_US; see http://jqueryui.com/demos/datepicker/#localization
define('JQUERY_DATEPICKER_FORMAT', 'mm/dd/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate

////
// Return date in raw format
// $date should be in format mm/dd/yyyy
// raw date is in format YYYYMMDD, or DDMMYYYY
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 3, 2) . substr($date, 0, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 0, 2) . substr($date, 3, 2);
  }
}

Теперь будет работать регистрация по дате, но как поведет себя локаль, зависит конкретно от серверной оси.
Вот о чём речь:
Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
@setlocale(LC_ALL, array('en_US.UTF-8', 'en_US.UTF8', 'enu_usa'));

Оказалось, что locale вовсе менять не обязательно. Просто нужно было везде заменить mm на dd и наборот, и все сработало...

*

Tirey

  • *
  • 15

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Тогда еще вопрос. Можно ли сделать так, чтобы при желании, клиент мог вводить полные данные при регистрации, а при быстрой покупке, от него требовались бы только, скажем, мейл и номер телефона?

Посмотрите дополнение Purchase without Account (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)

А руссификации нет для этого плагина?

*

Spido

  • *
  • 1609

Нет, русификации нет.
Если русифицируете, то выкладывайте здесь ваш вариант русификации.
Это будет ваш вклад в поддержку модуля и проекта.

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Оказалось, что locale вовсе менять не обязательно. Просто нужно было везде заменить mm на dd и наборот, и все сработало...

Опубликуйте ту строку, в которой провели изменения и после этого работает регистрация по дате.
Другие пользователи смогут воспользоваться вашим решением, не задавая лишних вопросов.

*

Tirey

  • *
  • 15

Все очень просто. Нужно исправить везде, где указан "неправильный" порядок данных: день, месяц, год.

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
define('DATE_FORMAT_SHORT', '%d/%m/%Y');  // this is used for strftime()

define('DATE_FORMAT', 'd/m/Y'); // this is used for date()

Нужно заменить на:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
define('DATE_FORMAT_SHORT', '%m/%d/%Y');  // this is used for strftime()

define('DATE_FORMAT', 'm/d/Y'); // this is used for date()

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
define('JQUERY_DATEPICKER_FORMAT', 'dd/mm/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate
на:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
define('JQUERY_DATEPICKER_FORMAT', 'mm/dd/yy'); // see http://docs.jquery.com/UI/Datepicker/formatDate
Для памяти, можно поменять и в комментарии (понятно, что на работу скрипта это никак не повлияет):

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
// $date should be in format dd/mm/yyyy
на:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
// $date should be in format mm/dd/yyyy
Ну, и:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 0, 2) . substr($date, 3, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 3, 2) . substr($date, 0, 2);
  }

на:

Код: (здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
function tep_date_raw($date, $reverse = false) {
  if ($reverse) {
    return substr($date, 3, 2) . substr($date, 0, 2) . substr($date, 6, 4);
  } else {
    return substr($date, 6, 4) . substr($date, 0, 2) . substr($date, 3, 2);
  }

Как я понимаю, это все из-за этого ActiveX (Календарь), с помощью, которого вводится дата. Скрпит англоязычный, и у них принят такой порядок. При руссификации, естественно, Календарь не меняли, но формат поменяли на принятый у нас порядок отображения дат. Отсюда и получилась такая нестыковка.

*

Spido

  • *
  • 1609

(здесь есть ссылка, которая гостям не доступна зарегистрируйтесь или залогиньтесь)
Как я понимаю, это все из-за этого ActiveX (Календарь), с помощью, которого вводится дата. Скрпит англоязычный, и у них принят такой порядок. При руссификации, естественно, Календарь не меняли, но формат поменяли на принятый у нас порядок отображения дат. Отсюда и получилась такая нестыковка.
Это верно, с одной стороны. Но теперь будут "англоязычно" выводиться даты в магазине.
Наверное можно решить проблему даты изменив функцию tep_date_raw, которая используется при обработке даты рождения и находится в языковом файле.

Другие функции дат прописаны в файле \includes\functions\general.php, начиная со строки 585.
Посмотрите их, возможно это вам поможет.

Я писал новые функции дат для блога oscommerce Titanium. Смотрите скриншот.
Думаю и вы сможете переписать функцию tep_date_raw так как вам нужно.