Плагин Logincheck

Logincheck предназначен для автоматической нормализации и строгой проверки логина пользователя при регистрации в CMS Cotonti. Основная задача — преобразовать произвольный никнейма пользователя в правильный формат.

Опубликовано в: Модули и Плагины для Cotonti

Плагин Logincheck для Cotonti: полное руководство

1. Назначение и концепция

Плагин Logincheck предназначен для автоматической нормализации и строгой проверки логина пользователя при регистрации в системе управления контентом Cotonti (версия 0.9.26 и выше, поддержка PHP 8.4+). Основная задача — преобразовать произвольный ввод пользователя в поле «Имя пользователя» (которое может содержать кириллические символы, пробелы, дефисы, подчёркивания, цифры и даже случайные специальные символы) в единообразный формат, полностью соответствующий внутренним ограничениям Cotonti и дополнительным требованиям безопасности.

Идея для нового плагина была взята и переработана на основе этого расширения.

 Постоянная ссылка на актуальный исходный код плагина на GitHub. 

Cotonti накладывает на поле user_name следующие ограничения:

  • длина не более 32 символов (тип VARCHAR(32) в базе данных);
  • первый символ должен быть латинской буквой (строчной или заглавной);
  • последующие символы могут быть латинскими буквами, цифрами, подчёркиванием или дефисом.

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

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

2. Техническая реализация: хук в системе Cotonti

Плагин подключается к системе через стандартный механизм хуков. В заголовке файла logincheck.users.register.add.validate.php указана директива:

Hooks=users.register.add.validate

Это означает, что код плагина будет выполнен в момент валидации данных, отправленных формой регистрации нового пользователя. Хук срабатывает до того, как Cotonti проверит данные по своим внутренним правилам и попытается создать запись в базе данных. Параметр Order=1 гарантирует, что данный хук выполнится первым среди других плагинов, использующих этот же хук, что важно для последовательной обработки логина.

Внутри хука доступен массив $ruser, содержащий все поля, переданные из формы регистрации. Интересующее нас поле — $ruser['user_name']. Плагин извлекает его значение, проводит все необходимые манипуляции и записывает обратно в тот же массив, после чего управление передаётся следующим хукам и, в конечном счёте, ядру Cotonti.

3. Пошаговый разбор нормализации логина

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

3.1. Получение исходного значения

$username = $ruser['user_name'] ?? '';

Безопасное извлечение значения с помощью оператора объединения с null. Если по какой-то причине ключ отсутствует, переменная будет пустой строкой. Это предотвращает появление ошибок PHP в случае некорректных данных.

3.2. Транслитерация: cot_translit_encode

$username = cot_translit_encode($username);

Ключевой этап — преобразование нелатинских символов (например, кириллицы) в латиницу. Используется штатная функция Cotonti cot_translit_encode(), которая загружает массив соответствий из языкового файла translit.XX.lang.php, где XX — текущий язык системы

/**
 * Transliterates a string if transliteration is available
 *
 * @param string $str Source string
 * @return string
 *
 * @todo use intl php-extension
 */
function cot_translit_encode($str)
{
	global $lang, $cot_translit;
	static $lang_loaded = false;
	if (!$lang_loaded && $lang != 'en' && file_exists(cot_langfile('translit', 'core')))
	{
		require_once cot_langfile('translit', 'core');
		$lang_loaded = true;
	}
	if (is_array($cot_translit))
	{
		// Apply transliteration
		$str = strtr($str, $cot_translit);
	}
	return $str;
}

Механизм работы функции:

  • Проверяется, не является ли текущий язык английским ($lang == 'en').
  • Если язык не английский и файл translit.XX.lang.php существует, он подключается.
  • Файл определяет глобальный массив $cot_translit, где ключами являются исходные символы (в UTF-8), а значениями — их латинские эквиваленты.
  • Функция strtr() заменяет все вхождения ключей на соответствующие значения.

Важно отметить, что порядок элементов в массиве $cot_translit имеет значение: более длинные комбинации (диграфы, триграфы) должны быть расположены раньше, чтобы корректно обрабатываться. Например, в украинской таблице 'Щ' → 'Shch' стоит перед 'Ш' → 'Sh'.

