Инструкция: вывод имени и ссылки на профиль пользователя в Cotonti
В этой инструкции описано, как получить данные о пользователе (текущем или владельце любой сущности) и передать их в шаблон в виде трёх готовых тегов:
{PREFIX_OWNER}– готовая HTML‑ссылка на профиль с именем владельца.{PREFIX_OWNER_URL}– чистый URL профиля (без тега<a>).{PREFIX_OWNER_NAME}– просто никнейм (без ссылки).
Инструкция универсальна, основана на фасаде Cot и подходит для любых модулей и плагинов Cotonti 1.0+.
1. Подготовка PHP‑файла
1.1. Подключение пространства имён (опционально)
Если вы используете встроенный репозиторий пользователей, добавьте в начало файла:
use cot\users\UsersRepository;Если вы предпочитаете прямой запрос через Cot::$db, это подключение не требуется.
1.2. Определение ID пользователя
Для текущего авторизованного пользователя
Данные доступны через фасад Cot::$usr:
$userId = Cot::$usr['id']; // 0 для гостя
$userName = Cot::$usr['name']; // имя уже есть, но для единообразия можно переопределитьДля владельца сущности (страницы, товара, записи и т.п.)
У вас есть массив с данными сущности, например $item, $page, $topic. В нём хранится поле с ID владельца. Название поля может быть разным:
- Страницы:
page_ownerid - Товары MarketPro:
fieldmrkt_ownerid - Комментарии:
com_authorid - Темы форума:
ft_firstposteridи т.д.
Замените {FIELD}_ownerid на реальное имя поля:
$userId = isset($item['{FIELD}_ownerid']) ? (int)$item['{FIELD}_ownerid'] : 0;Примеры:
// Для страниц
$userId = isset($page['page_ownerid']) ? (int)$page['page_ownerid'] : 0;
// Для товаров MarketPro
$userId = isset($item['fieldmrkt_ownerid']) ? (int)$item['fieldmrkt_ownerid'] : 0;1.3. Получение имени пользователя
Способ А (рекомендуемый) – через UsersRepository
Этот способ использует встроенный репозиторий, который кэширует результат.
$userInfo = null;
if ($userId > 0) {
$userInfo = UsersRepository::getInstance()->getById($userId);
}
$userName = ($userInfo && isset($userInfo['user_name'])) ? $userInfo['user_name'] : Cot::$L['Deleted'];Способ Б – прямой запрос через фасад Cot::$db
Подходит, если вы не хотите подключать UsersRepository:
$userName = Cot::$L['Deleted'];
if ($userId > 0) {
$row = Cot::$db->query("SELECT user_name FROM " . Cot::$db->users . " WHERE user_id = ?", $userId)->fetch();
if ($row && isset($row['user_name'])) {
$userName = $row['user_name'];
}
}В обоих случаях, если пользователь не найден, подставляется языковая строка «Удалён» (Cot::$L['Deleted']).
1.4. Формирование трёх тегов
Теперь создайте три переменные для передачи в шаблон:
// Безопасное экранирование для HTML и URL
$safeName = htmlspecialchars($userName, ENT_QUOTES, 'UTF-8');
// Ссылка на профиль (URL)
$profileUrl = cot_url('users', [
'm' => 'details',
'id' => $userId,
'u' => $safeName, // добавляем имя для ЧПУ
]);
// Готовая HTML-ссылка
$profileLink = ($userId > 0 && $userName !== Cot::$L['Deleted'])
? cot_rc_link($profileUrl, $safeName)
: $safeName; // если пользователь удалён, выводим только текст
// Просто имя (уже экранировано)
$userNamePlain = $safeName;1.5. Передача в шаблон
В зависимости от структуры вашего кода, используйте один из способов.
Способ А – через массив (как в MarketPro)
Если вы собираете массив данных для шаблона, добавьте ключи:
$itemedit_array = [
// ... другие поля
'{PREFIX}_OWNER' => $profileLink,
'{PREFIX}_OWNER_URL' => $profileUrl,
'{PREFIX}_OWNER_NAME'=> $userNamePlain,
];
$t->assign($itemedit_array);Замените {PREFIX} на уникальный префикс вашего модуля (например, PAGE_ROW, FORUM_TOPIC, MARKETEDIT_FORM).
Способ Б – прямой assign
$t->assign([
'{PREFIX}_OWNER' => $profileLink,
'{PREFIX}_OWNER_URL' => $profileUrl,
'{PREFIX}_OWNER_NAME'=> $userNamePlain,
]);2. Использование в шаблоне (TPL)
В вашем .tpl-файле теги будут выглядеть так (замените PREFIX на реальный префикс):
<!-- Готовая ссылка -->
<p>Владелец: {PREFIX_OWNER}</p>
<!-- Только URL -->
<a href="{PREFIX_OWNER_URL}" target="_blank">Открыть профиль</a>
<!-- Только имя -->
<span>{PREFIX_OWNER_NAME}</span>Пример из MarketPro (уже есть в вашем шаблоне):
<div class="alert alert-info">
<p class="fw-semibold">{PHP.L.market_form_owner}
<a href="{MARKETEDIT_FORM_OWNER_URL}" target="_blank">{MARKETEDIT_FORM_OWNER_NAME}</a>
</p>
<small class="form-text text-muted">{PHP.L.market_form_owner_hint}</small>
</div>3. Полный пример кода для вашего любого плагина под модуль страниц (Page)
PHP (в контроллере или обработчике):
use cot\users\UsersRepository;
// $page – массив с данными страницы
$userId = isset($page['page_ownerid']) ? (int)$page['page_ownerid'] : 0;
$userInfo = ($userId > 0) ? UsersRepository::getInstance()->getById($userId) : null;
$userName = ($userInfo && isset($userInfo['user_name'])) ? $userInfo['user_name'] : Cot::$L['Deleted'];
$safeName = htmlspecialchars($userName);
$profileUrl = cot_url('users', ['m' => 'details', 'id' => $userId, 'u' => $safeName]);
$profileLink = ($userId > 0 && $userName !== Cot::$L['Deleted']) ? cot_rc_link($profileUrl, $safeName) : $safeName;
$t->assign([
'PAGE_ROW_OWNER' => $profileLink,
'PAGE_ROW_OWNER_URL' => $profileUrl,
'PAGE_ROW_OWNER_NAME' => $safeName,
]);Шаблон (page.tpl):
<div class="page-author">
Автор: {PAGE_ROW_OWNER} (ник: {PAGE_ROW_OWNER_NAME})
<a href="{PAGE_ROW_OWNER_URL}">Профиль</a>
</div>4. Особые случаи
4.1. Текущий пользователь
Если нужен текущий авторизованный пользователь, данные уже есть в Cot::$usr:
$userId = Cot::$usr['id'];
$userName = Cot::$usr['name'];
$safeName = htmlspecialchars($userName);
$profileUrl = cot_url('users', ['m' => 'details', 'id' => $userId, 'u' => $safeName]);
$profileLink = cot_rc_link($profileUrl, $safeName);4.2. Обработка гостя
Если пользователь не авторизован ($userId == 0), ссылку можно не создавать или вести на страницу входа:
if ($userId > 0) {
$profileUrl = cot_url('users', ['m' => 'details', 'id' => $userId, 'u' => $safeName]);
$profileLink = cot_rc_link($profileUrl, $safeName);
} else {
$profileUrl = cot_url('users', ['m' => 'login']);
$profileLink = cot_rc_link($profileUrl, Cot::$L['Login']);
}5. Важные замечания
- Безопасность: всегда экранируйте имена через
htmlspecialchars(), чтобы избежать XSS. - Производительность:
UsersRepositoryкэширует запросы, используйте его предпочтительно. - Отсутствие пользователя: всегда проверяйте, что данные получены, и подставляйте значение по умолчанию (например,
Cot::$L['Deleted']). - Префиксы: выбирайте уникальные префиксы для тегов, чтобы не конфликтовать с другими модулями.
- Фасад Cot: все глобальные переменные (
$cfg,$db,$usr,$L) доступны черезCot::$...безglobal. Это делает код чище.
6. Заключение
Следуя этой инструкции, вы сможете в любом модуле или плагине Cotonti получить имя пользователя (владельца или текущего) и передать в шаблон три удобных тега: готовую ссылку, чистый URL и просто имя. Используйте фасад Cot и UsersRepository для надёжного и производительного кода.