*

Tirey

  • *
  • 15

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

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

*

Spido

  • *
  • 1612

Попробуйте зарегистрироваться в нашей демо-версии http://oscommerce.ru/demo/version#oscommerce-v2-3-4-bootstrap
Никаких проблем с датой нет.

*

Tirey

  • *
  • 15

Попробуйте зарегистрироваться в нашей демо-версии http://oscommerce.ru/demo/version#oscommerce-v2-3-4-bootstrap
Никаких проблем с датой нет.
Попробовал — та же самая история.
При этом, что интересно, в поле дата стоит в том формате, как требует магазин.

*

Spido

  • *
  • 1612

Если так нужна дата в регистрационной форме, то в файле 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

  • *
  • 1612

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

@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

  • *
  • 1612

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

Посмотрите дополнение Purchase without Account https://apps.oscommerce.com/5f3nn

*

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 https://apps.oscommerce.com/5f3nn

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

*

Spido

  • *
  • 1612

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

Оказалось, что 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

  • *
  • 1612

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

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

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