Пример (русский язык): пользователь ввёл Иван Петров. После транслитерации получится Ivan Petrov 

(предполагая, что таблица транслитерации содержит стандартные замены: ).

'И'→'I', 'в'→'v', 'а'→'a', 'н'→'n', ' '→' ', 'П'→'P', 'е'→'e', 'т'→'t', 'р'→'r', 'о'→'o', 'в'→'v'

Пример (украинский язык): ЄвгеніяYevheniia (согласно таблице: ).

'Є'→'Ye', 'в'→'v', 'г'→'h', 'е'→'e', 'н'→'n', 'і'→'i', 'я'→'ia'

Транслитерация — это основа «интернационализации» логина, позволяющая пользователям вводить имена на родном языке, но получать пригодное для URL и системных идентификаторов представление.

3.3. Замена пробельных символов на подчёркивание

$username = preg_replace('/\s+/u', '_', $username);

Регулярное выражение /\s+/u находит любые последовательности пробельных символов (пробел, табуляция, перенос строки и т.п.) и заменяет их на один символ подчёркивания. Модификатор u включает работу с UTF-8. В результате все пробелы схлопываются в одиночные подчёркивания.

Пример: Ivan PetrovIvan_Petrov.

3.4. Удаление всех символов, кроме разрешённых

$username = preg_replace('/[^a-zA-Z0-9_-]/', '-', $username);

Всё, что не является латинской буквой (в любом регистре), цифрой, подчёркиванием или дефисом, заменяется на дефис. Этот шаг гарантирует, что в строке останутся только допустимые символы. Любые «экзотические» знаки, пунктуация, символы других алфавитов (если транслитерация почему-то их пропустила) превратятся в дефисы.

Пример: Ivan_Petrov!Ivan_Petrov-.

3.5. Сжатие множественных дефисов

$username = preg_replace('/-+/', '-', $username);

Любая последовательность из одного и более дефисов заменяется на один дефис. Предотвращает появление логинов типа user----name.

3.6. Сжатие множественных подчёркиваний

$username = preg_replace('/_+/', '_', $username);

Аналогично предыдущему шагу, но для подчёркивания. Устраняет конструкции вида user___name.

3.7. Удаление дефисов и подчёркиваний в начале и конце

$username = trim($username, '-_');

Функция trim() обрезает указанные символы с обоих концов строки. Логин не должен начинаться или заканчиваться разделителями — это правило Cotonti и общепринятая практика.

Пример: _Ivan-Petrov_Ivan-Petrov.

3.8. Проверка на пустую строку

if ($username === '') {
    cot_error($L['logincheck_error_invalidchars'], 'rusername');
    return;
}

Если после всех преобразований от исходной строки ничего не осталось (например, пользователь ввёл только пробелы или спецсимволы), плагин вызывает ошибку через функцию cot_error(). Сообщение берётся из языкового файла плагина. Параметр 'rusername' указывает, что ошибка относится к полю с именем пользователя (в форме регистрации это поле обычно называется rusername). После вызова ошибки выполнение хука прекращается, и Cotonti не допустит регистрацию.

3.9. Ограничение длины до 32 символов

$username = mb_substr($username, 0, 32);

Использование многобайтовой функции mb_substr() гарантирует корректную обрезку строки в кодировке UTF-8 до 32 символов, что соответствует максимальной длине поля user_name в таблице cot_users.

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

3.10. Проверка первого символа и добавление префикса

if (!preg_match('/^[a-zA-Z]/', $username)) {
    $username = 'user_' . $username;
}

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

Пример: 12345user_12345.

3.11. Запись обработанного значения в массив

$ruser['user_name'] = $username;

Нормализованный логин помещается обратно в регистрационные данные. Дальнейшие хуки и сама система Cotonti будут работать уже с исправленным значением.

4. Финальная строгая проверка

if (!empty($ruser['user_name']) && 
    !preg_match("/^[a-zA-Z][_a-zA-Z0-9-]*$/", $ruser['user_name'])) {
    cot_error($L['logincheck_error_invalidchars'], 'rusername');
}

Даже после всех преобразований плагин выполняет контрольное сравнение с регулярным выражением, которое точно описывает допустимый формат:

  • ^[a-zA-Z] — первый символ обязательно латинская буква;
  • [_a-zA-Z0-9-]* — далее любое количество букв, цифр, подчёркиваний или дефисов;
  • $ — конец строки.

