Функция cot_generate_usertags в Cotonti

Функция cot_generate_usertags предназначена для генерации тегов пользователя для использования в шаблонах XTemplate.
Она возвращает массив тегов, которые содержат информацию о пользователе, включая его ID, имя, группу, страну и другие данные.

Код функции:

/**
 * Returns all user tags for XTemplate
 *
 * @param mixed $user_data User Info Array
 * @param string $tag_prefix Prefix for tags
 * @param string $emptyname Name text if user is not exist
 * @param bool $allgroups Build info about all user groups
 * @param bool $cacheitem Cache tags
 * @return array
 * @global CotDB $db
 */
function cot_generate_usertags($user_data, $tag_prefix = '', $emptyname='', $allgroups = false, $cacheitem = true)
{
    global $db, $cot_extrafields, $cot_groups, $cfg, $L, $user_cache, $db_users;

    static $extp_first = null, $extp_main = null;

    $return_array = [];

    if (is_null($extp_first)) {
        $extp_first = cot_getextplugins('usertags.first');
        $extp_main = cot_getextplugins('usertags.main');
    }

    /* === Hook === */
    foreach ($extp_first as $pl) {
        include $pl;
    }
    /* ===== */

    $user_id = (is_array($user_data) && !empty($user_data['user_id']))
        ? (int) $user_data['user_id']
        : (is_numeric($user_data) ? (int) $user_data : 0);

    if (isset($user_cache[$user_id])) {
        $temp_array = $user_cache[$user_id];
    } else {
        if (!is_array($user_data) && $user_id > 0) {
            $sql = $db->query("SELECT * FROM $db_users WHERE user_id = $user_id LIMIT 1");
            $user_data = $sql->fetch();
        }
        if (empty($user_data) || !is_array($user_data)) {
            $user_data = [];
        }

        if (is_array($user_data) && !empty($user_data['user_id']) && !empty($user_data['user_name'])) {
            $user_data['user_birthdate'] = cot_date2stamp($user_data['user_birthdate']);
            $enableMarkup = isset(Cot::$cfg['users']['usertextimg']) ? Cot::$cfg['users']['usertextimg'] : false;
            $user_data['user_text'] = cot_parse($user_data['user_text'], $enableMarkup);

            $temp_array = [
                'ID' => $user_data['user_id'],
                'NAME' => cot_build_user($user_data['user_id'], $user_data['user_name']),
                'NICKNAME' => htmlspecialchars($user_data['user_name']),
                'DETAILS_URL' => cot_url(
                    'users',
                    ['m' => 'details', 'id' => $user_data['user_id'], 'u' => $user_data['user_name']]
                ),
                'DETAILS_URL_SHORT' => cot_url('users', ['m' => 'details', 'id' => $user_data['user_id']]),
                'FULL_NAME' => htmlspecialchars(UsersHelper::getInstance()->getFullName($user_data)),
                'TITLE' => $cot_groups[$user_data['user_maingrp']]['title'],
                'MAIN_GROUP' => cot_build_group($user_data['user_maingrp']),
                'MAIN_GROUP_ID' => $user_data['user_maingrp'],
                'MAIN_GROUP_NAME' => $cot_groups[$user_data['user_maingrp']]['name'],
                'MAIN_GROUP_TITLE' => cot_build_group($user_data['user_maingrp'], true),
                'MAIN_GROUP_STARS' => cot_build_stars($cot_groups[$user_data['user_maingrp']]['level']),
                'MAIN_GROUP_ICON' => cot_build_groupicon($cot_groups[$user_data['user_maingrp']]['icon']),
                'COUNTRY' => cot_build_country($user_data['user_country']),
                'COUNTRY_FLAG' => cot_build_flag($user_data['user_country']),
                'TEXT' => $user_data['user_text'],
                'EMAIL' => cot_build_email($user_data['user_email'], $user_data['user_hideemail']),
                'THEME' => $user_data['user_theme'],
                'SCHEME' => $user_data['user_scheme'],
                'LANG' => $user_data['user_lang'],
                'GENDER' => ($user_data['user_gender'] == '' || $user_data['user_gender'] == 'U') ? '' : $L['Gender_' . $user_data['user_gender']],
                'BIRTHDATE' => (is_null($user_data['user_birthdate'])) ? '' : cot_date('date_full', $user_data['user_birthdate']),
                'BIRTHDATE_STAMP' => (is_null($user_data['user_birthdate'])) ? '' : $user_data['user_birthdate'],
                'AGE' => (is_null($user_data['user_birthdate'])) ? '' : cot_build_age($user_data['user_birthdate']),
                'TIMEZONE' => cot_build_timezone(
                        cot_timezone_offset($user_data['user_timezone'], false, false)
                    ) . ' '
                    . str_replace('_', ' ', $user_data['user_timezone']),
                'REGDATE' => cot_date('datetime_medium', $user_data['user_regdate']),
                'REGDATE_STAMP' => $user_data['user_regdate'],
                'LASTLOG' => cot_date('datetime_medium', $user_data['user_lastlog']),
                'LASTLOG_STAMP' => $user_data['user_lastlog'],
                'LOGCOUNT' => $user_data['user_logcount'],
                'POSTCOUNT' => !empty($user_data['user_postcount']) ? $user_data['user_postcount'] : 0,
                'LASTIP' => $user_data['user_lastip'],
            ];

            if ($allgroups) {
                $temp_array['GROUPS'] = cot_build_groupsms($user_data['user_id'], false, $user_data['user_maingrp']);
            }

            // Extra fields
            if (!empty(Cot::$extrafields[Cot::$db->users])) {
                foreach (Cot::$extrafields[Cot::$db->users] as $extrafield) {
                    $extrafieldTitle = cot_extrafield_title($extrafield, 'user_');
                    $extrafieldTag = strtoupper($extrafield['field_name']);
                    $temp_array[$extrafieldTag] = cot_build_extrafields_data(
                        'user',
                        $extrafield,
                        $user_data['user_' . $extrafield['field_name']]
                    );
                    $temp_array[$extrafieldTag . '_TITLE'] = $extrafieldTitle;
                    $temp_array[$extrafieldTag . '_VALUE'] = $user_data['user_' . $extrafield['field_name']];
                }
            }
        } else {
            $temp_array = [
                'ID' => 0,
                'NAME' => (!empty($emptyname)) ? $emptyname : $L['Deleted'],
                'NICKNAME' => (!empty($emptyname)) ? $emptyname : $L['Deleted'],
                'FULL_NAME' => (!empty($emptyname)) ? $emptyname : $L['Deleted'],
                'MAIN_GROUP' => cot_build_group(COT_GROUP_GUESTS),
                'MAIN_GROUP_ID' => COT_GROUP_GUESTS,
                'MAIN_GROUP_STARS' => '',
                'MAIN_GROUP_ICON' => cot_build_groupicon($cot_groups[1]['icon']),
                'COUNTRY' => cot_build_country(''),
                'COUNTRY_FLAG' => cot_build_flag(''),
                'TEXT' => '',
                'EMAIL' => '',
                'GENDER' => '',
                'BIRTHDATE' => '',
                'BIRTHDATE_STAMP' => '',
                'AGE' => '',
                'REGDATE' => '',
                'REGDATE_STAMP' => '',
                'POSTCOUNT' => '',
                'LASTIP' => '',
            ];
        }

        /* === Hook === */
        foreach ($extp_main as $pl) {
            include $pl;
        }
        /* ===== */

        if (is_array($user_data) && isset($user_data['user_id'])) {
            $cacheitem && $user_cache[$user_data['user_id']] = $temp_array;
        }

    }

    foreach ($temp_array as $key => $val) {
        $return_array[$tag_prefix . $key] = $val;
    }

    return $return_array;
}


