Функция cot_import_date в php-фреймворке Cotonti.

Её основное назначение — импортировать и обработать дату и время, полученные из различных источников (например, из POST-запроса, cookies или переменных). Она преобразует эти данные в метку времени Unix или возвращает их в виде массива с детализированными данными о дате и времени.

Пример использования:

в page.functions.php

$rpage['page_begin']    = (int) cot_import_date('rpagebegin');

в page.edit.php

    'PAGEEDIT_FORM_BEGIN' => cot_selectbox_date($pag['page_begin'], 'long', 'rpagebegin').' '.Cot::$usr['timetext'],

 

Код функции


/**
 * Imports date stamp
 *
 * @param string $name Variable name
 * @param bool $usertimezone Use user timezone
 * @param bool $returnarray Return Date Array
 * @param string $source Source type: P (POST), C (COOKIE) or D (variable filtering)
 * @return int|array{stamp: int, year: int, month: int, day: int, hour: int, minute: int}|null
 */
function cot_import_date($name, $usertimezone = true, $returnarray = false, $source = 'P')
{
    if (function_exists('cot_import_date_custom')) {
        return cot_import_date_custom($name, $usertimezone, $returnarray, $source);
    }

    $result = null;

    /* === Hook === */
    foreach (cot_getextplugins('import.date') as $pl) {
        include $pl;
    }
    /* ===== */

    if ($result !== null) {
        return $result;
    }

    //$name = preg_match('#^(\w+)\[(.*?)\]$#', $name, $mt) ? $mt[1] : $name;
    $date = cot_import($name, $source, 'ARR');

    $timestamp = null;

    /**
     * Try to parse textual datetime string into a Unix timestamp
     * @see https://www. .net/manual/en/datetime.formats.
     */
    if (empty($date)) {
        $date = cot_import($name, $source, 'TXT');
        if (empty($date)) {
            return null;
        }

        $timestamp = cot_date2stamp($date);
        if ($timestamp === false) {
            return null;
        }
    }

    // Parse datetime array
    if ($timestamp === null) {
        $date['year'] = isset($date['year']) ? $date['year'] : 0;
        $date['month'] = isset($date['month']) ? $date['month'] : 0;
        $date['day'] = isset($date['day']) ? $date['day'] : 0;
        $date['hour'] = isset($date['hour']) ? $date['hour'] : 0;
        $date['minute'] = isset($date['minute']) ? $date['minute'] : 0;
        $date['string'] = isset($date['string']) ? $date['string'] : '';
        $date['format'] = isset($date['format']) ? $date['format'] : '';

        $year = cot_import($date['year'], 'D', 'INT');
        $month = cot_import($date['month'], 'D', 'INT');
        $day = cot_import($date['day'], 'D', 'INT');
        $hour = cot_import($date['hour'], 'D', 'INT');
        $minute = cot_import($date['minute'], 'D', 'INT');

        if (
            count($date) > 0
            && is_null($year)
            && is_null($month)
            && is_null($day)
            && is_null($hour)
            && is_null($minute)
            && empty($date['string'])
        ) {
            // Datetime field is present in form but it is set to zero date (empty)
            return null;
        }

        $timestamp = 0;
        if (($month && $day && $year) || ($day && $minute)) {
            $timestamp = cot_mktime($hour, $minute, 0, $month, $day, $year);
        } else {
            $string = cot_import($date['string'], 'D', 'TXT');
            $format = cot_import($date['format'], 'D', 'TXT');
            if ($string) {
                $format = !empty($format) ? $format : 'Y-m-d H:i';
                $timestamp = cot_date2stamp($string, $format);
            } else {
                return null;
            }
        }
    }
    if ($usertimezone) {
        $timestamp -= Cot::$usr['timezone'] * 3600;
    }

    if ($returnarray) {
        $result = [];
        $result['stamp'] = $timestamp;
        $result['year'] = (int) date('Y', $timestamp);
        $result['month'] = (int) date('m', $timestamp);
        $result['day'] = (int) date('d', $timestamp);
        $result['hour'] = (int) date('H', $timestamp);
        $result['minute'] = (int) date('i', $timestamp);
        return $result;
    }

    return $timestamp;
}


Рассмотрим код функции построчно:

 
 
Это описание функции. Она импортирует метку времени даты, и в зависимости от параметров, возвращает либо метку времени в формате int, либо массив с детализированной информацией о дате, либо null, если не удалось обработать дату.
 
 
 
 