Если по какой-то причине строка не соответствует шаблону (например, содержит недопустимый символ, пропущенный на этапе очистки, или имеет длину 0), регистрация будет отклонена.

5. Проверка по чёрному списку запрещённых имён

if (!empty($cfg['plugin']['logincheck']['invalidnames'])) {
    $invalidnames = array_map('trim', explode(',', $cfg['plugin']['logincheck']['invalidnames']));
    if (in_array($ruser['user_name'], $invalidnames, true)) {
        cot_error($L['logincheck_error_invalidname'], 'rusername');
    }
}

Плагин позволяет администратору задать список недопустимых логинов через настройки в панели управления. Конфигурационная опция invalidnames хранит строку с перечислением через запятую. При проверке плагин:

  • разбивает строку в массив с помощью explode();
  • применяет trim() к каждому элементу для удаления возможных пробелов вокруг имён;
  • выполняет строгое сравнение (in_array(..., true)) на предмет совпадения с нормализованным логином.

Если логин совпадает с одним из запрещённых, пользователь увидит ошибку с текстом «Пожалуйста, укажите другой логин».

Администратор может добавить в этот список стандартные зарезервированные имена: admin, system, guest, root, support, moderator и любые другие по своему усмотрению.

6. Конфигурация плагина

Управление плагином осуществляется через стандартный конфигурационный файл logincheck.setup.php и интерфейс администрирования Cotonti. В секции [BEGIN_COT_EXT_CONFIG] определена одна настройка:

invalidnames=01:textarea:::Invalid names

Это означает, что в панели управления плагинами будет доступно текстовое поле (textarea) для ввода запрещённых логинов. Подпись к полю локализуется через языковой файл: $L['cfg_invalidnames'].

Языковые файлы плагина (logincheck.ru.lang.php и аналоги) содержат две строки:

  • $L['logincheck_error_invalidchars'] — сообщение о недопустимых символах;
  • $L['logincheck_error_invalidname'] — сообщение при совпадении с чёрным списком.

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

7. Взаимодействие с транслитерацией Cotonti

Ключевую роль в преобразовании кириллицы играет механизм транслитерации Cotonti. Плагин не содержит собственных таблиц замены, а полностью полагается на системные файлы translit.XX.lang.php. Это обеспечивает единообразие с другими частями системы (например, генерацией алиасов для страниц) и облегчает поддержку: обновление таблиц транслитерации в языковых пакетах автоматически улучшает и работу плагина.

Администратор может модифицировать или дополнять таблицу $cot_translit в соответствующем языковом файле, чтобы адаптировать правила транслитерации под конкретные нужды (например, изменить преобразование «Щ» с «Shch» на «Sch»). Важно соблюдать порядок элементов: более длинные последовательности должны располагаться выше.

Функция cot_translit_encode() статически кэширует загрузку языкового файла (переменная $lang_loaded), поэтому при многократных вызовах внутри одного запроса файл подключается только один раз, что экономит ресурсы.

8. Примеры полного цикла обработки

Ниже приведены примеры того, как плагин преобразует различные входные данные в конечный логин, пригодный для Cotonti.

Пример 1. Кириллица с пробелом

  • Ввод пользователя: Иван Петров
  • После транслитерации: Ivan Petrov
  • Замена пробелов на подчёркивание: Ivan_Petrov
  • Очистка недопустимых символов: Ivan_Petrov (изменений нет)
  • Сжатие повторов, обрезка краёв: без изменений
  • Длина в пределах 32, первый символ — буква → префикс не добавляется
  • Результат: Ivan_Petrov

Пример 2. Имя с дефисом и спецсимволами

  • Ввод: Анна-Мария!!!
  • Транслитерация: Anna-Mariya!!!
  • Пробелов нет, очистка: восклицательные знаки заменяются на дефисы → Anna-Mariya---
  • Сжатие дефисов: Anna-Mariya-
  • Удаление дефиса в конце: Anna-Mariya
  • Результат: Anna-Mariya

Пример 3. Только цифры

  • Ввод: 12345
  • Транслитерация: 12345 (без изменений)
  • Очистка: цифры остаются
  • Первый символ не буква → добавляется user_
  • Результат: user_12345

