Модуль "Users", - users.profile.php в Cotonti CMF

Опубликовано в: Модули в Cotonti из коробки

Общее описание файла

Файл users.profile.php является важной частью административной панели в системе управления контентом Cotonti CMF. Он отвечает за обработку и отображение профиля пользователя, позволяя администратору или самому пользователю редактировать и просматривать его данные. Важнейшей частью работы файла является взаимодействие с пользовательскими данными, такими как имя, email, пароль, группа и другие настройки, а также обработка ошибок и их отображение на экране.

Файл хранится в директории, которая, скорее всего, относится к модулям или функционалу пользователей, например, в /modules/users/ или /system/admin/.

Основное назначение файла и его место в системе Cotonti

users.profile.php отвечает за обработку и вывод страницы профиля пользователя на сайте, а также за обновление его данных в базе данных. Этот файл используется для создания, редактирования и отображения информации о пользователях, включая их настройки, такие как email, текстовые поля, параметры отображения и другие атрибуты, связанные с аккаунтом.

Взаимодействие с другими компонентами сайта

Файл users.profile.php тесно взаимодействует с базой данных, различными конфигурационными настройками и пользовательскими данными. Он использует:

  • Базу данных для выборки и обновления данных пользователя.
  • Конфигурационные настройки для обработки разных вариантов поведения страницы, например, разрешение на изменение email, возможность применения защиты пароля.
  • Шаблоны для вывода данных на экран.
  • Плагины и хуки, позволяющие сторонним разработчикам вмешиваться в процесс и расширять функциональность (например, для добавления дополнительных полей или валидации данных).

Используемые переменные, хуки, методы, функции и классы

  1. Cot::$cfg - глобальный объект конфигурации системы, который содержит параметры, связанные с настройками пользователей, защиты данных и других компонентов сайта.

    • Cot::$cfg['users']['useremailchange'] – разрешение на изменение email.
    • Cot::$cfg['users']['user_email_noprotection'] – настройка защиты для изменения email.
  2. Cot::$usr - объект текущего пользователя, который содержит информацию о текущем вошедшем пользователе, такую как ID, имя, IP-адрес и другие параметры.

  3. Cot::$db - объект базы данных, через который выполняются запросы для извлечения и обновления данных в базе данных.

    • Cot::$db->query() - используется для выполнения SQL-запросов.
    • Cot::$db->update() - выполняет обновление данных в базе.
  4. Cot::$out - объект, отвечающий за вывод данных на экран. Здесь используется для управления титулом страницы и добавления метатегов.

  5. Cot::$L - объект локализации, предоставляющий переведенные строки для различных частей сайта, такие как названия и сообщения об ошибках.

  6. Cot::$R - объект, который хранит настройки для отображения на странице, например, метатеги или элементы интерфейса.

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

  8. cot_inputbox(), cot_textarea(), cot_selectbox() и другие функции ввода - используются для создания HTML-форм для ввода данных пользователями.

  9. cot_display_messages() - функция для отображения сообщений, таких как ошибки или успешные уведомления.

  10. cot_mail() - функция для отправки email уведомлений пользователям.

  11. cot_redirect() - функция для выполнения редиректа на другую страницу.

  12. XTemplate - класс для работы с шаблонами в Cotonti. Он используется для рендеринга HTML на основе данных.

Основные задачи, функции и условия

  1. Выборка данных пользователя:

    • Сначала извлекается информация о пользователе из базы данных, используя его ID. Это включает данные, такие как email, имя, страна, дата рождения и другие атрибуты.
  2. Обработка ошибок и сообщений:

    • Весь процесс редактирования профиля включает в себя проверку на наличие ошибок. Если ошибка найдена, она отображается на странице. Используется метод cot_error_found() для проверки ошибок.
  3. Обновление профиля:

    • Если ошибок нет, данные пользователя обновляются в базе данных. Это может быть изменение email, текстового поля или других параметров.
  4. Изменение email:

    • Если пользователь меняет свой email, система проверяет, не использует ли уже этот email другой пользователь. Также может быть отправлено подтверждение на новый email.
  5. Плагины и хуки:

    • В коде присутствуют хуки, которые позволяют сторонним разработчикам вмешиваться в процесс, добавляя свои функции, такие как дополнительные поля или действия после обновления данных пользователя.
  6. Вывод шаблонов и данных:

    • Для отображения страницы профиля пользователя используется шаблон. Данные профиля, такие как email, имя, группа и другие, выводятся в соответствующих формах на веб-странице.
  7. Обработка и вывод дополнительных полей:

    • Если для пользователя настроены дополнительные поля (например, поля профиля), то они выводятся на странице с возможностью редактирования.
  8. Отправка email уведомлений:

    • При изменении email может быть отправлено уведомление на новый email для подтверждения изменений.

