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

Tab "вкладка товаров" на странице профиля пользователя

webitproff
webitproff • 13.09.2026 00:43 #596

Подробное описание файла 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 страницы.

Порядок действий:

  1. Импорт tab, cat, dmarket из GET.
  2. Формирование условий $where и $order:
    • фильтр статуса — только опубликованные, если смотрит не владелец и не админ;
    • фильтр категории — если задан cat;
    • фильтр владельца — fieldmrkt_ownerid = $urr['user_id'];
    • сортировка — fieldmrkt_date DESC.
  3. Хук market.userdetails.query — плагины могут изменить условия.
  4. SQL-запрос общего количества и постраничной выборки (LIMIT $d, $perpageincat).
  5. Если товаров нет — echo json_encode(['rows' => '', 'pagination' => '']) и exit.
  6. Генерация тегов для каждой строки товара через cot_generate_markettags($item_data, 'MARKET_ROW_', ...).
  7. Перезапись тега {MARKET_ROW_ADMIN_DELETE_URL} — добавляется CSRF-токен, delete=1, redirect обратно в профиль.
  8. Хук market.userdetails.loop — плагины могут добавить свои теги.
  9. Парсинг блока MAIN.MARKET_ROWS в отдельном XTemplate.
  10. Получение HTML списка товаров через $ajax_tpl->text('MAIN.MARKET_ROWS').
  11. Генерация пагинации через cot_pagenav() и парсинг pagination.tpl.
  12. Отправка JSON-ответа: echo json_encode(['rows' => $rows_html, 'pagination' => $pagination_html]).

Часть C. Основная логика (строки ~212–конец)

Срабатывает при обычном открытии страницы профиля. Возвращает HTML вкладки, который вставляется в {MARKET} основного шаблона.

Порядок действий:

  1. Получение прав пользователя: cot_auth('market', 'any', 'RWA')$usr['auth_read'], $usr['auth_write'], $usr['isadmin'].
  2. Импорт tab, cat из GET.
  3. Импорт пагинации dmarket$pg, $d, $durl.
  4. Создание XTemplate из userdetails.tpl.
  5. Присвоение базовых тегов вкладки: {MARKET_ADD_URL}, {MARKET_ADD_SHOWBUTTON}, {MARKET_TAB_URL}.
  6. Формирование условий $where и $order (аналогично AJAX-ветке).
  7. Создание $wherecount — копии без фильтра категории (для подсчёта по категориям).
  8. Хук market.userdetails.query — плагины могут изменить условия.
  9. SQL-запрос количества товаров по категориям (GROUP BY fieldmrkt_cat).
  10. SQL-запрос общего количества товаров пользователя.
  11. Присвоение тегов подгрузки: {LOAD_MORE_URL}, {LOAD_MORE_PERPAGE}, {LOAD_MORE_TOTALPAGES}, {LOAD_MORE_CURRENTPAGE}, {LOAD_MORE_LANG}.
  12. SQL-запрос списка товаров текущей страницы.
  13. Цикл по категориям — присвоение и парсинг блока MAIN.CAT_ROW.
  14. Генерация пагинации и присвоение cot_generatePaginationTags().
  15. Цикл по товарам — генерация тегов, хук market.userdetails.loop, парсинг MAIN.MARKET_ROWS.
  16. Хук market.userdetails.tags — плагины могут добавить свои теги.
  17. Парсинг MAIN шаблона вкладки.
  18. Присвоение в основной шаблон $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

  1. Пользователь открывает /users/userNickName/tab/market.
  2. Cotonti разбирает URL через urleditor, получает e=users, m=details, u=userNickName, tab=market.
  3. Модуль users вызывает users.details.tags.
  4. Движок подключает все файлы, зарегистрированные на users.details.tags, включая market.userdetails.php.
  5. Файл формирует HTML вкладки и присваивает его в {MARKET}.
  6. users.tpl парсится, в месте {MARKET} подставляется HTML вкладки.
  7. Ответ отдаётся пользователю.

Подробное описание таблицы тегов

1. Что это за таблица

Это справочник всех шаблонных тегов XTemplate, которые файл market.userdetails.php передаёт в шаблоны. Она нужна разработчику темы, чтобы знать:

  • какие теги существуют;
  • что каждый тег выводит;
  • где тег присваивается в PHP;
  • в каком шаблоне и в каком блоке тег работает.
ТегОписаниеИсточникШаблон
{MARKET_ADD_URL}URL страницы добавления нового товара в модуле Market. Формируется в PHP через cot_url('market', 'm=add'). Используется в шаблоне вкладки для кнопки «Добавить товар», чтобы пользователь с правом записи мог создать новый товар из профиля.$t1->assign() в market.userdetails.phpmodules/market/market.userdetails.tpl
{MARKET_ADD_SHOWBUTTON}Флаг (1 или пусто), показывать ли кнопку добавления товара в шаблоне вкладки. Устанавливается в 1 только если у текущего пользователя есть право записи в модуль Market ($usr['auth_write']). Пустая строка означает «не показывать кнопку».$t1->assign() в market.userdetails.phpmodules/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.phpmodules/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.phpmodules/market/market.userdetails.tpl
{LOAD_MORE_PERPAGE}Количество товаров на страницу (число). Берётся из настроек модуля Market: marketmaxlistsperpageincat для категории по умолчанию или marketmaxlistsperpage, с fallback на 10. Применяется в JS для расчёта оставшихся страниц.$t1->assign() в market.userdetails.phpmodules/market/market.userdetails.tpl
{LOAD_MORE_TOTALPAGES}Общее число страниц товаров пользователя (с учётом фильтра по категории). Считается как ceil($market_count / $perpageincat). Применяется в JS для определения, показывать ли ещё кнопку «Загрузить ещё» после текущей порции.$t1->assign() в market.userdetails.phpmodules/market/market.userdetails.tpl
{LOAD_MORE_CURRENTPAGE}Номер текущей страницы, начиная с 1. Считается как floor($d / $perpageincat) + 1, где $d — смещение LIMIT для выборки товаров. Используется в JS для отображения прогресса «страница N из M» на кнопке подгрузки.$t1->assign() в market.userdetails.phpmodules/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.phpmodules/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_catmodules/market/market.userdetails.tpl, блок CAT_ROW
{MARKET_CAT_ROW_ICON}Иконка (CSS-класс или путь к файлу) категории товаров в блоке фильтра. Берётся из Cot::$structure['market'][<код_категории>]['icon']. Если иконка не задана или категория удалена — пустая строка. Применяется для визуального оформления списка категорий вкладки.$t1->assign() в цикле по $sql_market_count_catmodules/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_catmodules/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_catmodules/market/market.userdetails.tpl, блок CAT_ROW
{MARKET_CAT_ROW_SELECT}Флаг (1 или пусто), является ли эта категория активной (выбранной) в текущем фильтре. Сравнивается $category из GET с fieldmrkt_cat. Используется для подсветки активной категории в списке.$t1->assign() в цикле по $sql_market_count_catmodules/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.phpusers.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.phpusers.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.*:

  1. Откройте modules/market/inc/market.functions.php.
  2. Найдите функцию cot_generate_markettags.
  3. Сверьте список ключей массива $tags с колонкой «Тег».
  4. Добавьте или удалите строки в таблице по факту.
Отредактировано: webitproff (13.09.2026 01:01, 1 час назад)
🗿

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