разберем функцию cot_generate_usertags подробно, с комментариями на русском языке, чтобы понять, как она работает и что делает на каждом этапе.

/**
 * Возвращает все теги пользователя для XTemplate.
 *
 * @param mixed $user_data Информация о пользователе в виде массива или ID пользователя.
 * @param string $tag_prefix Префикс для тегов.
 * @param string $emptyname Имя, которое отображается, если пользователь не существует.
 * @param bool $allgroups Создать информацию о всех группах пользователя.
 * @param bool $cacheitem Кэшировать теги.
 * @return array Возвращает массив с тегами пользователя.
 */
function cot_generate_usertags($user_data, $tag_prefix = '', $emptyname = '', $allgroups = false, $cacheitem = true)
{
    // Глобальные переменные, которые понадобятся в функции.
    global $db, $cot_extrafields, $cot_groups, $cfg, $L, $user_cache, $db_users;

    // Статические переменные, чтобы плагины загружались только один раз.
    static $extp_first = null, $extp_main = null;

    // Инициализация возвращаемого массива.
    $return_array = [];

    // Загрузка плагинов для хуков 'usertags.first' и 'usertags.main'.
    if (is_null($extp_first)) {
        $extp_first = cot_getextplugins('usertags.first');
        $extp_main = cot_getextplugins('usertags.main');
    }

    // Выполнение плагинов, зарегистрированных на хук 'usertags.first'.
    foreach ($extp_first as $pl) {
        include $pl;
    }

    // Определение ID пользователя. Если переданы данные массива, то извлекается ID, иначе используется переданный ID.
    $user_id = is_array($user_data) && !empty($user_data['user_id'])
        ? (int)$user_data['user_id']
        : (is_numeric($user_data) ? (int)$user_data : 0);

    // Проверка, есть ли пользователь в кэше.
    if (isset($user_cache[$user_id])) {
        $temp_array = $user_cache[$user_id];
    } else {
        // Если данных нет в кэше и передан только ID, извлекаем данные пользователя из базы данных.
        if (!is_array($user_data) && $user_id > 0) {
            $sql = $db->query("SELECT * FROM $db_users WHERE user_id = $user_id LIMIT 1");
            $user_data = $sql->fetch();
        }

        // Если данные пользователя не найдены, инициализируем пустой массив.
        if (empty($user_data) || !is_array($user_data)) {
            $user_data = [];
        }

        // Если данные пользователя существуют, генерируем теги.
        if (!empty($user_data['user_id']) && !empty($user_data['user_name'])) {
            // Обработка даты рождения пользователя и текста.
            $user_data['user_birthdate'] = cot_date2stamp($user_data['user_birthdate']);
            $enableMarkup = $cfg['users']['usertextimg'] ?? false;
            $user_data['user_text'] = cot_parse($user_data['user_text'], $enableMarkup);

            // Генерация массива с тегами пользователя.
            $temp_array = [
                'ID' => $user_data['user_id'],
                'NAME' => cot_build_user($user_data['user_id'], $user_data['user_name']),
                'NICKNAME' => htmlspecialchars($user_data['user_name']),
                'DETAILS_URL' => cot_url(
                    'users',
                    ['m' => 'details', 'id' => $user_data['user_id'], 'u' => $user_data['user_name']]
                ),
                'FULL_NAME' => htmlspecialchars(UsersHelper::getInstance()->getFullName($user_data)),
                'TITLE' => $cot_groups[$user_data['user_maingrp']]['title'],
                'MAIN_GROUP' => cot_build_group($user_data['user_maingrp']),
                'COUNTRY' => cot_build_country($user_data['user_country']),
                'TEXT' => $user_data['user_text'],
                'EMAIL' => cot_build_email($user_data['user_email'], $user_data['user_hideemail']),
                'GENDER' => ($user_data['user_gender'] == '' || $user_data['user_gender'] == 'U') ? '' : $L['Gender_' . $user_data['user_gender']],
                'BIRTHDATE' => is_null($user_data['user_birthdate']) ? '' : cot_date('date_full', $user_data['user_birthdate']),
                'AGE' => is_null($user_data['user_birthdate']) ? '' : cot_build_age($user_data['user_birthdate']),
                'REGDATE' => cot_date('datetime_medium', $user_data['user_regdate']),
                'LASTLOG' => cot_date('datetime_medium', $user_data['user_lastlog']),
                'POSTCOUNT' => $user_data['user_postcount'] ?? 0,
                'LASTIP' => $user_data['user_lastip'],
            ];

            // Если нужно добавить информацию о всех группах пользователя.
            if ($allgroups) {
                $temp_array['GROUPS'] = cot_build_groupsms($user_data['user_id'], false, $user_data['user_maingrp']);
            }

            // Обработка дополнительных полей (extrafields).
            foreach ($cot_extrafields[$db_users] ?? [] as $extrafield) {
                $extrafieldTag = strtoupper($extrafield['field_name']);
                $temp_array[$extrafieldTag] = cot_build_extrafields_data(
                    'user',
                    $extrafield,
                    $user_data['user_' . $extrafield['field_name']]
                );
            }
        } else {
            // Если пользователь не существует, заполняем массив значениями по умолчанию.
            $temp_array = [
                'ID' => 0,
                'NAME' => $emptyname ?: $L['Deleted'],
                'NICKNAME' => $emptyname ?: $L['Deleted'],
                'FULL_NAME' => $emptyname ?: $L['Deleted'],
                'MAIN_GROUP' => cot_build_group(COT_GROUP_GUESTS),
                'COUNTRY' => cot_build_country(''),
                'TEXT' => '',
                'EMAIL' => '',
                'GENDER' => '',
                'BIRTHDATE' => '',
                'AGE' => '',
                'REGDATE' => '',
                'POSTCOUNT' => '',
                'LASTIP' => '',
            ];
        }

        // Выполнение плагинов, зарегистрированных на хук 'usertags.main'.
        foreach ($extp_main as $pl) {
            include $pl;
        }

        // Кэширование данных пользователя, если это необходимо.
        if ($cacheitem && isset($user_data['user_id'])) {
            $user_cache[$user_data['user_id']] = $temp_array;
        }
    }

    // Добавление префикса к тегам и возврат массива тегов.
    foreach ($temp_array as $key => $val) {
        $return_array[$tag_prefix . $key] = $val;
    }

    return $return_array;
}

 

