Описание файла шаблона admin.extensions.tpl в Cotonti CMF
Файл шаблона admin.extensions.tpl, расположенный в директории /system/admin/tpl/ фреймворка Cotonti, отвечает за отображение интерфейса для управления расширениями в админ-панели системы. Этот шаблон используется для визуализации данных о различных расширениях, их статусах, настройках и зависимостях, а также для предоставления административных функций, таких как установка, обновление и удаление расширений.
Основное назначение и место в системе Cotonti
- Основное назначение:
- Файл
admin.extensions.tplпредставляет собой шаблон для админского интерфейса, в котором пользователи могут управлять различными расширениями (плагинами, модулями) системы. Это позволяет администраторам сайта устанавливать, обновлять, конфигурировать и удалять расширения, а также контролировать их активность.
- Файл
- Место в системе:
- Шаблон размещен в директории
/system/admin/tpl/, что указывает на его принадлежность к административной панели сайта. В админ-панели Cotonti шаблоны часто используются для визуализации и взаимодействия с данными, которые обрабатываются через PHP-скрипты, с помощью движка шаблонов XTemplate. Шаблонadmin.extensions.tplподключается и выводит данные, переданные из соответствующих PHP-скриптов.
- Шаблон размещен в директории
Суть содержания кода и выполняемые задачи
Файл шаблона решает несколько ключевых задач:
-
Отображение информации о расширениях:
- Шаблон предоставляет структуру для отображения данных о расширениях, таких как код, описание, версия, дата и автор. Эти данные заполняются динамически через переменные PHP, передаваемые в шаблон.
-
Управление состоянием расширений:
- Шаблон предоставляет возможность для администратора управлять состоянием расширений (например, пауза/возобновление, установка/удаление). Это реализуется через различные кнопки, с помощью которых можно выполнять действия с расширениями, такими как установка, обновление, пауза, и др.
-
Работа с зависимостями:
- Файл также отображает информацию о зависимостях расширений, если таковые имеются. Если расширение зависит от других, эти зависимости будут отображаться в виде списка с возможностью перехода по ссылкам.
-
Интерфейс для работы с хранилищем тегов:
- Шаблон позволяет отображать теги, связанные с расширениями, а также предоставляет возможность работы с метками для организации контента и поиска по ним.
-
Обработка ошибок:
- Для каждой строки, в которой происходит ошибка, шаблон отображает специальную информацию об ошибке, если таковая имеется, например, в случае некорректного порядка расширений или других проблем.
Перечень переменных и функций, заключенных в фигурные скобки
{PHP.L.Code}{ADMIN_EXTENSIONS_CODE}{PHP.L.Description}{ADMIN_EXTENSIONS_DESCRIPTION}{PHP.L.Version}{ADMIN_EXTENSIONS_VERSION_INSTALLED}{ADMIN_EXTENSIONS_VERSION}{PHP.L.Date}{ADMIN_EXTENSIONS_DATE}{PHP.L.Category}{ADMIN_EXTENSIONS_CATEGORY_TITLE}{ADMIN_EXTENSIONS_JUMPTO_URL}{ADMIN_EXTENSIONS_ADMIN_URL}{ADMIN_EXTENSIONS_CONFIG_URL}{ADMIN_EXTENSIONS_TOTALCONFIG}{ADMIN_EXTENSIONS_RIGHTS_URL}{ADMIN_EXTENSIONS_STRUCTURE_URL}{PHP.L.Hooks}{ADMIN_EXTENSIONS_CNT_HOOK}{ADMIN_EXTENSIONS_HOOK}{ADMIN_EXTENSIONS_CODE}{ADMIN_EXTENSIONS_ORDER}{ADMIN_EXTENSIONS_ACTIVE}{ADMIN_EXTENSIONS_DETAILS_ROW_I_1}{ADMIN_EXTENSIONS_DETAILS_ROW_PART}{ADMIN_EXTENSIONS_DETAILS_ROW_FILE}{ADMIN_EXTENSIONS_DETAILS_ROW_HOOKS}{ADMIN_EXTENSIONS_DETAILS_ROW_ORDER_INSTALLED}{ADMIN_EXTENSIONS_DETAILS_ROW_ERROR}{PHP.L.None}{ADMIN_EXTENSIONS_DETAILS_ROW_LISTTAGS}{PHP.L.Parts}{PHP.L.Files}{PHP.L.Tags}{PHP.L.Order}{PHP.L.Status}{PHP.L.Action}{PHP.L.Hooks}{ADMIN_EXTENSIONS_UPDATE_URL}{ADMIN_EXTENSIONS_UNINSTALL_URL}{ADMIN_EXTENSIONS_PAUSE_URL}{ADMIN_EXTENSIONS_UNPAUSE_URL}{PHP.L.adm_opt_install_explain}{PHP.L.adm_opt_install}{PHP.L.adm_opt_update}{PHP.L.adm_opt_uninstall_explain}{PHP.L.adm_opt_pauseall_explain}{PHP.L.adm_opt_pauseall}{PHP.L.adm_opt_unpauseall_explain}{PHP.L.adm_opt_unpauseall}
Комментарий по содержимому конструкций <!-- ... -->
-
Логические блоки Cotonti:
- Все конструкции внутри комментариев
<!-- BEGIN: ... -->и<!-- END: ... -->описывают логические блоки, обрабатываемые движком Cotonti. Эти блоки управляют выводом данных, условным отображением элементов, и динамически генерируют контент в зависимости от условий. - Например, блоки
<!-- BEGIN: ROW_ERROR_PART -->и<!-- END: ROW_ERROR_PART -->определяют вывод строки с ошибкой для каждого расширения, если таковая существует. Аналогично, блоки<!-- BEGIN: ROW_PART -->и<!-- END: ROW_PART -->управляют выводом строк с данными расширений. - Также присутствуют блоки для вывода зависимостей расширений, хуков, тегов и действий с расширениями (пауза, обновление, установка).
- Все конструкции внутри комментариев
-
Условия:
- В блоках
<!-- IF ... -->и<!-- ELSE -->проверяются условия, такие как наличие версии расширения, зависимости от других расширений, статус установки и активности. Эти условия определяют, какой контент будет выведен (например, ссылки для установки, обновления или управления расширением).
- В блоках
-
Динамические ссылки:
- В блоках, таких как
<!-- IF {ADMIN_EXTENSIONS_JUMPTO_URL} -->, с помощью условий выводятся различные динамические ссылки для перехода к настройкам, правам, структуре и т.д.
- В блоках, таких как
Характеристика стиля HTML/CSS/JS
- HTML:
- Шаблон использует стандартные HTML-элементы для построения таблиц, блоков, ссылок и кнопок. Применяются классы для стилизации элементов (например,
class="button special large"для кнопок).
- Шаблон использует стандартные HTML-элементы для построения таблиц, блоков, ссылок и кнопок. Применяются классы для стилизации элементов (например,
- CSS:
- Для оформления используется подход с классами для элементов таблиц и кнопок. Классы, такие как
w-25,w-75,centerall, задают стили для ширины столбцов и выравнивание элементов. Классы типаhighlight_redиhighlight_greenиспользуют для выделения различных состояний версий расширений.
- Для оформления используется подход с классами для элементов таблиц и кнопок. Классы, такие как
- JavaScript:
- В шаблоне используется минимальный JavaScript, в основном для обработки действий с расширениями (например, установка, пауза, обновление). Однако эти действия скорее управляются через ссылки с классами, такими как
ajax button, что предполагает использование JavaScript для обработки запросов через AJAX.
- В шаблоне используется минимальный JavaScript, в основном для обработки действий с расширениями (например, установка, пауза, обновление). Однако эти действия скорее управляются через ссылки с классами, такими как
Шаблон admin.extensions.tpl обеспечивает чистую и функциональную структуру для управления расширениями в админке Cotonti, с акцентом на гибкость и динамическое обновление данных через условия и логические блоки.
<!-- BEGIN: MAIN --> <!-- Указывает начало логического блока, который будет обработан через $t->parse('MAIN'); -->
{FILE "{PHP.cfg.system_dir}/admin/tpl/warnings.tpl"} <!-- Загружает шаблон предупреждений -->
<!-- BEGIN: DEFAULT --> <!-- Указывает начало логического блока, который будет обработан через $t->parse('DEFAULT'); -->
<div class="button-toolbar">
<a class="button <!-- IF {ADMIN_EXTENSIONS_SORT_ALP_SEL} -->special<!-- ENDIF -->" href="{ADMIN_EXTENSIONS_SORT_ALP_URL}">{PHP.L.adm_sort_alphabet}</a> <!-- Если сортировка по алфавиту, добавляется класс special -->
<a class="button <!-- IF {ADMIN_EXTENSIONS_SORT_CAT_SEL} -->special<!-- ENDIF -->" href="{ADMIN_EXTENSIONS_SORT_CAT_URL}">{PHP.L.adm_sort_category}</a> <!-- Если сортировка по категории, добавляется класс special -->
<a class="button <!-- IF {ADMIN_EXTENSIONS_ONLY_INSTALLED_SEL} -->special" href="{ADMIN_EXTENSIONS_ONLY_INSTALLED_URL}"<!-- ELSE-->" href="{ADMIN_EXTENSIONS_ONLY_INSTALLED_URL}"<!-- ENDIF -->>{PHP.L.adm_only_installed}</a> <!-- Если фильтр только для установленных расширений, добавляется класс special -->
<a href="{ADMIN_EXTENSIONS_HOOKS_URL}" class="button">{PHP.L.Hooks}</a> <!-- Ссылка на управление хуками -->
</div>
<!-- BEGIN: SECTION--> <!-- Указывает начало логического блока, который будет обработан через $t->parse('SECTION'); -->
<div class="block">
<h2>{ADMIN_EXTENSIONS_SECTION_TITLE} ({ADMIN_EXTENSIONS_CNT_EXTP})</h2> <!-- Заголовок раздела расширений, включая количество расширений -->
<div class="wrapper">
<table class="cells">
<thead>
<tr>
<th class="w-30">{PHP.L.Name} {PHP.L.adm_clicktoedit}</th> <!-- Название расширения с подсказкой для редактирования -->
<th class="w-10">{PHP.L.Code}</th> <!-- Код расширения -->
<th class="w-10">{PHP.L.Version}</th> <!-- Версия расширения -->
<th class="w-10">{PHP.L.Parts}</th> <!-- Количество частей расширения -->
<th class="w-10">{PHP.L.Status}</th> <!-- Статус расширения -->
<th class="w-40">{PHP.L.Action}</th> <!-- Действия с расширением -->
</tr>
</thead>
<tbody>
<!-- BEGIN: ROW --> <!-- Указывает начало логического блока для строки расширения -->
<!-- BEGIN: ROW_CAT --> <!-- Указывает начало логического блока для категории расширений -->
<tr>
<td colspan="6">
<h3>{ADMIN_EXTENSIONS_CAT_TITLE}</h3> <!-- Заголовок категории расширений -->
</td>
</tr>
<!-- END: ROW_CAT --> <!-- Закрывает блок категории расширений -->
<!-- BEGIN: ROW_ERROR_EXT --> <!-- Указывает начало логического блока для ошибки расширения -->
<tr>
<td>{ADMIN_EXTENSIONS_X_ERR}</td> <!-- Ошибка расширения -->
<td colspan="5">{ADMIN_EXTENSIONS_ERROR_MSG}</td> <!-- Сообщение об ошибке расширения -->
</tr>
<!-- END: ROW_ERROR_EXT --> <!-- Закрывает блок ошибки расширения -->
<tr>
<td class="start">
<figure>
{ADMIN_EXTENSIONS_ICON} <!-- Иконка расширения -->
</figure>
<div>
<a href="{ADMIN_EXTENSIONS_DETAILS_URL}">{ADMIN_EXTENSIONS_NAME}</a> <!-- Ссылка на подробности расширения -->
<!-- IF {ADMIN_EXTENSIONS_DESCRIPTION} -->
<p>{ADMIN_EXTENSIONS_DESCRIPTION|cot_cutstring($this, 60)}</p> <!-- Если описание существует, обрезаем его до 60 символов -->
<!-- ENDIF -->
</div>
</td>
<td class="centerall">
{ADMIN_EXTENSIONS_CODE_X} <!-- Код расширения -->
</td>
<td class="centerall">
<!-- IF {PHP.part_status} != 3 AND {ADMIN_EXTENSIONS_VERSION_COMPARE} > 0 -->
<span class="highlight_red">{ADMIN_EXTENSIONS_VERSION_INSTALLED}</span> / <!-- Версия установленного расширения, если есть различие -->
<span class="highlight_green">{ADMIN_EXTENSIONS_VERSION}</span> <!-- Версия доступного обновления -->
<!-- ELSE -->
{ADMIN_EXTENSIONS_VERSION} <!-- Если обновления нет, отображаем текущую версию -->
<!-- ENDIF -->
</td>
<td class="centerall">
{ADMIN_EXTENSIONS_PARTSCOUNT} <!-- Количество частей расширения -->
</td>
<td class="centerall">
{ADMIN_EXTENSIONS_STATUS} <!-- Статус расширения -->
</td>
<td class="action">
<!-- IF {ADMIN_EXTENSIONS_TOTALCONFIG} -->
<a title="{PHP.L.Configuration}" href="{ADMIN_EXTENSIONS_EDIT_URL}" class="button">{PHP.L.Config}</a> <!-- Если есть настройки, ссылка на конфигурацию -->
<!-- ENDIF -->
<!-- IF {ADMIN_EXTENSIONS_STRUCTURE_URL} -->
<a title="{PHP.L.Structure}" href="{ADMIN_EXTENSIONS_STRUCTURE_URL}" class="button">{PHP.L.Structure}</a> <!-- Если есть структура, ссылка на неё -->
<!-- ENDIF -->
<!-- IF {ADMIN_EXTENSIONS_RIGHTS_URL} -->
<a title="{PHP.L.Rights}" href="{ADMIN_EXTENSIONS_RIGHTS_URL}" class="button">{PHP.L.Rights}</a> <!-- Если есть права, ссылка на их управление -->
<!-- ENDIF -->
<!-- IF {ADMIN_EXTENSIONS_ADMIN_URL} -->
<a title="{PHP.L.Administration}" href="{ADMIN_EXTENSIONS_ADMIN_URL}" class="button special">{PHP.L.Admin}</a> <!-- Если есть административный доступ, ссылка на администрирование -->
<!-- ENDIF -->
<!-- IF {ADMIN_EXTENSIONS_JUMPTO_URL} -->
<a title="{PHP.L.Open}" href="{ADMIN_EXTENSIONS_JUMPTO_URL}" class="button special">{PHP.L.Open}</a> <!-- Если есть URL, ссылка для перехода -->
<!-- ENDIF -->
</td>
</tr>
<!-- END: ROW --> <!-- Закрывает блок строки расширения -->
<!-- BEGIN: ROW_ERROR --> <!-- Указывает начало логического блока для ошибки расширения -->
<tr>
<td>{ADMIN_EXTENSIONS_X}</td> <!-- Ошибка расширения -->
<td colspan="5">{PHP.L.adm_opt_setup_missing}</td> <!-- Сообщение о недостающей настройке -->
</tr>
<!-- END: ROW_ERROR --> <!-- Закрывает блок ошибки расширения -->
</tbody>
</table>
</div>
</div>
<!-- END: SECTION --> <!-- Закрывает блок секции расширений -->
<!-- END: DEFAULT --> <!-- Закрывает блок по умолчанию -->
<!-- BEGIN: DETAILS --> <!-- Логический блок, который движок обработает через $t->parse('DETAILS'); -->
<div class="block">
<h2>
{ADMIN_EXTENSIONS_ICON} {ADMIN_EXTENSIONS_TYPE} {ADMIN_EXTENSIONS_NAME}: <!-- Вставка переменных {ADMIN_EXTENSIONS_ICON}, {ADMIN_EXTENSIONS_TYPE}, {ADMIN_EXTENSIONS_NAME} -->
</h2>
<div class="wrapper">
<!-- IF {PHP.isInstalled} AND {PHP.exists} --> <!-- Условие, проверяет, если установлено и существует расширение -->
<div class="button-toolbar">
<!-- IF {ADMIN_EXTENSIONS_JUMPTO_URL} --> <!-- Условие, если URL для перехода существует -->
<a title="{PHP.L.Open}" href="{ADMIN_EXTENSIONS_JUMPTO_URL}" class="button special large">{PHP.L.Open}</a> <!-- Если условие выполнено, ссылка с URL для перехода -->
<!-- ENDIF --> <!-- Конец условия -->
<!-- IF {ADMIN_EXTENSIONS_ADMIN_URL} --> <!-- Условие, если URL для администрирования существует -->
<a title="{PHP.L.Administration}" href="{ADMIN_EXTENSIONS_ADMIN_URL}" class="button special large">{PHP.L.Administration}</a> <!-- Если условие выполнено, ссылка для администрирования -->
<!-- ENDIF --> <!-- Конец условия -->
<!-- IF {ADMIN_EXTENSIONS_TOTALCONFIG} > 0 --> <!-- Условие, если есть конфигурации расширения -->
<a title="{PHP.L.Configuration}" href="{ADMIN_EXTENSIONS_CONFIG_URL}" class="button large">{PHP.L.Configuration} ({ADMIN_EXTENSIONS_TOTALCONFIG})</a> <!-- Если условие выполнено, ссылка на конфигурацию с количеством -->
<!-- ENDIF --> <!-- Конец условия -->
<!-- IF {ADMIN_EXTENSIONS_RIGHTS_URL} --> <!-- Условие, если URL прав доступа существует -->
<a title="{PHP.L.Rights}" href="{ADMIN_EXTENSIONS_RIGHTS_URL}" class="button large">{PHP.L.Rights}</a> <!-- Если условие выполнено, ссылка на права доступа -->
<!-- ENDIF --> <!-- Конец условия -->
<!-- IF {ADMIN_EXTENSIONS_STRUCTURE_URL} --> <!-- Условие, если URL структуры существует -->
<a title="{PHP.L.Structure}" href="{ADMIN_EXTENSIONS_STRUCTURE_URL}" class="button large">{PHP.L.Structure}</a> <!-- Если условие выполнено, ссылка на структуру -->
<!-- ENDIF --> <!-- Конец условия -->
</div>
<!-- ENDIF --> <!-- Конец общего условия -->
</div>
</div>
<table class="cells">
<tbody>
<tr>
<td class="w-25">{PHP.L.Code}:</td> <!-- Просто вывод значения из переменной PHP.L.Code -->
<td class="w-75">{ADMIN_EXTENSIONS_CODE}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_CODE -->
</tr>
<tr>
<td>{PHP.L.Description}:</td> <!-- Просто вывод значения из переменной PHP.L.Description -->
<td>{ADMIN_EXTENSIONS_DESCRIPTION}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DESCRIPTION -->
</tr>
<tr>
<td>{PHP.L.Version}:</td> <!-- Просто вывод значения из переменной PHP.L.Version -->
<td>
<!-- IF {PHP.isInstalled} AND {ADMIN_EXTENSIONS_VERSION_COMPARE} > 0 -->
<span class="highlight_red">{ADMIN_EXTENSIONS_VERSION_INSTALLED}</span> / <span class="highlight_green">{ADMIN_EXTENSIONS_VERSION}</span> <!-- Если установлена версия и версия сравнения больше 0, показываем установленные и доступные версии -->
<!-- ELSE -->
{ADMIN_EXTENSIONS_VERSION} <!-- Иначе просто выводим версию -->
<!-- ENDIF -->
</td>
</tr>
<tr>
<td>{PHP.L.Date}:</td> <!-- Просто вывод значения из переменной PHP.L.Date -->
<td>{ADMIN_EXTENSIONS_DATE}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DATE -->
</tr>
<!-- IF {ADMIN_EXTENSIONS_CATEGORY_TITLE} AND {ADMIN_EXTENSIONS_CATEGORY} != 'misc-ext' -->
<tr>
<td>{PHP.L.Category}:</td> <!-- Просто вывод значения из переменной PHP.L.Category -->
<td>{ADMIN_EXTENSIONS_CATEGORY_TITLE}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_CATEGORY_TITLE -->
</tr>
<!-- ENDIF -->
</tbody>
</table>
<!--//<tr>
<td>{PHP.L.adm_defauth_guests}:</td> <!-- Просто вывод значения из переменной PHP.L.adm_defauth_guests -->
<td>{ADMIN_EXTENSIONS_ADMRIGHTS_AUTH_GUESTS} ({ADMIN_EXTENSIONS_AUTH_GUESTS})</td> <!-- Просто вывод значений из переменных ADMIN_EXTENSIONS_ADMRIGHTS_AUTH_GUESTS и ADMIN_EXTENSIONS_AUTH_GUESTS -->
</tr>
<tr>
<td>{PHP.L.adm_deflock_guests}:</td> <!-- Просто вывод значения из переменной PHP.L.adm_deflock_guests -->
<td>{ADMIN_EXTENSIONS_ADMRIGHTS_LOCK_GUESTS} ({ADMIN_EXTENSIONS_LOCK_GUESTS})</td> <!-- Просто вывод значений из переменных ADMIN_EXTENSIONS_ADMRIGHTS_LOCK_GUESTS и ADMIN_EXTENSIONS_LOCK_GUESTS -->
</tr>
<tr>
<td>{PHP.L.adm_defauth_members}:</td> <!-- Просто вывод значения из переменной PHP.L.adm_defauth_members -->
<td>{ADMIN_EXTENSIONS_ADMRIGHTS_AUTH_MEMBERS} ({ADMIN_EXTENSIONS_AUTH_MEMBERS})</td> <!-- Просто вывод значений из переменных ADMIN_EXTENSIONS_ADMRIGHTS_AUTH_MEMBERS и ADMIN_EXTENSIONS_AUTH_MEMBERS -->
</tr>
<tr>
<td>{PHP.L.adm_deflock_members}:</td> <!-- Просто вывод значения из переменной PHP.L.adm_deflock_members -->
<td>{ADMIN_EXTENSIONS_ADMRIGHTS_LOCK_MEMBERS} ({ADMIN_EXTENSIONS_LOCK_MEMBERS})</td> <!-- Просто вывод значений из переменных ADMIN_EXTENSIONS_ADMRIGHTS_LOCK_MEMBERS и ADMIN_EXTENSIONS_LOCK_MEMBERS -->
</tr>//-->
<tr>
<td>{PHP.L.Author}:</td> <!-- Просто вывод значения из переменной PHP.L.Author -->
<td>{ADMIN_EXTENSIONS_AUTHOR}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_AUTHOR -->
</tr>
<tr>
<td>{PHP.L.Copyright}:</td> <!-- Просто вывод значения из переменной PHP.L.Copyright -->
<td>{ADMIN_EXTENSIONS_COPYRIGHT}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_COPYRIGHT -->
</tr>
<tr>
<td>{PHP.L.Notes}:</td> <!-- Просто вывод значения из переменной PHP.L.Notes -->
<td>{ADMIN_EXTENSIONS_NOTES}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_NOTES -->
</tr>
<!-- BEGIN: DEPENDENCIES --> <!-- Логический блок, начинающий секцию зависимостей -->
<tr>
<td>{ADMIN_EXTENSIONS_DEPENDENCIES_TITLE}:</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DEPENDENCIES_TITLE -->
<td>
<ul>
<!-- BEGIN: DEPENDENCIES_ROW --> <!-- Логический блок для каждой строки зависимостей -->
<li>
<!-- IF {ADMIN_EXTENSIONS_DEPENDENCIES_ROW_URL} != '' --> <!-- Условие проверки наличия URL -->
<a href="{ADMIN_EXTENSIONS_DEPENDENCIES_ROW_URL}" class="{ADMIN_EXTENSIONS_DEPENDENCIES_ROW_CLASS}">{ADMIN_EXTENSIONS_DEPENDENCIES_ROW_NAME}</a> <!-- Вывод ссылки на зависимость -->
<!-- ELSE -->
<span class="{ADMIN_EXTENSIONS_DEPENDENCIES_ROW_CLASS}">{ADMIN_EXTENSIONS_DEPENDENCIES_ROW_NAME}</span> <!-- Вывод без ссылки, если URL пустой -->
<!-- ENDIF -->
</li>
<!-- END: DEPENDENCIES_ROW --> <!-- Завершающий логический блок строки зависимости -->
</ul>
</td>
</tr>
<!-- END: DEPENDENCIES --> <!-- Завершающий логический блок зависимостей -->
<tr>
<td colspan="2" class="action">
<!-- IF !{PHP.isInstalled} AND {PHP.dependencies_satisfied} --> <!-- Условие, если расширение не установлено и зависимости удовлетворены -->
<a title="{PHP.L.adm_opt_install_explain}" href="{ADMIN_EXTENSIONS_INSTALL_URL}" class="button special large">{PHP.L.adm_opt_install}</a> <!-- Кнопка установки -->
<!-- ENDIF -->
<!-- IF {PHP.isInstalled} --> <!-- Условие, если расширение установлено -->
<!-- IF {PHP.exists} --> <!-- Условие, если расширение существует -->
<a title="{PHP.L.adm_opt_install_explain}" href="{ADMIN_EXTENSIONS_UPDATE_URL}" class="button special large">{PHP.L.adm_opt_update}</a> <!-- Кнопка обновления -->
<!-- ENDIF -->
<a title="{PHP.L.adm_opt_uninstall_explain}" href="{ADMIN_EXTENSIONS_UNINSTALL_URL}" class="ajax button large">{PHP.L.adm_opt_uninstall}</a> <!-- Кнопка удаления -->
<a title="{PHP.L.adm_opt_pauseall_explain}" href="{ADMIN_EXTENSIONS_PAUSE_URL}" class="button large">{PHP.L.adm_opt_pauseall}</a> <!-- Кнопка приостановки всех операций -->
<!-- IF {PHP.exists} --> <!-- Условие для существующих расширений -->
<a title="{PHP.L.adm_opt_unpauseall_explain}" href="{ADMIN_EXTENSIONS_UNPAUSE_URL}" class="button large">{PHP.L.adm_opt_unpauseall}</a> <!-- Кнопка возобновления всех операций -->
<!-- ENDIF -->
<!-- ENDIF -->
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="block">
<h2>{PHP.L.Tags}:</h2> <!-- Просто вывод значения из переменной PHP.L.Tags -->
<div class="wrapper">
<table class="cells">
<thead>
<tr>
<th class="w-5">#</th> <!-- Заголовок для колонки № -->
<th class="w-25">{PHP.L.Part}</th> <!-- Заголовок для колонки "Part", вывод значения из переменной PHP.L.Part -->
<th class="w-70">{PHP.L.Files} / {PHP.L.Tags}</th> <!-- Заголовок для колонки "Files / Tags", вывод значений из переменных PHP.L.Files и PHP.L.Tags -->
</tr>
</thead>
<tbody>
<!-- BEGIN: ROW_ERROR_TAGS --> <!-- Логический блок для отображения ошибки в строках тегов -->
<tr>
<td class="centerall">{ADMIN_EXTENSIONS_DETAILS_ROW_I_1}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DETAILS_ROW_I_1 -->
<td class="centerall">{ADMIN_EXTENSIONS_DETAILS_ROW_PART}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DETAILS_ROW_PART -->
<td class="centerall">{PHP.L.None}</td> <!-- Вывод "None" из переменной PHP.L.None, если теги отсутствуют -->
</tr>
<!-- END: ROW_ERROR_TAGS --> <!-- Завершающий логический блок для строки с ошибкой -->
<!-- BEGIN: ROW_TAGS --> <!-- Логический блок для обычной строки с тегами -->
<tr>
<td class="centerall">{ADMIN_EXTENSIONS_DETAILS_ROW_I_1}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DETAILS_ROW_I_1 -->
<td class="centerall">{ADMIN_EXTENSIONS_DETAILS_ROW_PART}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DETAILS_ROW_PART -->
<td>{ADMIN_EXTENSIONS_DETAILS_ROW_LISTTAGS}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_DETAILS_ROW_LISTTAGS, списка тегов -->
</tr>
<!-- END: ROW_TAGS --> <!-- Завершающий логический блок для строки с тегами -->
</tbody>
</table>
</div>
</div>
<!-- END: DETAILS --> <!-- Конструкция END: DETAILS, означающая конец логического блока DETAILS -->
<!-- BEGIN: HOOKS --> <!-- Логический блок для отображения информации о хуках -->
<div class="block">
<h2>{PHP.L.Hooks} ({ADMIN_EXTENSIONS_CNT_HOOK}):</h2> <!-- Заголовок, выводит значение из переменной PHP.L.Hooks и количество хуков ADMIN_EXTENSIONS_CNT_HOOK -->
<div class="wrapper">
<table class="cells">
<thead>
<tr>
<th class="w-40">{PHP.L.Hooks}</th> <!-- Заголовок для колонки "Hooks", вывод значения из переменной PHP.L.Hooks -->
<th class="w-20">{PHP.L.Plugin}</th> <!-- Заголовок для колонки "Plugin", вывод значения из переменной PHP.L.Plugin -->
<th class="w-20">{PHP.L.Order}</th> <!-- Заголовок для колонки "Order", вывод значения из переменной PHP.L.Order -->
<th class="w-20">{PHP.L.Active}</th> <!-- Заголовок для колонки "Active", вывод значения из переменной PHP.L.Active -->
</tr>
</thead>
<tbody>
<!-- BEGIN: HOOKS_ROW --> <!-- Логический блок для отображения строки с хука -->
<tr>
<td>{ADMIN_EXTENSIONS_HOOK}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_HOOK -->
<td>{ADMIN_EXTENSIONS_CODE}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_CODE -->
<td class="centerall">{ADMIN_EXTENSIONS_ORDER}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_ORDER, отображаемое по центру -->
<td class="centerall">{ADMIN_EXTENSIONS_ACTIVE}</td> <!-- Просто вывод значения из переменной ADMIN_EXTENSIONS_ACTIVE, отображаемое по центру -->
</tr>
<!-- END: HOOKS_ROW --> <!-- Завершающий логический блок для строки с хука -->
</tbody>
</table>
</div>
</div>
<!-- END: HOOKS --> <!-- Конец логического блока HOOKS -->
<!-- END: MAIN --> <!-- Конец логического блока MAIN -->