Руководство по плагину Table of Contents Page (toc_page) для Cotonti
Версия: 1.1.4
Дата: 24 августа 2026 года
Оглавление
- Введение
- Установка и настройка
- Управление деревьями
- Управление элементами
- Мультиязычность
- Интеграция с Cotonti
- AJAX-поиск страниц (Select2)
- Генератор SQL-дампа
- Расширенные функции
- Часто задаваемые вопросы
- Примеры
Введение
О плагине
Table of Contents Page (toc_page) — это плагин для системы управления контентом Cotonti, предназначенный для создания управляемых оглавлений на страницах сайта. Он позволяет строить иерархические меню (деревья), состоящие из элементов различных типов: ссылок на категории, на отдельные страницы или на произвольные URL. Элементы можно вручную сортировать, задавать родительско-дочерние связи, включать или отключать, а также переводить заголовки и URL на разные языки.
Плагин особенно полезен для:
- создания баз знаний и справочных разделов;
- навигационных меню с ручным управлением;
- иерархических оглавлений длинных руководств;
- мультиязычных навигационных структур.
Главная особенность — полный контроль над порядком и вложенностью элементов, что выгодно отличает плагин от автоматически генерируемых меню на основе структуры категорий или страниц.
Возможности
- Неограниченное количество деревьев: можно создавать несколько независимых оглавлений для разных разделов сайта.
- Три типа элементов:
- Категория — ссылка на категорию Cotonti;
- Страница — ссылка на конкретную страницу;
- Произвольная ссылка — любой внешний или внутренний URL.
- Ручная сортировка: каждому элементу задаётся числовой порядок внутри своего родителя.
- Иерархия: неограниченная вложенность элементов.
- Мультиязычность: перевод заголовков и URL на дополнительные языки (при включении).
- AJAX-поиск страниц: удобный выбор страницы через Select2 вместо громоздкого выпадающего списка.
- Пагинация в админ-панели для работы с большими деревьями.
- Редактирование типа элемента после создания.
- Генератор SQL-дампа: позволяет быстро импортировать готовую структуру дерева из HTML-списка.
- Простая интеграция: вывод дерева одной функцией в любом шаблоне.
- Безопасность: поддержка прав доступа, AJAX-запросы защищены.
Требования
- Cotonti версии 1.0 или выше (рекомендуется актуальная).
- PHP 8.5 или выше.
- MySQL 8.4 или выше (с поддержкой InnoDB и utf8mb4).
- Модуль Page должен быть включён (обязательно).
- Для мультиязычности рекомендуется плагин i18n (опционально).
Установка и настройка
Установка плагина
- Скачайте архив плагина
toc_page. - Распакуйте архив в директорию
plugins/вашего сайта Cotonti. Должна получиться структура:
plugins/
└── toc_page/
├── toc_page.setup.php
├── toc_page.admin.php
├── toc_page.functions.php
├── toc_page.ajax.php
├── lang/
│ ├── toc_page.ru.lang.php
│ ├── toc_page.en.lang.php
│ └── toc_page.uk.lang.php
├── tpl/
│ ├── toc_page.admin.tpl
│ └── toc_page.tpl
└── setup/
└── toc_page.install.sql- Зайдите в административную панель Cotonti.
- Перейдите в раздел «Расширения» (Extensions) → «Плагины».
- Найдите в списке Table of Contents Page и нажмите «Установить».
- После успешной установки плагин будет активирован.
При установке будут созданы три таблицы в базе данных:
cot_toc_page_trees— деревья (заголовки, описания, временные метки);cot_toc_page_items— элементы деревьев (тип, ссылка, заголовок, URL, сортировка, статус);cot_toc_page_i18n— переводы полей элементов (item_title, item_url и др.).
Примечание. Если у вас другой префикс таблиц (например,
my_), заменитеcot_в SQL-файле на ваш префикс перед установкой. Обычно это можно сделать автоматически при установке, если система использует динамический префикс, но для надёжности проверьте.
Первоначальная настройка
После установки перейдите в «Настройки» → «Плагины» → Table of Contents Page. Доступны следующие параметры:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
default_tree | ID дерева по умолчанию. Используется, если функция cot_toc_page_render() вызывается без явного указания ID. | 0 |
toc_page_i18n_use | Включить/выключить мультиязычность. | Выключено |
toc_page_i18n_lang_code_default | Код основного языка сайта (должен совпадать с $cfg['defaultlang']). | ru |
toc_page_i18n_lang_code_first | Код первого дополнительного языка. | en |
toc_page_i18n_lang_code_first_use | Использовать первый дополнительный язык. | Включено |
toc_page_i18n_lang_code_second | Код второго дополнительного языка. | ua |
toc_page_i18n_lang_code_second_use | Использовать второй дополнительный язык. | Выключено |
toc_page_select2_use | Использовать AJAX-поиск страниц через Select2. | Выключено |
Рекомендуется сразу установить default_tree после создания первого дерева, чтобы функция вывода работала без параметров.
Конфигурация мультиязычности
- Включите опцию «Мультиязычность активировать и использовать».
- Укажите код основного языка в поле
toc_page_i18n_lang_code_default. Это должен быть тот же код, что и глобальная настройка Cotonti$cfg['defaultlang']. Заголовки элементов в основной таблицеcot_toc_page_itemsсчитаются оригиналом для этого языка. - Для каждого дополнительного языка:
- задайте его код (например,
en,uk,de); - включите флаг «Использовать …».
- задайте его код (например,
- Сохраните настройки.
Теперь в административной панели плагина появится вкладка «Переводы», где можно вводить переводы заголовков и URL для каждого активного дополнительного языка.
Важно: если у вас уже есть элементы, включение мультиязычности не изменит их оригинальные значения; они останутся в основной таблице.
Настройка Select2
Select2 — это улучшенный выпадающий список с поиском. В плагине он используется для выбора страницы в формах добавления/редактирования элемента.
Как включить:
- В настройках плагина найдите опцию «использовать поиск статей через select2».
- Установите значение «Да».
- Сохраните.
После этого в форме добавления элемента типа «Страница» обычный <select> заменится на поле с автодополнением. При вводе минимум двух символов выполняется AJAX-запрос к серверу, который возвращает список страниц, соответствующих запросу.
Select2 подключается автоматически из ресурсов Cotonti. Если вы хотите настроить минимальную длину ввода, это можно изменить в коде (minimumInputLength: 2) в файлах toc_page.admin.php (два места: для вкладки редактирования дерева и для вкладки редактирования элемента). По умолчанию порог — 2 символа.
Управление деревьями
Создание дерева
- Перейдите в административный раздел плагина: «Другое» → «Table of Contents Page».
- Откройте вкладку «Деревья».
- Внизу страницы находится форма «Добавить дерево»:
- Название дерева — обязательное поле (например, «База знаний»).
- Описание — необязательное краткое описание (отображается только в админке).
- Нажмите кнопку «Создать».
После сохранения дерево появится в таблице списка деревьев с присвоенным ID.
Редактирование дерева
Каждое дерево в списке имеет кнопку «Изменить» (иконка карандаша). При нажатии на неё форма редактирования откроется прямо в списке (вкладка «Деревья»). Изменяемые поля: название и описание. Нажмите «Обновить», чтобы сохранить.
Удаление дерева
В списке деревьев для каждого дерева есть кнопка «Удалить». При удалении:
- удаляются все элементы этого дерева из
cot_toc_page_items; - удаляются все переводы этих элементов из
cot_toc_page_i18n(каскадно); - удаляется запись о дереве из
cot_toc_page_trees.
Удаление необратимо — перед этим рекомендуется сделать резервную копию базы данных.
Код для вставки дерева
В колонке «Код для вставки» для каждого дерева автоматически генерируется готовый код, который нужно вставить в TPL-шаблон страницы или в PHP-код.
Пример кода:
<!-- IF {PHP|cot_plugin_active('toc_page')} -->
{PHP|cot_toc_page_render(1)}
<!-- ENDIF -->Здесь 1 — ID дерева. Вы можете скопировать этот код кнопкой «Копировать» и вставить в нужное место.
Управление элементами
Добавление элемента
- Перейдите на вкладку «Редактирование дерева» (кнопка «Элементы» напротив нужного дерева в списке деревьев).
- Внизу страницы расположена форма «Добавить элемент».
- Выберите тип элемента:
- Категория — потребуется выбрать категорию из выпадающего списка.
- Страница — потребуется выбрать страницу (обычным списком или через Select2).
- Произвольная ссылка — потребуется ввести URL.
- Заполните заголовок (если оставить пустым для типа «Страница» или «Категория», заголовок может быть автоматически взят из связанного объекта).
- При необходимости выберите родителя из списка (по умолчанию — «Верхний уровень»).
- Нажмите «Добавить».
Новый элемент будет добавлен в конец списка своего родителя с автоматически вычисленным порядковым номером (item_sort).
Типы элементов
Категория
При выборе этого типа необходимо указать категорию из структуры страниц Cotonti. В поле item_ref сохраняется код категории. При выводе на сайте ссылка будет вести на страницу категории, а заголовок (если не задан вручную) — браться из названия категории.
Если категория позже будет удалена или переименована, плагин покажет заголовок, сохранённый в item_title, либо выведет «Категория не найдена».
Страница
Тип «Страница» требует выбора конкретной страницы из списка опубликованных страниц (page_state = 0). В item_ref хранится числовой ID страницы. При выводе формируется URL страницы, заголовок берётся из названия страницы или из поля item_title.
При использовании AJAX-поиска Select2 можно быстро найти нужную страницу по названию.
Произвольная ссылка
Этот тип позволяет указать любой внешний или внутренний URL (например, https://example.com или /some/page). В item_ref ничего не сохраняется, а в item_url помещается введённый URL. Заголовок следует задать вручную в поле «Заголовок».
Редактирование элемента
Для редактирования элемента нажмите кнопку «Редактировать» (иконка карандаша) в строке элемента на вкладке «Редактирование дерева». Откроется отдельная вкладка «Элемент» с полной формой редактирования.
Здесь можно изменить:
- тип элемента;
- связанный объект (категорию, страницу или URL);
- заголовок;
- родительский элемент;
- порядок сортировки;
- статус (включён/выключен).
После сохранения вы останетесь на странице редактирования, чтобы видеть внесённые изменения.
Изменение типа элемента
Раньше после создания элемента его тип нельзя было изменить. В версии 1.1.4 эта проблема решена: в форме редактирования элемента (вкладка «Элемент») есть выпадающий список «Тип». Вы можете свободно переключать тип между «Категория», «Страница» и «Произвольная ссылка». Соответствующие поля для выбора объекта будут меняться автоматически при помощи JavaScript.
Сортировка и порядок
Порядок элементов внутри одного родителя определяется числом в поле item_sort. Оно заполняется автоматически при добавлении элемента (максимальное значение + 1). Изменить порядок можно двумя способами:
- В общем списке (вкладка «Редактирование дерева»): измените число в колонке «Порядок» и нажмите «Сохранить изменения» внизу таблицы.
- В форме редактирования элемента: в поле «Порядок» укажите нужное число.
Рекомендуется использовать последовательные числа (1, 2, 3...). Элементы с одинаковым порядком сортируются по ID.
Иерархия и родительские элементы
Каждый элемент может иметь родителя, выбранного из списка всех элементов этого же дерева. Верхний уровень соответствует parent_id = 0. Вложенность не ограничена. При выводе на сайте вложенные элементы автоматически помещаются внутрь <ul> родительского элемента.
В списке родительских элементов невозможно выбрать самого себя (для избежания циклов) — это учтено в форме редактирования элемента.
Включение и отключение
Каждый элемент имеет флаг «Включено». Если флаг снят, элемент не выводится на сайте, но остаётся в базе данных. Это удобно для временного скрытия пунктов меню без удаления.
Управление флагом:
- В таблице списка элементов — чекбокс в колонке «Включено».
- В форме редактирования элемента — аналогичный чекбокс.
Удаление элемента
Для удаления элемента на вкладке «Редактирование дерева» нажмите кнопку «Удалить» (красная иконка). При удалении:
- сам элемент удаляется;
- все его дочерние элементы удаляются рекурсивно;
- все переводы удалённых элементов также удаляются (каскадно из-за внешнего ключа).
Перед удалением появится запрос подтверждения.
Мультиязычность
Включение и настройка языков
Подробная настройка описана в разделе «Конфигурация мультиязычности». Напомним:
- Включите опцию
toc_page_i18n_use. - Укажите основной язык (
toc_page_i18n_lang_code_default). - Включите нужные дополнительные языки (
toc_page_i18n_lang_code_first_useи т.д.) и задайте их коды.
Перевод заголовков и URL
После включения мультиязычности в админке плагина появляется вкладка «Переводы». Она доступна только если выбран конкретный дерево (слева в списке деревьев). На этой вкладке отображается таблица всех элементов дерева с полями для каждого активного дополнительного языка:
Заголовок— перевод названия элемента;URL— перевод ссылки (если нужно, например, для разных языковых версий страниц).
Оригинальные значения (на основном языке) показываются в столбце «Заголовок» без возможности редактирования (они редактируются на вкладке «Редактирование дерева» или «Элемент»).
Чтобы сохранить переводы, заполните нужные поля и нажмите «Сохранить изменения». Пустые поля удаляют перевод (если он был), оставляя оригинал для этого языка.
Как работает определение языка
Определение текущего языка происходит в функции toc_page_i18n_get_value(). Логика:
- Если мультиязычность выключена — возвращается оригинал.
- Определяется основной язык из настроек плагина (
toc_page_get_default_lang()). - Определяется язык текущего посетителя (
Cot::$usr['lang']или основной, если гость). - Если текущий язык совпадает с основным — всегда возвращается оригинал (переводы для основного языка не используются).
- Иначе загружается перевод из
cot_toc_page_i18nпоitem_id,field_name,lang. Если перевод найден — возвращается он, иначе оригинал.
Таким образом, для основного языка всегда используются оригинальные поля, а переводы применяются только для дополнительных языков.
Функции для разработчиков i18n
Для разработчиков в файле toc_page.functions.php доступны следующие функции:
toc_page_i18n_enabled()— проверяет, включена ли мультиязычность.toc_page_get_active_langs()— возвращает массив кодов активных дополнительных языков.toc_page_get_default_lang()— возвращает код основного языка.toc_page_i18n_load($itemId, $fieldName, $lang)— загружает перевод.toc_page_i18n_save($itemId, $fieldName, $lang, $value)— сохраняет/удаляет перевод.toc_page_i18n_get_value($itemId, $fieldName, $originalValue)— возвращает значение с учётом перевода.
Эти функции можно использовать в собственных расширениях или шаблонах.
Интеграция с Cotonti
Вывод дерева на странице
Плагин предоставляет простой способ вывести дерево в любом месте сайта. Для этого используется функция cot_toc_page_render($treeId).
Способы вызова:
- В TPL-шаблоне:
{PHP|cot_toc_page_render(1)}Где 1 — ID дерева.
- В PHP-коде (например, в модуле или плагине):
$out = cot_toc_page_render(1);Затем передайте $out в шаблон.
Функция возвращает готовый HTML, сгенерированный по шаблону toc_page.tpl.
Функция cot_toc_page_render()
Сигнатура:
function cot_toc_page_render($treeId, $tpl = 'toc_page')Параметры:
$treeId— ID дерева, которое нужно отобразить.$tpl— имя шаблона (без расширения.tpl). По умолчаниюtoc_page.
Функция:
- Получает все включённые элементы дерева через
toc_page_get_tree(). - Вызывает рекурсивный рендеринг
toc_page_display(). - Возвращает HTML.
Если дерево пустое или ID неверный, вернёт пустую строку.
Шаблон toc_page.tpl
Файл toc_page.tpl (в папке tpl/) управляет вёрсткой дерева. По умолчанию он имеет следующую структуру:
<!-- BEGIN: LIST -->
<ul class="toc-page level-{LIST_LEVEL}">
<!-- BEGIN: ROW -->
<li class="toc-page-item level-{ROW_LEVEL}">
<!-- IF {ROW_URL} -->
<a href="{ROW_URL}">{ROW_TITLE}</a>
<!-- ELSE -->
<span class="toc-page-title">{ROW_TITLE}</span>
<!-- ENDIF -->
{ROW_ITEMS}
</li>
<!-- END: ROW -->
</ul>
<!-- END: LIST -->Вы можете изменить этот шаблон под свой дизайн. Доступные переменные:
{LIST_LEVEL}— уровень вложенности корневого списка (обычно 0);{ROW_LEVEL}— уровень конкретного элемента;{ROW_URL}— сгенерированная ссылка (если есть);{ROW_TITLE}— заголовок (с учётом перевода и очистки HTML);{ROW_ITEMS}— рекурсивно сгенерированный HTML дочерних элементов.
Использование в TPL-шаблонах
Наиболее распространённый сценарий — вставить дерево в боковую панель или в контент страницы. Пример:
<div class="block">
<h3>База знаний</h3>
{PHP|cot_toc_page_render(1)}
</div>Если нужно вывести разные деревья на разных страницах, можно использовать условные операторы Cotonti или PHP-логику в шаблоне.
Для глобальной видимости функции в TPL убедитесь, что плагин активен и функция зарегистрирована (это происходит автоматически при подключении toc_page.functions.php).
AJAX-поиск страниц (Select2)
Включение
Чтобы использовать Select2 для выбора страниц, включите опцию «использовать поиск статей через select2» в настройках плагина.
Как работает
При включённом Select2 в формах добавления/редактирования элемента типа «Страница» вместо стандартного <select> появляется скрытое поле и элемент Select2. Пользователь вводит минимум 2 символа, после чего отправляется AJAX-запрос на публичный URL index.php?r=toc_page&ajax=search&q=.... Сервер (файл toc_page.ajax.php) ищет страницы, у которых page_state = 0 и название содержит введённую подстроку (без учёта регистра). Результаты возвращаются в формате JSON для Select2.
Дополнительно фильтруются права доступа: только администраторы могут использовать поиск (в текущей реализации проверка cot::$usr['isadmin']). Для не-администраторов доступ не предусмотрен, так как AJAX используется только в админке.
Настройка минимальной длины
Минимальная длина ввода для поиска задаётся в JavaScript-коде в файлах toc_page.admin.php (в двух местах: вкладка «Редактирование дерева» и вкладка «Редактирование элемента»). Найдите строку:
minimumInputLength: 2,и замените 2 на нужное число. После изменения сохраните файл и очистите кеш браузера.
Генератор SQL-дампа
Назначение
Скрипт generate_toc_dump.php предназначен для автоматического создания SQL-дампа таблиц плагина на основе HTML-списка. Это удобно, когда нужно быстро импортировать готовую структуру дерева (например, из существующего статического меню) без ручного добавления элементов в админке.
Подготовка HTML-списка
HTML-список должен быть валидным вложенным списком <ul><li>. Правила:
- Каждый пункт —
<li>, который может содержать вложенный<ul>. <nav></nav>внутри<li>игнорируется (можно не писать).- HTML-сущности автоматически преобразуются.
- Не оставляйте лишних пробелов между закрывающим
</li>и следующим<li>.
Пример:
<ul>
<li>Родитель
<ul>
<li>Дочерний 1</li>
<li>Дочерний 2</li>
</ul>
</li>
<li>Ещё родитель</li>
</ul>Создание дампа
- Откройте файл
generate_toc_dump.phpв редакторе. - Вставьте свой HTML в переменную
$html(между<<<'HTML'иHTML;). - Заполните массив
$translations(если нужны переводы), где ключ — оригинал, значение — перевод. - Укажите параметры дерева:
$treeId,$treeTitle,$treeDescription. - Проверьте префикс таблиц (по умолчанию
cot_). При необходимости замените. - Загрузите файл в корень сайта через FTP.
- Запустите в браузере:
https://ваш-домен/generate_toc_dump.php. - Скрипт создаст файл
toc_page_dump_YYYYMMDD_HHMMSS.sqlв корне сайта. - Скачайте этот файл по FTP.
Импорт в базу
- Зайдите в phpMyAdmin и выберите вашу базу данных.
- Перейдите на вкладку «Импорт».
- Выберите скачанный
.sqlфайл. - Убедитесь, что кодировка utf-8.
- Нажмите «Импортировать».
Важно: скрипт при импорте удаляет существующие таблицы cot_toc_page_* и создаёт их заново. Сделайте резервную копию, если у вас уже есть данные.
После импорта дерево появится в админке плагина.
Расширенные функции
Функции для получения данных
В файле toc_page.functions.php определены следующие функции:
toc_page_get_tree($treeId)— возвращает вложенный массив всех включённых элементов дерева. Каждый элемент содержит все поля таблицы +children(массив дочерних).cot_toc_page_render($treeId, $tpl = 'toc_page')— рендерит дерево по шаблону.toc_page_display($items, $level, $tpl)— рекурсивно выводит элементы. Обычно не вызывается напрямую.
Для разработчиков также доступны функции мультиязычности, описанные ранее.
Работа с переводами напрямую
Если вам нужно программно добавить или получить перевод, используйте:
// Загрузить перевод
$translated = toc_page_i18n_load($itemId, 'item_title', 'en');
// Сохранить перевод
toc_page_i18n_save($itemId, 'item_title', 'en', 'English title');
// Удалить перевод (передать null или пустую строку)
toc_page_i18n_save($itemId, 'item_title', 'en', '');Эти функции автоматически обрабатывают вставку/обновление/удаление.
Часто задаваемые вопросы
Почему не отображается дерево?
- Проверьте, что плагин активирован.
- Убедитесь, что ID дерева правильный и дерево содержит хотя бы один включённый элемент.
- Проверьте, что в TPL-шаблоне используется правильный вызов
{PHP|cot_toc_page_render(ID)}. - Очистите кеш Cotonti.
- Убедитесь, что элементы не отключены (флаг «Включено»).
Как изменить тип элемента?
- Откройте вкладку «Редактирование дерева».
- Найдите нужный элемент и нажмите кнопку «Редактировать».
- В открывшейся вкладке «Элемент» измените тип в выпадающем списке.
- Заполните соответствующие поля (категорию, страницу или URL).
- Нажмите «Обновить».
Как добавить новый язык?
- В настройках плагина включите мультиязычность.
- В поле для дополнительного языка введите код (например,
de) и включите флаг «Использовать». - Сохраните настройки.
- Перейдите на вкладку «Переводы» и заполните переводы.
Максимум поддерживается два дополнительных языка (плюс основной).
Как удалить плагин?
- Сделайте резервную копию базы данных.
- В админке Cotonti перейдите в «Расширения» → «Плагины».
- Найдите Table of Contents Page и нажмите «Удалить».
- При необходимости удалите файлы плагина из директории
plugins/toc_page.
Внимание: при удалении плагина таблицы cot_toc_page_* обычно удаляются автоматически.
Если что-то ну пошло не так... то, чтобы полностью очистить базу, удалите их вручную через phpMyAdmin (установить чекбоксы напротив таблиц, затем "выделенные" - "удалить") или еажмите на вкладку "SQL" и выполните SQL-запрос ниже (с поправкой на префикс своих таблиц)
DROP TABLE IF EXISTS `cot_toc_page_i18n`;
DROP TABLE IF EXISTS `cot_toc_page_items`;
DROP TABLE IF EXISTS `cot_toc_page_trees`;Примеры
Простое дерево
Допустим, нужно создать боковое меню с тремя пунктами:
- Главная
- О нас
- КонтактыШаги:
- Создайте дерево с ID 1.
- Добавьте три элемента типа «Произвольная ссылка» с URL:
/,/about,/contacts. - Установите порядок 1, 2, 3.
- Вставьте в шаблон:
<div class="sidebar">
{PHP|cot_toc_page_render(1)}
</div>Дерево с подуровнями
Структура:
- Услуги
- Разработка
- Дизайн
- Портфолио
- Сайты
- ЛоготипыРеализация:
- Добавьте элементы «Услуги» и «Портфолио» как родительские (родитель = 0).
- Добавьте дочерние элементы, выбрав в поле «Родитель» соответствующий родительский элемент.
- Настройте порядок.
Мультиязычное дерево
Требуется вывести меню на русском и английском.
- Включите мультиязычность, задайте основной язык
ru, дополнительныйen. - Создайте элементы с русскими заголовками.
- Перейдите на вкладку «Переводы», введите английские заголовки для каждого элемента.
- При посещении сайта на английском языке заголовки автоматически заменятся.
Если для какого-то элемента перевод не задан, отобразится русский оригинал.
Это руководство охватывает основные аспекты работы с плагином Table of Contents Page версии 1.1.4. За дополнительной информацией обращайтесь к документации на GitHub или на форум поддержки.
ПРИЛОЖЕНИЕ 1.
функции и переменные, определённые и используемые в PHP-файле toc_page.admin.php:
Глобальные переменные / Инициализация
| Переменная | Тип | Назначение |
|---|---|---|
$tab | строка | Текущая вкладка администратора ('trees', 'edit', 'i18n', 'edit_element') |
$treeId | целое | ID выбранного дерева |
$a | строка | Параметр действия (update_tree, edit_tree, add, delete, save, add_item и т.д.) |
$i18nActive | логический | Включена ли мультиязычная поддержка |
$activeLangs | массив | Список активных дополнительных языков |
$defaultLang | строка | Код основного языка |
$perPage | целое | Количество элементов на странице (пагинация) |
$t | XTemplate | Объект шаблона для отображения админ-интерфейса |
Подключаемые функции (из внешних файлов)
| Функция | Источник | Назначение |
|---|---|---|
cot_langfile() | Ядро Cotonti | Загружает языковой файл |
cot_incfile() | Ядро Cotonti | Подключает файлы плагина |
cot_import() | Ядро Cotonti | Безопасно импортирует GET/POST/COOKIE параметры |
cot_redirect() | Ядро Cotonti | Перенаправляет на URL |
cot_url() | Ядро Cotonti | Генерирует URL с параметрами |
cot_inputbox() | Ядро Cotonti | Создаёт HTML-элемент ввода |
cot_selectbox() | Ядро Cotonti | Создаёт HTML-выпадающий список |
cot_confirm_url() | Ядро Cotonti | Оборачивает URL в диалог подтверждения |
cot_message() | Ядро Cotonti | Добавляет сообщение в очередь вывода |
cot_die_message() | Ядро Cotonti | Показывает сообщение об ошибке и завершает работу |
cot_tplfile() | Ядро Cotonti | Получает путь к файлу шаблона |
cot_display_messages() | Ядро Cotonti | Выводит накопленные сообщения в шаблоне |
cot_import_pagenav() | Ядро Cotonti | Разбирает параметр пагинации |
cot_pagenav() | Ядро Cotonti | Генерирует навигацию пагинации |
cot_generatePaginationTags() | Ядро Cotonti | Создаёт теги пагинации для шаблона |
toc_page_i18n_enabled() | функции toc_page | Проверяет, включена ли i18n |
toc_page_get_active_langs() | функции toc_page | Возвращает список активных языков |
toc_page_get_default_lang() | функции toc_page | Возвращает язык по умолчанию |
toc_page_i18n_load() | функции toc_page | Загружает перевод для элемента |
toc_page_i18n_save() | функции toc_page | Сохраняет перевод для элемента |
Основные блоки обработки данных (по вкладкам)
Вкладка: trees — Управление деревьями оглавления
- Действие:
update_tree— Обновить название/описание дерева - Действие:
edit_tree— Показать форму редактирования дерева - Действие:
add— Создать новое дерево - Действие:
delete— Удалить дерево и все его элементы/переводы (рекурсивно) - Вывод: Перебор всех деревьев, отображение шаблона TREES_ROW
Вкладка: edit — Редактирование элементов внутри дерева
- Действие:
delete_item— Удалить элемент и все дочерние рекурсивно - Действие:
save— Сохранить изменения нескольких элементов (parent_id, sort, title, enabled) - Действие:
add_item— Вставить новый элемент (тип category, page или custom) - Вывод: Пагинированный список элементов; формы для добавления новых элементов
- Особенности:
- Интеграция Select2 AJAX (если включена) для поиска страниц
- Выпадающий список родительского элемента (иерархия)
- Селектор типа элемента (категория, страница, произвольная ссылка)
Вкладка: edit_element — Редактирование одного элемента
- Действие:
save_element— Обновить детали элемента (тип, ссылка, заголовок, URL, родитель, сортировка, включён) - Вывод: Форма с полным интерфейсом редактирования элемента
- Особенности: Та же интеграция Select2 AJAX, что и при массовом редактировании
Вкладка: i18n — Мультиязычные переводы
- Действие:
save_i18n— Сохранить переводы заголовков/URL элементов на дополнительные языки - Вывод: Пагинированная таблица с полями перевода для каждого активного языка
- Особенности: Отдельные поля перевода заголовка и URL для каждого языка
Операции с базой данных (через Cot::$db)
| Операция | Таблица | Назначение |
|---|---|---|
| INSERT | toc_page_trees | Создать новое дерево |
| UPDATE | toc_page_trees | Изменить название/описание дерева |
| DELETE | toc_page_trees | Удалить дерево |
| SELECT | toc_page_trees | Загрузить данные дерева |
| INSERT | toc_page_items | Добавить элемент в дерево |
| UPDATE | toc_page_items | Изменить свойства элемента |
| DELETE | toc_page_items | Удалить элемент (с рекурсивным удалением дочерних) |
| SELECT | toc_page_items | Загрузить элементы дерева |
| DELETE | toc_page_i18n | Удалить переводы |
| (неявно) | toc_page_i18n | Загрузить/сохранить переводы через вспомогательные функции |
| SELECT | cot_pages | Получить доступные страницы для выпадающего списка |
Назначенные переменные шаблона (XTemplate)
| Переменная | Область | Назначение |
|---|---|---|
TAB_*_ACTIVE | Все вкладки | Пометить активную вкладку классом 'active' |
URL_* | Все вкладки | URL-адреса для навигации по вкладкам |
TREE_* | trees, edit, i18n | Метаданные дерева и действия |
EDIT_TREE_* | trees | Поля формы редактирования |
ADD_TREE_* | trees | Поля формы добавления |
ITEM_* | edit | Поля строки элемента (заголовок, тип, сортировка, включён и т.д.) |
ADD_*_SELECT | edit | Выпадающие списки для добавления элементов (категории, страницы, родители) |
ELEMENT_* | edit_element | Поля формы редактирования одного элемента |
I18N_* | i18n | Строки таблицы переводов и заголовки языков |
LANG_CODE | i18n | Код языка для полей перевода |
Ключевой поток управления
- Логика перенаправления: Если активна вкладка
editилиi18n, но дерево не выбрано, автоматически перенаправляет на первое дерево или на вкладку «Деревья» - Проверки прав: В этом файле явных проверок нет (предполагается, что их выполняет роутер Cotonti)
- Рекурсивное удаление: При удалении и дерева, и элемента очищаются дочерние записи и переводы
- Пагинация: Элементы во вкладках
editиi18nразбиты на страницы; состояние URL сохраняется через параметрd - Интеграция Select2: AJAX-поиск страниц динамически загружается, если включена настройка
toc_page_select2_use