Использование владельцем сайта

Владелец сайта может использовать этот файл для настройки и управления профилями пользователей на сайте. Например, он может:

  • Позволить пользователям редактировать их данные, такие как email, текстовые поля, и другие настройки.
  • Активировать или деактивировать возможность смены email и других данных.
  • Использовать плагины и расширения для добавления новых полей в профиль пользователя.

Стиль написания PHP-кода и совместимость с версиями PHP

Код написан в стандартном стиле для Cotonti CMF, который использует объектно-ориентированный подход для работы с базой данных, настройками и выводом данных на экран. Он предполагает использование встроенных функций системы и взаимодействие с внешними плагинами через хуки.

Совместимость с версиями PHP: данный код должен быть совместим с версиями PHP 5.6 и выше, так как используется стандартный синтаксис PHP, а также некоторые функции, которые могут быть недоступны в более старых версиях PHP.

 

<?php

/**
 * User Profile
 *
 * @package Users
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */

defined('COT_CODE') or die('Wrong URL'); // Проверка безопасности: если код не загружен через Cotonti, доступ запрещен.

require_once cot_incfile('uploads'); // Подключение необходимого файла для работы с загрузками.

@clearstatcache(); // Очистка кэша состояния файлов.

list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('users', 'a'); // Получение прав доступа пользователя для модуля "users", включая права на чтение, запись и административные права.

cot_block(Cot::$usr['auth_write']); // Если у пользователя нет прав на запись, будет завершен скрипт.

require_once cot_langfile('users', 'module'); // Подключение языкового файла для модуля "users".

/* === Hook === */
foreach (cot_getextplugins('users.profile.first') as $pl) { // Вызов всех плагинов для события 'users.profile.first'.
	include $pl; // Подключение плагинов.
}
/* ===== */

$id = cot_import('id','G','TXT'); // Получение параметра 'id' из глобального массива $_GET, тип данных: строка.

$a = cot_import('a','G','ALP'); // Получение параметра 'a' из глобального массива $_GET, тип данных: строка (буквы).

$sql = Cot::$db->query("SELECT * FROM " . Cot::$db->users . " WHERE user_id='" . Cot::$usr['id']."' LIMIT 1"); // Выполнение SQL-запроса для получения данных о текущем пользователе из таблицы пользователей, используя его ID.

cot_die($sql->rowCount()==0); // Если запрос не вернул результатов, завершаем выполнение скрипта (пользователь не найден).

$urr = $sql->fetch(); // Получение данных пользователя в виде ассоциативного массива.

 

