Универсальная инструкция: получение и вывод данных владельца в Cotonti
В этой инструкции показано, как получить имя и ссылку на профиль владельца любой сущности (страницы, товара, записи и т.д.) и передать их в шаблон в виде трёх готовых тегов:
{XXX_OWNER} — готовая HTML-ссылка на профиль с именем владельца.{XXX_OWNER_URL} — чистый URL профиля (без тега <a>).{XXX_OWNER_NAME} — просто никнейм владельца.
Инструкция универсальна и подходит для любого модуля или плагина Cotonti.
1. Подготовка PHP-файла
1.1. Подключите пространство имён
В начале вашего PHP-файла (после defined('COT_CODE')) добавьте:
use cot\users\UsersRepository;
1.2. Получите ID владельца
Предположим, у вас есть массив $item с данными сущности, в котором хранится ID владельца. Название поля может быть разным (например, page_ownerid, prd_ownerid, fieldmrkt_ownerid и т.п.). Замените {ENTITY}_OWNERID на реальное имя поля.
$ownerId = isset($item['{ENTITY}_ownerid']) ? (int)$item['{ENTITY}_ownerid'] : 0;
1.3. Получите информацию о владельце
Используйте UsersRepository::getInstance()->getById() для получения данных пользователя. Если владелец не найден, подставьте значение по умолчанию (например, «Удалён»).
$ownerInfo = null;
if ($ownerId > 0) {
$ownerInfo = UsersRepository::getInstance()->getById($ownerId);
}
$ownerName = ($ownerInfo && isset($ownerInfo['user_name'])) ? $ownerInfo['user_name'] : Cot::$L['Deleted'];
1.4. Сформируйте три переменные для шаблона
$ownerLink = cot_rc_link(
cot_url('users', [
'm' => 'details',
'id' => $ownerId,
'u' => htmlspecialchars($ownerName)
]),
htmlspecialchars($ownerName)
);
$ownerUrl = cot_url('users', [
'm' => 'details',
'id' => $ownerId,
'u' => htmlspecialchars($ownerName)
]);
$ownerNamePlain = htmlspecialchars($ownerName);
1.5. Передайте переменные в шаблон
Если вы используете массив $itemedit_array или прямой вызов $t->assign(), добавьте следующие ключи:
$t->assign([
'{PREFIX}_OWNER' => $ownerLink,
'{PREFIX}_OWNER_URL' => $ownerUrl,
'{PREFIX}_OWNER_NAME'=> $ownerNamePlain,
]);
Где {PREFIX} — это префикс вашего модуля (например, MARKETEDIT_FORM, PAGE_ROW, PRD_EDIT и т.п.). Используйте тот префикс, который уже применяется для других тегов в вашем шаблоне.
2. Использование в шаблоне (TPL)
В вашем .tpl-файле вы можете использовать теги следующим образом:
<!-- Готовая ссылка на профиль с именем -->
<p>{PREFIX_OWNER}</p>
<!-- Только URL профиля -->
<a href="{PREFIX_OWNER_URL}" target="_blank">Открыть профиль</a>
<!-- Только никнейм -->
<span>{PREFIX_OWNER_NAME}</span>
Вы можете комбинировать эти теги по своему усмотрению, например:
<div class="owner-info">
Владелец: <a href="{PREFIX_OWNER_URL}" class="owner-link">{PREFIX_OWNER_NAME}</a>
</div>
3. Альтернативный вариант без UsersRepository
Если по какой-то причине вы не можете использовать UsersRepository, можно получить имя прямым запросом к базе данных:
$ownerName = Cot::$db->query(
"SELECT user_name FROM " . Cot::$db->users . " WHERE user_id = ?",
$ownerId
)->fetchColumn();
if (!$ownerName) {
$ownerName = Cot::$L['Deleted'];
}
Остальные шаги (формирование ссылок и передача в шаблон) остаются теми же.
4. Пример из модуля MarketPro
В файле market.edit.php было:
use cot\users\UsersRepository;
// ...
$owner_info = null;
if (!empty($item['fieldmrkt_ownerid'])) {
$owner_info = UsersRepository::getInstance()->getById((int)$item['fieldmrkt_ownerid']);
}
$owner_name = ($owner_info && isset($owner_info['user_name'])) ? $owner_info['user_name'] : Cot::$L['Deleted'];
// В массиве $itemedit_array:
$itemedit_array = [
// ...
'MARKETEDIT_FORM_OWNER' => cot_rc_link(
cot_url('users', ['m' => 'details', 'id' => $item['fieldmrkt_ownerid'], 'u' => htmlspecialchars($owner_name)]),
htmlspecialchars($owner_name)
),
'MARKETEDIT_FORM_OWNER_URL' => cot_url('users', ['m' => 'details', 'id' => $item['fieldmrkt_ownerid'], 'u' => htmlspecialchars($owner_name)]),
'MARKETEDIT_FORM_OWNER_NAME' => htmlspecialchars($owner_name),
// ...
];
В шаблоне market.edit.tpl используется {MARKETEDIT_FORM_OWNER_URL} и {MARKETEDIT_FORM_OWNER_NAME}.
5. Важные замечания
- Безопасность: всегда экранируйте имя пользователя с помощью
htmlspecialchars() для предотвращения XSS. - Обработка отсутствующего пользователя: всегда проверяйте, что пользователь существует, иначе подставляйте значение по умолчанию (например, «Удалён»).
- Префиксы: убедитесь, что префикс тегов (
PREFIX_) совпадает с тем, что используется в вашем шаблоне для остальных полей. - Производительность:
UsersRepository::getInstance()->getById() кэширует результат, поэтому многократные вызовы в пределах одного запроса не приведут к лишним запросам к БД.
Следуя этой инструкции, вы сможете легко добавить вывод информации о владельце в любой модуль Cotonti.