По умолчанию в системе Vtiger в настройках пользователя доступны следующие форматы дат:
- дд-мм-гггг
- мм-дд-гггг
- гггг-мм-дд
Как видно из списка, российского формата дд.мм.гггг или dd.mm.yyyy здесь не присутствует.
Используя опыт разработки в системе Vtiger 7.1 я покажу вам, как в список формата дат добавить новый европейский.
Следует помнить, что формат нужно добавить не только в календарь, но и при экспорте в Excel и PDF.
Для добавления даты вам потребуются некоторые знания MySQL и PHP, а также командной строки Linux.
Обратите внимание, что любые изменения вы делаете на свой страх и риск. Я не несу ответственности за возниикшие ошибки. Поэтому, не забудьте сделать резервную копию базы данных и файлов. Процесс также следует повторить, если вы произвели обновление Vtiger до более новой версии. Данное руководство актуально для версии 7.1 и нельзя исключать, что оно не будет работать в более новой версии.
Ниже я в деталях описываю процесс добавления нового формата даты дд.мм.гггг в сисеме Vtiger.
0. Делаем резервную копию перед внесением изменений.
В данном разделе мы делаем копию папки, чтобы у нас была возможность откатить сделанные нами изменения.
cp -ar vtigercrm vtigercrm_backup
1. Добавляем в выпадающий список в настройках пользователя новый формат дат.
Для этого нам нужно внести изменения в таблицу vtiger_date_format.
Заходим в консоль Mysql и выполняем следующий запрос:
INSERT INTO `vtiger_date_format` (`date_formatid`, `date_format`, `sortorderid`, `presence`) VALUES (4, 'dd.mm.yyyy', 0, 1);
Значение в третьем столбце sortorderid является приоритетом при отображении форматов дат. В нашем случае новый формат будет отображаться четвёртым.
Я также бы изменил порядок сортировки и переместил бы значение по умолчанию назад.
UPDATE vtiger_date_format SET sortorderid=1 WHERE date_format='dd-mm-yyyy';
2. Изменяем файл vtlib/Vtiger/Functions.php
Функция currentUserJSDateFormat (строка 31)
Вам следует добавить следующие строчки в первый блок оператора if (это строка 30++)
elseif ($current_user->date_format == 'dd.mm.yyyy') {
$dt_popup_fmt = "%d.%m.%Y";
}
Функция currentUserDisplayDate (строка 52)
Замените формат даты в функции на следующий:
if ($dat_fmt == '') {
$dat_fmt = 'dd.mm.yyyy';
}
3. Меняем файл include/fields/DateTimeField.php
Функция __convertToDBFormat (строка 110)
Добавьте следующий блок в оператор if:
elseif ($format == 'dd.mm.yyyy') {
if(strpos($date, "-") !== false) {
list($d, $m, $y) = explode('-', $date);
} else {
list($d, $m, $y) = explode('.', $date);
}
}
Функция convertToUserFormat (строка 152)
Здесь мы говорим, что хотим по умолчанию использовать новый формат. Для этого меняем
if(empty($format)) {
$format = 'dd-mm-yyyy';
}
на следующий блок кода:
if(empty($format)) {
$format = 'dd.mm.yyyy';
}
Функция __convertToUserFormat (строка 173)
Добавьте следующий блок кода в оператор if:
elseif ($format == 'dd.mm.yyyy') {
$date[0] = $d . '.' . $m . '.' . $y;
}
4. Вносим изменения в файл include/ComboStrings.php (строка 305)
Пожалуйста, замените весь блок 'date_format_dom' на следующий:
'date_format_dom' => Array('dd-mm-yyyy'=>'dd-mm-yyyy',
'dd.mm.yyyy'=>'dd.mm.yyyy',
'mm-dd-yyyy'=>'mm-dd-yyyy',
'yyyy-mm-dd'=>'yyyy-mm-dd'
),
5. Файл modules/Calendar/RepeatEvents.php
Функция formattime (строка 45).
Добавляем новый case в оператор switch:
case 'dd.mm.yyyy': $format_string = 'd.m.Y H:i'; break;
6. Файл resources/app.js
Функция convertToDatePickerFormat (строка 540)
Просьба добавить новый блок в оператор условия:
else if (dateFormat == 'dd.mm.yyyy') {
return 'd.m.Y';
}
Функция convertTojQueryDatePickerFormat (строка 552)
В этой функции нужно внести гораздо больше изменений, поэтому замените следующую строчку:
var splitDateFormat = dateFormat.split('-');
На этот блок:
var dotMode = false;
if(dateFormat.indexOf(".") != -1 && dateFormat.indexOf("-") == -1) {
dotMode = true;
}
var splitDateFormat = dateFormat.split(dotMode?'.':'-');
Далее в цикле for замените эту строчку:
var joinedDateFormat = splitDateFormat.join('-');
На следующую:
var joinedDateFormat = splitDateFormat.join(dotMode?'.':'-');
7. Меняем файл layouts/vlayout/modules/Vtiger/resources/dashboards/Widget.js
Функция convertToDateRangePicketFormat строка 93
Добавляем в блок if сдеюущий блок с условием:
else if(userDateFormat == 'dd.mm.yyyy') {
return 'dd.MM.yyyy';
}
8. Файл resources/helper.js
Функция getDateInstance строка 59
Следует заменить строчки кода ниже. Часть snip следует сохранить следующим образом:
var splittedDate = dateComponent.split("-");
<..snip..>
var splittedDateFormat = dateFormat.split("-");
Меняем на эти строчки кода:
var dotMode = false;
if(dateComponent.indexOf(".") != -1 && dateComponent.indexOf("-") == -1) {
dotMode = true;
}
var splittedDate = dateComponent.split(dotMode?".":"-");
<..snip..> до строки 67
var splittedDateFormat = dateFormat.split(dotMode?".":"-");
9. Файл layouts/v7/resources/helper.js
В районе строки 85 внесите изменения в функцию getDateInstance переписав её начало на следующий вариант:
var dateTimeComponents = dateTime.split(" ");
var dateComponent = dateTimeComponents[0];
var timeComponent = dateTimeComponents[1];
var seconds = '00';
var splitter = '-';
if ( dateComponent.includes(".") ) {
splitter = '.';
}
var splittedDate = dateComponent.split(splitter);
if(splittedDate.length > 3) {
var errorMsg = app.vtranslate("JS_INVALID_DATE");
throw errorMsg;
}
var splittedDateFormat = dateFormat.split(splitter);
Результат уже отличный. Теперь на экране вы можете увидеть новый формат даты и результат экспортируется в том числе и в файлы xls, pdf.
Надеюсь что в следующих версиях системы Российский формат даты будет включён в код по умолчанию.