if ($a == 'update') { // Проверка, если параметр 'a' равен 'update', выполняется обновление данных пользователя.
	cot_check_xg(); // Проверка корректности формы с помощью X-Token для защиты от CSRF атак.

	/* === Hook === */
	foreach (cot_getextplugins('users.profile.update.first') as $pl) { // Вызов плагинов для события 'users.profile.update.first'.
		include $pl; // Подключение плагинов.
	}
	/* ===== */

	$ruser['user_text'] = cot_import('rusertext','P','HTM', Cot::$cfg['users']['usertextmax']); // Получение текстовой информации о пользователе с проверкой на максимальную длину, установленную в конфигурации.

	$ruser['user_country'] = cot_import('rusercountry','P','ALP'); // Получение страны пользователя (алфавитный код страны).

    $rtheme = cot_import('rusertheme','P','TXT'); // Получение выбранной темы пользователя.
    $rtheme = !empty($rtheme) ? explode(':', $rtheme) : []; // Разделение темы на два элемента: имя темы и схема, если она есть.

	$ruser['user_theme'] = isset($rtheme[0]) ? $rtheme[0] : null; // Установка имени темы, если оно указано.
	$ruser['user_scheme'] = isset($rtheme[1]) ? $rtheme[1] : null; // Установка схемы темы, если она указана.

	$ruser['user_lang'] = cot_import('ruserlang','P','ALP'); // Получение языка пользователя (алфавитный код языка).

	$ruser['user_gender'] = cot_import('rusergender','P','ALP'); // Получение пола пользователя (алфавитный код).

	$ruser['user_timezone'] = cot_import('rusertimezone','P','TXT'); // Получение часового пояса пользователя.
	$ruser['user_hideemail'] = cot_import('ruserhideemail','P','BOL'); // Получение флага скрытия электронной почты пользователя (булевое значение).

 

// Extra fields
if (!empty(Cot::$extrafields[Cot::$db->users])) { // Проверка наличия дополнительных полей для пользователей.
    foreach (Cot::$extrafields[Cot::$db->users] as $exfld) { // Проход по каждому дополнительному полю.
        $ruser['user_' . $exfld['field_name']] = cot_import_extrafields('ruser' . $exfld['field_name'], $exfld, 'P', // Получение значения дополнительного поля из POST-запроса.
            $urr['user_' . $exfld['field_name']], 'user_'); // Значение поля сохраняется в массив $ruser с префиксом 'user_'.
    }
}

$ruser['user_birthdate'] = cot_import_date('ruserbirthdate', false); // Получение даты рождения пользователя и проверка на формат даты.

if (!is_null($ruser['user_birthdate']) && $ruser['user_birthdate'] > Cot::$sys['now']) { // Проверка, если дата рождения больше текущей даты.
    cot_error('pro_invalidbirthdate', 'ruserbirthdate'); // Генерация ошибки, если дата рождения некорректна.
}

$roldpass  = (string) cot_import('roldpass','P','NOC'); // Получение старого пароля пользователя (без ограничений по длине).
$rnewpass1 = (string) cot_import('rnewpass1','P','NOC', 32); // Получение первого нового пароля (с ограничением длины 32 символа).
$rnewpass2 = (string) cot_import('rnewpass2','P','NOC', 32); // Получение второго нового пароля для подтверждения (с ограничением длины 32 символа).
$rmailpass = (string) cot_import('rmailpass','P','NOC'); // Получение пароля для подтверждения изменения электронной почты.
$ruseremail = cot_import('ruseremail','P','TXT'); // Получение нового адреса электронной почты пользователя.

 

if (!empty($rnewpass1) && !empty($rnewpass2) && !empty($roldpass)) { // Проверка, что введены старый и оба новых пароля.
    if ($rnewpass1 != $rnewpass2) cot_error('pro_passdiffer', 'rnewpass2'); // Если новые пароли не совпадают, генерируется ошибка.
    if (mb_strlen($rnewpass1) < 4) cot_error('pro_passtoshort', 'rnewpass1'); // Если длина нового пароля меньше 4 символов, генерируется ошибка.
    if (cot_hash($roldpass, $urr['user_passsalt'], $urr['user_passfunc']) != $urr['user_password']) cot_error('pro_wrongpass', 'roldpass'); // Если старый пароль неверный (сравнение хешей), генерируется ошибка.

    if (!empty($ruseremail) && !empty($rmailpass) && Cot::$cfg['users']['useremailchange'] && $ruseremail != $urr['user_email']) { // Если новый email и пароль для изменения email заданы, проверяется, отличается ли email от текущего.
        cot_error('pro_emailandpass', 'ruseremail'); // Если email отличается и условия для изменения email есть, генерируется ошибка.
    }

    if (!cot_error_found()) { // Если ошибок не найдено, продолжаем выполнение.
        $ruserpass = array(); // Создаем пустой массив для пароля.
        $ruserpass['user_passsalt'] = cot_unique(16); // Генерация нового соли для пароля.
        $ruserpass['user_passfunc'] = empty(Cot::$cfg['hashfunc']) ? 'sha256' : Cot::$cfg['hashfunc']; // Определение функции хеширования, если не указано, используется sha256.
        $ruserpass['user_password'] = cot_hash($rnewpass1, $ruserpass['user_passsalt'], $ruserpass['user_passfunc']); // Хеширование нового пароля с солью.
        Cot::$db->update(Cot::$db->users, $ruserpass, "user_id=" . Cot::$usr['id']); // Обновление пароля пользователя в базе данных.
        unset($ruserpass); // Очистка массива пароля.
        cot_message('Password_updated'); // Отображение сообщения об успешном обновлении пароля.
    }
}

 

if (
    !empty($ruseremail) && // Проверка, что новый email не пустой.
    (!empty($rmailpass) || Cot::$cfg['users']['user_email_noprotection']) && // Проверка, что либо введен пароль для изменения email, либо настройка на отсутствие защиты email активирована.
    Cot::$cfg['users']['useremailchange'] && // Проверка, что в конфигурации разрешено изменять email.
    $ruseremail != $urr['user_email'] // Проверка, что новый email отличается от текущего.
) {
    $sqltmp = Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->users . " WHERE user_email='" .
        Cot::$db->prep($ruseremail)."'"); // Запрос для проверки, существует ли уже такой email в базе данных.
    $res = $sqltmp->fetchColumn(); // Получение количества пользователей с таким email.

    if (!Cot::$cfg['users']['user_email_noprotection']) { // Если защита от изменения email включена.
        $rmailpass = cot_hash($rmailpass, $urr['user_passsalt'], $urr['user_passfunc']); // Хеширование введенного пароля.
        if ($rmailpass != $urr['user_password']) cot_error('pro_wrongpass', 'rmailpass'); // Если пароль неверный, генерируется ошибка.
    }

    if (!cot_check_email($ruseremail)) { // Проверка на правильность формата email.
        cot_error('aut_emailtooshort', 'ruseremail'); // Если email некорректен, генерируется ошибка.
    }
    if ($res > 0) cot_error('aut_emailalreadyindb', 'ruseremail'); // Если email уже существует в базе данных, генерируется ошибка.

    if (!cot_error_found()) { // Если ошибок не найдено, продолжаем выполнение.
        if (!Cot::$cfg['users']['user_email_noprotection']) { // Если защита от изменения email включена.
            $validationkey = md5(microtime()); // Генерация уникального ключа для валидации email.
            Cot::$db->update(Cot::$db->users, array(
                'user_email' => $ruseremail, // Обновление email пользователя.
                'user_lostpass' => $validationkey, // Установка ключа для восстановления пароля.
                'user_maingrp' => '0', // Установка основного группового значения.
                'user_sid' => $urr['user_maingrp']), // Установка идентификатора сессии пользователя.
                "user_id='" . Cot::$usr['id']."'"
            );

            $rsubject = Cot::$L['aut_mailnoticetitle']; // Заголовок письма.
            $ractivate = Cot::$cfg['mainurl'] . '/' .
                cot_url('users', 'm=register&a=validate&v='.$validationkey, '', true); // Ссылка для активации email.
            $rbody = sprintf(Cot::$L['aut_emailchange'], Cot::$usr['name'], $ractivate); // Текст письма с ссылкой для активации.
            $rbody .= "\n\n" . Cot::$L['aut_contactadmin']; // Добавление информации для контакта с администратором.
            cot_mail($ruseremail, $rsubject, $rbody); // Отправка письма пользователю.

            if (cot_import(Cot::$sys['site_id'], 'COOKIE', 'TXT')) { // Если есть cookie для текущего сайта.
                cot_setcookie(Cot::$sys['site_id'], '', time() - 63072000, Cot::$cfg['cookiepath'],
                    Cot::$cfg['cookiedomain'], Cot::$sys['secure'], true); // Удаление cookies.
            }

            if (!empty($_SESSION[Cot::$sys['site_id']])) { // Если сессия активна.
                session_unset(); // Очистка сессии.
                session_destroy(); // Уничтожение сессии.
            }
            if (cot_plugin_active('whosonline')) { // Если плагин "whosonline" активирован.
                Cot::$db->delete(Cot::$db->online, "online_ip='" . Cot::$usr['ip'] . "'"); // Удаление информации о пользователе из онлайн-списка.
            }
            cot_redirect(cot_url('message', 'msg=102', '', true)); // Перенаправление на страницу сообщения об успешном изменении email.
        } else { // Если защита от изменения email не включена.
            Cot::$db->update(Cot::$db->users, array('user_email' => $ruseremail), "user_id='" .
                Cot::$usr['id']."'"); // Просто обновляем email в базе данных без валидации.
        }
    }
}

 

