Категории форума

Инструкция: вывод в шаблон имени и ссылки на профиль пользователя в Cotonti

В этой инструкции описано, как получить данные о пользователе (текущем или владельце любой сущности) и передать их в шаблон в виде трёх готовых тегов

webitproff
webitproff • 07.09.2026 15:15 #591

Инструкция: вывод имени и ссылки на профиль пользователя в 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 для надёжного и производительного кода.

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.