Меняем формат даты в Vtiger 7 у пользователей на дд.мм.гггг или dd.mm.yyyy

Меняем формат даты в Vtiger 7 у пользователей на дд.мм.гггг или dd.mm.yyyy

Используя опыт разработки в системе Vtiger 7.1 я покажу вам, как в список формата дат добавить новый европейский. Следует помнить, что формат нужно добавить не только в календарь, но и при экспорте в Excel и PDF. Для добавления даты вам потребуются некоторые знания MySQL и PHP, а также командной строки Linux.

По умолчанию в системе  Vtiger в настройках пользователя доступны следующие форматы дат:

  1. дд-мм-гггг
  2. мм-дд-гггг
  3. гггг-мм-дд

Как видно из списка, российского формата дд.мм.гггг или 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.

Надеюсь что в следующих версиях системы Российский формат даты будет включён в код по умолчанию.