if (!cot_error_found()) { // Если нет ошибок в процессе выполнения.
    if (is_null($ruser['user_birthdate'])) { // Если дата рождения не была указана.
        if (isset($_POST['ruserbirthdate'])) { // Если дата рождения была отправлена в запросе.
            $ruser['user_birthdate'] = 'NULL'; // Устанавливаем значение NULL в базе данных.
        } else {
            unset($ruser['user_birthdate']); // Удаляем значение, если дата не указана.
        }

    } else {
        $ruser['user_birthdate'] = cot_stamp2date($ruser['user_birthdate']); // Преобразуем метку времени в формат даты.
    }

    $ruser['user_auth'] = ''; // Очищаем поле аутентификации.

    Cot::$db->update(Cot::$db->users, $ruser, "user_id='" . Cot::$usr['id']."'"); // Обновляем данные пользователя в базе данных.

    cot_extrafield_movefiles(); // Перемещаем файлы для дополнительных полей.

    /* === Hook === */
    foreach (cot_getextplugins('users.profile.update.done') as $pl) { // Запускаем хуки, если они существуют.
        include $pl;
    }
    /* ===== */

    cot_message('Profile_updated'); // Отображаем сообщение о том, что профиль обновлен.
    cot_redirect(cot_url('users', 'm=profile', '', true)); // Перенаправляем пользователя на страницу профиля.
}
}

 