Основные аспекты функции cot_generate_usertags в Cotonti :


Параметры:

$user_data: Данные пользователя (массив или ID).
$tag_prefix: Префикс для тегов.
$emptyname: Текст, если пользователь не существует.
$allgroups: Включить информацию о всех группах пользователя.
$cacheitem: Кэшировать теги.


Кэширование:

Использует кэширование для улучшения производительности, избегая повторного запроса к базе данных.


Плагины:

Выполняет плагины, зарегистрированные на хуки 'usertags.first' и 'usertags.main'.


Генерация тегов:

Генерирует множество тегов с информацией о пользователе, которые могут быть использованы в шаблонах XTemplate.


Обработка дополнительных полей:

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


Объяснение каждого этапа:


Загрузка плагинов:

Функция загружает плагины для обработки дополнительных хуков, что позволяет расширять функционал.


Получение ID пользователя:

Определяет ID пользователя, исходя из переданных данных.


Кэширование:

Проверяет, есть ли данные пользователя в кэше, чтобы избежать повторных запросов к базе данных.


Извлечение данных пользователя:

Если пользователь не найден в кэше, функция извлекает его данные из базы данных.


Генерация тегов:

Создает теги для пользователя на основе его данных, включая дополнительные поля.


Возвращение тегов:

Функция возвращает массив тегов, который можно использовать в шаблонах.


Таким образом, cot_generate_usertags является мощным инструментом для генерации данных пользователя, которые могут быть использованы в шаблонах Cotonti.

7 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 20:30
  • Последнее обновление: 21.01.2025 20:30