Пример 4. Имя с несколькими пробелами и смешанными регистрами

  • Ввод: John Doe
  • Транслитерация: John Doe (латиница не меняется)
  • Замена пробелов: все пробельные последовательности заменяются на одиночные подчёркивания → _John_Doe_
  • Очистка: допустимые символы остаются
  • Удаление подчёркиваний по краям: John_Doe
  • Результат: John_Doe

Пример 5. Строка, состоящая только из недопустимых символов

  • Ввод: !!!@@@###
  • Транслитерация без изменений
  • Очистка: все символы заменяются на дефисы → -------
  • Сжатие дефисов: -
  • Обрезка краёв: пустая строка → ошибка «Логин должен состоять из латинского алфавита...»
Введённый логин (исходные данные)Результат после обработки плагиномПримечание и объяснение
Иван ПетровIvan_PetrovТранслитерация кириллицы в латиницу: И→I, в→v, а→a, н→n, П→P, е→e, т→t, р→r, о→o, в→v.
Пробел заменён на подчёркивание (_).
Первый символ — латинская буква, префикс не добавляется.
Анна-Мария!!!Anna-MariyaТранслитерация: А→A, н→n, а→a, М→M, а→a, р→r, и→i, я→ya.
Восклицательные знаки (!!!) заменены на дефисы → Anna-Mariya---.
Последовательность дефисов сжата в один, дефис в конце удалён функцией trim().
12345user_12345Цифры не транслитерируются и остаются без изменений.
Первый символ не латинская буква, поэтому добавляется префикс user_.
Длина не превышает 32 символа.
John DoeJohn_DoeЛатиница остаётся без изменений.
Все пробельные последовательности (включая начальные и конечные) заменяются на одиночное подчёркивание.
Подчёркивания по краям удаляются trim($username, '-_').
!!!@@@###Ошибка: «Логин должен состоять из латинского алфавита, цифр и/или символов _ и -»Все символы не входят в допустимый набор [a-zA-Z0-9_-], поэтому каждый из них заменяется на дефис → -------.
Сжатие дефисов даёт -.
trim() удаляет дефис в начале и конце, остаётся пустая строка.
Пустая строка вызывает ошибку валидации.
Євгенія (украинский)YevheniiaТранслитерация согласно украинской таблице (ДСТУ 8583:2015): Є→Ye, в→v, г→h, е→e, н→n, і→i, я→ia.
Пробелов и недопустимых символов нет, первый символ — латинская буква.
Результат полностью соответствует требованиям Cotonti.
admin (при наличии в чёрном списке)Ошибка: «Пожалуйста, укажите другой логин»Логин admin проходит все этапы нормализации без изменений (латиница, допустимые символы).
Однако он совпадает со значением из настройки invalidnames плагина.
Срабатывает проверка по чёрному списку, регистрация отклоняется.
User_Name-2024User_Name-2024Пример логина, который не претерпевает изменений.
Строка состоит только из латинских букв, цифр, подчёркивания и дефиса.
Первый символ — латинская буква.
Нет пробелов, краевых разделителей или недопустимых символов.
Длина менее 32 символов, в чёрном списке отсутствует.
Плагин пропускает такой логин без модификаций.
user with multiple___spaces---and symbols!@#user_with_multiple_spaces-and-symbolsТранслитерация не требуется (латиница).
Множественные пробелы заменяются на одно подчёркивание → user_with_multiple___spaces---and_symbols!@#.
Символы !@# заменяются на дефисы → user_with_multiple___spaces---and_symbols---.
Последовательности подчёркиваний и дефисов сжимаются: ____, ----.
Крайние дефисы удаляются. Итог: user_with_multiple_spaces-and-symbols.
_Alice_AliceПодчёркивания в начале и конце удаляются функцией trim($username, '-_').
Оставшаяся часть соответствует правилам, изменения не требуются.
ОченьДлинноеИмяКотороеПревышаетТридцатьДваСимволаOchenDlinnoeImyaKotoroePrevy (ровно 32 символа)Транслитерация: О→O, ч→ch, е→e, н→n, ь→ (исчезает) и т.д.
После транслитерации длина превышает 32 символа.
Функция mb_substr($username, 0, 32) обрезает строку до 32 символов.
Первый символ — латинская буква, префикс не добавляется.