$sql = Cot::$db->query('SELECT * FROM ' . Cot::$db->users . " WHERE user_id='" . Cot::$usr['id'] . "' LIMIT 1"); // Выполняем SQL-запрос для получения информации о пользователе по ID.
$urr = $sql->fetch(); // Извлекаем полученные данные о пользователе.

Cot::$out['subtitle'] = Cot::$L['Profile']; // Устанавливаем заголовок страницы.
Cot::$out['head'] .= Cot::$R['code_noindex']; // Добавляем тег noindex для страницы (не индексировать в поисковиках).

$mskin = cot_tplfile(['users', 'profile', $urr['user_maingrp']], 'module'); // Определяем шаблон для отображения страницы, основываясь на основной группе пользователя.

/* === Hook === */
foreach (cot_getextplugins('users.profile.main') as $pl) { // Загружаем расширения для хуков 'users.profile.main', если они существуют.
    include $pl;
}
/* ===== */

require_once Cot::$cfg['system_dir'] . '/header.php'; // Подключаем заголовок страницы.

$t = new XTemplate($mskin); // Создаем объект XTemplate для обработки шаблона.

/* === Forms === */
require_once cot_incfile('forms'); // Подключаем файл для работы с формами.

$protected = !Cot::$cfg['users']['useremailchange'] ? ['disabled' => 'disabled'] : []; // Проверяем, разрешено ли изменение email, если нет - поле будет заблокировано.
$profile_form_email = cot_inputbox(
    'text', // Тип поля (текстовое поле).
    'ruseremail', // Имя поля.
    $urr['user_email'], // Значение поля (текущий email пользователя).
    ['maxlength' => 64] + $protected // Устанавливаем максимальную длину для email и добавляем атрибут disabled, если изменение email не разрешено.
);

$editor_class = Cot::$cfg['users']['usertextimg'] ? 'minieditor' : ''; // Устанавливаем класс для редактора текста, если изображения разрешены.

