Подробное описание файла market.userdetails.php
1. Общая информация
Параметр Значение Имя файла market.userdetails.php Расположение modules/market/market.userdetails.php Хук Cotonti users.details.tags Когда вызывается При открытии страницы профиля пользователя (users.php?m=details) Что делает Рендерит вкладку «Товары» в профиле пользователя Язык PHP 8.5+ Зависимости Модуль market, класс MarketDictionary, XTemplate, таблицы cot_market, cot_structure Версия 5.7.9
2. Структура файла
Файл состоит из трёх логических частей:
Часть A. Инициализация (строки 1–50)
- Защита от прямого вызова:
defined('COT_CODE') or die('Wrong URL'). - Подключение класса статусов:
use cot\modules\market\inc\MarketDictionary. - Подключение API модуля Market:
require_once cot_incfile('market', 'module'). - Чтение настроек количества товаров на страницу из
$cfg['market']['cat___default']:- сначала
marketmaxlistsperpageincat; - потом
marketmaxlistsperpage; - fallback = 10.
- сначала
Часть B. AJAX-ветка (строки ~52–210)
Срабатывает, если в GET есть ajax=1. Возвращает JSON, а не HTML страницы.
Порядок действий:
- Импорт
tab,cat,dmarketиз GET. - Формирование условий
$whereи$order:- фильтр статуса — только опубликованные, если смотрит не владелец и не админ;
- фильтр категории — если задан
cat; - фильтр владельца —
fieldmrkt_ownerid = $urr['user_id']; - сортировка —
fieldmrkt_date DESC.
- Хук
market.userdetails.query— плагины могут изменить условия. - SQL-запрос общего количества и постраничной выборки (
LIMIT $d, $perpageincat). - Если товаров нет —
echo json_encode(['rows' => '', 'pagination' => ''])иexit. - Генерация тегов для каждой строки товара через
cot_generate_markettags($item_data, 'MARKET_ROW_', ...). - Перезапись тега
{MARKET_ROW_ADMIN_DELETE_URL}— добавляется CSRF-токен,delete=1,redirectобратно в профиль. - Хук
market.userdetails.loop— плагины могут добавить свои теги. - Парсинг блока
MAIN.MARKET_ROWSв отдельномXTemplate. - Получение HTML списка товаров через
$ajax_tpl->text('MAIN.MARKET_ROWS'). - Генерация пагинации через
cot_pagenav()и парсингpagination.tpl. - Отправка JSON-ответа:
echo json_encode(['rows' => $rows_html, 'pagination' => $pagination_html]).
Часть C. Основная логика (строки ~212–конец)
Срабатывает при обычном открытии страницы профиля. Возвращает HTML вкладки, который вставляется в {MARKET} основного шаблона.
Порядок действий:
- Получение прав пользователя:
cot_auth('market', 'any', 'RWA')→$usr['auth_read'],$usr['auth_write'],$usr['isadmin']. - Импорт
tab,catиз GET. - Импорт пагинации
dmarket→$pg,$d,$durl. - Создание
XTemplateизuserdetails.tpl. - Присвоение базовых тегов вкладки:
{MARKET_ADD_URL},{MARKET_ADD_SHOWBUTTON},{MARKET_TAB_URL}. - Формирование условий
$whereи$order(аналогично AJAX-ветке). - Создание
$wherecount— копии без фильтра категории (для подсчёта по категориям). - Хук
market.userdetails.query— плагины могут изменить условия. - SQL-запрос количества товаров по категориям (
GROUP BY fieldmrkt_cat). - SQL-запрос общего количества товаров пользователя.
- Присвоение тегов подгрузки:
{LOAD_MORE_URL},{LOAD_MORE_PERPAGE},{LOAD_MORE_TOTALPAGES},{LOAD_MORE_CURRENTPAGE},{LOAD_MORE_LANG}. - SQL-запрос списка товаров текущей страницы.
- Цикл по категориям — присвоение и парсинг блока
MAIN.CAT_ROW. - Генерация пагинации и присвоение
cot_generatePaginationTags(). - Цикл по товарам — генерация тегов, хук
market.userdetails.loop, парсингMAIN.MARKET_ROWS. - Хук
market.userdetails.tags— плагины могут добавить свои теги. - Парсинг
MAINшаблона вкладки. - Присвоение в основной шаблон
$t:{MARKET},{USERS_DETAILS_MARKET_COUNT},{USERS_DETAILS_MARKET_URL}.
3. Какие хуки внутри файла
Хук Строка Назначение market.userdetails.query В AJAX-ветке и в основной Плагины могут менять SQL-условия выборки товаров market.userdetails.loop В цикле по товарам Плагины могут добавлять теги к текущему товару market.userdetails.tags После цикла Плагины могут добавлять теги всей вкладки
4. Какие шаблоны использует
Файл Назначение modules/market/market.userdetails.tpl Шаблон вкладки «Товары»: список категорий, список товаров, пагинация, кнопка подгрузки modules/market/market.pagination.tpl Шаблон блока пагинации, используется только для AJAX-ответа themes/<тема>/users.tpl Главный шаблон профиля пользователя, куда вставляется {MARKET}
5. Какие данные ходит в БД
Таблица Что читает/пишет cot_market SELECT — список товаров пользователя, счётчики по категориям cot_structure SELECT — названия и иконки категорий (structure_area = 'market') cot_users JOIN — данные владельца для генерации тегов владельца
6. Порядок исполнения в контексте Cotonti
- Пользователь открывает
/users/userNickName/tab/market. - Cotonti разбирает URL через
urleditor, получаетe=users,m=details,u=userNickName,tab=market. - Модуль
usersвызываетusers.details.tags. - Движок подключает все файлы, зарегистрированные на
users.details.tags, включаяmarket.userdetails.php. - Файл формирует HTML вкладки и присваивает его в
{MARKET}. users.tplпарсится, в месте{MARKET}подставляется HTML вкладки.- Ответ отдаётся пользователю.
Подробное описание таблицы тегов
1. Что это за таблица
Это справочник всех шаблонных тегов XTemplate, которые файл market.userdetails.php передаёт в шаблоны. Она нужна разработчику темы, чтобы знать:
- какие теги существуют;
- что каждый тег выводит;
- где тег присваивается в PHP;
- в каком шаблоне и в каком блоке тег работает.
| Тег | Описание | Источник | Шаблон |
|---|---|---|---|
{MARKET_ADD_URL} | URL страницы добавления нового товара в модуле Market. Формируется в PHP через cot_url('market', 'm=add'). Используется в шаблоне вкладки для кнопки «Добавить товар», чтобы пользователь с правом записи мог создать новый товар из профиля. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{MARKET_ADD_SHOWBUTTON} | Флаг (1 или пусто), показывать ли кнопку добавления товара в шаблоне вкладки. Устанавливается в 1 только если у текущего пользователя есть право записи в модуль Market ($usr['auth_write']). Пустая строка означает «не показывать кнопку». | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{MARKET_TAB_URL} | URL вкладки «Товары» в профиле пользователя. Формируется через cot_url('users', ['m' => 'details', 'id' => $urr['user_id'], 'u' => $urr['user_name'], 'tab' => 'market']). При активном urleditor получает вид /users/ElectoSTO/tab/market. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{LOAD_MORE_URL} | URL AJAX-запроса для подгрузки следующей страницы товаров без перезагрузки. Содержит параметры m=details, id=$urr['user_id'], u=$urr['user_name'], tab=market, текущий cat=$category и ajax=1. Используется JavaScript-обработчиком кнопки «Загрузить ещё». | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{LOAD_MORE_PERPAGE} | Количество товаров на страницу (число). Берётся из настроек модуля Market: marketmaxlistsperpageincat для категории по умолчанию или marketmaxlistsperpage, с fallback на 10. Применяется в JS для расчёта оставшихся страниц. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{LOAD_MORE_TOTALPAGES} | Общее число страниц товаров пользователя (с учётом фильтра по категории). Считается как ceil($market_count / $perpageincat). Применяется в JS для определения, показывать ли ещё кнопку «Загрузить ещё» после текущей порции. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{LOAD_MORE_CURRENTPAGE} | Номер текущей страницы, начиная с 1. Считается как floor($d / $perpageincat) + 1, где $d — смещение LIMIT для выборки товаров. Используется в JS для отображения прогресса «страница N из M» на кнопке подгрузки. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{LOAD_MORE_LANG} | JSON-строка с локализованными подписями для JS-обработчика кнопки «Загрузить ещё». Содержит ключи load_more, loading, error из языковых строк $L['market_load_more'], $L['market_loading'], $L['market_load_error'] с fallback на русский текст. | $t1->assign() в market.userdetails.php | modules/market/market.userdetails.tpl |
{PAGENAV_PAGES} | HTML-блок с номерами страниц пагинации товаров пользователя. Генерируется функцией cot_generatePaginationTags($pagenav) и присваивается шаблону целиком. Применяется для постраничной навигации под списком товаров вкладки. | $t1->assign(cot_generatePaginationTags()) | modules/market/market.userdetails.tpl |
{PAGENAV_PREV} | HTML-ссылка «Предыдущая страница» пагинации товаров пользователя. Генерируется через cot_generatePaginationTags($pagenav). Отображается рядом с номерами страниц, если текущая страница не первая. | $t1->assign(cot_generatePaginationTags()) | modules/market/market.userdetails.tpl |
{PAGENAV_NEXT} | HTML-ссылка «Следующая страница» пагинации товаров пользователя. Генерируется через cot_generatePaginationTags($pagenav). Отображается рядом с номерами страниц, если текущая страница не последняя. | $t1->assign(cot_generatePaginationTags()) | modules/market/market.userdetails.tpl |
{MARKET_CAT_ROW_TITLE} | Название категории товаров в блоке фильтра. Берётся из массива структуры Cot::$structure['market'][<код_категории>]['title'] по коду fieldmrkt_cat. Если категория была удалена и в структуре её нет — подставляется пустая строка без ошибки. | $t1->assign() в цикле по $sql_market_count_cat | modules/market/market.userdetails.tpl, блок CAT_ROW |
{MARKET_CAT_ROW_ICON} | Иконка (CSS-класс или путь к файлу) категории товаров в блоке фильтра. Берётся из Cot::$structure['market'][<код_категории>]['icon']. Если иконка не задана или категория удалена — пустая строка. Применяется для визуального оформления списка категорий вкладки. | $t1->assign() в цикле по $sql_market_count_cat | modules/market/market.userdetails.tpl, блок CAT_ROW |
{MARKET_CAT_ROW_URL} | URL фильтра по данной категории в профиле пользователя. Формируется через cot_url('users', ['m' => 'details', 'id' => $urr['user_id'], 'u' => $urr['user_name'], 'tab' => 'market', 'cat' => $value['fieldmrkt_cat']]). При активном urleditor принимает вид /users/ElectoSTO/tab/market/electric-scooters. | $t1->assign() в цикле по $sql_market_count_cat | modules/market/market.userdetails.tpl, блок CAT_ROW |
{MARKET_CAT_ROW_COUNT_MARKET} | Количество товаров пользователя в данной категории. Берётся из результата SQL-запроса COUNT(fieldmrkt_cat) as cat_count, сгруппированного по fieldmrkt_cat без фильтра по конкретной категории. Показывается рядом с названием категории. | $t1->assign() в цикле по $sql_market_count_cat | modules/market/market.userdetails.tpl, блок CAT_ROW |
{MARKET_CAT_ROW_SELECT} | Флаг (1 или пусто), является ли эта категория активной (выбранной) в текущем фильтре. Сравнивается $category из GET с fieldmrkt_cat. Используется для подсветки активной категории в списке. | $t1->assign() в цикле по $sql_market_count_cat | modules/market/market.userdetails.tpl, блок CAT_ROW |
{MARKET_ROW_ID} | ID товара (fieldmrkt_id). Один из тегов, генерируемых функцией cot_generate_markettags($item_data, 'MARKET_ROW_', 0, $usr['isadmin'], Cot::$cfg['homebreadcrumb']). Применяется в шаблоне строки товара вкладки, в частности для ссылок редактирования и удаления. | cot_generate_markettags() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_TITLE} | Название товара (fieldmrkt_title). Формируется функцией cot_generate_markettags($item_data, 'MARKET_ROW_', 0, $usr['isadmin'], Cot::$cfg['homebreadcrumb']). Используется как основной текст ссылки на страницу товара в списке товаров вкладки профиля. | cot_generate_markettags() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_URL} | URL страницы товара. Формируется функцией cot_generate_markettags() на основе fieldmrkt_id или fieldmrkt_alias и категории fieldmrkt_cat. Применяется в шаблоне для ссылки с названия и изображения товара. | cot_generate_markettags() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_DESC} | Краткое описание товара (fieldmrkt_desc), обрезанное до длины $cfg['market']['markettruncatetext']. Генерируется функцией cot_generate_markettags(). Используется под названием товара в списке товаров вкладки профиля. | cot_generate_markettags() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_ADMIN_DELETE} | HTML-ссылка удаления товара с JavaScript-подтверждением. Перезаписывается в market.userdetails.php через cot_rc_link($deleteConfirmUrl, Cot::$L['Delete'], 'class="confirmLink"'). Показывается только пользователям с правом удаления. | $marketTags['MARKET_ROW_ADMIN_DELETE'] = cot_rc_link() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_ADMIN_DELETE_URL} | URL удаления товара с CSRF-токеном x = Cot::$sys['xk'], параметром delete=1 и redirect обратно в профиль на ту же страницу товаров. Формируется через cot_confirm_url($deleteUrl, 'market'). Доступен только пользователям с правом удаления. | $marketTags['MARKET_ROW_ADMIN_DELETE_URL'] = cot_confirm_url() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{MARKET_ROW_<EXTRAFIELD>} | Значение любого extrafield модуля Market, сгенерированного под префиксом MARKET_ROW_. Имена зависят от настроек extrafields в таблице cot_extrafields для cot_market. Точный список — в cot_generate_markettags() в modules/market/inc/market.functions.php. | cot_generate_markettags() | modules/market/market.userdetails.tpl, блок MARKET_ROWS |
{PAGENAV_PAGES} | HTML-блок номеров страниц пагинации в AJAX-ответе. Генерируется через cot_generatePaginationTags($pagenav) в AJAX-ветке market.userdetails.php. Возвращается клиенту в JSON-поле pagination для обновления навигации после подгрузки товаров. | $pagination_tpl->assign(cot_generatePaginationTags()) | modules/market/market.pagination.tpl |
{PAGENAV_PREV} | HTML-ссылка «Предыдущая страница» в AJAX-ответе пагинации. Генерируется через cot_generatePaginationTags($pagenav). Возвращается клиенту в JSON-поле pagination вместе с номерами страниц и ссылкой «вперёд». | $pagination_tpl->assign(cot_generatePaginationTags()) | modules/market/market.pagination.tpl |
{PAGENAV_NEXT} | HTML-ссылка «Следующая страница» в AJAX-ответе пагинации. Генерируется через cot_generatePaginationTags($pagenav). Возвращается клиенту в JSON-поле pagination вместе с номерами страниц и ссылкой «назад». | $pagination_tpl->assign(cot_generatePaginationTags()) | modules/market/market.pagination.tpl |
{MARKET} | Готовый HTML всей вкладки «Товары» — результат парсинга $t1->text('MAIN'). Включает список категорий, список товаров, пагинацию, кнопки добавления и подгрузки. Вставляется в основной шаблон профиля пользователя через $t->assign('MARKET', $t1->text('MAIN')). | $t->assign('MARKET', $t1->text('MAIN')) | users.tpl |
{USERS_DETAILS_MARKET_COUNT} | Общее количество товаров пользователя без учёта фильтра по категории. Значение $market_count_all, полученное запросом SELECT COUNT(*). Применяется на странице профиля для отображения счётчика товаров рядом с названием вкладки. | $t->assign([...]) в конце market.userdetails.php | users.tpl |
{USERS_DETAILS_MARKET_URL} | URL вкладки «Товары» в профиле пользователя. Формируется через cot_url('users', ['m' => 'details', 'id' => $urr['user_id'], 'u' => $urr['user_name'], 'tab' => 'market']). Применяется в шаблоне профиля для ссылок на вкладку и кнопок перехода к товарам. | $t->assign([...]) в конце market.userdetails.php | users.tpl |
2. Колонки
Колонка Что содержит Тег Имя тега XTemplate, в фигурных скобках. Пример: {MARKET_ROW_TITLE} Описание Что тег выводит и как применяется в шаблоне Источник Имя функции или вызова в PHP, где тег присваивается Шаблон Имя файла шаблона и, если тег работает внутри цикла, имя блока XTemplate
3. Группы тегов по шаблонам
Группа 1. modules/market/market.userdetails.tpl — базовые теги (вне блоков)
Тег Что делает {MARKET_ADD_URL} URL страницы добавления нового товара {MARKET_ADD_SHOWBUTTON} Флаг, показывать ли кнопку «Добавить товар» {MARKET_TAB_URL} URL вкладки «Товары» в профиле {LOAD_MORE_URL} URL AJAX-запроса следующей страницы товаров {LOAD_MORE_PERPAGE} Количество товаров на страницу {LOAD_MORE_TOTALPAGES} Общее число страниц {LOAD_MORE_CURRENTPAGE} Номер текущей страницы {LOAD_MORE_LANG} JSON с локализованными подписями для JS {PAGENAV_PAGES} HTML номеров страниц пагинации {PAGENAV_PREV} Ссылка «Предыдущая страница» {PAGENAV_NEXT} Ссылка «Следующая страница»
Группа 2. modules/market/market.userdetails.tpl — блок CAT_ROW
Работают только внутри <!-- BEGIN: CAT_ROW --> ... <!-- END: CAT_ROW -->.
Тег Что делает {MARKET_CAT_ROW_TITLE} Название категории {MARKET_CAT_ROW_ICON} Иконка категории {MARKET_CAT_ROW_URL} URL фильтра по категории {MARKET_CAT_ROW_COUNT_MARKET} Количество товаров в категории {MARKET_CAT_ROW_SELECT} Флаг активной категории
Группа 3. modules/market/market.userdetails.tpl — блок MARKET_ROWS
Работают только внутри <!-- BEGIN: MARKET_ROWS --> ... <!-- END: MARKET_ROWS -->.
Тег Что делает {MARKET_ROW_ID} ID товара {MARKET_ROW_TITLE} Название товара {MARKET_ROW_URL} URL товара {MARKET_ROW_DESC} Краткое описание товара {MARKET_ROW_ADMIN_DELETE} HTML-ссылка удаления (для админа) {MARKET_ROW_ADMIN_DELETE_URL} URL удаления с CSRF и redirect {MARKET_ROW_X_<EXTRAFIELD>} Значения extrafields модуля Market
Группа 4. modules/market/market.pagination.tpl — AJAX-ответ
Тег Что делает {PAGENAV_PAGES} HTML номеров страниц {PAGENAV_PREV} Ссылка «Предыдущая страница» {PAGENAV_NEXT} Ссылка «Следующая страница»
Группа 5. users.tpl — главный шаблон профиля
Тег Что делает {MARKET} Готовый HTML всей вкладки «Товары» {USERS_DETAILS_MARKET_COUNT} Общее количество товаров пользователя {USERS_DETAILS_MARKET_URL} URL вкладки «Товары»
4. Как пользоваться таблицей — пошагово
Шаг 1. Откройте файл, который хотите править:
modules/market/market.userdetails.tpl— вкладка «Товары»;modules/market/market.pagination.tpl— блок пагинации;themes/<тема>/users.tpl— страница профиля.
Шаг 2. В таблице найдите строки, где колонка «Шаблон» совпадает с именем файла.
Шаг 3. Проверьте колонку «Шаблон» на наличие имени блока (CAT_ROW, MARKET_ROWS).
- Если блок не указан — тег можно вставлять в любое место шаблона.
- Если блок указан — тег работает только внутри соответствующего
<!-- BEGIN: <БЛОК> --> ... <!-- END: <БЛОК> -->.
Шаг 4. Вставьте тег в нужное место. Пример для вывода названия товара:
<a href="{MARKET_ROW_URL}">{MARKET_ROW_TITLE}</a>Шаг 5. Сохраните файл и очистите кэш Cotonti (datas/cache/*.php) через админку или файловый менеджер.
5. Что важно помнить
- Теги работают только в том шаблоне, куда они присвоены. Тег
{MARKET_ROW_TITLE}не отобразится вusers.tpl, потому что он присвоен другому XTemplate. - Теги внутри блока
CAT_ROWилиMARKET_ROWSне работают вне этого блока. Если вставить{MARKET_ROW_TITLE}вне<!-- BEGIN: MARKET_ROWS -->, он не выведется. - Теги подгрузки (
{LOAD_MORE_*}) используются JavaScript-обработчиком; их нужно вставлять вdata-*атрибуты кнопки «Загрузить ещё» или в отдельный JS-блок. - Значения extrafields зависят от настроек модуля Market в разделе Extrafields в админке. Если поле не создано, тег
{MARKET_ROW_X_<EXTRAFIELD>}не будет существовать.
6. Как использовать таблицу
Таблица описывает теги версии модуля Market, указанной в шапке market.userdetails.php (например, 5.7.9). При обновлении модуля или подключении новых плагинов с хуками market.userdetails.*:
- Откройте
modules/market/inc/market.functions.php. - Найдите функцию
cot_generate_markettags. - Сверьте список ключей массива
$tagsс колонкой «Тег». - Добавьте или удалите строки в таблице по факту.