Пример 6. Попадание в чёрный список

  • Ввод: admin (если в настройках плагина указано admin)
  • Все этапы нормализации проходят успешно, логин остаётся admin
  • Проверка по чёрному списку находит совпадение → ошибка «Пожалуйста, укажите другой логин»

9. Рекомендации по улучшению и возможные доработки

Несмотря на то, что плагин успешно выполняет свои функции, в текущей версии можно отметить несколько моментов, которые при желании могут быть улучшены:

  • Порядок добавления префикса и обрезки длины: как уже упоминалось, обрезка до 32 символов до добавления префикса может приводить к превышению лимита. Рекомендуется поменять шаги местами: сначала добавить user_, затем выполнить mb_substr().
  • Расширение чёрного списка системными именами: плагин мог бы автоматически добавлять к пользовательскому списку стандартные зарезервированные имена Cotonti (admin, guest, system и т.д.), чтобы избежать их случайного использования.
  • Логирование преобразований: для отладки можно записывать исходное и результирующее значения в лог-файл плагина, что упростит анализ проблем при массовой регистрации.
  • Учёт регистра: в текущей реализации регистр сохраняется. Можно добавить опциональное приведение к нижнему регистру для единообразия (например, $username = mb_strtolower($username);).

Все эти улучшения не являются критическими, и плагин стабильно работает в представленной версии.

10. Заключение

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

Для установки достаточно поместить файлы плагина в соответствующую директорию plugins/logincheck, активировать его в панели управления Cotonti и, при необходимости, заполнить список запрещённых логинов. Дальнейшая работа полностью автоматизирована и не требует вмешательства.

Таким образом, Logincheck — это незаменимый помощник для любого сайта на Cotonti, где важна чистота базы данных и единообразие пользовательских идентификаторов.

Купить Плагин Logincheck по низким ценам. Интернет-магазин предлагает заказать Плагин Logincheck, просмотреть полное описание, детальные характеристики, фото товара и актуальные цены со скидками


Рейтинг на основе отзывов:
Звезд получено: 5
Oтзывов всего: 1
Средняя оценка: 5
11 минут чтения
Владелец: Carbonate Sodium

Отзывы к товарам 1

Спасибо

Большое спасибо

16.04.2026 08:56


Добавить в корзину

Товар без файла для загрузки

 

Категория расширения
Администрирование и управление, Многоязычность и перевод (i18n), Безопасность и аутентификация, SEO и оптимизация, Утилиты и инструменты
Доступность
Бесплатно

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

webitproff

Оффлайн

webitproff

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

Обо мне кратко
Поддержка и разработка веб-проектов на CMF Cotonti: приватные мессенджеры через сайт, открытые и закрытые небольшие социальные сети, торговые площадки и маркетплейсы, портал биржи фриланса и услуг, каталоги товаров оптовых поставщиков, дропшиппинг-платформы, интернет-магазины и многое другое.
Смотреть разработки и скачать
Публичное портфолио моих работ и разработок
Телеграм для сообщений
@webitproff
Телеграм-канал
@s/aBuyFILE
  • 22.08.2026 10:40
  • 22.08.2026 10:40
  • Язык:

Рекомендуемые товары и услуги

Login OTP (2FA) — двухфакторная аутентификация по email

Login OTP (2FA) — двухфакторная аутентификация по email

Плагин для Cotonti создает 5-значный код, отправляемый на email пользователя сразу после успешной
Украинская локализация для Cotonti

Украинская локализация для Cotonti

Данный пакет предназначен для внедрения полноценного украинского интерфейса в стандартной поставке
Установка, интеграция и адаптация плагинов под Cotonti CMF

Установка, интеграция и адаптация плагинов под Cotonti CMF

профессиональные услуги по установке, глубокой интеграции и адаптации плагинов под Cotonti CMF, с

Витрина Market PRO

CMS, Скрипт и Движок - веб сайта онлайн-витрины, интернет магазина инфопродуктов и цифровых товаров. Разные цены в разных валютах на товар. Онлайн-оплата в криптовалюте за товары и услуги.