$breadCrumbs = [ // Формируем хлебные крошки для навигации.
    [cot_url('users', ['m' => 'details']), Cot::$L['users_myProfile']], // Ссылка на профиль пользователя.
    [cot_url('users', ['m' => 'profile']), Cot::$L['Edit']], // Ссылка на редактирование профиля.
];

 

$t->assign([ // Присваиваем значения переменным шаблона для вывода на страницу.
    'USERS_PROFILE_TITLE' => Cot::$L['pro_title'], // Заголовок страницы профиля.
    'USERS_PROFILE_SUBTITLE' => Cot::$L['pro_subtitle'], // Подзаголовок страницы профиля.
    'USERS_PROFILE_BREADCRUMBS' => cot_breadcrumbs($breadCrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки для навигации по странице.
    'USERS_PROFILE_DETAILS_URL' => cot_url(
        'users', // Ссылка на страницу с деталями пользователя.
        ['m' => 'details', 'id' => $urr['user_id'], 'u' => $urr['user_name']] // Параметры URL для получения информации о пользователе.
    ),
    'USERS_PROFILE_EDIT_URL' => cot_url('users', ['m' => 'edit', 'id' => $urr['user_id']]), // Ссылка на страницу редактирования профиля.
    'USERS_PROFILE_FORM_SEND' => cot_url('users', "m=profile&a=update&".cot_xg()), // Ссылка для отправки формы обновления профиля.
    'USERS_PROFILE_ID' => $urr['user_id'], // ID пользователя.
    'USERS_PROFILE_NAME' => htmlspecialchars($urr['user_name']), // Имя пользователя (защищенное от XSS).
    'USERS_PROFILE_MAIN_GROUP' => cot_build_group($urr['user_maingrp']), // Основная группа пользователя.
    'USERS_PROFILE_GROUPS' => cot_build_groupsms($urr['user_id'], FALSE, $urr['user_maingrp']), // Список групп пользователя.
    'USERS_PROFILE_COUNTRY' => cot_selectbox_countries($urr['user_country'], 'rusercountry'), // Селектор стран с текущей страной пользователя.
    'USERS_PROFILE_TEXT' => cot_textarea('rusertext', $urr['user_text'], 8, 56, array('class' => $editor_class)), // Поле для текста профиля.
    'USERS_PROFILE_EMAIL' => $profile_form_email, // Поле для изменения email.
    'USERS_PROFILE_EMAILPASS' => cot_inputbox('password', 'rmailpass', '', array('size' => 12, 'maxlength' => 32, 'autocomplete' => 'off')), // Поле для пароля для изменения email.
    'USERS_PROFILE_HIDEEMAIL' => cot_radiobox($urr['user_hideemail'], 'ruserhideemail', array(1, 0), array(Cot::$L['Yes'], Cot::$L['No'])), // Радиокнопки для скрытия email.
    'USERS_PROFILE_THEME' => cot_selectbox_theme($urr['user_theme'], $urr['user_scheme'], 'rusertheme'), // Селектор темы оформления.
    'USERS_PROFILE_LANG' => cot_selectbox_lang($urr['user_lang'], 'ruserlang'), // Селектор языка.
    'USERS_PROFILE_GENDER' => cot_selectbox_gender($urr['user_gender'] ,'rusergender'), // Селектор пола.
    'USERS_PROFILE_BIRTHDATE' => cot_selectbox_date(cot_date2stamp($urr['user_birthdate']), 'short', 'ruserbirthdate', cot_date('Y', Cot::$sys['now']), cot_date('Y', Cot::$sys['now']) - 100, false), // Селектор даты рождения.
    'USERS_PROFILE_TIMEZONE' => cot_selectbox_timezone($urr['user_timezone'], 'rusertimezone'), // Селектор часового пояса.
    'USERS_PROFILE_REGDATE' => cot_date('datetime_medium', $urr['user_regdate']), // Дата регистрации пользователя.
    'USERS_PROFILE_REGDATE_STAMP' => $urr['user_regdate'], // Время регистрации пользователя.
    'USERS_PROFILE_LASTLOG' => cot_date('datetime_medium', $urr['user_lastlog']), // Дата последнего входа пользователя.
    'USERS_PROFILE_LASTLOG_STAMP' => $urr['user_lastlog'], // Время последнего входа пользователя.
    'USERS_PROFILE_LOGCOUNT' => $urr['user_logcount'], // Количество входов пользователя.
    'USERS_PROFILE_ADMINRIGHTS' => '', // Пустая строка для прав администратора (пока не используется).
    'USERS_PROFILE_OLDPASS' => cot_inputbox('password', 'roldpass', '', ['size' => 12, 'maxlength' => 32]), // Поле для ввода старого пароля.
    'USERS_PROFILE_NEWPASS1' => cot_inputbox('password', 'rnewpass1', '', ['size' => 12, 'maxlength' => 32, 'autocomplete' => 'off']), // Поле для ввода нового пароля (1).
    'USERS_PROFILE_NEWPASS2' => cot_inputbox('password', 'rnewpass2', '', ['size' => 12, 'maxlength' => 32, 'autocomplete' => 'off']), // Поле для повторного ввода нового пароля.
]);

 

if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Проверка на наличие и значение параметра 'legacyMode' в конфигурации.
    // @deprecated in 0.9.24
    $t->assign([ // Присваиваем значения переменным шаблона для вывода на страницу.
        'USERS_PROFILE_DETAILSLINK' => cot_url('users', 'm=details&id=' . $urr['user_id']), // Ссылка на страницу с деталями пользователя.
        'USERS_PROFILE_EDITLINK' => cot_url('users', 'm=edit&id=' . $urr['user_id']), // Ссылка на страницу редактирования профиля.
        'USERS_PROFILE_MAINGRP' => cot_build_group($urr['user_maingrp']), // Основная группа пользователя.
    ]);
}