function cot_import_date($name, $usertimezone = true, $returnarray = false, $source = 'P')
{

Это объявление функции cot_import_date с четырьмя параметрами:
$name: имя переменной, в которой содержится дата.
$usertimezone: флаг, указывающий, учитывать ли часовой пояс пользователя (по умолчанию — true).
$returnarray: флаг, указывающий, возвращать ли массив с деталями о дате (по умолчанию — false).
$source: источник данных (по умолчанию — 'P', т.е. из POST-запроса). Можно указать 'C' для cookies или 'D' для фильтрации переменных.
 
 
 

if (function_exists('cot_import_date_custom')) {
    return cot_import_date_custom($name, $usertimezone, $returnarray, $source);
}


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

$result = null;

Инициализация переменной $result значением null. Это значение будет возвращено, если не удастся обработать дату.
 
 
 

 
/* === Hook === */
foreach (cot_getextplugins('import.date') as $pl) {
    include $pl;
}
/* ===== */

Это интеграция с системой плагинов. Для хука 'import.date' загружаются и выполняются все плагины, которые зарегистрированы для этого хука. Если плагин изменяет или обрабатывает дату, он может это сделать в этом месте.
 

if ($result !== null) {
    return $result;
}



Если после выполнения плагинов переменная $result не равна null, то результат возвращается сразу. Это может означать, что плагин обработал дату и вернул результат.
 
 

$date = cot_import($name, $source, 'ARR');

 

Функция cot_import извлекает данные о дате из указанного источника ($source) в виде массива ('ARR'). Если дата была передана в виде массива (например, через форму), то она будет доступна в переменной $date.
 
 
 

$timestamp = null;



Инициализация переменной для хранения метки времени Unix.
 
 
 

/**
 * Try to parse textual datetime string into a Unix timestamp
 * @see https://www. .net/manual/en/datetime.formats.
 */
if (empty($date)) {
    $date = cot_import($name, $source, 'TXT');
    if (empty($date)) {
        return null;
    }

    $timestamp = cot_date2stamp($date);
    if ($timestamp === false) {
        return null;
    }
}


Если переменная $date пуста (т.е. дата не передана в виде массива), то пытается извлечь дату как строку через cot_import в формате текста ('TXT'). Затем пытается преобразовать строку в метку времени Unix с помощью функции cot_date2stamp. Если это не удаётся, функция возвращает null.
 
 
 

// Parse datetime array
if ($timestamp === null) {
    $date['year'] = isset($date['year']) ? $date['year'] : 0;
    $date['month'] = isset($date['month']) ? $date['month'] : 0;
    $date['day'] = isset($date['day']) ? $date['day'] : 0;
    $date['hour'] = isset($date['hour']) ? $date['hour'] : 0;
    $date['minute'] = isset($date['minute']) ? $date['minute'] : 0;
    $date['string'] = isset($date['string']) ? $date['string'] : '';
    $date['format'] = isset($date['format']) ? $date['format'] : '';



Если дата не была преобразована в метку времени, то функция пытается разобрать её как массив с годом, месяцем, днём, часом, минутой, строкой и форматом. Если какие-то параметры отсутствуют, устанавливаются значения по умолчанию (например, 0 для числовых значений и пустые строки для строковых).
 
 

 
$year = cot_import($date['year'], 'D', 'INT');
$month = cot_import($date['month'], 'D', 'INT');
$day = cot_import($date['day'], 'D', 'INT');
$hour = cot_import($date['hour'], 'D', 'INT');
$minute = cot_import($date['minute'], 'D', 'INT');

Каждое из полей массива $date импортируется с помощью функции cot_import, которая фильтрует и преобразует данные в соответствующий формат. Здесь используется тип фильтрации 'D' (для "даты") и 'INT' для числовых значений.
 
 

 
        if (
            count($date) > 0
            && is_null($year)
            && is_null($month)
            && is_null($day)
            && is_null($hour)
            && is_null($minute)
            && empty($date['string'])
        ) {
            // Datetime field is present in form but it is set to zero date (empty)
            return null;
        }



Если в форме присутствует поле для даты, но оно установлено в нулевое значение (поля пусты или все числовые значения равны null), то возвращается null.
 
 
 

        $timestamp = 0;
        if (($month && $day && $year) || ($day && $minute)) {
            $timestamp = cot_mktime($hour, $minute, 0, $month, $day, $year);
        } else {
            $string = cot_import($date['string'], 'D', 'TXT');
            $format = cot_import($date['format'], 'D', 'TXT');
            if ($string) {
                $format = !empty($format) ? $format : 'Y-m-d H:i';
                $timestamp = cot_date2stamp($string, $format);
            } else {
                return null;
            }
        }


Если все обязательные параметры для даты (год, месяц, день, час, минута) предоставлены, используется функция cot_mktime, чтобы вычислить метку времени Unix.
Если параметры не полные, проверяется, была ли передана строка с датой и её формат. Если строка есть, она конвертируется в метку времени с помощью функции cot_date2stamp.
 
 
 


    if ($usertimezone) {
        $timestamp -= Cot::$usr['timezone'] * 3600;
    }


Если параметр $usertimezone равен true, то из метки времени вычитается смещение для часового пояса пользователя, чтобы привести время к правильному местному времени.
 
 

    if ($returnarray) {
        $result = [];
        $result['stamp'] = $timestamp;
        $result['year'] = (int) date('Y', $timestamp);
        $result['month'] = (int) date('m', $timestamp);
        $result['day'] = (int) date('d', $timestamp);
        $result['hour'] = (int) date('H', $timestamp);
        $result['minute'] = (int) date('i', $timestamp);
        return $result;
    }

 

Если параметр $returnarray установлен в true, то возвращается массив с полными данными о дате, включая метку времени, год, месяц, день, час и минуту.
 
 
 

 
    return $timestamp;
}

Если $returnarray не задано, то возвращается просто метка времени Unix.
Итог:
Функция cot_import_date извлекает дату из различных источников (POST, COOKIE и т. д.), преобразует её в метку времени Unix, учитывает часовой пояс пользователя и, если необходимо, возвращает массив с подробной информацией о дате и времени. Это полезная функция для работы с датами и временем в фреймворке Cotonti.

7 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-21 08:08
  • Last update: 2025-01-21 09:47