Модуль "Users", - users.register.php в Cotonti CMF
Файл "users.register.php" в системе Cotonti CMF отвечает за обработку процесса регистрации нового пользователя на сайте
Основное назначение файла "users.register.php" и его место в системе Cotonti CMF
Файл "users.register.php" в системе Cotonti CMF отвечает за обработку процесса регистрации нового пользователя на сайте. Это один из ключевых файлов, связанный с модулями пользователей. В Cotonti, как и в других системах управления контентом (CMS), пользователи могут зарегистрироваться, и этот процесс включает несколько шагов, таких как проверка введенных данных, взаимодействие с базой данных, возможно, отправка уведомлений или активация учетных записей.
Файл "users.register.php" хранится в директории модуля users, в подкаталоге /modules/users/, и взаимодействует с различными компонентами системы:
- С базой данных для обработки информации о пользователях.
- С функциональностью плагинов, что позволяет расширять систему без изменения основного кода.
- С механизмами защиты и безопасности, такими как защита от CSRF атак (функция
cot_shield_protect()), а также проверка и фильтрация данных пользователя.
Взаимодействие с другими частями сайта
Когда пользователь пытается зарегистрироваться на сайте, файл "users.register.php" отвечает за следующие ключевые этапы:
- Получение данных формы: Когда форма регистрации отправляется пользователем, данные передаются в этот файл, который проверяет их корректность.
- Проверка данных и валидация: Например, файл проверяет, соответствует ли введенный логин заданной длине, есть ли уже такой пользователь в базе данных, или если пароли совпадают.
- Обработка ошибок: Если данные некорректны (например, уже существует учетная запись с таким же именем пользователя), файл выводит сообщения об ошибке.
- Регистрация пользователя: В случае успешной валидации данных файл создает нового пользователя в базе данных, а затем активирует его учетную запись.
- Интеграция с плагинами: В коде предусмотрена возможность подключения дополнительных плагинов, которые могут быть использованы для расширения функционала процесса регистрации (например, дополнительные проверки, уведомления и т. д.).
Переменные, методы, функции и классы, используемые в коде
-
Переменные:
$mskin: указывает на файл шаблона для страницы регистрации.$breadCrumbs: массив, содержащий структуру хлебных крошек для отображения на странице регистрации.$t: объект класса XTemplate, который используется для загрузки и обработки шаблона страницы.$ruser: ассоциативный массив, содержащий данные о пользователе, такие как имя, email, страна и т. д.$exfld: массив, представляющий дополнительные поля для пользователя.
-
Методы и функции:
- cot_url(): генерирует URL для различных страниц на сайте. Используется для формирования ссылок.
- cot_inputbox(): генерирует HTML-элемент ввода данных (например, текстовые поля, пароли).
- cot_selectbox_countries(): генерирует выпадающий список для выбора страны.
- cot_selectbox_timezone(): генерирует выпадающий список для выбора часового пояса.
- cot_selectbox_gender(): генерирует выпадающий список для выбора пола.
- cot_selectbox_date(): генерирует выпадающий список для выбора даты (например, для выбора даты рождения).
- cot_build_extrafields(): создает HTML для дополнительных полей, если они определены для пользователей.
- cot_extrafield_title(): получает заголовок для дополнительного поля.
- cot_display_messages(): отображает сообщения об ошибках или успешных действиях.
- cot_getextplugins(): функция для загрузки и исполнения плагинов.
- cot_shield_protect(): защита от CSRF атак, применяется для предотвращения подделки запросов.
-
Классы:
- XTemplate: используется для обработки и вывода шаблонов. В данном случае, создается объект
$t, с помощью которого происходит загрузка и вывод шаблона страницы регистрации.
- XTemplate: используется для обработки и вывода шаблонов. В данном случае, создается объект
Задачи, функции и условия, выполняемые кодом
- Проверка и валидация данных: Код сначала проверяет, что все обязательные данные, такие как имя пользователя и email, корректны и что логин не используется другим пользователем.
- Использование плагинов: Для каждой стадии процесса регистрации предусмотрены хуки для плагинов (
users.register.validate.first,users.register.validate.done,users.register.rejectedи другие). Это позволяет расширять функциональность регистрации, например, добавлять дополнительные проверки или действия после регистрации. - Обработка дополнительных полей: Если для пользователей определены дополнительные поля, файл их обрабатывает и выводит на форму.
- Отображение сообщений об ошибках и успехе: При некорректных данных или успешной регистрации выводятся соответствующие сообщения.
Использование кода владельцем сайта
Владелец сайта может использовать этот сценарий для реализации функционала регистрации новых пользователей. Этот файл дает возможность не только собрать стандартные данные (имя пользователя, email, пароль), но и обработать дополнительные поля, такие как страна, пол, дата рождения и т. д. Также, если на сайте используются плагины, владелец может расширить процесс регистрации дополнительными проверками, действиями после успешной регистрации и прочими возможностями.
Например, если владельцу сайта нужно интегрировать внешний сервис для подтверждения email, это можно сделать через хук users.register.validate.done, добавив необходимую логику в плагин.
Стиль написания PHP-кода и совместимость с версиями PHP
- Стиль кода: Код написан в современном стиле PHP, с использованием ассоциативных массивов, строгой типизации данных, функций и методов для выполнения конкретных задач.
- Совместимость: Код совместим с версиями PHP начиная с 5.4, так как используется синтаксис массивов и функций, который был введен в этих версиях. Однако, с учетом более новых возможностей PHP, рекомендуется использовать версию PHP не ниже 7.1, чтобы обеспечить лучшее использование типов данных, производительности и безопасности.
Заключение
Файл "users.register.php" в системе Cotonti CMF выполняет важную роль в процессе регистрации пользователей, обеспечивая валидацию данных, взаимодействие с плагинами и базой данных, а также поддержку дополнительных полей. Его можно адаптировать и расширять в зависимости от требований владельца сайта, добавляя новые этапы проверки и обработки данных.
/**
* User Registration Script
*
* @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('auth'); // Подключение файла для работы с аутентификацией
$v = cot_import('v','G','ALP'); // Импорт переменной 'v' из GET-запроса, ожидается строка в алфавитном регистре (для безопасности)
$y = cot_import('y','G','INT'); // Импорт переменной 'y' из GET-запроса, ожидается целое число
$token = cot_import('token', 'G', 'ALP'); // Импорт переменной 'token' из GET-запроса, ожидается строка в алфавитном регистре
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('users', 'a'); // Получение прав доступа текущего пользователя для модуля 'users' с использованием функции cot_auth, присваивание результатов в переменные
if (Cot::$cfg['users']['disablereg'] && !Cot::$usr['isadmin']) { // Проверка, отключена ли регистрация пользователей и не является ли текущий пользователь администратором
cot_die_message(117, TRUE); // Если регистрация отключена и пользователь не администратор, выводится сообщение об ошибке и завершение работы
}
/* === Hook === */
foreach (cot_getextplugins('users.register.first') as $pl) { // Запуск плагинов, если они существуют для этого этапа регистрации
include $pl; // Подключение каждого плагина
}
/* ===== */
cot_block(Cot::$usr['id'] == 0 || Cot::$usr['isadmin']); // Проверка, что текущий пользователь не аутентифицирован или является администратором (ограничение доступа)
Объяснение кода:
-
Проверка прав доступа: В самом начале осуществляется проверка на корректность вызова скрипта через систему Cotonti. Если код не был вызван внутри движка, выполнение прекращается.
-
Импорт переменных: После этого происходит импорт переменных из GET-запроса для дальнейшей обработки. Важно, что для каждой переменной указаны типы данных и ограничения (например, строка в алфавитном регистре для
v, целое число дляy). -
Получение прав пользователя: При помощи функции
cot_authопределяются права текущего пользователя в модулеusers, и эти данные присваиваются в переменные, отвечающие за доступ на чтение, запись и права администратора. -
Отключение регистрации: В случае, если в конфигурации указано, что регистрация пользователей отключена и текущий пользователь не является администратором, скрипт завершит выполнение с ошибкой.
-
Подключение плагинов: Если предусмотрены дополнительные плагины для этапа регистрации, они будут подключены для расширения функционала или изменения поведения.
-
Ограничение доступа: В коде также присутствует проверка, чтобы доступ к регистрации был ограничен только для неавторизованных пользователей или администраторов.
Этот файл отвечает за обработку процесса регистрации пользователей на сайте и проверку условий, таких как доступность регистрации и права пользователя.
$ruser = [
'user_name' => '', // Инициализация массива с ключом 'user_name', значение пустое (имя пользователя)
'user_email' => '', // Инициализация массива с ключом 'user_email', значение пустое (email пользователя)
'user_country' => '', // Инициализация массива с ключом 'user_country', значение пустое (страна пользователя)
'user_timezone' => '', // Инициализация массива с ключом 'user_timezone', значение пустое (временная зона пользователя)
'user_gender' => '', // Инициализация массива с ключом 'user_gender', значение пустое (пол пользователя)
];
Этот фрагмент кода представляет собой инициализацию ассоциативного массива $ruser, который будет использоваться для хранения данных о пользователе, таких как имя, email, страна, временная зона и пол. Изначально все значения в массиве пустые, что может означать, что они будут заполнены позднее в процессе регистрации или редактирования профиля пользователя.
Массив $ruser может быть использован для обработки и сохранения информации, введенной пользователем на различных этапах работы с системой, например, при регистрации нового пользователя.
if ($a == 'add') { // Если параметр $a равен 'add', то выполняется регистрация нового пользователя
cot_shield_protect(); // Защита от CSRF атак, проверка токена безопасности
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.add.first') as $pl) { // Загружаются и подключаются плагины, если они существуют для регистрации нового пользователя
include $pl; // Включение плагина
}
/* ===== */
$ruser['user_name'] = cot_import('rusername','P','TXT', 100, TRUE); // Получение значения поля 'rusername' (имя пользователя) из POST-запроса, ограничение длины 100 символов
$ruser['user_email'] = cot_import('ruseremail','P','TXT',64, TRUE); // Получение значения поля 'ruseremail' (email пользователя) из POST-запроса, ограничение длины 64 символа
$rpassword1 = (string) cot_import('rpassword1','P','NOC',32); // Получение значения первого пароля из POST-запроса (максимальная длина 32 символа)
$rpassword2 = (string) cot_import('rpassword2','P','NOC',32); // Получение значения второго пароля из POST-запроса (максимальная длина 32 символа)
$ruser['user_country'] = cot_import('rcountry','P','TXT'); // Получение значения поля 'rcountry' (страна пользователя) из POST-запроса
$ruser['user_timezone'] = cot_import('rusertimezone','P','TXT'); // Получение значения поля 'rusertimezone' (часовой пояс пользователя) из POST-запроса
$ruser['user_timezone'] = (!$ruser['user_timezone']) ? Cot::$cfg['defaulttimezone'] : $ruser['user_timezone']; // Если часовой пояс не был передан, используется значение по умолчанию из конфигурации
$ruser['user_gender'] = cot_import('rusergender','P','TXT'); // Получение значения поля 'rusergender' (пол пользователя) из POST-запроса
$ruser['user_email'] = mb_strtolower($ruser['user_email']); // Приведение email пользователя к нижнему регистру для нормализации
// 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',
'', 'user_'); // Обработка дополнительных полей, их импорт через функцию cot_import_extrafields
}
- Проверка условия на добавление нового пользователя (
$a == 'add'). - Применение защиты от CSRF-атак с помощью метода
cot_shield_protect(). - Выполнение хуков, если они существуют, для модификации поведения регистрации пользователя через плагины.
- Извлечение и обработка данных, отправленных через форму регистрации:
- Имя пользователя (
user_name), - Email (
user_email), - Пароли (
rpassword1иrpassword2), - Страна, часовой пояс и пол пользователя.
- Обработка дополнительных полей (если они определены в конфигурации).
- Имя пользователя (
- Приведение email к нижнему регистру для унификации.
$ruser['user_birthdate'] = cot_import_date('ruserbirthdate', false); // Импортирует дату рождения пользователя из параметра 'ruserbirthdate', используя функцию cot_import_date() для валидации и преобразования.
if (!is_null($ruser['user_birthdate']) && $ruser['user_birthdate'] > Cot::$sys['now']) { // Если дата рождения существует и она в будущем (больше текущего времени).
cot_error('pro_invalidbirthdate', 'ruserbirthdate'); // Генерирует ошибку, если дата рождения неверная (больше текущего времени).
}
$user_exists = (bool)Cot::$db->query("SELECT user_id FROM ".Cot::$db->users." WHERE user_name = ? LIMIT 1", // Выполняет запрос для проверки существования пользователя с указанным именем.
array($ruser['user_name']))->fetch(); // Возвращает результат запроса (пользователь с таким именем существует или нет).
$email_exists = (bool)Cot::$db->query("SELECT user_id FROM ".Cot::$db->users." WHERE user_email = ? LIMIT 1", // Выполняет запрос для проверки существования пользователя с таким email.
array($ruser['user_email']))->fetch(); // Возвращает результат запроса (пользователь с таким email существует или нет).
if (preg_match('/&#\d+;/', $ruser['user_name']) || preg_match('/[<>#\'"\/]/', $ruser['user_name'])) { // Проверяет, содержат ли имя пользователя неподобающие символы (например, HTML-сущности или специальные символы).
cot_error('aut_invalidloginchars', 'rusername'); // Если имя пользователя содержит запрещенные символы, генерируется ошибка.
}
if (mb_strlen($ruser['user_name']) < 2) { // Если длина имени пользователя меньше 2 символов.
cot_error('aut_usernametooshort', 'rusername'); // Генерируется ошибка, что имя пользователя слишком короткое.
}
if (mb_strlen($rpassword1) < 4) { // Если длина пароля меньше 4 символов.
cot_error('aut_passwordtooshort', 'rpassword1'); // Генерируется ошибка, что пароль слишком короткий.
}
if (!cot_check_email($ruser['user_email'])) { // Проверка на валидность email.
cot_error('aut_emailtooshort', 'ruseremail'); // Генерируется ошибка, если email некорректен.
}
if ($user_exists) { // Если пользователь с таким именем уже существует в базе данных.
cot_error('aut_usernamealreadyindb', 'rusername'); // Генерируется ошибка, что имя пользователя уже занято.
}
if ($email_exists && !Cot::$cfg['useremailduplicate']) { // Если email уже зарегистрирован и настройка не позволяет дублировать email.
cot_error('aut_emailalreadyindb', 'ruseremail'); // Генерируется ошибка, что email уже используется.
}
if ($rpassword1 != $rpassword2) { // Если пароли не совпадают.
cot_error('aut_passwordmismatch', 'rpassword2'); // Генерируется ошибка, что пароли не совпадают.
}
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.add.validate') as $pl) { // Запускает плагины для валидации, если они существуют.
include $pl; // Включает каждый плагин для обработки.
}
/* ===== */
В этом участке кода происходит валидация данных, введенных пользователем при регистрации. Он проверяет:
- Корректность введенной даты рождения (не может быть в будущем).
- Уникальность имени пользователя и email в базе данных.
- Валидность имени пользователя (проверка на запрещенные символы и минимальную длину).
- Длину пароля и его совпадение с подтверждением.
- Корректность email.
Если одно из условий не выполняется, генерируется соответствующая ошибка с кодом, который позже используется для отображения сообщения пользователю.
Этот код также интегрируется с плагинами, которые могут добавлять дополнительные проверки перед завершением регистрации.
if (!cot_error_found()) { // Если не было найдено ошибок при валидации данных (с помощью функции cot_error_found()).
$ruser['user_password'] = $rpassword1; // Устанавливает пароль пользователя равным первому введенному паролю.
$userid = cot_add_user($ruser); // Добавляет нового пользователя в базу данных и возвращает его ID.
$authorize = false; // Инициализирует переменную $authorize значением false.
if (Cot::$db->countRows(Cot::$db->users) == 1) { // Если в базе данных всего один пользователь (возможно, это первый пользователь).
$authorize = true; // Разрешает авторизацию, т.е. автоматически авторизует нового пользователя.
} elseif (
(Cot::$cfg['users']['regnoactivation'] || Cot::$cfg['users']['inactive_login']) // Если регистрация не требует активации или пользователь может войти в неактивном статусе.
&& Cot::$cfg['users']['register_auto_login'] // Если настройка позволяет автоматический вход после регистрации.
) {
$authorize = true; // Разрешает автоматическую авторизацию.
}
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.add.done') as $pl) { // Запускает плагины после завершения добавления пользователя, если они есть.
include $pl; // Включает каждый плагин для обработки.
}
/* ===== */
if ($authorize) { // Если пользователь должен быть автоматически авторизован.
cot_user_authorize($userid); // Авторизует пользователя, используя его ID.
}
if (Cot::$cfg['users']['regnoactivation'] || Cot::$db->countRows(Cot::$db->users) == 1) { // Если регистрация не требует активации или это первый пользователь в базе данных.
cot_redirect(cot_url('message', 'msg=106', '', true)); // Перенаправляет на страницу сообщения об успешной регистрации.
} elseif (Cot::$cfg['users']['regrequireadmin']) { // Если требуется администраторская активация для новых пользователей.
cot_redirect(cot_url('message', 'msg=118', '', true)); // Перенаправляет на страницу сообщения о необходимости подтверждения администратором.
} else { // В других случаях.
cot_redirect(cot_url('message', 'msg=105', '', true)); // Перенаправляет на страницу сообщения об успешной регистрации.
}
} else { // Если при регистрации были ошибки.
cot_redirect(cot_url('users', 'm=register', '', true)); // Перенаправляет обратно на страницу регистрации.
}
В этом участке кода происходит обработка результатов регистрации пользователя.
- Обработка пароля и добавление пользователя: Если не было ошибок при валидации, устанавливается пароль и добавляется новый пользователь в базу данных.
- Авторизация нового пользователя: Если это первый пользователь или если настройки позволяют, автоматически авторизуется новый пользователь.
- Запуск плагинов: После добавления пользователя запускаются дополнительные плагины для выполнения дополнительных действий.
- Перенаправление: В зависимости от настроек сайта (активация пользователя, необходимость подтверждения администратором), происходит перенаправление пользователя на различные страницы с соответствующими сообщениями:
- Сообщение о успешной регистрации.
- Сообщение о необходимости подтверждения администратором.
- Сообщение об успешной регистрации, если активация не требуется.
- Если произошла ошибка при регистрации, пользователя перенаправляют обратно на форму регистрации.
} elseif ($a == 'validate' && mb_strlen($v) == 32) { // Если переменная $a равна 'validate' и длина строки $v равна 32 (вероятно, это код для сброса пароля).
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.validate.first') as $pl) { // Запускает плагины перед валидацией, если они есть.
include $pl; // Включает каждый плагин для обработки.
}
/* ===== */
cot_shield_protect(); // Защищает от CSRF-атак, проверяя валидность токена.
$sql = Cot::$db->query("SELECT * FROM ".Cot::$db->users." WHERE user_lostpass='$v' AND (user_maingrp=2 OR user_maingrp='-1') LIMIT 1"); // Выполняет запрос к базе данных для получения пользователя, у которого активна потеря пароля (проверка по токену $v).
В этом участке кода происходит:
- Проверка условий: Если действие (
$a) равно "validate" и длина строки$vравна 32, то начинается процесс валидации. - Запуск плагинов: Прежде чем продолжить валидацию, запускаются дополнительные плагины через
cot_getextplugins(), если таковые имеются. - Защита от CSRF: Функция
cot_shield_protect()проверяет защиту от атак через подмену запросов (CSRF). - Запрос к базе данных: Выполняется SQL-запрос для поиска пользователя, который запросил сброс пароля, и проверяется, что его токен для сброса пароля (
user_lostpass) совпадает с переданным значением$v. Учитываются также пользователи с основными группами2или-1, что может быть связано с неактивными или заблокированными пользователями.
if ($row = $sql->fetch()) // Если в результате SQL-запроса был найден пользователь, продолжаем обработку.
{
if ($row['user_maingrp'] == COT_GROUP_INACTIVE) // Если пользователь находится в группе "неактивные" (COT_GROUP_INACTIVE).
{
if ($y == 1) // Если значение переменной $y равно 1, выполняем активацию пользователя.
{
$sql = Cot::$db->update(Cot::$db->users, array('user_maingrp' => COT_GROUP_MEMBERS), // Обновляем основной статус группы пользователя на "члены".
"user_id='".$row['user_id']."' AND user_lostpass='$v'"); // Где user_id соответствует найденному пользователю, а также проверяется токен сброса пароля.
$sql = Cot::$db->update(Cot::$db->groups_users, array('gru_groupid' => COT_GROUP_MEMBERS), // Обновляем группу пользователя в таблице групп.
"gru_groupid=2 AND gru_userid='".$row['user_id']."'");
$row['user_maingrp'] = COT_GROUP_MEMBERS; // Обновляем значение группы пользователя в текущем объекте.
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.validate.done') as $pl) // Запускаем плагины, если они есть, после успешной валидации.
{
include $pl; // Включаем каждый плагин.
}
/* ===== */
cot_auth_clear($row['user_id']); // Очищаем текущие данные аутентификации пользователя.
if(Cot::$usr['id'] == 0 && Cot::$cfg['users']['register_auto_login']) cot_user_authorize($row); // Если пользователь не авторизован и разрешена автоматическая авторизация, то авторизуем пользователя.
cot_redirect(cot_url('message', 'msg=106', '', true)); // Перенаправляем на страницу с сообщением об успешной активации.
}
elseif ($y == 0) // Если значение переменной $y равно 0, выполняем отклонение пользователя.
{
foreach(Cot::$extrafields[Cot::$db->users] as $exfld) // Если есть дополнительные поля, очищаем прикрепленные к ним файлы.
{
cot_extrafield_unlinkfiles($row['user_'.$exfld['field_name']], $exfld);
}
$sql = Cot::$db->delete(Cot::$db->users, "user_id=".(int)$row['user_id']); // Удаляем пользователя из базы данных.
$sql = Cot::$db->delete(Cot::$db->groups_users, "gru_userid='".$row['user_id']."'"); // Удаляем пользователя из таблицы групп.
/* === Hook for the plugins === */
foreach (cot_getextplugins('users.register.validate.rejected') as $pl) // Запускаем плагины, если они есть, после отклонения регистрации.
{
include $pl; // Включаем каждый плагин.
}
/* ===== */
cot_redirect(cot_url('message', 'msg=109', '', true)); // Перенаправляем на страницу с сообщением об отклонении.
}
}
elseif ($row['user_maingrp'] == -1) // Если пользователь имеет статус "заблокирован".
{
$sql = Cot::$db->update(Cot::$db->users, array('user_maingrp' => $row['user_sid']), // Обновляем группу пользователя на его предыдущую группу, использованную до блокировки.
"user_id='".$row['user_id']."' AND user_lostpass='$v'"); // Где user_id соответствует найденному пользователю, а также проверяется токен сброса пароля.
cot_redirect(cot_url('message', 'msg=106', '', true)); // Перенаправляем на страницу с сообщением об успешной активации.
}
}
else
{
Cot::$env['status'] = '403 Forbidden'; // Если пользователь не найден, устанавливаем статус ошибки 403.
cot_shield_update(7, "Account validation"); // Обновляем защиту от подделки запросов.
cot_log("Wrong validation URL", 'sec', 'user', 'error'); // Логируем ошибку с некорректным URL для валидации.
cot_redirect(cot_url('message', 'msg=157', '', true)); // Перенаправляем на страницу с сообщением об ошибке.
}
Описание действий:
- Проверка наличия пользователя: Если пользователь найден в базе данных, то выполняется дальнейшая обработка.
- Проверка на активность пользователя:
- Если пользователь в группе неактивных (
COT_GROUP_INACTIVE), то проверяется значение переменной$y.- Если
$y == 1, то активируем пользователя, обновляем его группу на "члены" (COT_GROUP_MEMBERS), и запускаем соответствующие плагины. - Если
$y == 0, то отклоняем регистрацию пользователя, удаляем его из базы данных, очищаем дополнительные файлы и запускаем плагины для отклонения.
- Если
- Если пользователь в группе неактивных (
- Проверка на заблокированного пользователя: Если пользователь заблокирован (группа
-1), восстанавливаем его предыдущую группу. - Обработка ошибки: Если пользователь не найден, выводим ошибку с кодом 403 и сообщением о неверной ссылке для валидации.
Код организует проверку и обработку пользователей, которые либо активируются, либо отклоняются, с выполнением соответствующих действий и плагинов для каждого из случаев.
$mskin = cot_tplfile('users.register', 'module'); // Загружаем файл шаблона для регистрации пользователя.
$breadCrumbs = [
[cot_url('users', ['m' => 'register']), Cot::$L['aut_registertitle']], // Устанавливаем хлебные крошки для страницы регистрации.
];
/* === Hook === */
foreach (cot_getextplugins('users.register.main') as $pl) { // Загружаем и выполняем все плагины, связанные с главной страницей регистрации.
include $pl; // Включаем каждый плагин, если они есть.
}
/* ===== */
Cot::$out['subtitle'] = Cot::$L['aut_registertitle']; // Устанавливаем подзаголовок страницы, который будет отображаться в теге <title>.
if (!isset($out['head'])) { // Если переменная для данных в теге <head> еще не установлена.
Cot::$out['head'] = ''; // Инициализируем переменную с пустым значением.
}
Cot::$out['head'] .= Cot::$R['code_noindex']; // Добавляем мета-тег noindex в <head>, чтобы страницы регистрации не индексировались поисковыми системами.
require_once Cot::$cfg['system_dir'] . '/header.php'; // Подключаем файл header.php для вывода начальных частей HTML-документа.
$t = new XTemplate($mskin); // Создаем новый объект XTemplate для работы с шаблоном.
require_once cot_incfile('forms'); // Подключаем файл для обработки форм, возможно, для валидации или обработки ввода.
Описание действий:
- Загрузка шаблона: Устанавливаем файл шаблона для страницы регистрации пользователя.
- Хлебные крошки: Формируем массив с хлебными крошками, указывая URL для страницы регистрации и заголовок.
- Плагины: Загружаем плагины, если они указаны для страницы регистрации, позволяя добавить дополнительную логику или изменения.
- Установка подзаголовка: Устанавливаем подзаголовок страницы с использованием локализованного значения.
- Обработка тега
<head>: Если переменная для тега<head>еще не была установлена, создаем ее. Затем добавляем мета-тегnoindex, чтобы не индексировать страницу регистрации в поисковиках. - Подключение header.php: Подключаем файл
header.phpдля вывода начала страницы. - Работа с шаблоном: Создаем объект XTemplate для работы с файлом шаблона.
- Подключение обработки форм: Подключаем файл, связанный с обработкой форм, что может включать в себя валидацию или другие действия.
Этот код подготавливает все необходимые переменные и подключает ресурсы для отображения страницы регистрации на сайте.
$t->assign([ // Присваиваем значения переменным, которые будут использованы в шаблоне.
'USERS_REGISTER_TITLE' => Cot::$L['aut_registertitle'], // Заголовок страницы регистрации.
'USERS_REGISTER_SUBTITLE' => Cot::$L['aut_registersubtitle'], // Подзаголовок страницы регистрации.
'USERS_REGISTER_BREADCRUMBS' => cot_breadcrumbs($breadCrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки.
//'USERS_REGISTER_ADMINEMAIL' => $cot_adminemail, // Обратный адрес электронной почты администратора. (Закомментировано, скорее всего устаревшее.)
'USERS_REGISTER_SEND' => cot_url('users', 'm=register&a=add'), // URL для отправки формы регистрации.
'USERS_REGISTER_USER' => cot_inputbox('text', 'rusername', $ruser['user_name'], array('size' => 24, 'maxlength' => 100)), // Поле для имени пользователя.
'USERS_REGISTER_EMAIL' => cot_inputbox('text', 'ruseremail', $ruser['user_email'], array('size' => 24, 'maxlength' => 64)), // Поле для email.
'USERS_REGISTER_PASSWORD' => cot_inputbox('password', 'rpassword1', '', array('size' => 12, 'maxlength' => 32)), // Поле для пароля.
'USERS_REGISTER_PASSWORDREPEAT' => cot_inputbox('password', 'rpassword2', '', array('size' => 12, 'maxlength' => 32)), // Повтор пароля.
'USERS_REGISTER_COUNTRY' => cot_selectbox_countries($ruser['user_country'], 'rcountry'), // Поле для выбора страны.
'USERS_REGISTER_TIMEZONE' => cot_selectbox_timezone($ruser['user_timezone'], 'rusertimezone'), // Поле для выбора часового пояса.
'USERS_REGISTER_GENDER' => cot_selectbox_gender($ruser['user_gender'],'rusergender'), // Поле для выбора пола.
'USERS_REGISTER_BIRTHDATE' => cot_selectbox_date(0, 'short', 'ruserbirthdate', cot_date('Y', $sys['now']), cot_date('Y', $sys['now']) - 100, false), // Поле для выбора даты рождения.
]);
// Extra fields (Дополнительные поля)
if (!empty(Cot::$extrafields[Cot::$db->users])) { // Если есть дополнительные поля для пользователей.
foreach (Cot::$extrafields[Cot::$db->users] as $exfld) { // Проходим по каждому дополнительному полю.
$uname = strtoupper($exfld['field_name']); // Преобразуем название поля в верхний регистр.
$val = isset($ruser['user_'.$exfld['field_name']]) ? $ruser['user_'.$exfld['field_name']] : null; // Получаем значение для поля.
$exfld_val = cot_build_extrafields('ruser'.$exfld['field_name'], $exfld, $val); // Строим HTML для поля.
$exfld_title = cot_extrafield_title($exfld, 'user_'); // Получаем заголовок для поля.
$t->assign(array(
'USERS_REGISTER_' . $uname => $exfld_val, // Присваиваем значение для шаблона.
'USERS_REGISTER_' . $uname . '_TITLE' => $exfld_title, // Присваиваем заголовок для шаблона.
'USERS_REGISTER_EXTRAFLD' => $exfld_val, // Присваиваем дополнительное поле.
'USERS_REGISTER_EXTRAFLD_TITLE' => $exfld_title // Присваиваем заголовок дополнительного поля.
));
$t->parse('MAIN.EXTRAFLD'); // Разбираем шаблон для дополнительного поля.
}
}
/* === Hook === */
foreach (cot_getextplugins('users.register.tags') as $pl) { // Загружаем и выполняем все плагины для тегов регистрации.
include $pl; // Включаем каждый плагин.
}
/* ===== */
// Error and message handling (Обработка ошибок и сообщений)
cot_display_messages($t); // Отображаем все ошибки или сообщения.
$t->parse('MAIN'); // Разбираем основной шаблон.
$t->out('MAIN'); // Выводим разобранный шаблон.
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключаем footer.php для завершения страницы.
Описание действий:
-
Присваивание значений шаблону:
- Присваиваем значения переменным для шаблона (название страницы, подзаголовок, хлебные крошки и другие данные формы регистрации).
- Для каждого элемента формы создаем нужные HTML-поля с помощью различных функций (например,
cot_inputbox,cot_selectbox_countries,cot_selectbox_timezoneи т. д.).
-
Обработка дополнительных полей:
- Если есть дополнительные поля для пользователей, они динамически добавляются в шаблон. Это делается с использованием функции
cot_build_extrafieldsдля создания HTML-кода иcot_extrafield_titleдля получения заголовка поля.
- Если есть дополнительные поля для пользователей, они динамически добавляются в шаблон. Это делается с использованием функции
-
Плагины для тегов регистрации:
- Загружаются и выполняются все плагины, которые могут быть зарегистрированы для страницы регистрации с использованием
cot_getextplugins('users.register.tags').
- Загружаются и выполняются все плагины, которые могут быть зарегистрированы для страницы регистрации с использованием
-
Обработка ошибок и сообщений:
- Функция
cot_display_messagesотображает все ошибки или сообщения, если они были установлены.
- Функция
-
Завершающие шаги:
- Разбираем шаблон с помощью
$t->parse('MAIN')и выводим его на экран с помощью$t->out('MAIN'). - Подключаем файл
footer.php, чтобы завершить HTML-страницу.
- Разбираем шаблон с помощью
Этот код выполняет создание формы регистрации с возможностью ввода различных данных (имя, email, пароль и т. д.), а также учитывает дополнительные поля, если они есть, и подключает плагины для расширенной функциональности.
Comments (0)
Content author
Offline
Sodium Carbonate
Last logged: 2026-07-20 04:22
- Page published: 2025-01-31 01:56
- Last update: 2025-01-31 02:04