// Extra fields
if (!empty(Cot::$extrafields[Cot::$db->users])) { // Проверка на наличие дополнительных полей для пользователей.
    foreach (Cot::$extrafields[Cot::$db->users] as $exfld) { // Перебор всех дополнительных полей.
        $uname = strtoupper($exfld['field_name']); // Преобразуем имя поля в верхний регистр для использования в переменной.
        $exfld_val = cot_build_extrafields('ruser'.$exfld['field_name'], $exfld, $urr['user_'.$exfld['field_name']]); // Строим значение дополнительного поля.
        $exfld_title = cot_extrafield_title($exfld, 'user_'); // Получаем название дополнительного поля.

        $t->assign(array( // Присваиваем значения переменным шаблона для вывода на страницу.
            'USERS_PROFILE_' . $uname => $exfld_val, // Присваиваем значение дополнительного поля.
            'USERS_PROFILE_' . $uname . '_TITLE' => $exfld_title, // Присваиваем название дополнительного поля.
            'USERS_PROFILE_EXTRAFLD' => $exfld_val, // Присваиваем значение дополнительного поля.
            'USERS_PROFILE_EXTRAFLD_TITLE' => $exfld_title // Присваиваем название дополнительного поля.
        ));
        $t->parse('MAIN.EXTRAFLD'); // Обрабатываем шаблон дополнительного поля.
    }
}
/* === Hook === */
foreach (cot_getextplugins('users.profile.tags') as $pl) { // Перебор плагинов, которые добавляют теги для профиля пользователя.
	include $pl; // Включаем каждый плагин для обработки соответствующих тегов.
}
/* ===== */

// Error handling
cot_display_messages($t); // Отображение сообщений об ошибках или успешных операциях на странице.

if (Cot::$cfg['users']['useremailchange']) { // Если в конфигурации разрешена смена email.
	if (!Cot::$cfg['users']['user_email_noprotection']) { // Если не отключена защита для смены email.
		$t->parse('MAIN.USERS_PROFILE_EMAILCHANGE.USERS_PROFILE_EMAILPROTECTION'); // Обрабатываем и отображаем блок для защиты смены email.
	}
	$t->parse('MAIN.USERS_PROFILE_EMAILCHANGE'); // Обрабатываем и отображаем блок с возможностью смены email.
}

