v.1.0.1 Extrafields Users Custom
Extrafields Users Custom — плагин дополнительных полей для модуля Users
Общая информация о плагине
- Код: xtradbrowusers
- Назначение: добавляет дополнительные поля для модуля Users версии 1.4.14+ в собственную таблицу базы данных
- Версия: 1.0.0
- Дата: 16 июля 2026
- Автор: webitproff
- Копирайт: © 2026 webitproff
- Зависимости: Модуль Users (входит в состав Cotonti CMF)
- Совместимость: Cotonti v1.0+, PHP 8.4+, MySQL 8.4+, Bootstrap 5.3+
Что это за плагин и зачем он нужен?
Extrafields Users Custom — это специализированное расширение для Cotonti CMF, которое позволяет добавлять неограниченное количество произвольных полей (extrafields) к профилям пользователей, не изменяя при этом структуру стандартной таблицы cot_users. Все дополнительные данные сохраняются в отдельной, изолированной таблице cot_xtradbrowusers, связанной с основной записью пользователя через внешний ключ с каскадным удалением (ON DELETE CASCADE).
Такой подход особенно актуален для сайтов, где профиль пользователя — это не просто учётная запись, а лицо в сообществе, витрина мастера или карточка клиента. Будь то форум по интересам, интернет-магазин, фриланс-биржа или корпоративный портал — плагин позволяет легко адаптировать профиль под любой сценарий, не вмешиваясь в ядро системы.
Ключевые преимущества изолированного хранения:
- Чистота ядра системы: стандартная таблица пользователей остаётся нетронутой, что исключает конфликты при обновлениях Cotonti и упрощает обслуживание.
- Полная изоляция данных: любые изменения структуры дополнительных полей не затрагивают основные данные пользователя.
- Автоматическая целостность: при удалении пользователя все связанные дополнительные данные удаляются автоматически (благодаря внешнему ключу), а также очищаются загруженные файлы.
- Простота отката: при деинсталляции плагина все его данные полностью удаляются одним SQL‑запросом и очисткой папок.
Что идёт «из коробки»?
Сразу после установки плагина администратор получает 15 заранее настроенных демонстрационных полей всех основных типов, поддерживаемых API Extrafields в Cotonti. Среди них:
- Текстовые поля (input, textarea)
- Целые числа и числа с плавающей точкой (inputint, double)
- Выпадающие списки (select)
- Радиокнопки (radio)
- Дата и время (datetime)
- Флаг страны (country)
- Диапазон чисел (range)
- Чекбоксы с множественным выбором (checklistbox)
- Загрузка файлов (file)
Это позволяет не только сразу увидеть плагин в действии, но и быстро оценить, какой тип поля лучше подходит для конкретной задачи — без долгого изучения документации.
Кому и почему будет полезен этот плагин?
Плагин решает задачу расширения профиля пользователя там, где стандартного набора полей недостаточно. В зависимости от типа проекта вы получаете возможность вывести на первый план именно те данные, которые важны вашей аудитории:
Для сообществ и форумов:
- Показать статус, достижения, репутацию, ссылки на соцсети.
- Добавить поля с интересами или специализацией, чтобы участники находили единомышленников.
- Дать возможность кратко рассказать о себе, загрузить аватар в отдельное поле.
Для интернет-магазинов:
- Хранить дополнительный телефон, предпочтительный способ связи, адрес доставки (если не используется отдельная адресная книга).
- Вести учёт клиентов по категориям (оптовый/розничный, уровень лояльности).
- Прикреплять к профилю документы: договоры, реквизиты.
Для фриланс-бирж и площадок услуг:
- Публиковать портфолио, список навыков, сертификаты.
- Указывать профессиональный опыт, ставку, график работы.
- Загружать резюме прямо в профиль.
- Выводить рейтинг исполнителя, верификацию, уровень квалификации — всё это можно оформить в виде отдельных полей и гибко кастомизировать вывод.
Разработчикам и администраторам плагин даёт полную свободу: все поля управляются через стандартный интерфейс (Администрирование → Расширения → Экстраполя), а их значения автоматически доступны в шаблонах регистрации, редактирования профиля (пользователем и администратором), публичной карточки и общего списка пользователей. Также поддерживается вывод в мета‑теги страницы (header.tpl) через специальный хук, что открывает дополнительные возможности для SEO.
Благодаря полной интеграции с системой тегов Cotonti каждое поле можно выводить как в универсальном цикле, так и индивидуально, с собственной вёрсткой и логикой отображения. Это делает плагин одинаково удобным как для быстрого добавления пары полей, так и для глубокой кастомизации профилей на крупных проектах.
Часть №2 README: описание файлов плагина с группировкой по назначению
Структура и назначение файлов плагина
Плагин Extrafields Users Custom взаимодействует с Cotonti через систему хуков. Каждый файл, предназначенный для выполнения на определённом хуке, содержит обязательный заголовок, который регистрирует его в таблице cot_plugins и определяет, когда именно код должен быть выполнен. Например, файл, подключающийся к хуку admin.extrafields.first, начинается так:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=admin.extrafields.first
[END_COT_EXT]
==================== */После установки плагина эта запись попадает в таблицу cot_plugins, и при каждом вызове cot_getextplugins('admin.extrafields.first') Cotonti автоматически подключает и выполняет наш файл.
Группировка файлов
Основные файлы плагина
1. Файлы регистрации и инициализации плагина
Файл xtradbrowusers.setup.php
Это файл метаданных плагина, который не является обработчиком какого‑либо хука. Он содержит единственный блок [BEGIN_COT_EXT]...[END_COT_EXT], в котором через пары Ключ=Значение объявлены основные сведения о расширении:
Code– уникальный идентификатор плагина (xtradbrowusers);Name– человекочитаемое название (Custom Extrafields Users);Description,Version,Date,Author,Copyright,Notes– справочная информация;Requires_modules– список обязательных модулей (в нашем случаеusers);Auth_guests,Lock_guests,Auth_members,Lock_members– права доступа для гостей и участников, которые будут записаны в таблицуcot_authпри установке.
Этот файл не содержит PHP‑кода, исполняемого при каждом запросе. Он обрабатывается единожды функцией cot_extension_install() во время установки плагина. При этом система Cotonti автоматически:
- создаёт запись в таблице
cot_coreсct_code='xtradbrowusers',ct_plug=1(признак плагина), текущей версией; - на основе значений
Auth_guests,Lock_guests,Auth_members,Lock_membersформирует строки в таблицеcot_authдля каждой группы пользователей (гости, неактивные, участники, суперадминистраторы и т.д.); - сканирует все файлы плагина, находит в них заголовки вида
Hooks=..., и для каждого создаёт отдельную запись в таблицеcot_pluginsс указанием хука, части, порядка выполнения и пути к файлу.
Сам setup.php не вызывает Cot::$db->registerTable('xtradbrowusers') и не подключает языковые файлы — эта инициализация выполняется позже, в рабочих файлах плагина.
Файл не добавляет записей в cot_config, так как плагин пока не имеет собственных настроек, однако при необходимости разработчик может расширить setup.php блоком COT_EXT_CONFIG, и система автоматически создаст нужные опции в таблице cot_config (структура cot_config полностью позволяет хранить любые параметры модулей и плагинов).
Файл xtradbrowusers.global.php
Этот файл уже содержит активный хук global. Благодаря записи в cot_plugins он подключается при каждом запросе к сайту (до формирования основного вывода). Его задача — гарантировать, что во всех точках выполнения Cotonti доступны:
- языковые константы плагина (через
cot_langfile('xtradbrowusers', 'plug')); - API‑функции плагина, определённые в
inc/xtradbrowusers.functions.php.
Именно внутри xtradbrowusers.functions.php (подключаемого отсюда) находится вызов Cot::$db->registerTable('xtradbrowusers'), регистрирующий глобальную переменную $db_xtradbrowusers и делающий доступным обращение Cot::$db->xtradbrowusers во всём коде плагина и за его пределами.
Таким образом, global.php обеспечивает «фоновую» инициализацию, не требующую повторения в каждом хуке, а setup.php выполняет разовую регистрацию плагина в системных таблицах при установке.
2. Файлы установки и удаления (setup/)
-
setup/xtradbrowusers.install.sql
Создаёт таблицуcot_xtradbrowusersс внешним ключом, каскадно удаляющим данные при удалении пользователя. -
setup/xtradbrowusers.install.php
Добавляет 15 демонстрационных полей (всех типов, поддерживаемых Cotonti Extrafields) и создаёт папку для загружаемых файлов. -
setup/xtradbrowusers.uninstall.sql
Удаляет таблицуcot_xtradbrowusersпри деинсталляции. -
setup/xtradbrowusers.uninstall.php
Удаляет все определения экстраполей изcot_extra_fields, удаляет таблицу и папку с загруженными файлами, обеспечивая полную очистку системы.
3. Интеграция с интерфейсом управления экстраполями
xtradbrowusers.extrafields.php
Хук:admin.extrafields.first. Регистрирует таблицуcot_xtradbrowusersв списке доступных для управления экстраполями. Благодаря этому файлу администратор может добавлять, редактировать и удалять поля через стандартный раздел «Администрирование → Расширения → Экстраполя». В массиве$extra_whitelistзадаются подсказки по доступным тегам для каждого шаблона.
4. Редактирование профиля самим пользователем
-
xtradbrowusers.users.profile.tags.php
Хук:users.profile.tags. Назначает теги{USERS_PROFILE_XTRA_ИМЯПОЛЯ}и{USERS_PROFILE_XTRA_ИМЯПОЛЯ_TITLE}в шаблоне редактирования профиля (users.profile.tpl). Позволяет как выводить поля в цикле (<!-- BEGIN: XTRA_EXTRAFLD -->), так и по отдельности. -
xtradbrowusers.users.profile.update.done.php
Хук:users.profile.update.done. После сохранения профиля пользователем перехватывает значения полей из POST, валидирует их через API и сохраняет в таблицуcot_xtradbrowusers, включая загрузку файлов.
5. Редактирование пользователя администратором
-
xtradbrowusers.users.edit.tags.php
Хук:users.edit.tags. Назначает теги{USERS_EDIT_XTRA_ИМЯПОЛЯ}и{USERS_EDIT_XTRA_ИМЯПОЛЯ_TITLE}в админской форме редактирования (users.edit.tpl). -
xtradbrowusers.users.edit.update.done.php
Хук:users.edit.update.done. Сохраняет данные после редактирования пользователя администратором. Аналогиченusers.profile.update.done, но обрабатывает случай$idиз запроса.
6. Публичный профиль пользователя
xtradbrowusers.users.details.tags.php
Хук:users.details.tags. Выводит все поля на публичной странице профиля (users.details.tpl). Теги имеют префикс{USERS_DETAILS_XTRA_...}. Поддерживается как цикл, так и индивидуальные теги. Для полей типаcountryдополнительно присваивается тег с названием страны (_NAME).
7. Список пользователей
-
xtradbrowusers.users.loop.php
Хук:users.loop. Внутри цикла вывода пользователей (например, вusers.tpl) назначает теги{USERS_ROW_XTRA_...}. Работает для каждой строки списка. -
xtradbrowusers.usertags.php
Хук:usertags.main. Интегрируется в функциюcot_generate_usertags(). Добавляет в массив$temp_arrayтеги с префиксомXTRA_, которые затем могут использоваться в любом контексте, где вызывается эта функция (форумы, списки, карточки и т.д.). Благодаря этому поля плагина доступны везде, где используются пользовательские теги, с единым синтаксисом.
8. Регистрация новых пользователей
-
xtradbrowusers.users.register.tags.php
Хук:users.register.tags. Назначает теги{USERS_REGISTER_XTRA_...}в форме регистрации (users.register.tpl). -
xtradbrowusers.users.register.add.done.php
Хук:users.register.add.done. Сохраняет значения дополнительных полей после успешной регистрации.
9. Удаление пользователя
xtradbrowusers.users.delete.done.php
Хук:users.delete.done. При удалении пользователя администратором или через валидацию регистрации сначала удаляет загруженные файлы (вызываяcot_extrafield_unlinkfiles), затем удаляет соответствующую запись изcot_xtradbrowusers. Гарантирует отсутствие мусора.
10. Дополнительные интеграции
xtradbrowusers.header.tags.php
Хук:header.tags. При просмотре профиля пользователя (когда определена переменная$urr) добавляет теги{USERS_HEADER_XTRA_...}, позволяя вывести, например, название страны или уровень квалификации в<title>или мета-тегах страницы.
API-функции плагина
inc/xtradbrowusers.functions.php
Содержит три ключевые функции, используемые всеми файлами плагина:xtradbrowusers_getExtrafields()— возвращает массив зарегистрированных экстраполей для таблицыcot_xtradbrowusers.xtradbrowusers_load($user_id)— загружает данные дополнительных полей конкретного пользователя.xtradbrowusers_save($user_id, $data)— сохраняет или обновляет запись в таблице, автоматически определяя, существует ли она.
Этот файл также регистрирует таблицу xtradbrowusers в системе и подключает языковые файлы.
Таким образом, каждая группа файлов отвечает за определённый этап жизненного цикла пользователя, обеспечивая сквозную работу с дополнительными полями без вмешательства в ядро.
Полная карта файлов плагина xtradbrowusers с указанием назначения и используемых хуков
/xtradbrowusers/
├── inc/
│ └── xtradbrowusers.functions.php # API: загрузка/сохранение, регистрация таблицы
├── lang/
│ ├── xtradbrowusers.ru.lang.php # Русская локализация
│ ├── xtradbrowusers.en.lang.php # Английская локализация
├── setup/
│ ├── xtradbrowusers.install.sql # SQL: создание таблицы cot_xtradbrowusers
│ ├── xtradbrowusers.install.php # PHP: демо-поля при установке
│ ├── xtradbrowusers.uninstall.php # PHP: удаление extra_fields + таблицы
│ └── xtradbrowusers.uninstall.sql # SQL: DROP TABLE
├── xtradbrowusers.global.php # Глобальная инициализация (подключение языков, функций)
├── xtradbrowusers.setup.php # Регистрация плагина в БД Cotonti
├── xtradbrowusers.extrafields.php # admin.extrafields.first – регистрация таблицы для управления экстраполями
├── xtradbrowusers.header.tags.php # Хук header.tags. Присваивает теги {USERS_HEADER_XTRA_XXXXX} и {USERS_HEADER_XTRA_XXXXX_TITLE}
├── xtradbrowusers.users.profile.tags.php # users.profile.tags – теги в форме редактирования профиля (пользователь)
├── xtradbrowusers.users.profile.update.done.php # users.profile.update.done – сохранение при редактировании профиля
├── xtradbrowusers.users.edit.tags.php # users.edit.tags – теги в форме админ. редактирования пользователя
├── xtradbrowusers.users.edit.update.done.php # users.edit.update.done – сохранение при админ. редактировании
├── xtradbrowusers.users.details.tags.php # users.details.tags – теги в публичном профиле
├── xtradbrowusers.users.loop.php # users.loop – теги в списке пользователей (USERS_ROW_...)
├── xtradbrowusers.usertags.php # usertags.main – интеграция в cot_generate_usertags() (теги без префикса)
├── xtradbrowusers.users.delete.done.php # users.delete.done – удаление записи при удалении пользователя
├── xtradbrowusers.users.register.tags.php # users.register.tags – теги в форме регистрации
└── xtradbrowusers.users.register.add.done.php # users.register.add.done – сохранение после регистрации
Часть №2: Файлы плагина и их роль
Плагин состоит из нескольких групп файлов, каждый из которых отвечает за свою часть работы с дополнительными полями пользователей. Ниже по группам описано назначение и механизм работы каждого файла.
1. Файлы регистрации и инициализации плагина
Файл xtradbrowusers.setup.php
Это файл метаданных плагина, который не является обработчиком какого‑либо хука. Он содержит единственный блок [BEGIN_COT_EXT]...[END_COT_EXT], в котором через пары Ключ=Значение объявлены основные сведения о расширении:
Code– уникальный идентификатор плагина (xtradbrowusers);Name– человекочитаемое название (Custom Extrafields Users);Description,Version,Date,Author,Copyright,Notes– справочная информация;Requires_modules– список обязательных модулей (в нашем случаеusers);Auth_guests,Lock_guests,Auth_members,Lock_members– права доступа для гостей и участников, которые будут записаны в таблицуcot_authпри установке.
Этот файл не содержит PHP‑кода, исполняемого при каждом запросе. Он обрабатывается единожды функцией cot_extension_install() во время установки плагина. При этом система Cotonti автоматически:
- создаёт запись в таблице
cot_coreсct_code='xtradbrowusers',ct_plug=1(признак плагина), текущей версией; - на основе значений
Auth_guests,Lock_guests,Auth_members,Lock_membersформирует строки в таблицеcot_authдля каждой группы пользователей (гости, неактивные, участники, суперадминистраторы и т.д.); - сканирует все файлы плагина, находит в них заголовки вида
Hooks=..., и для каждого создаёт отдельную запись в таблицеcot_pluginsс указанием хука, части, порядка выполнения и пути к файлу.
Сам setup.php не вызывает Cot::$db->registerTable('xtradbrowusers') и не подключает языковые файлы — эта инициализация выполняется позже, в рабочих файлах плагина.
Файл не добавляет записей в cot_config, так как плагин пока не имеет собственных настроек, однако при необходимости разработчик может расширить setup.php блоком COT_EXT_CONFIG, и система автоматически создаст нужные опции в таблице cot_config (структура cot_config полностью позволяет хранить любые параметры модулей и плагинов).
Файл xtradbrowusers.global.php
Этот файл уже содержит активный хук global. Благодаря записи в cot_plugins он подключается при каждом запросе к сайту (до формирования основного вывода). Его задача — гарантировать, что во всех точках выполнения Cotonti доступны:
- языковые константы плагина (через
cot_langfile('xtradbrowusers', 'plug')); - API‑функции плагина, определённые в
inc/xtradbrowusers.functions.php.
Именно внутри xtradbrowusers.functions.php (подключаемого отсюда) находится вызов Cot::$db->registerTable('xtradbrowusers'), регистрирующий глобальную переменную $db_xtradbrowusers и делающий доступным обращение Cot::$db->xtradbrowusers во всём коде плагина и за его пределами.
Таким образом, global.php обеспечивает «фоновую» инициализацию, не требующую повторения в каждом хуке, а setup.php выполняет разовую регистрацию плагина в системных таблицах при установке.
2. Файлы установки и удаления (папка setup/)
Файл setup/xtradbrowusers.install.sql
SQL-скрипт, выполняемый однократно при установке плагина. Создаёт таблицу cot_xtradbrowusers (точное имя зависит от префикса БД) со следующей структурой:
user_id— первичный ключ, целое беззнаковое, связанное через внешний ключfk_xtradbrowusers_usersс полемuser_idтаблицыcot_usersи настроенным каскадным удалениемON DELETE CASCADE. Это означает, что при удалении пользователя изcot_usersзапись вcot_xtradbrowusersбудет удалена автоматически на уровне БД, даже если код плагина по какой-то причине не отработает. Никаких дополнительных столбцов в этой таблице нет — все колонки будут добавлены позже через API Extrafields, когда администратор создаст поля в админке.
Файл setup/xtradbrowusers.install.php
Выполняется на этапе установки после SQL-файла. Его задача — заполнить свежесозданную таблицу наборами демонстрационных экстраполей, используя штатную функцию Cotonti cot_extrafield_add(). Для таблицы cot_xtradbrowusers добавляется 15 полей всех основных типов: input, textarea, datetime, double, select, inputint, radio, file, country, range, checklistbox. Каждое поле получает осмысленное название, HTML-шаблон для формы ввода, значения по умолчанию и описание. Благодаря этому администратор сразу после установки видит готовые примеры в панели управления экстраполями и в профилях пользователей.
Также создаётся папка datas/exflds/xtradbrowusers (если её нет) с правами 0777, куда будут сохраняться загружаемые через поля файлы. При необходимости можно раскомментировать создание .htaccess для запрета прямого доступа.
Файл setup/xtradbrowusers.uninstall.sql
Содержит единственный запрос DROP TABLE IF EXISTS ..., который удаляет таблицу cot_xtradbrowusers при деинсталляции плагина. Выполняется после PHP-кода удаления.
Файл setup/xtradbrowusers.uninstall.php
Этот файл вызывается при удалении плагина через панель администратора. Он производит полную очистку:
- Удаляет все строки из
cot_extra_fields, гдеfield_locationравно имени нашей таблицы — тем самым убираются все определения экстраполей из реестра. - Явно удаляет таблицу
cot_xtradbrowusersчерезDROP TABLE IF EXISTS(на случай, если SQL-файл не отработал или префикс отличается). - Рекурсивно удаляет директорию
datas/exflds/xtradbrowusersсо всеми загруженными файлами, чтобы не оставлять файлового мусора. Используется простой рекурсивный обход папки.
3. Интеграция с управлением экстраполями в админке
Файл xtradbrowusers.extrafields.php
Хук: admin.extrafields.first.
Файл содержит обязательный заголовок:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=admin.extrafields.first
[END_COT_EXT]
==================== */При установке плагина система Cotonti обнаруживает этот заголовок и добавляет в таблицу cot_plugins запись с pl_hook='admin.extrafields.first', pl_code='xtradbrowusers', pl_part='extrafields', pl_file='xtradbrowusers/xtradbrowusers.extrafields.php'. Когда администратор открывает страницу «Администрирование → Расширения → Экстраполя», в файле system/admin/admin.extrafields.php выполняется вызов cot_getextplugins('admin.extrafields.first'), который загружает все зарегистрированные на этот хук файлы, включая наш. После этого массив $extra_whitelist пополняется записью для таблицы cot_xtradbrowusers.
Код файла добавляет в $extra_whitelist элемент с ключом $db_xtradbrowusers, указывая:
'name'— имя таблицы,'caption'— заголовок из языкового файла,'type' => 'plug'— признак плагина,'code' => 'xtradbrowusers'— идентификатор плагина,'tags'— массив подсказок для шаблонов: какие теги будут доступны в каждом файле темы (users.profile.tpl,users.edit.tpl,users.details.tpl,users.register.tpl,users.tpl,header.tpl).
Благодаря этому администратор видит нашу таблицу в выпадающем списке и может управлять её полями через стандартный интерфейс.
4. Редактирование профиля пользователем
Файл xtradbrowusers.users.profile.tags.php
Хук: users.profile.tags.
Включается в момент построения формы редактирования собственного профиля пользователем (/users/m=profile). В контексте уже загружена переменная $urr с данными пользователя.
Файл получает массив экстраполей через xtradbrowusers_getExtrafields(), загружает текущие значения дополнительных полей для $urr['user_id'] функцией xtradbrowusers_load(). Для каждого поля строятся HTML-элементы формы с помощью cot_build_extrafields() и назначаются теги шаблона с префиксом USERS_PROFILE_XTRA_, например:
{USERS_PROFILE_XTRA_PHONE_EXTRA}, {USERS_PROFILE_XTRA_PHONE_EXTRA_TITLE}.
Одновременно присваиваются универсальные теги USERS_PROFILE_XTRA_EXTRAFLD и USERS_PROFILE_XTRA_EXTRAFLD_TITLE, позволяя вывести все поля в цикле <!-- BEGIN: XTRA_EXTRAFLD -->.
Файл xtradbrowusers.users.profile.update.done.php
Хук: users.profile.update.done.
Вызывается после успешного обновления профиля пользователем. Получает ID текущего пользователя из Cot::$usr['id'].
Для каждого экстраполя считывает соответствующее значение из массива $_POST с помощью cot_import_extrafields(), передавая имя поля как 'rxtra_' . fieldName, и сохраняет полученный массив в таблицу cot_xtradbrowusers через xtradbrowusers_save(). После этого вызывает cot_extrafield_movefiles(), чтобы переместить загруженные файлы из временной папки в datas/exflds/xtradbrowusers.
5. Редактирование пользователя администратором
Файл xtradbrowusers.users.edit.tags.php
Хук: users.edit.tags.
Действует аналогично profile.tags, но для формы администратора (users.edit.tpl). Назначает теги с префиксом USERS_EDIT_XTRA_....
Файл xtradbrowusers.users.edit.update.done.php
Хук: users.edit.update.done.
Аналог profile.update.done для случая, когда администратор редактирует чужой профиль. Идентификатор пользователя берётся из переменной $id, определённой в области видимости хука. Данные сохраняются в cot_xtradbrowusers с помощью той же xtradbrowusers_save().
6. Публичный профиль пользователя
Файл xtradbrowusers.users.details.tags.php
Хук: users.details.tags.
Выполняется при построении публичной страницы профиля (users.details.tpl). Загружает дополнительные поля владельца профиля и назначает теги с префиксом USERS_DETAILS_XTRA_, а также общие теги цикла.
Особенность: для полей типа country дополнительно создаётся тег _NAME, содержащий полное название страны, взятое из файла countries.lang.php. Это позволяет выводить не только код страны, но и читаемое название.
7. Список пользователей
Файл xtradbrowusers.users.loop.php
Хук: users.loop.
Вызывается внутри цикла перебора пользователей на странице списка (users.tpl). Переменная $urr в каждой итерации содержит текущего пользователя. Файл назначает теги {USERS_ROW_XTRA_...} — такие же, как в profile.tags, но с префиксом USERS_ROW_. Это даёт возможность вывести дополнительную информацию прямо в общем списке.
Файл xtradbrowusers.usertags.php
Хук: usertags.main.
Этот хук встроен непосредственно в функцию cot_generate_usertags() — центральный генератор пользовательских тегов Cotonti. Благодаря ему все дополнительные поля плагина становятся доступны везде, где используется эта функция: карточка пользователя на форуме, посты, личные сообщения, виджеты. Теги имеют формат XTRA_ИМЯПОЛЯ (без префикса модуля), что даёт унифицированный доступ из любого шаблона.
8. Регистрация нового пользователя
Файл xtradbrowusers.users.register.tags.php
Хук: users.register.tags.
Назначает теги {USERS_REGISTER_XTRA_...} в форме регистрации (users.register.tpl). Значения по умолчанию берутся из настроек поля или из $ruser, если форма отправлялась с ошибками.
Файл xtradbrowusers.users.register.add.done.php
Хук: users.register.add.done.
Выполняется сразу после успешной регистрации, когда $userid уже определён. Получает значения дополнительных полей из POST, сохраняет их в cot_xtradbrowusers функцией xtradbrowusers_save() и перемещает загруженные файлы.
9. Удаление пользователя
Файл xtradbrowusers.users.delete.done.php
Хук: users.delete.done.
Срабатывает при удалении пользователя из системы (как администратором, так и при отклонении регистрации). Файл сначала загружает текущие данные дополнительных полей удаляемого пользователя, чтобы для каждого поля вызвать cot_extrafield_unlinkfiles() и физически удалить загруженные файлы с диска. Затем удаляет строку из cot_xtradbrowusers командой Cot::$db->delete(). Это гарантирует полную очистку данных без оставления мусора.
10. Дополнительные интеграции
Файл xtradbrowusers.header.tags.php
Хук: header.tags.
Если в контексте страницы определена переменная $urr (а это происходит на страницах профиля и его редактирования), файл добавляет теги {USERS_HEADER_XTRA_...}, которые можно использовать в <title> и мета-тегах header.tpl. Например, с помощью {USERS_HEADER_XTRA_RESIDENCE_COUNTRY_NAME} можно динамически вывести страну проживания пользователя в заголовке страницы, улучшая SEO и персонализацию.
11. API-функции плагина
Файл inc/xtradbrowusers.functions.php
Содержит три функции, образующие ядро логики плагина:
xtradbrowusers_getExtrafields()— возвращает массив зарегистрированных экстраполей для таблицыcot_xtradbrowusersиз глобального реестраCot::$extrafields. Если таблица ещё не инициализирована, возвращает пустой массив.xtradbrowusers_load($user_id)— выполняетSELECT * FROM ... WHERE user_id = ?и возвращает ассоциативный массив всех значений дополнительных полей для заданного пользователя илиnull, если записи нет.xtradbrowusers_save($user_id, $data)— проверяет, существует ли уже запись для этого пользователя, и либо обновляет её черезUPDATE, либо вставляет новую черезINSERT. При вставке автоматически добавляет ключuser_id.
Также этот файл подключает языковой файл плагина, файл API Extrafields и выполняет Cot::$db->registerTable('xtradbrowusers'), обеспечивая доступ к таблице по Cot::$db->xtradbrowusers в любой точке системы, где вызваны функции плагина.
Такова детальная картина назначения и работы каждого файла плагина Extrafields Users Custom. Каждый из них реализует чётко ограниченную (то есть изоллированную и точечную) функциональность в нужный момент жизненного цикла пользователя, опираясь на систему хуков и API Cotonti.
Часть №3: Управление экстраполями в админке — руководство для начинающих
После установки плагина вы попадаете в знакомую среду управления дополнительными полями Cotonti. Все операции выполняются через раздел «Администрирование → Расширения → Экстраполя». В выпадающем списке таблиц нужно выбрать cot_xtradbrowusers — Custom Extrafields Users. Именно здесь создаются, изменяются и удаляются поля, которые затем появятся в профилях пользователей.
Интерфейс состоит из списка уже существующих полей (сразу после установки их 15) и формы добавления нового поля внизу страницы. Каждое поле характеризуется набором атрибутов, которые определяют его поведение и внешний вид. Давайте разберём их по порядку.
Атрибуты экстраполя
- Имя — уникальное системное название поля (только латиница, цифры и знак подчёркивания). Например,
phone_extraилиhire_date. Именно это имя будет использоваться в шаблонах для вывода значения. - Тип — определяет, какой HTML-элемент будет отображаться в форме редактирования и как данные будут обрабатываться. Доступны следующие типы:
input— обычное текстовое поле.inputint— текстовое поле для целых чисел.currency,double— текстовое поле для чисел с плавающей точкой.textarea— многострочная область ввода.select— выпадающий список.checkbox— единичный флажок (да/нет).radio— радиокнопки (выбор одного варианта из нескольких).datetime— набор выпадающих списков для выбора даты и времени.country— выпадающий список стран.range— выпадающий список чисел из заданного диапазона.checklistbox— группа чекбоксов для множественного выбора.file— поле для загрузки файла.
- HTML-код — шаблон, который используется при отображении поля в форме. Обычно содержит переменные
{$name},{$value}и т.д. Если оставить поле пустым, система подставит стандартный HTML для выбранного типа. - Варианты — строка с перечислением вариантов, разделённых запятыми. Используется для типов
select,radio,checklistbox, а также дляfile(список разрешённых расширений). Например:IT,Маркетинг,ПродажиилиYes,No. - Параметры — дополнительные настройки поля. Для
datetimeэто диапазон лет и формат, например2010,2030,d.m.Y H:i. Дляrange— минимальное и максимальное значение, например0,100. Дляdoubleиinputintможно задать границы через запятую (min,max). - Значение по умолчанию — будет подставлено, если пользователь ничего не ввёл. Для
datetimeуказывается timestamp (например1714060800для 26.04.2024), для остальных типов — просто строка или число. - Обязательное — галочка, которая заставляет систему проверять заполнение поля перед сохранением.
- Парсер — определяет, как значение будет обрабатываться при выводе.
HTML— разрешены HTML‑теги (но с очисткой),Text— всё преобразуется в plain text. Дляfile,country,rangeпарсер, как правило, не применяется. - Описание — человекочитаемое название поля, которое показывается рядом с полем в формах и в списке экстраполей. Именно оно становится заголовком
_TITLEв шаблонах.
Пошаговый пример: создание нового поля «Любимый язык программирования»
- Перейдите в раздел экстраполей для таблицы
cot_xtradbrowusers. - В форме добавления нового поля заполните:
- Имя:
fav_language - Тип:
select(выпадающий список) - Варианты:
Не указан,JavaScript,Python,PHP,Rust - Значение по умолчанию:
Не указан - Обязательное: можно не ставить
- Парсер:
HTML - Описание:
Любимый язык программирования - Остальные поля оставьте пустыми.
- Имя:
- Нажмите кнопку «Добавить поле».
Новое поле немедленно появится в списке, и в профилях пользователей станет доступен выпадающий список с указанными вариантами.
Примеры заполнения для всех типов полей
Ниже приведена сводная таблица с реальными примерами из демонстрационных полей плагина. Вы можете использовать их как основу для своих задач.
| Тип | Имя поля | Варианты | Параметры | Значение по умолчанию | Описание |
|---|---|---|---|---|---|
input |
phone_extra |
— | — | — | Дополнительный телефон |
textarea |
about_extra |
— | — | — | О себе |
datetime |
hire_date |
— | 2010,2030,d.m.Y H:i |
1714060800 |
Дата найма |
double |
salary |
— | — | 0.00 |
Зарплата |
select |
department |
Не указан,IT,Маркетинг,Продажи,Поддержка |
— | Не указан |
Отдел |
inputint |
experience_years |
— | — | 0 |
Стаж (лет) |
radio |
has_car |
Yes,No |
— | No |
Наличие автомобиля |
file |
resume_file |
jpg,png,pdf,zip |
datas/exflds/xtradbrowusers |
— | Резюме |
country |
residence_country |
— | — | ua |
Страна проживания |
range |
english_level |
— | 0,100 |
50 |
Уровень английского |
checklistbox |
interests |
Спорт,Музыка,IT,Путешествия |
— | IT |
Интересы |
select |
work_schedule |
Полный день,Сменный,Удалёнка,Гибкий |
— | Полный день |
График работы |
input |
emergency_contact |
— | — | — | Экстренный контакт |
Несколько советов
- Не меняйте HTML-код без необходимости. Стандартные шаблоны уже содержат все нужные классы Bootstrap 5 и готовы к использованию.
- Для поля
fileобязательно укажите «Варианты» — список расширений через запятую. Иначе будут приниматься любые файлы. - Параметр «Значение по умолчанию» для
datetimeзадаётся в виде UNIX timestamp. Вы можете использовать любой онлайн-конвертер, чтобы получить нужную дату. - После создания или изменения полей они автоматически появляются во всех формах (регистрация, профиль, админка) и на публичной странице пользователя, но после того, как мы пропишем тегами вывод полей в нужных шаблонах.
Теперь вы полностью готовы к наполнению профилей пользователей именно теми данными, которые важны для вашего проекта. Но сначало мы рассмотрим, как вывести созданные поля в шаблонах Cotonti.
Часть 4: Вывод полей в шаблонах — настройка шаблона users.edit.tpl (редактирование администратором)
Плагин автоматически делает дополнительные поля доступными в каждом шаблоне через систему хуков. После того как поля созданы в админке, их нужно «подключить» к шаблонам — то есть вставить в нужное место специальные TPL‑теги. Начнём с формы редактирования пользователя администратором (users.edit.tpl).
Файл плагина: xtradbrowusers.users.edit.tags.php
Этот файл зарегистрирован на хук users.edit.tags и выполняется каждый раз, когда Cotonti обрабатывает шаблон users.edit.tpl. Он загружает текущие значения дополнительных полей пользователя из таблицы cot_xtradbrowusers и присваивает их шаблонным переменным. Доступны два режима вывода: циклический (все поля разом) и индивидуальный (каждое поле отдельно).
Какие теги доступны в шаблоне
После обработки хука в шаблоне можно использовать:
| Шаблонный тег | Назначение |
|---|---|
{USERS_EDIT_XTRA_ИМЯПОЛЯ} |
HTML‑элемент формы (input, select, textarea…) с текущим значением |
{USERS_EDIT_XTRA_ИМЯПОЛЯ_TITLE} |
Название поля (подпись) |
{USERS_EDIT_XTRA_EXTRAFLD} |
Универсальный контейнер текущего поля (внутри цикла) |
{USERS_EDIT_XTRA_EXTRAFLD_TITLE} |
Название поля внутри цикла |
Здесь ИМЯПОЛЯ — это системное имя, которое вы задали при создании экстраполя (например, phone_extra), приведённое к верхнему регистру.
Как вставить поля в шаблон
1. Циклический вывод всех полей
Добавьте в шаблон следующий блок в том месте, где должны появиться дополнительные поля:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_edit_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_EDIT_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_EDIT_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Этот код:
- проверяет, что плагин
xtradbrowusersактивен; - выводит все поля одно за другим внутри цикла
<!-- BEGIN: XTRA_EXTRAFLD -->…<!-- END: XTRA_EXTRAFLD -->; - для каждого поля показывает его название и сам элемент формы.
Такой подход удобен, если вы хотите быстро отобразить все существующие дополнительные поля.
2. Индивидуальный вывод конкретного поля
Если нужно расположить поля в разных местах карточки или применить уникальную вёрстку, используйте персональные теги. Например, поле с именем phone_extra будет доступно как {USERS_EDIT_XTRA_PHONE_EXTRA} и {USERS_EDIT_XTRA_PHONE_EXTRA_TITLE}.
Пример вставки:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_EDIT_XTRA_PHONE_EXTRA} -->
<div class="row mb-3">
<label class="col-sm-3 col-form-label fw-semibold">{USERS_EDIT_XTRA_PHONE_EXTRA_TITLE}:</label>
<div class="col-sm-9">{USERS_EDIT_XTRA_PHONE_EXTRA}</div>
</div>
<!-- ENDIF -->
<!-- ENDIF -->Таким образом можно комбинировать произвольное количество полей, создавая сложную разметку.
3. Пример для вашего шаблона users.edit.tpl (тема Index36)
Допустим, мы хотим разместить дополнительные поля плагина между блоком «Основные данные» и «Подвал с подписью». В вашем шаблоне после закрывающего тега </div> блока с группами и перед строкой с <!-- IF {PHP|cot_module_active('pm')} --> можно вставить:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_edit_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_EDIT_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_EDIT_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Либо вывести отдельные поля в нужных вам местах, используя индивидуальные теги.
Проверка и сохранение
После вставки кода в шаблон откройте профиль любого пользователя для редактирования администратором (например, /users/1?m=edit). Вы должны увидеть новые поля. Заполните их, сохраните — данные запишутся в таблицу cot_xtradbrowusers и будут доступны для других частей системы (публичный профиль, список пользователей и т.д.).
В следующей части мы аналогичным образом настроим публичный профиль пользователя (users.details.tpl) и другие шаблоны.
Часть 5: Вывод полей в форме редактирования профиля пользователем (users.profile.tpl)
Форма, которую видит сам пользователь при редактировании своего профиля (/users/m=profile), также автоматически получает доступ ко всем дополнительным полям плагина xtradbrowusers. За это отвечает файл xtradbrowusers.users.profile.tags.php, зарегистрированный на хук users.profile.tags.
Какие теги доступны в шаблоне
После обработки хука в users.profile.tpl можно использовать следующие шаблонные переменные:
| Шаблонный тег | Назначение |
|---|---|
{USERS_PROFILE_XTRA_ИМЯПОЛЯ} |
HTML‑элемент формы (input, select, textarea…) с текущим значением |
{USERS_PROFILE_XTRA_ИМЯПОЛЯ_TITLE} |
Название поля (подпись) |
{USERS_PROFILE_XTRA_EXTRAFLD} |
Универсальный контейнер текущего поля (внутри цикла) |
{USERS_PROFILE_XTRA_EXTRAFLD_TITLE} |
Название поля внутри цикла |
Имена полей записываются в верхнем регистре, например для поля phone_extra тег будет {USERS_PROFILE_XTRA_PHONE_EXTRA}.
Как вставить поля в шаблон
Рекомендуется всегда оборачивать вывод в проверку активности плагина:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
...
<!-- ENDIF -->Это гарантирует, что при отключении плагина вёрстка не сломается.
1. Циклический вывод всех полей
Добавьте блок, который выведет все дополнительные поля одно за другим:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_profile_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_PROFILE_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_PROFILE_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Такой подход удобен, если вы хотите быстро отобразить все поля одним списком, не заботясь о порядке.
2. Индивидуальный вывод конкретных полей
Если требуется расположить поля в разных местах или оформить их по-разному, используйте персональные теги. Например, поле с системным именем phone_extra выводится так:
<!-- IF {USERS_PROFILE_XTRA_PHONE_EXTRA} -->
<div class="row mb-3">
<label class="col-sm-3 col-form-label fw-semibold">{USERS_PROFILE_XTRA_PHONE_EXTRA_TITLE}:</label>
<div class="col-sm-9">{USERS_PROFILE_XTRA_PHONE_EXTRA}</div>
</div>
<!-- ENDIF -->Обратите внимание: тег {USERS_PROFILE_XTRA_PHONE_EXTRA} содержит уже готовый HTML-элемент, поэтому его нужно просто вывести в нужном месте.
Пример интеграции в шаблон темы Index36
Ниже показано, как можно встроить циклический вывод дополнительных полей в ваш users.profile.tpl. Код вставляется, например, после блока с группами (после {USERS_PROFILE_GROUPS}) и перед карточкой страны/часового пояса, либо в любое другое место по вашему усмотрению.
Фрагмент шаблона с добавлением:
</div> <!-- конец card-body с группами -->
</div> <!-- конец card -->
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-5">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_profile_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_PROFILE_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_PROFILE_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->
<div class="card border-0 shadow-sm mb-5">
<div class="card-body">
<div class="row g-4">
<div class="col-md-6">
<div class="mb-3">
<label class="form-label fw-semibold">{PHP.L.Country}:</label>
<div>{USERS_PROFILE_COUNTRY}</div>
</div>
</div>
...Проверка и сохранение
После вставки кода в шаблон войдите под любым пользователем и перейдите в редактирование профиля. Новые поля появятся в форме. Заполните их и сохраните — данные будут записаны в cot_xtradbrowusers и затем отобразятся в публичном профиле и других местах.
Таким образом, управление дополнительными полями для самого пользователя полностью аналогично админской форме, но использует теги с префиксом USERS_PROFILE_XTRA_. В следующей части мы настроим публичную страницу профиля (users.details.tpl).
Часть 6: Вывод полей в публичном профиле пользователя (users.details.tpl)
Публичная страница профиля пользователя (/users/...?m=details) — это то место, где посетители сайта видят информацию о пользователе. Плагин xtradbrowusers автоматически делает дополнительные поля доступными и здесь через хук users.details.tags, который обрабатывается файлом xtradbrowusers.users.details.tags.php. В отличие от форм редактирования, здесь поля отображаются не как элементы ввода, а как готовые отформатированные значения, подходящие для чтения.
Какие теги доступны в шаблоне
После обработки хука в users.details.tpl можно использовать следующие теги:
| Шаблонный тег | Назначение |
|---|---|
{USERS_DETAILS_XTRA_ИМЯПОЛЯ} |
Отформатированное значение поля (текст, HTML) |
{USERS_DETAILS_XTRA_ИМЯПОЛЯ_TITLE} |
Название поля (подпись) |
{USERS_DETAILS_XTRA_ИМЯПОЛЯ_VALUE} |
Сырое значение поля (без форматирования, может быть полезно для сравнений) |
{USERS_DETAILS_XTRA_EXTRAFIELD_TITLE} |
Название текущего поля (внутри цикла) |
{USERS_DETAILS_XTRA_EXTRAFIELD_VALUE} |
Отформатированное значение текущего поля (внутри цикла) |
{USERS_DETAILS_XTRA_EXTRAFIELD_NAME} |
Системное имя текущего поля (внутри цикла) |
Для полей типа country дополнительно доступен тег:
| {USERS_DETAILS_XTRA_ИМЯПОЛЯ_NAME} | Полное название страны (например, «Украина» вместо ua) |
Имена полей пишутся в верхнем регистре, например для поля phone_extra — USERS_DETAILS_XTRA_PHONE_EXTRA.
Как вставить поля в шаблон
Рекомендуется проверять активность плагина и наличие значений, чтобы не отображать пустые строки:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
...
<!-- ENDIF -->1. Циклический вывод всех полей
Можно вывести все заполненные дополнительные поля единым списком, используя цикл:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_details_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<!-- IF {USERS_DETAILS_XTRA_EXTRAFIELD_VALUE} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_EXTRAFIELD_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- ENDIF -->
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Условие <!-- IF {USERS_DETAILS_XTRA_EXTRAFIELD_VALUE} --> гарантирует, что пустые поля не выводятся.
2. Индивидуальный вывод конкретных полей
Если требуется расположить поля в разных местах карточки или применить уникальную вёрстку, используйте отдельные теги. Например, поле phone_extra выводится так:
<!-- IF {USERS_DETAILS_XTRA_PHONE_EXTRA} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_PHONE_EXTRA_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_PHONE_EXTRA}</span>
</div>
<!-- ENDIF -->Для поля residence_country (тип country) можно показать флаг и название страны:
<!-- IF {USERS_DETAILS_XTRA_RESIDENCE_COUNTRY} -->
<div class="mb-3">
<img src="images/flags/{USERS_DETAILS_XTRA_RESIDENCE_COUNTRY_VALUE}.svg" style="width:24px;" alt="">
<strong>{USERS_DETAILS_XTRA_RESIDENCE_COUNTRY_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_RESIDENCE_COUNTRY_NAME} ({USERS_DETAILS_XTRA_RESIDENCE_COUNTRY})</span>
</div>
<!-- ENDIF -->Пример интеграции в шаблон темы Index36
В вашем шаблоне users.details.tpl уже есть таблица с основными данными пользователя (страна, часовой пояс, дата рождения и т.д.). Вы можете либо добавить дополнительные поля в существующую таблицу, либо создать отдельный блок. Ниже показан вариант вставки блока с циклом после таблицы основных данных, но ещё до демонстрационного блока «Профиль» и вкладок.
Фрагмент шаблона после таблицы с группами:
<tr>
<td>{PHP.L.Registered}:</td>
<td>{USERS_DETAILS_REGDATE}</td>
</tr>
</table>
</div>
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_details_tpl_title}</h4>
<small>{PHP.L.xtradbrowusers_details_tpl_desc}</small>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<!-- IF {USERS_DETAILS_XTRA_EXTRAFIELD_VALUE} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_EXTRAFIELD_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- ENDIF -->
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->
<h5>Профиль</h5>
<p>Lorem ipsum dolor sit amet...</p>Либо, если вы предпочитаете индивидуальное размещение, можно разнести поля по карточке. Например, поле about_extra («О себе») вставить рядом с подписью (Signature), а phone_extra — в таблицу.
Проверка
Откройте публичный профиль любого пользователя, у которого заполнены дополнительные поля. Если все сделано правильно, вы увидите их значения в указанном месте. Пустые поля не отображаются.
Таким образом, публичная страница профиля теперь может содержать всю необходимую дополнительную информацию о пользователе, управляемую через единый интерфейс экстраполей. В следующей части мы рассмотрим вывод полей в общем списке пользователей (users.tpl).
Часть 7: Вывод полей в общем списке пользователей (users.tpl)
Список пользователей — это страница, на которой отображаются сразу несколько профилей (например, /users). Плагин xtradbrowusers делает дополнительные поля доступными и здесь, чтобы в каждой карточке пользователя можно было показать ключевую информацию. За это отвечает файл xtradbrowusers.users.loop.php, зарегистрированный на хук users.loop. Внутри цикла перебора пользователей для каждой строки назначаются свои теги.
Какие теги доступны в шаблоне
Внутри блока <!-- BEGIN: USERS_ROW --> можно использовать следующие переменные:
| Шаблонный тег | Назначение |
|---|---|
{USERS_ROW_XTRA_ИМЯПОЛЯ} |
Отформатированное значение поля |
{USERS_ROW_XTRA_ИМЯПОЛЯ_TITLE} |
Название поля (подпись) |
{USERS_ROW_XTRA_ИМЯПОЛЯ_VALUE} |
Сырое значение поля (без форматирования) |
Для полей типа country дополнительно:
| {USERS_ROW_XTRA_ИМЯПОЛЯ_NAME} | Полное название страны |
Имена полей записываются в верхнем регистре с префиксом XTRA_, например для поля phone_extra — USERS_ROW_XTRA_PHONE_EXTRA. Обратите внимание: в users.details.tpl использовался префикс USERS_DETAILS_XTRA_, здесь же префикс USERS_ROW_XTRA_.
Как вставить поля в шаблон
Вывод всегда должен быть обёрнут в проверку активности плагина:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
...
<!-- ENDIF -->1. Вывод отдельного поля в карточке пользователя
Допустим, мы хотим показывать страну проживания (поле residence_country) в каждой карточке списка. В вашем шаблоне уже есть блок с аватаром, именем и группой. Можно добавить строку с флагом и названием страны, например, после строки с группой:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_ROW_XTRA_RESIDENCE_COUNTRY} -->
<div class="text-center mb-2">
<img src="images/flags/{USERS_ROW_XTRA_RESIDENCE_COUNTRY_VALUE}.svg" style="width:24px;" alt="">
<span class="text-muted">{USERS_ROW_XTRA_RESIDENCE_COUNTRY_NAME}</span>
</div>
<!-- ENDIF -->
<!-- ENDIF -->Аналогично можно добавить уровень английского (english_level), отдел (department) или любой другой параметр.
2. Компактный вывод нескольких полей
Если нужно отобразить сразу несколько полей в виде иконок или бейджей, используйте индивидуальные теги. Например, добавим значок отдела и уровень квалификации:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="d-flex justify-content-center gap-2 mb-2">
<!-- IF {USERS_ROW_XTRA_DEPARTMENT} -->
<span class="badge bg-info-subtle text-info">{USERS_ROW_XTRA_DEPARTMENT}</span>
<!-- ENDIF -->
<!-- IF {USERS_ROW_XTRA_SKILL_LEVEL} -->
<span class="badge bg-secondary-subtle text-secondary">{USERS_ROW_XTRA_SKILL_LEVEL}</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->Можно также выводить числовые показатели, например стаж:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_ROW_XTRA_EXPERIENCE_YEARS} -->
<div class="text-center mb-2">
<small class="text-muted">{USERS_ROW_XTRA_EXPERIENCE_YEARS_TITLE}: {USERS_ROW_XTRA_EXPERIENCE_YEARS} лет</small>
</div>
<!-- ENDIF -->
<!-- ENDIF -->Пример интеграции в шаблон темы Index36
В вашем текущем шаблоне users.tpl есть карточка с именем, аватаром, бейджами навыков (PHP, HTML, JavaScript) и счётчиками логинов/постов. Вы можете заменить или дополнить демонстрационные бейджи реальными данными из экстраполей. Например, вместо статичных «PHP», «HTML», «JavaScript» вывести настоящие навыки из поля interests (checklistbox) или department.
Добавим после строки <p class="text-muted">Backend Developer ({USERS_ROW_MAIN_GROUP_NAME})</p> блок с дополнительными полями:
<p class="text-muted">Backend Developer ({USERS_ROW_MAIN_GROUP_NAME})</p>
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="text-center mb-2">
<!-- IF {USERS_ROW_XTRA_DEPARTMENT} -->
<span class="badge bg-info-subtle text-info px-2 py-1 me-1">{USERS_ROW_XTRA_DEPARTMENT}</span>
<!-- ENDIF -->
<!-- IF {USERS_ROW_XTRA_SKILL_LEVEL} -->
<span class="badge bg-warning-subtle text-warning-emphasis px-2 py-1 me-1">{USERS_ROW_XTRA_SKILL_LEVEL}</span>
<!-- ENDIF -->
<!-- IF {USERS_ROW_XTRA_RESIDENCE_COUNTRY} -->
<span class="badge bg-primary-subtle text-primary px-2 py-1 me-1">
<img src="images/flags/{USERS_ROW_XTRA_RESIDENCE_COUNTRY_VALUE}.svg" style="width:16px;vertical-align:middle;" alt="">
{USERS_ROW_XTRA_RESIDENCE_COUNTRY_NAME}
</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->Этот код полностью заменит собой статичные бейджи «PHP», «HTML», «JavaScript», делая карточки информативными и управляемыми через админку.
Проверка
Откройте страницу списка пользователей. Если у кого-то заполнены дополнительные поля, вы увидите их в карточках. Пустые поля не выводятся, поэтому карточки остаются чистыми.
Таким образом, даже на странице со списком пользователей можно гибко показывать ключевую информацию, хранящуюся в дополнительных полях, без перегрузки интерфейса. В следующей части мы рассмотрим использование полей в форме регистрации (users.register.tpl).
Часть 8: Вывод полей в форме регистрации (users.register.tpl)
Форма регистрации нового пользователя — это первая точка входа, где можно собрать дополнительную информацию о будущем участнике. Плагин xtradbrowusers интегрируется в эту форму через файл xtradbrowusers.users.register.tags.php, зарегистрированный на хук users.register.tags.
Поскольку в момент отображения формы пользователь ещё не создан (его нет в базе), плагин не загружает данные из таблицы cot_xtradbrowusers, а ориентируется на массив $ruser, который содержит значения, введённые при предыдущей попытке отправки (если были ошибки валидации). Это позволяет сохранить введённые данные в полях после перезагрузки страницы, чтобы пользователю не приходилось заполнять всё заново.
Какие теги доступны в шаблоне
После обработки хука в шаблоне users.register.tpl можно использовать:
| Шаблонный тег | Назначение |
|---|---|
{USERS_REGISTER_XTRA_ИМЯПОЛЯ} |
HTML‑элемент формы (input, select, textarea…) с пустым или сохранённым значением |
{USERS_REGISTER_XTRA_ИМЯПОЛЯ_TITLE} |
Название поля (подпись) |
{USERS_REGISTER_XTRA_EXTRAFLD} |
Универсальный контейнер текущего поля (внутри цикла) |
{USERS_REGISTER_XTRA_EXTRAFLD_TITLE} |
Название поля внутри цикла |
Имена полей записываются в верхнем регистре, например для поля phone_extra — USERS_REGISTER_XTRA_PHONE_EXTRA.
Как вставить поля в шаблон
Обязательно оборачивайте вывод в проверку активности плагина, чтобы при его отключении вёрстка осталась корректной:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
...
<!-- ENDIF -->1. Циклический вывод всех полей
Можно вывести все дополнительные поля единым блоком, используя цикл. Это удобно, если вы не хотите настраивать каждое поле отдельно:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="mb-4">
<h5>{PHP.L.xtradbrowusers_register_title}</h5>
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label small">{USERS_REGISTER_XTRA_EXTRAFLD_TITLE}:</label>
{USERS_REGISTER_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
<!-- ENDIF -->2. Индивидуальный вывод отдельных полей
Если вы хотите расположить определённые поля в разных местах формы или оформить их по-особому, используйте персональные теги. Например, поле «Дополнительный телефон» (phone_extra):
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="mb-4 position-relative">
<i class="fa-solid fa-phone position-absolute top-50 start-0 translate-middle-y ms-3"></i>
{USERS_REGISTER_XTRA_PHONE_EXTRA}
<small class="text-muted">{USERS_REGISTER_XTRA_PHONE_EXTRA_TITLE}</small>
</div>
<!-- ENDIF -->Или поле «О себе» (about_extra):
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="mb-4">
<label class="form-label small">{USERS_REGISTER_XTRA_ABOUT_EXTRA_TITLE}:</label>
{USERS_REGISTER_XTRA_ABOUT_EXTRA}
</div>
<!-- ENDIF -->Пример интеграции в шаблон темы Index36
Ваш текущий шаблон users.register.tpl содержит компактную форму с полями: логин, email, пароль, подтверждение пароля. Дополнительные поля плагина можно разместить, например, между блоком подтверждения пароля и капчей. Это логичное место, так как пользователь уже ввёл основные учётные данные и готов указать расширенную информацию.
Фрагмент шаблона с добавлением циклического вывода:
<div class="mb-4 position-relative">
<i class="fa-solid fa-lock position-absolute top-50 start-0 translate-middle-y ms-3"></i>
{USERS_REGISTER_PASSWORDREPEAT}
</div>
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card bg-light mb-4">
<div class="card-body">
<h6 class="card-title mb-3">{PHP.L.xtradbrowusers_register_title}</h6>
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label small">{USERS_REGISTER_XTRA_EXTRAFLD_TITLE}:</label>
{USERS_REGISTER_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->
<!-- IF {PHP.cfg.captchamain|cot_plugin_active($this)} -->
...Обратите внимание: форма регистрации часто имеет ограниченное пространство, поэтому поля можно сгруппировать в компактную карточку с фоном.
Если же вы предпочитаете индивидуальный подход, можно вывести только несколько ключевых полей. Например, добавить после поля «Email» выпадающий список «Отдел» (department) и «Уровень квалификации» (skill_level):
<div class="mb-4 position-relative">
<i class="fa-solid fa-envelope position-absolute top-50 start-0 translate-middle-y ms-3"></i>
{USERS_REGISTER_EMAIL}
</div>
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="row mb-4">
<div class="col-6">
<label class="form-label small">{USERS_REGISTER_XTRA_DEPARTMENT_TITLE}:</label>
{USERS_REGISTER_XTRA_DEPARTMENT}
</div>
<div class="col-6">
<label class="form-label small">{USERS_REGISTER_XTRA_SKILL_LEVEL_TITLE}:</label>
{USERS_REGISTER_XTRA_SKILL_LEVEL}
</div>
</div>
<!-- ENDIF -->Проверка
Откройте страницу регистрации (/users/m=register). Вы должны увидеть новые поля, определённые в админке. Попробуйте заполнить их и отправить форму. Если какое-то обязательное поле не заполнено, после перезагрузки страницы ранее введённые значения сохранятся (благодаря $ruser). После успешной регистрации данные запишутся в cot_xtradbrowusers и будут доступны в профиле и других шаблонах.
Таким образом, вы можете собирать дополнительную информацию о пользователях уже на этапе регистрации, делая профили более полными и полезными для вашего сообщества или бизнеса.
Часть 9: Локализация дополнительных полей
Плагин xtradbrowusers полностью совместим с системой локализации Cotonti. Это значит, что названия полей и их значения (например, варианты в выпадающих списках или радиокнопках) можно переводить на разные языки, и они будут автоматически отображаться в соответствии с выбранным языком сайта. Вам не нужно дублировать поля для каждой языковой версии — достаточно один раз создать поле в админке и добавить переводы в языковые файлы плагина.
1. Где хранятся переводы
Языковые файлы плагина находятся в папке lang/:
xtradbrowusers.ru.lang.php— русский переводxtradbrowusers.en.lang.php— английский перевод
Вы можете редактировать эти файлы или создавать новые для других языков (например, xtradbrowusers.ua.lang.php для украинского). Также переводы можно размещать в языковых файлах вашей темы — они будут иметь приоритет над файлами плагина.
2. Перевод названий полей (заголовков)
Название поля (то, что выводится рядом с полем в форме, и что доступно в шаблоне как _TITLE) определяется функцией cot_extrafield_title(), которая ищет языковую строку в следующем порядке:
$L['xtra_имя_поля_title']— с префиксомxtra_(этот префикс плагин передаёт при вызове)$L['имя_поля_title']— без префикса- Если ничего не найдено, используется значение из поля «Описание» (
field_description) в админке.
Например, для поля phone_extra система проверит:
$L['xtra_phone_extra_title']$L['phone_extra_title']
Если ни один ключ не найден, подставится описание из админки «Дополнительный телефон».
Пример: перевод названия поля «Дополнительный телефон» на русский и английский
Добавьте в lang/xtradbrowusers.ru.lang.php:
$L['xtra_phone_extra_title'] = 'Дополнительный телефон';Или без префикса:
$L['phone_extra_title'] = 'Дополнительный телефон';В lang/xtradbrowusers.en.lang.php:
$L['xtra_phone_extra_title'] = 'Extra phone';Теперь в русской версии сайта рядом с полем будет написано «Дополнительный телефон», а в английской — «Extra phone».
3. Перевод значений для выпадающих списков, радиокнопок и чекбоксов
Для типов полей select, radio, checklistbox можно локализовать не только название, но и варианты выбора. В базе данных значения хранятся в исходном виде (например, it_department), а при выводе функция cot_build_extrafields_data() ищет перевод по ключу $L['имя_поля_значение'] (в нижнем регистре). Префиксы здесь не используются.
Формат ключа: $L['fieldname_value']
Пример для поля department со значением it_department:
$L['department_it_department'] = 'IT-отдел';Если перевода нет, отображается исходное значение.
Пример: локализация выпадающего списка «Отдел» (department)
Поле department в админке имеет варианты: Не указан,IT,Маркетинг,Продажи,Поддержка (это значения по-русски, но технически они могут быть любыми строками). Чтобы они переводились при смене языка, в языковые файлы добавляют:
Русский (ru.lang.php):
$L['department_Не указан'] = 'Не указан';
$L['department_IT'] = 'IT-отдел';
$L['department_Маркетинг'] = 'Маркетинг';
$L['department_Продажи'] = 'Продажи';
$L['department_Поддержка'] = 'Поддержка';Английский (en.lang.php):
$L['department_Не указан'] = 'Not specified';
$L['department_IT'] = 'IT Department';
$L['department_Маркетинг'] = 'Marketing';
$L['department_Продажи'] = 'Sales';
$L['department_Поддержка'] = 'Support';Теперь при выводе значения поля (например, {USERS_DETAILS_XTRA_DEPARTMENT}) вместо «IT» английский пользователь увидит «IT Department».
4. Перевод значений для radio и checklistbox
Работает точно так же: ключ $L['fieldname_value']. Например, для поля has_car со значениями Yes,No:
// Русский
$L['has_car_Yes'] = 'Да';
$L['has_car_No'] = 'Нет';
// Английский
$L['has_car_Yes'] = 'Yes';
$L['has_car_No'] = 'No';5. Добавление переводов в существующие языковые файлы плагина
Рекомендуемый способ — открыть файлы xtradbrowusers.ru.lang.php и xtradbrowusers.en.lang.php и дописать нужные строки после уже существующих констант плагина. Например, в русский файл добавить:
// Локализация названий полей
$L['xtra_phone_extra_title'] = 'Дополнительный телефон';
$L['xtra_about_extra_title'] = 'О себе';
$L['xtra_hire_date_title'] = 'Дата найма';
$L['xtra_salary_title'] = 'Зарплата';
$L['xtra_department_title'] = 'Отдел';
$L['xtra_experience_years_title'] = 'Стаж (лет)';
$L['xtra_skill_level_title'] = 'Уровень квалификации';
$L['xtra_has_car_title'] = 'Наличие автомобиля';
$L['xtra_last_promotion_title'] = 'Дата последнего повышения';
$L['xtra_resume_file_title'] = 'Резюме';
$L['xtra_residence_country_title'] = 'Страна проживания';
$L['xtra_english_level_title'] = 'Уровень английского';
$L['xtra_interests_title'] = 'Интересы';
$L['xtra_work_schedule_title'] = 'График работы';
$L['xtra_emergency_contact_title'] = 'Экстренный контакт';
// Локализация значений (примеры)
$L['department_IT'] = 'IT-отдел';
$L['skill_level_Junior'] = 'Младший';
$L['skill_level_Middle'] = 'Средний';
$L['skill_level_Senior'] = 'Старший';
$L['skill_level_Lead'] = 'Ведущий';
$L['has_car_Yes'] = 'Да';
$L['has_car_No'] = 'Нет';
// ... и так далее для всех вариантов всех полейПосле редактирования языковых файлов не забудьте сбросить кеш в админке (Администрирование → Управление сайтом → Кеш → Очистить кеш).
6. Приоритет языковых файлов
Cotonti загружает языковые файлы в следующем порядке:
- Глобальные языковые файлы (
lang/ru/main.ru.lang.php) - Языковые файлы модулей (
modules/*/lang/ru/ru.*.lang.php) - Языковые файлы плагинов (
plugins/*/lang/ru/ru.*.lang.php) — здесь находятся файлы нашего плагина - Языковой файл темы (
themes/ваша_тема/ваша_тема.ru.lang.php) — загружается последним и может переопределить любые строки
Поэтому, если вы хотите изменить перевод, не трогая файлы плагина, просто добавьте нужные ключи в языковой файл вашей темы. Например, в themes/index36/index36.ru.lang.php:
$L['department_IT'] = 'Отдел информационных технологий';Это значение переопределит то, что задано в файле плагина.
7. Рекомендация для начинающих
- Всегда задавайте в админке варианты значений на том языке, который вы будете использовать в качестве основного (например, русский). Затем добавляйте переводы для других языков через
$L['fieldname_value']. - Если не планируется многоязычность, можно просто заполнить варианты сразу на нужном языке и не добавлять переводы — тогда будет выводиться то, что указано в админке.
- Для заголовков полей, если вас устраивает текст из поля «Описание», дополнительные языковые строки можно не создавать. Однако при смене языка описание не переведётся автоматически, поэтому лучше использовать ключи локализации.
Теперь ваш плагин готов к использованию на многоязычном сайте — все заголовки и значения дополнительных полей могут быть переведены на любой язык без вмешательства в код.
Всё происходит автоматически — именно для этого плагин использует штатные функции Cotonti. Когда вы вставляете в шаблон тег вроде {USERS_DETAILS_XTRA_DEPARTMENT}, он уже содержит готовую локализованную строку.
Вам не нужно писать в шаблоне никаких дополнительных условий или вызовов языковых файлов.
Как это работает «под капотом»
-
Значения полей
В хуках вывода (например,users.details.tags) плагин вызываетcot_build_extrafields_data('xtra', $exfld, $value).
Эта функция, обнаружив типselect,radioилиchecklistbox, автоматически ищет в массиве$Lключ$L['имя_поля_значение']и, если находит, подставляет перевод вместо исходного значения.
В шаблон попадает уже переведённый текст, поэтому никаких дополнительных действий не требуется. -
Заголовки полей
Тег_TITLE(например,{USERS_DETAILS_XTRA_DEPARTMENT_TITLE}) формируется функциейcot_extrafield_title($exfld, 'xtra_').
Она ищет ключи$L['xtra_имя_поля_title']и$L['имя_поля_title']. Если перевод найден — возвращается он, если нет — описание из админки.
Результат также сразу попадает в шаблон.
Пример из вашего шаблона users.details.tpl
Допустим, у вас есть поле department со значением IT.
В языковой файл добавлено:
$L['department_IT'] = 'IT-отдел';
$L['xtra_department_title'] = 'Отдел';В шаблоне вы пишете:
<!-- IF {USERS_DETAILS_XTRA_DEPARTMENT} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_DEPARTMENT_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_DEPARTMENT}</span>
</div>
<!-- ENDIF -->Пользователь увидит:
Отдел: IT-отдел
Если он переключит язык на английский, и в en.lang.php будет:
$L['department_IT'] = 'IT Department';
$L['xtra_department_title'] = 'Department';То вывод автоматически изменится на:
Department: IT Department
Что нужно помнить
- Никаких ручных вызовов
cot_langfile()в шаблоне — языковой файл плагина уже загружен глобально (черезxtradbrowusers.global.php). - Если вы добавляете переводы в тему, они подхватятся автоматически, потому что файл темы загружается позже и дополняет/переопределяет массив
$L. - Значения, для которых нет перевода, отображаются «как есть» (например,
IT). Это нормально и позволяет постепенно добавлять локализацию.
Таким образом, вся локализация уже встроена в теги, и шаблоны остаются чистыми и не зависят от конкретного языка.
Пошаговая установка плагина
Шаг 1: Получение файлов плагина
Скачайте последнюю версию плагина xtradbrowusers из официального репозитория GitHub. На странице релизов выберите архив xtradbrowusers.zip и сохраните его на свой компьютер.
Шаг 2: Загрузка на сервер
Распакуйте архив — внутри находится папка xtradbrowusers со всеми файлами. Загрузите её в директорию plugins/ вашего сайта на Cotonti.
Проверьте, что файл xtradbrowusers.setup.php доступен по пути:
/plugins/xtradbrowusers/xtradbrowusers.setup.php.
Права доступа должны позволять веб-серверу читать файлы и создавать папки (стандартные 0755 для директорий и 0644 для файлов подходят).
Шаг 3: Установка через панель администратора
- Войдите в административную панель Cotonti.
- Перейдите в раздел «Расширения» (обычно пункт «Extensions» или «Расширения» в главном меню админки). В зависимости от настроек сайта URL может выглядеть как
/admin/extensions,/ru/admin/extensionsилиadmin.php?m=extensions. - Найдите в списке плагинов «Custom Extrafields Users» (код
xtradbrowusers). Если плагин не отображается, убедитесь, что файлы загружены в правильную папку и сервер их видит. - Нажмите кнопку «Установить» напротив названия плагина.
Система автоматически выполнит:
- Регистрацию плагина в таблице
cot_core. - Создание прав доступа в
cot_authдля всех групп пользователей. - Запуск
setup/xtradbrowusers.install.sql— будет создана таблицаcot_xtradbrowusersс внешним ключом кcot_users. - Запуск
setup/xtradbrowusers.install.php— добавится 15 демонстрационных полей и появится папкаdatas/exflds/xtradbrowusersдля загружаемых файлов. - Сканирование всех файлов плагина и регистрацию хуков в таблице
cot_plugins.
После успешной установки вы увидите подтверждающее сообщение.
Шаг 4: Проверка
После установки:
- Зайдите в «Администрирование → Расширения → Экстраполя».
- В выпадающем списке таблиц выберите
cot_xtradbrowusers — Custom Extrafields Users. Вы увидите 15 готовых к использованию полей. - Можете сразу открыть профиль любого пользователя для редактирования (например,
/users/1?m=edit) — в форме появятся все добавленные поля.
Дополнительная настройка через cot_config не требуется, плагин работает сразу после установки.
Демонстрационные поля, создаваемые при установке
Ниже перечислены все 15 полей, автоматически добавляемые плагином в таблицу cot_xtradbrowusers. Они охватывают все основные типы экстраполей Cotonti и служат наглядным примером.
| Имя поля | Тип | Назначение / Описание |
|---|---|---|
phone_extra |
input |
Дополнительный телефон (обычное текстовое поле) |
about_extra |
textarea |
О себе (многострочный текст) |
hire_date |
datetime |
Дата найма (выбор дня, месяца, года, часов, минут; по умолчанию 26.04.2024 00:00) |
salary |
double |
Зарплата (число с плавающей точкой, по умолчанию 0.00) |
department |
select |
Отдел (выпадающий список: Не указан, IT, Маркетинг, Продажи, Поддержка) |
experience_years |
inputint |
Стаж в годах (целое число, по умолчанию 0) |
skill_level |
select |
Уровень квалификации (Junior, Middle, Senior, Lead) |
has_car |
radio |
Наличие автомобиля (радиокнопки: Yes / No, по умолчанию No) |
last_promotion |
datetime |
Дата последнего повышения (аналогично hire_date) |
resume_file |
file |
Резюме (загрузка файла, разрешённые расширения: jpg, png, pdf, zip) |
residence_country |
country |
Страна проживания (выпадающий список всех стран, по умолчанию Украина) |
english_level |
range |
Уровень английского (число от 0 до 100, отображается как выпадающий список, по умолчанию 50) |
interests |
checklistbox |
Интересы (множественный выбор: Спорт, Музыка, IT, Путешествия; по умолчанию выбран IT) |
work_schedule |
select |
График работы (Полный день, Сменный, Удалёнка, Гибкий) |
emergency_contact |
input |
Экстренный контакт (текстовое поле) |
Все поля необязательны для заполнения, и их можно свободно редактировать или удалять через стандартный интерфейс экстраполей.
Часть 10: Практические примеры вывода демонстрационных полей в шаблонах
После установки плагина у вас есть 15 готовых полей. Чтобы убедиться, что всё работает, и увидеть их в действии, можно вставить минимальный код в каждый из основных шаблонов. Ниже показано, как вывести поля interests (чекбоксы), work_schedule (выпадающий список) и hire_date (дата) в каждом контексте. Примеры легко адаптировать для любых других полей.
1. Форма редактирования администратором (users.edit.tpl)
В этом шаблоне поля отображаются как элементы ввода (select, input и т.д.) с текущими значениями пользователя. Теги: USERS_EDIT_XTRA_ИМЯПОЛЯ, USERS_EDIT_XTRA_ИМЯПОЛЯ_TITLE.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_edit_tpl_title}</h4>
</div>
<div class="card-body">
<!-- IF {USERS_EDIT_XTRA_WORK_SCHEDULE} -->
<div class="mb-3">
<label class="form-label">{USERS_EDIT_XTRA_WORK_SCHEDULE_TITLE}:</label>
{USERS_EDIT_XTRA_WORK_SCHEDULE}
</div>
<!-- ENDIF -->
<!-- IF {USERS_EDIT_XTRA_INTERESTS} -->
<div class="mb-3">
<label class="form-label">{USERS_EDIT_XTRA_INTERESTS_TITLE}:</label>
{USERS_EDIT_XTRA_INTERESTS}
</div>
<!-- ENDIF -->
<!-- IF {USERS_EDIT_XTRA_HIRE_DATE} -->
<div class="mb-3">
<label class="form-label">{USERS_EDIT_XTRA_HIRE_DATE_TITLE}:</label>
{USERS_EDIT_XTRA_HIRE_DATE}
</div>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->Пояснение:
- Каждое поле проверяется на существование (тег не пуст).
USERS_EDIT_XTRA_WORK_SCHEDULEсодержит готовый<select>с вариантами,USERS_EDIT_XTRA_INTERESTS– группу чекбоксов,USERS_EDIT_XTRA_HIRE_DATE– набор select’ов для даты.
2. Форма редактирования профиля пользователем (users.profile.tpl)
Аналогично админке, но с префиксом USERS_PROFILE_XTRA_.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_profile_tpl_title}</h4>
</div>
<div class="card-body">
<!-- IF {USERS_PROFILE_XTRA_WORK_SCHEDULE} -->
<div class="mb-3">
<label class="form-label">{USERS_PROFILE_XTRA_WORK_SCHEDULE_TITLE}:</label>
{USERS_PROFILE_XTRA_WORK_SCHEDULE}
</div>
<!-- ENDIF -->
<!-- IF {USERS_PROFILE_XTRA_INTERESTS} -->
<div class="mb-3">
<label class="form-label">{USERS_PROFILE_XTRA_INTERESTS_TITLE}:</label>
{USERS_PROFILE_XTRA_INTERESTS}
</div>
<!-- ENDIF -->
<!-- IF {USERS_PROFILE_XTRA_HIRE_DATE} -->
<div class="mb-3">
<label class="form-label">{USERS_PROFILE_XTRA_HIRE_DATE_TITLE}:</label>
{USERS_PROFILE_XTRA_HIRE_DATE}
</div>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->3. Публичный профиль (users.details.tpl)
Здесь поля выводятся как отформатированные значения (не редактируемые). Теги: USERS_DETAILS_XTRA_ИМЯПОЛЯ (форматированное), _VALUE (сырое), _TITLE.
Для даты удобно использовать _VALUE и фильтр cot_date.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_details_tpl_title}</h4>
</div>
<div class="card-body">
<!-- IF {USERS_DETAILS_XTRA_WORK_SCHEDULE} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_WORK_SCHEDULE_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_WORK_SCHEDULE}</span>
</div>
<!-- ENDIF -->
<!-- IF {USERS_DETAILS_XTRA_INTERESTS} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_INTERESTS_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_INTERESTS}</span>
</div>
<!-- ENDIF -->
<!-- IF {USERS_DETAILS_XTRA_HIRE_DATE} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_HIRE_DATE_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_HIRE_DATE_VALUE|cot_date('d.m.Y H:i', $this)}</span>
</div>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->Пояснение:
USERS_DETAILS_XTRA_WORK_SCHEDULEпоказывает уже переведённое значение (если настроена локализация).USERS_DETAILS_XTRA_HIRE_DATE_VALUE– это timestamp, который форматируется в читаемую дату черезcot_date. Шаблонd.m.Y H:iможно менять по желанию.
4. Список пользователей (users.tpl)
В каждой карточке пользователя доступны теги с префиксом USERS_ROW_XTRA_. Можно вывести только ключевые поля, чтобы не перегружать карточку.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_ROW_XTRA_WORK_SCHEDULE} -->
<div class="mb-1">
<small class="text-muted">{USERS_ROW_XTRA_WORK_SCHEDULE_TITLE}: {USERS_ROW_XTRA_WORK_SCHEDULE}</small>
</div>
<!-- ENDIF -->
<!-- IF {USERS_ROW_XTRA_INTERESTS} -->
<div class="mb-1">
<small class="text-muted">{USERS_ROW_XTRA_INTERESTS}</small>
</div>
<!-- ENDIF -->
<!-- IF {USERS_ROW_XTRA_HIRE_DATE} -->
<div class="mb-1">
<small class="text-muted">{USERS_ROW_XTRA_HIRE_DATE_TITLE}: {USERS_ROW_XTRA_HIRE_DATE_VALUE|cot_date('d.m.Y', $this)}</small>
</div>
<!-- ENDIF -->
<!-- ENDIF -->Этот блок можно вставить внутри цикла <!-- BEGIN: USERS_ROW --> после имени или группы.
5. Форма регистрации (users.register.tpl)
При регистрации поля пусты, но пользователь может сразу заполнить их. Используем префикс USERS_REGISTER_XTRA_.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card bg-light mb-4">
<div class="card-body">
<h6 class="card-title">{PHP.L.xtradbrowusers_register_title}</h6>
<div class="mb-3">
<label>{USERS_REGISTER_XTRA_WORK_SCHEDULE_TITLE}:</label>
{USERS_REGISTER_XTRA_WORK_SCHEDULE}
</div>
<div class="mb-3">
<label>{USERS_REGISTER_XTRA_INTERESTS_TITLE}:</label>
{USERS_REGISTER_XTRA_INTERESTS}
</div>
<div class="mb-3">
<label>{USERS_REGISTER_XTRA_HIRE_DATE_TITLE}:</label>
{USERS_REGISTER_XTRA_HIRE_DATE}
</div>
</div>
</div>
<!-- ENDIF -->После успешной отправки формы все введённые значения сохранятся в cot_xtradbrowusers и станут доступны в других шаблонах.
Важное замечание
Во всех примерах сначала проверяется активность плагина (cot_plugin_active), а затем наличие конкретного поля (например, <!-- IF {USERS_EDIT_XTRA_WORK_SCHEDULE} -->). Это гарантирует, что при отключении плагина или удалении поля вёрстка не сломается. Теперь вы можете использовать эти примеры как основу и добавлять любые другие поля из своего набора.
Часть 11: Групповой (циклический) вывод всех дополнительных полей
Когда количество экстраполей измеряется десятками, перечислять каждое поле в шаблоне по отдельности становится неудобно. Плагин xtradbrowusers позволяет вывести сразу все активные дополнительные поля одной компактной конструкцией — циклом <!-- BEGIN: XTRA_EXTRAFLD -->. Этот механизм работает во всех шаблонах, куда плагин уже интегрирован, и не требует настройки каждого поля.
Как это работает
Каждый файл-обработчик хука (например, users.profile.tags.php) внутри цикла по всем экстраполям плагина назначает пару универсальных тегов:
{..._XTRA_EXTRAFLD}— HTML-код текущего поля (input, select, textarea и т.п.){..._XTRA_EXTRAFLD_TITLE}— локализованное название этого поля
Эти теги обновляются на каждой итерации, а шаблонный цикл <!-- BEGIN: XTRA_EXTRAFLD --> проходит по всем полям и выводит их последовательно. Префикс тегов зависит от контекста (шаблона):
| Шаблон | Префикс тегов |
|---|---|
users.edit.tpl |
USERS_EDIT_XTRA_ |
users.profile.tpl |
USERS_PROFILE_XTRA_ |
users.details.tpl |
USERS_DETAILS_XTRA_ |
users.register.tpl |
USERS_REGISTER_XTRA_ |
users.tpl (список) |
USERS_ROW_XTRA_ |
Правила интеграции
- Проверка активности плагина — обязательна, как и при индивидуальном выводе.
- Цикл размещается в том месте шаблона, где вы хотите видеть все дополнительные поля подряд.
- Внутри цикла можно использовать любую HTML-разметку, а также проверять, не пустое ли текущее поле:
<!-- IF {USERS_EDIT_XTRA_EXTRAFLD} -->. - Если какое-то поле отключено или удалено администратором, оно просто перестаёт выводиться — править шаблоны не нужно.
Примеры для каждого шаблона
1. Редактирование администратором (users.edit.tpl)
Вставьте блок, например, перед кнопкой «Сохранить»:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_edit_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_EDIT_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_EDIT_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Результат: все дополнительные поля пользователя отобразятся одно за другим внутри карточки. Администратор может заполнить/изменить значения и сохранить их.
2. Редактирование профиля пользователем (users.profile.tpl)
Аналогичный код, но с префиксом USERS_PROFILE:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card border-0 shadow-sm mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_profile_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label fw-semibold">{USERS_PROFILE_XTRA_EXTRAFLD_TITLE}:</label>
<div>{USERS_PROFILE_XTRA_EXTRAFLD}</div>
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->3. Публичный профиль (users.details.tpl)
Здесь выводятся уже сохранённые значения (не формы ввода). Можно добавить проверку на пустоту, чтобы не показывать незаполненные поля:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card mb-4">
<div class="card-header">
<h4>{PHP.L.xtradbrowusers_details_tpl_title}</h4>
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<!-- IF {USERS_DETAILS_XTRA_EXTRAFIELD_VALUE} -->
<div class="mb-3">
<strong>{USERS_DETAILS_XTRA_EXTRAFIELD_TITLE}:</strong>
<span>{USERS_DETAILS_XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- ENDIF -->
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Пояснение: теги USERS_DETAILS_XTRA_EXTRAFIELD_VALUE и USERS_DETAILS_XTRA_EXTRAFIELD_TITLE созданы специально для страницы просмотра. Они содержат готовое значение поля и его название.
4. Список пользователей (users.tpl)
В карточке каждого пользователя можно вывести все его дополнительные поля компактной строкой или списком. Важно: теги здесь имеют префикс USERS_ROW_, а цикл работает внутри блока <!-- BEGIN: USERS_ROW -->.
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="mt-2 small text-muted">
<!-- BEGIN: XTRA_EXTRAFLD -->
<!-- IF {USERS_ROW_XTRA_EXTRAFLD} -->
<div>{USERS_ROW_XTRA_EXTRAFLD_TITLE}: {USERS_ROW_XTRA_EXTRAFLD}</div>
<!-- ENDIF -->
<!-- END: XTRA_EXTRAFLD -->
</div>
<!-- ENDIF -->Такой блок размещают внутри карточки пользователя, сразу после основных данных (имени, группы).
5. Форма регистрации (users.register.tpl)
Новые пользователи могут сразу заполнить дополнительные поля при регистрации:
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<div class="card bg-light mb-4">
<div class="card-body">
<h6 class="card-title">{PHP.L.xtradbrowusers_register_title}</h6>
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label small">{USERS_REGISTER_XTRA_EXTRAFLD_TITLE}:</label>
{USERS_REGISTER_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Понял, исправляю текст с учётом реальной архитектуры плагина. В списке пользователей (users.tpl) у нас нет группового цикла — только индивидуальные теги USERS_ROW_XTRA_.... Поэтому рекомендации нужно скорректировать.
Вот исправленный фрагмент (заменяет раздел «Важно: нельзя смешивать…» и «Рекомендации по организации шаблонов»):
Важно: нельзя смешивать индивидуальный и групповой вывод в одном шаблоне формы
В формах редактирования (edit, profile, register) недопустимо одновременно использовать индивидуальный вывод конкретных полей и групповой цикл. Причина техническая: если одно и то же поле (например, interests) выведено дважды, в HTML окажутся два элемента с одинаковым именем (rxtra_interests[]). При отправке формы браузер передаст значения из последнего встреченного элемента, что приведёт к потере данных или непредсказуемому результату.
Для форм рекомендуется выбрать один способ:
- Групповой (цикл) — идеален для стандартного отображения всех полей, когда не нужна особая вёрстка. Просто вставляете блок с
<!-- BEGIN: XTRA_EXTRAFLD -->, и все поля выводятся автоматически. - Индивидуальный — подходит, если требуется уникальное оформление определённых полей. В этом случае вы выводите каждое нужное поле индивидуальным тегом, а групповой блок не используете.
В публичных шаблонах, где нет отправки форм (details.tpl, users.tpl), дублирование не вызовет проблем с данными, но для читаемости кода его тоже следует избегать.
Рекомендации по организации шаблонов
-
Формы редактирования (edit, profile, register): если вы часто добавляете или удаляете поля в админке, используйте только групповой цикл — шаблон не придётся править. Если же вам нужна особая вёрстка для некоторых полей, переходите на индивидуальный вывод всех нужных полей (без цикла).
-
Публичная страница профиля (
users.details.tpl): здесь допустимы оба подхода. Цикл удобен, чтобы быстро отобразить все заполненные поля списком. Индивидуальный вывод незаменим, когда требуется кастомизация: флаги стран, прогресс-бары, ссылки на файлы. Для индивидуального вывода используйте тегиUSERS_DETAILS_XTRA_.... -
Список пользователей (
users.tpl): в этом шаблоне плагин предоставляет только индивидуальные тегиUSERS_ROW_XTRA_...для каждого поля. Группового цикла здесь нет, потому что каждая карточка пользователя обычно требует особого оформления. Выводите нужные поля по отдельности. -
Всегда проверяйте активность плагина (
cot_plugin_active) и (при желании) наличие значения, чтобы избежать пустых блоков. Код плагина не привязан к конкретной теме и будет работать в любой теме, использующей стандартные шаблоны Cotonti.
Поддержка и обратная связь
Плагин xtradbrowusers распространяется бесплатно с открытым исходным кодом под лицензией BSD. Вы можете свободно использовать его в любых проектах, а также дорабатывать и распространять с сохранением копирайта.
Источники помощи и документации
-
Форум поддержки плагина — задать вопрос, сообщить об ошибке или предложить идею:
abuyfile.com/ru/forums/cotonti/custom/plugs/xtradbrowusers -
Форум по API Extrafields в Cotonti — официальные обсуждения, примеры и решения по работе экстраполей:
abuyfile.com/ru/forums/cotonti/original/extrafields -
GitHub Issues — баг-трекер и запросы новых функций:
github.com/webitproff/xtradbrowusers-cotonti/issues -
Исходный код и документация API Extrafields (встроено в Cotonti):
github.com/Cotonti/Cotonti/blob/master/system/extrafields.php
Поддержать автора
Если плагин оказался полезным для вашего проекта, вы можете отблагодарить автора:
- Добровольное пожертвование — любая сумма поможет выделять больше времени на развитие и поддержку.
- Заказ индивидуальной доработки — вы можете нанять автора для создания специфического функционала под ваши задачи.
Контактная информация и способы связи указаны на странице:
github.com/webitproff
Присоединяйтесь к сообществу
Ваши отзывы, предложения и сообщения об ошибках — главный стимул делать плагин лучше. Не стесняйтесь делиться опытом, задавать вопросы и участвовать в развитии проекта. Вместе мы делаем Cotonti удобнее и мощнее.
Последнее обновление: 16 июля 2026
Версия плагина: 1.0.0