Модуль "Users", - users.functions.php в Cotonti CMF
содержит функции, которые отвечают за обработку и взаимодействие с базой данных для добавления, обновления и получения информации о пользователях.
Описание файла "users.functions.php" в Cotonti CMF
Файл "users.functions.php" в системе управления контентом Cotonti CMF является важной частью механизма управления пользователями на сайте. Он содержит несколько функций, которые отвечают за обработку и управление данными пользователей, а также за взаимодействие с базой данных для добавления, обновления и получения информации о пользователях.
Этот файл хранится в директории, отвечающей за работу с пользователями, что делает его частью административной и пользовательской логики работы с учетными записями. Это может быть как часть функционала модуля пользователей, так и общей части CMS, которая управляет регистрацией, авторизацией, настройками пользователей и их группами.
Основное назначение файла и его место в системе Cotonti
Файл "users.functions.php" выполняет несколько ключевых функций, которые важны для взаимодействия пользователей с сайтом:
- Управление данными пользователей:
- Добавление новых пользователей.
- Обновление данных пользователей.
- Генерация различных параметров для пользователей, таких как пароли, токены и другие уникальные идентификаторы.
- Работа с группами пользователей:
- Присваивание пользователей в группы.
- Проверка наличия пользователей в определенных группах.
- Обработка регистрации и аутентификации пользователей:
- Регистрация новых пользователей с проверкой данных.
- Генерация ссылок для активации или деактивации аккаунтов.
- Обработка и защита данных:
- Хеширование паролей с использованием алгоритмов хеширования.
- Генерация уникальных значений (например, соли для паролей и токенов).
Файл также имеет встроенную поддержку плагинов, что позволяет расширять функциональность с помощью сторонних разработок.
Взаимодействие с сайтом
Этот файл взаимодействует с сайтом через несколько аспектов:
-
Регистрация пользователей: Когда новый пользователь регистрируется на сайте, данные пользователя (имя, пароль, группы, язык, тема и т.д.) обрабатываются через функции, реализованные в данном файле.
-
Обновление и управление профилем пользователя: Функции, такие как изменение основной группы, скрытие email-адреса, выбор темы и языка, все эти аспекты обрабатываются этим файлом.
-
Работа с базой данных: Все операции с данными пользователей, включая добавление, удаление или изменение данных пользователей, происходят через запросы к базе данных.
-
Группировка пользователей: Управление членством пользователей в группах, таких как администраторами, зарегистрированными пользователями, гостями и т.д.
-
Безопасность и валидация: Файл генерирует и проверяет токены для различных действий, чтобы защитить сайт от несанкционированных действий.
Переменные, методы, функции и классы
-
Переменные:
Cot::$db: Это объект базы данных, который используется для взаимодействия с базой данных (запросы к таблицам пользователей, групп и т.д.).Cot::$cfg: Массив, содержащий конфигурационные параметры сайта. Он используется для получения настроек, таких как язык, тема, хеш-функции и другие важные параметры.Cot::$sys: Массив системных данных, например, текущая дата и время.Cot::$usr: Данные о текущем пользователе, такие как IP-адрес.$ruser: Ассоциативный массив, содержащий данные о пользователе (например, имя, email, группа, дата регистрации).
-
Методы:
Cot::$db->insert(): Метод для вставки данных в базу данных, используется для добавления новых пользователей или обновления информации о них.Cot::$db->query(): Метод для выполнения SQL-запросов.cot_mail(): Метод для отправки электронных писем пользователям, например, для отправки сообщений с подтверждением регистрации.cot_unique(): Функция для генерации уникальных значений, таких как соли или токены.cot_rc(): Метод для рендеринга строки с динамическими данными, использующийся для формирования HTML-кода.cot_stamp2date(): Функция для преобразования метки времени в читаемый формат даты.cot_parse(): Функция для обработки текста, например, для преобразования BB-кода или других меток в HTML.
-
Функции:
cot_build_groupsms(): Функция для построения списка групп, в которых состоит пользователь. Эта функция также позволяет редактировать группы пользователей.cot_selectbox_gender(): Функция для создания выпадающего списка выбора пола пользователя.cot_user_sqlExcludeBanned(): Функция для формирования SQL-условия для исключения заблокированных пользователей из выборки.cot_build_usertext(): Функция для рендеринга текста подписи пользователя, включая обработку изображений.
Задачи, функции и условия
Основные задачи кода в файле "users.functions.php":
- Регистрация и обработка пользователей:
- Создание новых пользователей с необходимыми параметрами.
- Обработка групп пользователей, включая установку основной группы.
- Валидация данных, таких как дата рождения, электронная почта и другие параметры.
- Безопасность:
- Хеширование паролей с использованием выбранной хеш-функции.
- Генерация токенов для активации или деактивации аккаунта.
- Управление группами:
- Формирование списка групп пользователей, с возможностью редактирования и проверки прав доступа.
- Установление основной группы пользователя.
- Обработка данных:
- Преобразование дат и текстов (например, дата рождения, подпись).
- Отправка сообщений по электронной почте с различными уведомлениями (активация, запрос на регистрацию и т.д.).
Использование владельцем сайта
Владельцы сайта могут использовать сценарии из этого файла для:
- Управления пользователями: Включая регистрацию, редактирование профилей, добавление пользователей в различные группы и другие операции.
- Контроля за группами пользователей: Возможность назначения пользователю различных прав, например, доступ к административным функциям или статусу "заблокирован".
- Персонализация контента: Возможность управления темой, языком и подписью пользователя, а также контроль над видимостью данных, таких как email.
- Безопасности и защиты данных: Использование токенов и хеширования паролей для защиты пользовательской информации.
Стиль написания кода и совместимость с версиями PHP
Код написан в объектно-ориентированном стиле с использованием функциональных элементов. Он активно использует глобальные переменные и методы класса Cot, что характерно для фреймворка Cotonti. Использование ассоциативных массивов для работы с данными пользователей является стандартным подходом.
Код совместим с версиями PHP 5.x и выше, и, скорее всего, также будет работать с более новыми версиями PHP (например, 7.x и 8.x), поскольку используется стандартная синтаксис PHP, а также современные методы работы с базой данных и безопасностью (хеширование, работа с токенами).
Однако для полной совместимости с новыми версиями PHP может потребоваться обновление некоторых устаревших методов или синтаксиса.
/**
* User Functions
*
* @package Users
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
// Этот блок документации описывает файл, указывая его назначение, пакет (Users) и информацию о лицензии.
/**
* Проверка безопасности: если константа COT_CODE не определена, остановить выполнение.
*/
defined('COT_CODE') or die('Wrong URL'); // Проверяет, что код вызывается в правильном контексте Cotonti. Если это не так, выполнение скрипта прекращается.
/**
* Подключение необходимых файлов.
*/
require_once cot_incfile('auth'); // Подключает файл для работы с аутентификацией.
require_once cot_langfile('users', 'core'); // Загружает файл языковой локализации для модуля пользователей (основной).
require_once cot_langfile('users', 'module'); // Загружает файл языковой локализации для модуля пользователей (конкретный модуль).
require_once cot_incfile('users', 'module', 'resources'); // Подключает дополнительные ресурсы для модуля пользователей.
/**
* Подключение файла для работы с дополнительными полями (extrafields).
*/
require_once cot_incfile('extrafields'); // Подключает файл, обеспечивающий работу с дополнительными полями в системе Cotonti.
/**
* Регистрация таблицы для работы с дополнительными полями (extrafields) для пользователей.
*/
cot_extrafields_register_table('users'); // Регистрирует таблицу для дополнительного функционала с полями для пользователей.
В данном фрагменте кода происходит подключение нескольких важных файлов и выполнение начальных проверок:
-
Безопасность: Проверяется, что файл был вызван в рамках правильного контекста Cotonti. Это делается с помощью проверки наличия константы
COT_CODE. Если файл вызван напрямую без контекста, выполнение прерывается. -
Подключение необходимых файлов:
- Файл
authотвечает за аутентификацию и авторизацию пользователей. - Локализационные файлы (
usersдля основного ядра и модуля) загружают переводы для работы с пользователями. - Файл
resourcesподключает дополнительные ресурсы модуля пользователей. - Файл
extrafieldsподключает функционал работы с дополнительными полями.
- Файл
-
Регистрация дополнительного поля: С помощью функции
cot_extrafields_register_tableпроисходит регистрация дополнительной таблицы для пользователей, что позволяет работать с кастомными полями в модуле пользователей.
Этот участок кода важен для подготовки окружения, включая подключение всех необходимых файлов и настройку работы с дополнительными полями.
Функция cot_add_user в файле "users.functions.php" предназначена для добавления нового пользователя в систему Cotonti. Вот подробное описание её назначения, взаимодействия с другими частями системы и её работы.
Основное назначение
Функция cot_add_user реализует процесс регистрации нового пользователя в системе. Она принимает данные пользователя, валидирует их, обрабатывает и сохраняет в базу данных. В процессе она выполняет следующие основные действия:
- Проверяет наличие пользователя с таким же именем или email.
- Валидирует email.
- Устанавливает значения по умолчанию для различных полей (например, пол, страна, временная зона).
- Хеширует и солит пароль перед сохранением.
- Записывает данные пользователя в таблицу пользователей и добавляет пользователя в основную группу.
- Отправляет письмо пользователю для активации или уведомления администратора.
Место в системе
Функция cot_add_user является частью модуля управления пользователями в системе Cotonti. Она вызывается в процессе регистрации нового пользователя через веб-интерфейс сайта. Этот файл находится в директории /modules/users/ и играет ключевую роль в процессе создания аккаунтов.
Взаимодействие с другими частями системы
- С таблицами базы данных:
$db_users— используется для вставки данных о пользователе в таблицу пользователей.$db_groups_users— добавляется связь пользователя с его основной группой.cot_shield_update— обновление защитных настроек во время регистрации.cot_extrafield_movefiles— используется для перемещения файлов, связанных с дополнительными полями (если они имеются).
- С глобальными переменными и конфигурацией:
$L— используется для получения текстовых строк локализации (например, для уведомлений по email).Cot::$cfg— доступ к конфигурационным параметрам системы (например, для дефолтной временной зоны, темы, языка и т.д.).Cot::$sys— используется для получения текущего времени системы.Cot::$usr— доступ к текущему IP-адресу пользователя.
- С email-уведомлениями:
- Отправка писем пользователю для подтверждения регистрации и активации аккаунта.
- Уведомления администратору о новом запросе на регистрацию.
Важные элементы и их описание
-
Параметры функции:
$ruser— ассоциативный массив, содержащий данные пользователя (например, email, имя, пол, дата рождения и другие).$email,$name,$password,$maingrp— дополнительные параметры, которые могут переопределить значения в массиве$ruser.$sendemail— флаг, определяющий, нужно ли отправлять email-уведомление пользователю.
-
Основные шаги выполнения:
- Проверка существования пользователя или email в базе данных с использованием запросов к таблице пользователей.
- Валидация email с помощью функции
cot_check_email. - Установка значений по умолчанию для пола, страны, временной зоны.
- Генерация соли и хеширование пароля с использованием функции
cot_hash. - Запись данных пользователя в таблицу пользователей и добавление его в основную группу.
- Отправка email-сообщений пользователю и админу в зависимости от настроек конфигурации.
-
Возвращаемое значение: Функция возвращает ID созданного пользователя, если регистрация прошла успешно, или false, если произошла ошибка.
Как владельцы сайта могут использовать эту функцию
- Регистрация новых пользователей через интерфейс сайта или через API, если функция интегрирована в другие модули.
- Управление процессом активации пользователей: владельцы могут настроить, когда и как пользователи получат активационные письма.
- Настройка email-уведомлений в зависимости от требований для нового пользователя, например, можно настроить уведомления администратора о новых регистрациях.
Стиль написания PHP-кода
Код написан в стиле, соответствующем стандартам PHP, но не строго следуя PSR. Он использует:
- Обычные конструкции для работы с базой данных (например, через объект $db).
- Работа с ассоциативными массивами для представления данных.
- Использование глобальных переменных и конфигурационных настроек для гибкости.
- Применение хеширования и соления паролей, что соответствует современным стандартам безопасности.
Совместимость с версиями PHP
Код использует стандартные функции PHP, такие как:
md5(),microtime(),mb_strlen().- Объектно-ориентированное программирование в ограниченном объеме (например, использование класса \DateTimeZone для обработки временных зон).
Код совместим с версиями PHP 5.3 и выше, так как используется базовая объектно-ориентированная модель и устаревшие функции (например, md5() для хеширования, что менее безопасно по сравнению с более новыми алгоритмами, такими как bcrypt).
Заключение
Функция cot_add_user является неотъемлемой частью системы регистрации пользователей в Cotonti. Она выполняет проверку данных, создает пользователя и отправляет уведомления по email. Этот процесс взаимодействует с базой данных и системой настроек, обеспечивая безопасность и гибкость при регистрации пользователей.
/**
* Добавляет нового пользователя
*
* @param array $ruser Массив данных пользователя
* @param string $email Адрес электронной почты
* @param string $name Имя пользователя; по умолчанию используется $email, если не указано
* @param string $password Пароль; генерируется случайно, если не указано
* @param int $maingrp Основная группа пользователя
* @param float $sendemail Отправить email, если требуется активация
* @return int Новый ID пользователя или false
* @global CotDB $db
*/
function cot_add_user($ruser, $email = null, $name = null, $password = null, $maingrp = null, $sendemail = true) // Определение функции добавления пользователя с параметрами: массив данных пользователя, email, имя, пароль, основная группа, флаг активации email.
{
global $db, $db_users, $db_groups_users, $L; // Использование глобальных переменных для взаимодействия с базой данных и локализацией.
В этом фрагменте кода функция cot_add_user подготовлена для добавления нового пользователя. Параметры функции переведены на русский, чтобы более четко понять их предназначение.
Основное описание кода остается прежним, однако каждый параметр функции теперь снабжен русским описанием, что позволяет понять его назначение в контексте работы функции добавления нового пользователя в систему.
$ruser['user_email'] = (!empty($email)) ? $email : $ruser['user_email']; // Если email задан, использовать его, иначе оставить значение из массива $ruser.
$ruser['user_name'] = (!empty($name)) ? $name : $ruser['user_name']; // Если имя пользователя задано, использовать его, иначе оставить значение из массива $ruser.
$ruser['user_password'] = (!empty($password)) ? $password : $ruser['user_password']; // Если пароль задан, использовать его, иначе оставить значение из массива $ruser.
(empty($ruser['user_password'])) && $ruser['user_password'] = cot_randomstring(); // Если пароль пустой, генерируется случайный пароль с помощью функции cot_randomstring().
(empty($ruser['user_name'])) && $ruser['user_name'] = $ruser['user_email']; // Если имя пользователя пустое, используется email как имя пользователя.
$password = $ruser['user_password']; // Присваивание значения пароля переменной $password для дальнейшего использования.
$user_exists = (bool) $db->query("SELECT user_id FROM $db_users WHERE user_name = ? LIMIT 1", array($ruser['user_name']))->fetch(); // Проверка, существует ли пользователь с таким именем в базе данных.
$email_exists = (bool) $db->query("SELECT user_id FROM $db_users WHERE user_email = ? LIMIT 1", array($ruser['user_email']))->fetch(); // Проверка, существует ли пользователь с таким email в базе данных.
if (!cot_check_email($ruser['user_email']) || $user_exists || (!Cot::$cfg['useremailduplicate'] && $email_exists)) { // Если email некорректный или пользователь с таким именем/email существует, возвращаем false.
return false; // Завершаем выполнение функции, возвращая false, если есть ошибка.
}
$ruser['user_gender'] = (in_array($ruser['user_gender'], array('M', 'F'))) ? $ruser['user_gender'] : 'U'; // Проверка на корректность пола пользователя, если некорректный - устанавливаем значение по умолчанию 'U' (неизвестный).
$ruser['user_country'] = (!empty($ruser['user_country']) && mb_strlen($ruser['user_country']) < 4) ? // Если страна указана и длина строки меньше 4 символов, сохраняем страну, иначе очищаем.
$ruser['user_country'] : '';
$defaultTimeZone = !empty(Cot::$cfg['defaulttimezone']) ? Cot::$cfg['defaulttimezone'] : 'UTC'; // Определение часового пояса по умолчанию, если он не задан в конфигурации, то используется 'UTC'.
if (!empty($ruser['user_timezone'])) { // Если задан часовой пояс пользователя.
try {
$tmp = new \DateTimeZone($ruser['user_timezone']); // Проверка на корректность часового пояса.
} catch (\Exception $e) { // Если часовой пояс некорректный, устанавливаем часовой пояс по умолчанию.
$ruser['user_timezone'] = $defaultTimeZone;
}
} else {
$ruser['user_timezone'] = $defaultTimeZone; // Если часовой пояс не задан, устанавливаем часовой пояс по умолчанию.
}
В этом участке кода происходит несколько важных проверок и установок значений для параметров пользователя. В частности, осуществляется:
- Установка значений для email, имени и пароля, если они не были переданы.
- Генерация случайного пароля, если его нет, и использование email как имени пользователя, если имя не указано.
- Проверка на наличие пользователя с таким же именем или email в базе данных.
- Проверка корректности введенного пола и страны пользователя.
- Установка корректного часового пояса для пользователя, с использованием значения по умолчанию в случае ошибок.
$maingrp = (int) $maingrp; // Преобразование значения $maingrp в целое число для дальнейшей обработки.
if ($maingrp > 0) { // Если значение $maingrp больше 0, устанавливаем его как основной группой пользователя.
$tmp2 = $maingrp; // Присваиваем значение основной группы.
} elseif (Cot::$db->countRows($db_users) == 0) { // Если в базе данных нет пользователей (первоначальная настройка).
$tmp2 = COT_GROUP_SUPERADMINS; // Присваиваем группу суперадминистраторов как основную группу для первого пользователя.
} elseif(Cot::$cfg['users']['regnoactivation']) { // Если в конфигурации задано, что регистрация не требует активации.
$tmp2 = COT_GROUP_MEMBERS; // Присваиваем группу пользователей как основную группу.
} else {
$tmp2 = COT_GROUP_INACTIVE; // Если не выполняются предыдущие условия, присваиваем группу неактивных пользователей.
}
$ruser['user_maingrp'] = $tmp2; // Устанавливаем основную группу пользователя в массив $ruser.
$ruser['user_passsalt'] = cot_unique(16); // Генерация уникальной соли для пароля пользователя с помощью функции cot_unique().
$ruser['user_passfunc'] = empty(Cot::$cfg['hashfunc']) ? 'sha256' : Cot::$cfg['hashfunc']; // Установка функции хеширования для пароля, если не указана в конфигурации, используется sha256.
$ruser['user_password'] = cot_hash($ruser['user_password'], $ruser['user_passsalt'], $ruser['user_passfunc']); // Хеширование пароля пользователя с использованием соли и выбранной функции хеширования.
В данном участке кода выполняются следующие действия:
- Установка основной группы пользователя: В зависимости от значения параметра
$maingrpили других условий, таких как наличие пользователей в базе данных или настройки активации регистрации, выбирается основная группа пользователя. - Генерация соли и хеширование пароля: Для обеспечения безопасности пароля генерируется уникальная соль, а сам пароль хешируется с использованием выбранной функции хеширования (по умолчанию используется
sha256).
if (isset($ruser['user_birthdate'])) { // Проверяем, задано ли поле даты рождения пользователя.
if (is_null($ruser['user_birthdate']) || $ruser['user_birthdate'] > Cot::$sys['now']) { // Если дата рождения пуста или больше текущего времени.
$ruser['user_birthdate'] = 'NULL'; // Устанавливаем значение 'NULL' для даты рождения.
} else {
$ruser['user_birthdate'] = cot_stamp2date($ruser['user_birthdate']); // Преобразуем метку времени в формат даты.
}
}
$ruser['user_lostpass'] = md5(microtime()); // Генерация уникального хеша для восстановления пароля на основе текущего времени.
cot_shield_update(20, "Registration"); // Обновление защиты от ботов, возможно, увеличивая рейтинг защиты на этапе регистрации.
$ruser['user_hideemail'] = 1; // Устанавливаем флаг скрытия email-адреса пользователя.
$ruser['user_theme'] = Cot::$cfg['defaulttheme']; // Устанавливаем тему пользователя по умолчанию из конфигурации.
$ruser['user_scheme'] = Cot::$cfg['defaultscheme']; // Устанавливаем схему (стиль) пользователя по умолчанию.
$ruser['user_lang'] = empty($ruser['user_lang']) ? Cot::$cfg['defaultlang'] : $ruser['user_lang']; // Устанавливаем язык пользователя, если не задан, используется язык по умолчанию.
$ruser['user_regdate'] = (int)Cot::$sys['now']; // Устанавливаем дату регистрации как текущую метку времени.
$ruser['user_logcount'] = 0; // Инициализируем счетчик логинов пользователя (0 — пользователь еще не заходил).
$ruser['user_lastip'] = empty($ruser['user_lastip']) ? Cot::$usr['ip'] : $ruser['user_lastip']; // Устанавливаем последний IP-адрес пользователя, если не задан, используется IP текущего пользователя.
$ruser['user_token'] = cot_unique(16); // Генерация уникального токена для пользователя.
if (!$db->insert($db_users, $ruser)) return false; // Вставка данных пользователя в базу данных, если вставка не удалась, возвращаем false.
$userid = $db->lastInsertId(); // Получаем ID последнего вставленного пользователя.
$db->insert($db_groups_users, array('gru_userid' => (int)$userid, 'gru_groupid' => (int)$ruser['user_maingrp'])); // Добавляем пользователя в основную группу, указанную в его данных.
cot_extrafield_movefiles(); // Выполняем дополнительные действия, связанные с файлами полей пользователя (например, перемещение загруженных файлов).
Комментарий по функционалу:
- Дата рождения: Если дата рождения задана неверно или в будущем, она будет установлена как
NULL. В противном случае дата преобразуется в читаемый формат. - Восстановление пароля: Для восстановления пароля генерируется уникальный хеш, который зависит от текущего времени.
- Конфигурация по умолчанию: Устанавливаются значения по умолчанию для темы, схемы, языка и других настроек пользователя, если они не были заданы при регистрации.
- Информация о пользователе: Присваиваются значения для IP-адреса, счетчика логинов и токена пользователя.
- Запись в базу данных: Данные нового пользователя вставляются в таблицу пользователей. Если вставка не удается, возвращается
false. - Добавление в группу: Пользователь добавляется в основную группу, которая определяется в его данных.
- Перемещение файлов: После создания пользователя выполняются действия с дополнительными полями (например, перемещение загруженных файлов).
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.adduser.done') as $pl) // Цикл по подключенным плагинам для события 'users.adduser.done'.
{
include $pl; // Включение каждого плагина, соответствующего событию.
}
/* ===== */
if ($ruser['user_maingrp'] == 2 && $sendemail) // Если основная группа пользователя равна 2 (предположительно группа, требующая подтверждения администратором) и нужно отправить email.
{
if (Cot::$cfg['users']['regrequireadmin']) // Если требуется одобрение администратора для регистрации.
{
$subject = $L['aut_regrequesttitle']; // Заголовок письма для уведомления пользователя о том, что регистрация ожидает одобрения администратора.
$body = sprintf($L['aut_regrequest'], $ruser['user_name']); // Тело письма для пользователя с уведомлением о том, что регистрация ожидает подтверждения.
$body .= "\n\n".$L['aut_contactadmin']; // Добавление контактов администратора в конце письма.
cot_mail($ruser['user_email'], $subject, $body); // Отправка письма пользователю.
$subject = $L['aut_regreqnoticetitle']; // Заголовок письма для уведомления администратора.
$inactive = Cot::$cfg['mainurl'].'/'.cot_url('users', 'gm=2&s=regdate&w=desc', '', true); // Ссылка на страницу с неподтвержденными пользователями.
$body = sprintf($L['aut_regreqnotice'], $ruser['user_name'], $inactive); // Тело письма для администратора с информацией о новом пользователе.
cot_mail(Cot::$cfg['adminemail'], $subject, $body); // Отправка письма администратору.
}
else // Если администратор не требуется для подтверждения регистрации.
{
$subject = $L['Registration']; // Заголовок письма с активацией регистрации.
$activate = Cot::$cfg['mainurl'].'/'.cot_url('users', 'm=register&a=validate&token='.$ruser['user_token'].'&v='.$ruser['user_lostpass'].'&y=1', '', true); // Ссылка для активации аккаунта.
$deactivate = Cot::$cfg['mainurl'].'/'.cot_url('users', 'm=register&a=validate&token='.$ruser['user_token'].'&v='.$ruser['user_lostpass'].'&y=0', '', true); // Ссылка для деактивации аккаунта.
$body = sprintf($L['aut_emailreg'], $ruser['user_name'], $activate, $deactivate); // Тело письма с инструкциями по активации и деактивации.
$body .= "\n\n".$L['aut_contactadmin']; // Добавление контактов администратора в конце письма.
cot_mail($ruser['user_email'], $subject, $body); // Отправка письма пользователю с инструкциями по активации.
}
}
return $userid; // Возвращаем ID нового пользователя.
Комментарий по функционалу:
- Плагины: Код вызывает подключенные плагины на событие
users.adduser.done, что позволяет расширять функциональность системы регистрации пользователями. - Уведомления по электронной почте:
- Если пользователь добавлен в группу, требующую одобрения администратора (группа с ID 2), и если требуется отправить email:
- Письмо пользователю: Отправляется уведомление о том, что регистрация ожидает подтверждения администратора.
- Письмо админу: Администратор получает уведомление о новой регистрации с ссылкой на страницу для утверждения.
- Если администратор не требуется для подтверждения:
- Письмо пользователю: Отправляется письмо с ссылками на активацию и деактивацию аккаунта.
- Если пользователь добавлен в группу, требующую одобрения администратора (группа с ID 2), и если требуется отправить email:
- Возвращаемый ID: Функция возвращает ID пользователя, который был добавлен в базу данных.
/**
* Формирует список групп пользователя, доступных для редактирования или нет
*
* @param int $userid ID редактируемого пользователя
* @param bool $edit Права на редактирование
* @param int $maingrp Основная группа пользователя
* @return string HTML-код для отображения списка групп
*/
function cot_build_groupsms($userid, $edit = false, $maingrp = 0)
{
global $cot_groups;
// Получение всех групп, в которых состоит пользователь
$memberships = Cot::$db->query(
'SELECT gru_groupid FROM ' . Cot::$db->groups_users . ' WHERE gru_userid = ?',
[$userid]
)->fetchAll();
foreach ($memberships as $row) {
$member[(int) $row['gru_groupid']] = true; // Отметка групп, в которых состоит пользователь
}
$res = Cot::$R['users_code_grplist_begin']; // Начало списка групп
foreach ($cot_groups as $groupId => $i) {
// Если группа пользователя не найдена, то считаем её как не выбранную
if (!isset($member[$groupId])) {
$member[$groupId] = false;
}
// Если редактирование разрешено
if ($edit) {
// Проверка, если группа выбрана
$checked = ($member[$groupId]) ? ' checked="checked"' : '';
// Проверка, если это основная группа
$checked_maingrp = ($maingrp == $groupId) ? ' checked="checked"' : '';
// Если группа заблокирована для редактирования (например, для гостей или забаненных пользователей)
$readonly = (
in_array($groupId, [COT_GROUP_GUESTS, COT_GROUP_INACTIVE], true)
|| ($groupId === COT_GROUP_SUPERADMINS && $userid == 1)
)
? ' disabled="disabled"'
: '';
// Если группа является основной, добавляем блокировку
$readonly_maingrp = (
$groupId === COT_GROUP_GUESTS
|| ($groupId === COT_GROUP_INACTIVE && $userid == 1)
|| ($groupId === COT_GROUP_BANNED && $userid == 1)
)
? ' disabled="disabled"'
: '';
}
// Если группа выбрана или редактирование разрешено
if ($member[$groupId] || $edit) {
// Проверяем, если группа не скрыта или есть права на её просмотр
if (!$cot_groups[$groupId]['hidden'] || cot_auth('users', 'a', 'A')) {
$item = '';
if ($edit) {
// Формирование радио-кнопки для основной группы
$item .= cot_rc(
'users_input_grplist_radio',
[
'value' => $groupId,
'name' => 'rusermaingrp',
'checked' => $checked_maingrp,
'title' => '',
'attrs' => $readonly_maingrp,
]
);
// Формирование чекбокса для других групп
$item .= cot_rc(
'users_input_grplist_checkbox',
[
'value' => '1',
'name' => "rusergroupsms[$groupId]",
'checked' => $checked,
'title' => '',
'attrs' => $readonly,
]
);
}
// Если это группа гостей, выводим её имя без ссылки
$item .= ( $groupId == COT_GROUP_GUESTS)
? $cot_groups[$groupId]['name']
: cot_rc_link(cot_url('users', 'gm=' . $groupId), $cot_groups[$groupId]['name']);
// Если группа скрыта, добавляем пометку (Hidden)
$item .= ( $cot_groups[$groupId]['hidden']) ? ' (' . Cot::$L['Hidden'] . ')' : '';
// Определение CSS-класса для основной группы
$rc = ($maingrp == $groupId) ? 'users_code_grplist_item_main' : 'users_code_grplist_item';
// Добавление элемента группы в итоговый список
$res .= cot_rc($rc, ['item' => $item]);
}
}
}
$res .= Cot::$R['users_code_grplist_end']; // Конец списка групп
return $res; // Возвращаем итоговый HTML-код списка групп
}
Комментарии по коду:
- Основная цель функции: Формирует список групп, в которых состоит пользователь. Этот список может быть как для отображения, так и для редактирования в зависимости от переданных параметров.
- Работа с группами:
- Получаем из базы данные о группах пользователя.
- Для каждой группы проверяется, может ли пользователь быть добавлен в неё (с учетом прав и ограничений).
- Редактирование:
- Если редактирование разрешено (
$edit = true), генерируются элементы формы (чекбоксы и радио-кнопки), чтобы изменить принадлежность пользователя к группам. - Некоторые группы, такие как
COT_GROUP_GUESTSиCOT_GROUP_SUPERADMINS, имеют специальные условия, при которых они становятся недоступными для редактирования.
- Если редактирование разрешено (
- Формирование HTML: Каждый элемент группы генерируется с учетом возможности кликабельности, скрытости и роли группы, что влияет на выводимую информацию.
/**
* Отображает текст подписи пользователя
*
* @param string $text Текст подписи
* @return string
*/
function cot_build_usertext($text)
{
global $cfg;
// Функция cot_parse парсит текст, возможно, добавляя изображения или другие элементы в зависимости от конфигурации
return cot_parse($text, $cfg['users']['usertextimg']);
}
Комментарии по коду:
- Основная цель функции: Эта функция предназначена для обработки и рендеринга текста подписи пользователя. Она позволяет отображать текст с поддержкой форматирования, включая изображения, если это указано в конфигурации.
- Используемая функция:
cot_parse()— это вспомогательная функция для парсинга текста, которая может включать дополнительные возможности, такие как обработка HTML или включение изображений.- Параметр
usertextimgиз конфигурации указывает, разрешено ли отображать изображения в тексте подписи.
- Параметры: Текст подписи передается как строка, и в итоге возвращается обработанный текст, который готов к выводу на страницу
/**
* Генерирует выпадающий список для выбора пола
*
* @param string $check Проверяемый пол
* @param string $name Имя поля ввода
* @return string
*/
function cot_selectbox_gender($check, $name, $custom_rc = '')
{
global $L;
// Список возможных значений для пола: 'U' - неопределенный, 'M' - мужской, 'F' - женский
$genlist = ['U', 'M', 'F'];
$titlelist = [];
// Добавление перевода для каждого значения пола
foreach ($genlist as $i) {
$titlelist[] = $L['Gender_' . $i];
}
// Генерация выпадающего списка с использованием функции cot_selectbox
return cot_selectbox($check, $name, $genlist, $titlelist, false, '', $custom_rc);
}
Комментарии по коду:
- Цель функции: Эта функция генерирует выпадающий список для выбора пола пользователя, используя три возможных значения: неопределенный ('U'), мужской ('M'), и женский ('F').
- Список гендеров: В массиве
$genlistхранятся возможные значения для пола. Массив$titlelistформируется для отображения перевода значений на язык, настроенный в приложении. - Используемая функция:
cot_selectbox()используется для создания выпадающего списка, где:$check— это текущее значение пола, которое будет отмечено в списке.$name— имя поля ввода.$genlistи$titlelist— массивы значений и соответствующих переводов для отображения в выпадающем списке.
- Параметры:
$check: значение, которое будет выбрано по умолчанию.$name: имя поля, используемое в HTML.$custom_rc: необязательный параметр для пользовательских RC-шаблонов.
/**
* Возвращает SQL-условие для исключения заблокированных пользователей
*
* @param string $usersTableAlias Префикс таблицы пользователей (по умолчанию используется таблица пользователей из базы данных)
* @return string SQL-условие
*/
function cot_user_sqlExcludeBanned($usersTableAlias = null)
{
// Если префикс таблицы пользователей не передан, используем значение по умолчанию
if ($usersTableAlias === null) {
$usersTableAlias = Cot::$db->users;
}
// Добавление префикса к таблице пользователей
$usersTablePrefix = '';
if (!empty($usersTableAlias)) {
$usersTablePrefix = Cot::$db->quoteTableName($usersTableAlias) . '.';
}
// Префикс для таблицы групп пользователей
$groupUsersTable = Cot::$db->quoteTableName(Cot::$db->groups_users);
// Формируем SQL-условие для исключения заблокированных пользователей
$condition = '('
. "({$usersTablePrefix}user_maingrp <> " . COT_GROUP_BANNED // Проверка, что основная группа пользователя не заблокирована
. " AND {$usersTablePrefix}user_id NOT IN (SELECT gru_userid FROM {$groupUsersTable} WHERE gru_groupid = " . COT_GROUP_BANNED . '))' // Проверка, что пользователь не состоит в группе заблокированных
. " OR ({$usersTablePrefix}user_banexpire > 0 OR {$usersTablePrefix}user_banexpire < " . Cot::$sys['now'] . ')'
. ')';
/* === Hook === */
// Проверка на наличие подключенных плагинов, которые могут изменять SQL-условие
foreach (cot_getextplugins('users.sqlExcludeBanned') as $pl) {
include $pl;
}
/* ===== */
// Возвращаем сформированное SQL-условие
return $condition;
}
Комментарии по коду:
- Цель функции: Функция генерирует SQL-условие, которое исключает заблокированных пользователей. Это условие можно использовать в запросах для выборки пользователей, которые не заблокированы.
- Обработка аргумента: Если параметр
$usersTableAliasне передан, используется значение по умолчанию для таблицы пользователей. - SQL-условие: Условие состоит из нескольких частей:
- Проверка, что основная группа пользователя не является группой заблокированных.
- Проверка, что пользователь не состоит в группе заблокированных пользователей.
- Проверка, что бан пользователя либо не существует, либо срок бана уже истек.
- Подключение плагинов: Используется хук для расширения функционала, позволяя плагинам изменять или добавлять свои условия в SQL-запрос.
- Возврат: Функция возвращает строку с SQL-условием, которое можно использовать в запросах.
Комментарии (0)
Автор контента
Оффлайн
Sodium Carbonate
Последняя авторизация: 18.07.2026 14:46
- Страница размещена: 31.01.2025 01:20
- Последнее обновление: 31.01.2025 01:36