$t->parse('MAIN'); // Обрабатываем основной шаблон.
$t->out('MAIN'); // Выводим основной шаблон на страницу.

require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключаем файл с футером, который завершает страницу.

 


 

Немного о хуках в профиле пользователя, как они работают:

чем является "users.profile.tags" в конструкции ниже?

/* === Hook === */
foreach (cot_getextplugins('users.profile.tags') as $pl) {
	include $pl;
}
/* ===== */

 

В данном контексте "users.profile.tags" — это имя хука (hook), который используется в системе Cotonti для расширения функционала страницы или модуля. Хуки — это механизм, позволяющий сторонним разработчикам или пользователю добавлять или изменять функциональность без изменения основного кода.

В данном случае, хук "users.profile.tags" предназначен для добавления дополнительного функционала или модификации поведения страницы профиля пользователя. Когда система вызывает этот хук, она ищет все доступные плагины, зарегистрированные для этого хука, и включает их.

Как это работает:

  1. cot_getextplugins('users.profile.tags') — функция, которая возвращает список файлов плагинов, привязанных к хуку 'users.profile.tags'. Эти плагины должны находиться в директории с плагинами, и каждый плагин должен быть зарегистрирован для этого хука.
  2. foreach (cot_getextplugins('users.profile.tags') as $pl) — перебор всех плагинов, зарегистрированных для этого хука.
  3. include $pl — подключение каждого плагина. Это позволяет плагинам расширять функциональность страницы профиля, например, добавлять новые поля, производить дополнительные проверки или модификации.

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

Плагины, зарегистрированные для хука 'users.profile.tags', могут быть использованы для добавления дополнительных тегов или элементов на страницу профиля пользователя. Например, это могут быть поля для ввода дополнительной информации, обработка изображений профиля, подключение дополнительных валидаторов или обработчиков форм.


Список хуков, используемых в файле "users.profile.php":

Хуки в коде:

users.profile.main


Этот хук используется в блоке:

foreach (cot_getextplugins('users.profile.main') as $pl) {
    include $pl;
}


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

users.profile.tags

Этот хук используется в блоке:

foreach (cot_getextplugins('users.profile.tags') as $pl) {
    include $pl;
}


Назначение: Это хук, который позволяет подключать плагины для добавления или изменения определенных "тегов" или "полей" на странице профиля пользователя. Например, это могут быть дополнительные пользовательские поля, которые могут быть использованы для кастомизации интерфейса.

users.profile.update.done

Этот хук используется в блоке:

foreach (cot_getextplugins('users.profile.update.done') as $pl) {
include $pl;
}


Назначение: Этот хук активируется после успешного обновления данных профиля пользователя. Плагины, привязанные к этому хуку, могут выполнять дополнительные действия после того, как профиль обновлен, например, отправку уведомлений или выполнение других действий, связанных с обновлением данных пользователя.

 

 

16 минут чтения Sodium Carbonate

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

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

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

webitproff

Оффлайн

Sodium Carbonate

Последняя авторизация: 19.07.2026 01:57

  • Страница размещена: 31.01.2025 02:19
  • Последнее обновление: 31.01.2025 03:29

Похожие страницы

Модуль "Users", - users.profile.tpl в Cotonti CMF
1 Тематическое описание файла шаблона users.edit.tpl в Cotonti CMF 1. Основное назначение файла и его место в системе
Модуль "Users", - users.setup.php в Cotonti CMF
2 Файл users.setup.php в Cotonti CMF является конфигурационным файлом для модуля Users, который управляет регистрацией
Модуль "Users", - users.php в Cotonti CMF
3 Основное назначение файла и его место в системе Cotonti: Файл "users.php" в системе Cotonti является важным
Модуль "Users", - users.extrafields.php в Cotonti CMF
4 Основное назначение файла Файл users.extrafields.php в Cotonti CMF представляет собой часть модуля для управления
Модуль "Users", - users.admin.home.php в Cotonti CMF
5 Основное назначение файла "users.admin.home.php" в системе Cotonti — это обработка административной панели