- TP version
- none
Документация по системе шаблонов TorrentPier
Содержание
- Введение
- Архитектура системы шаблонов
- Основные возможности
- Синтаксис шаблонов
- Доступные переменные
- Блоки и циклы
- Условия
- Включение файлов
- PHP код в шаблонах
- Работа с языковыми переменными
- Конфигурация шаблонов
- Кэширование
- API для разработчиков
- Примеры использования
- Лучшие практики
- Отладка
Введение
Система шаблонов TorrentPier представляет собой мощный и гибкий механизм для разделения логики приложения и представления данных. Она базируется на концепции блочных шаблонов с поддержкой кэширования, условий, циклов и интеграции с языковой системой.Ключевые особенности:
- Компиляция шаблонов в PHP-код для максимальной производительности
- Кэширование скомпилированных шаблонов
- Блочная архитектура для работы с повторяющимися элементами
- Условная логика внутри шаблонов
- Языковая поддержка с автоматической подстановкой переводов
- Включение подшаблонов для модульной структуры
- Graceful fallback для отсутствующих переменных
Архитектура системы шаблонов
Основной класс: TorrentPier\Legacy\Template
Класс Template находится в файле src/Legacy/Template.php и является основой всей системы шаблонов.Основные компоненты:
PHP:
class Template {
public $_tpldata = []; // Данные для подстановки в шаблоны
public $vars = []; // Корневые переменные
public $files = []; // Файлы шаблонов
public $compiled_code = []; // Скомпилированный код
public $use_cache = 1; // Настройки кэширования
}
Жизненный цикл шаблона:
- Загрузка шаблона из файла
- Компиляция в PHP-код
- Кэширование скомпилированного кода
- Выполнение и вывод результата
Основные возможности
1. Переменные шаблона
HTML:
<!-- Простые переменные -->
{SITE_NAME}
{USER_NAME}
{CURRENT_TIME}
<!-- PHP переменные -->
{$user['username']}
{$bb_cfg['sitename']}
<!-- Константы -->
{#BB_ROOT#}
{#SITE_URL#}
2. Блоки (циклы)
HTML:
<!-- BEGIN users -->
<div class="user">
<h3>{users.USERNAME}</h3>
<p>Posts: {users.POST_COUNT}</p>
</div>
<!-- END users -->
3. Условия
HTML:
<!-- IF LOGGED_IN -->
<p>Добро пожаловать, {USERNAME}!</p>
<!-- ELSE -->
<p>Пожалуйста, войдите в систему</p>
<!-- ENDIF -->
4. Вложенные условия и блоки
HTML:
<!-- IF SHOW_FORUMS -->
<!-- BEGIN categories -->
<h2>{categories.CAT_NAME}</h2>
<!-- IF categories.FORUMS -->
<!-- BEGIN categories.forums -->
<div>{categories.forums.FORUM_NAME}</div>
<!-- END categories.forums -->
<!-- ENDIF -->
<!-- END categories -->
<!-- ENDIF -->
Синтаксис шаблонов
Основной синтаксис
| Элемент | Синтаксис | Описание |
|---|---|---|
| Переменная | {VARIABLE_NAME} | Простая переменная |
| PHP переменная | {$variable} | PHP переменная |
| Константа | {#CONSTANT#} | PHP константа |
| Языковая переменная | {L_LANGUAGE_KEY} | Переменная перевода |
| Блок | <!-- BEGIN block -->...<!-- END block --> | Цикл |
| Условие | <!-- IF condition -->...<!-- ENDIF --> | Условная конструкция |
| Включение | <!-- INCLUDE filename.tpl --> | Включение файла |
Операторы в условиях
| Оператор | Синтаксис | PHP эквивалент |
|---|---|---|
| Равно | eq или == | == |
| Не равно | ne, neq, != | != |
| Меньше | lt или < | < |
| Меньше или равно | le, lte, <= | <= |
| Больше | gt или > | > |
| Больше или равно | ge, gte, >= | >= |
| И | and или && | && |
| Или | or или || | || |
| Не | not или ! | ! |
| Остаток | mod или % | % |
Специальные конструкции
HTML:
<!-- ELSEIF condition -->
<!-- ELSE -->
<!-- BEGINELSE --> <!-- Альтернатива для пустых блоков -->
Доступные переменные
Системные переменные
Автоматически доступные:
| Переменная | Описание |
|---|---|
| {LANG} | Текущий язык |
| {TEMPLATE} | Путь к текущему шаблону |
| {TEMPLATE_NAME} | Имя текущего шаблона |
| {SITE_URL} | URL сайта |
| {BB_ROOT} | Корневой путь |
Переменные пользователя:
| Переменная | Описание |
|---|---|
| {LOGGED_IN} | Статус авторизации |
| {USERNAME} | Имя пользователя |
| {USER_ID} | ID пользователя |
| {IS_ADMIN} | Статус администратора |
| {IS_MOD} | Статус модератора |
Временные переменные:
| Переменная | Описание |
|---|---|
| {CURRENT_TIME} | Текущее время |
| {S_TIMEZONE} | Временная зона |
Навигационные переменные:
| Переменная | Описание |
|---|---|
| {PAGINATION} | HTML пагинации |
| {PAGE_NUMBER} | Номер страницы |
| {U_INDEX} | URL главной страницы |
Переменные блоков
Каждый блок автоматически получает:| Переменная | Описание |
|---|---|
| {block.S_ROW_COUNT} | Индекс элемента (начиная с 0) |
| {block.S_NUM_ROWS} | Общее количество элементов |
Блоки и циклы
Создание блока в PHP:
PHP:
// Простой блок
$template->assign_block_vars('users', [
'USERNAME' => 'john_doe',
'EMAIL' => '[email protected]',
'POST_COUNT' => 150
]);
// Множественные элементы
foreach ($users as $user) {
$template->assign_block_vars('users', [
'USERNAME' => $user['username'],
'EMAIL' => $user['email'],
'POST_COUNT' => $user['posts']
]);
}
Использование в шаблоне:
HTML:
<!-- Проверка наличия элементов -->
<!-- IF users -->
<h2>Список пользователей:</h2>
<!-- BEGIN users -->
<div class="user-card">
<h3>{users.USERNAME}</h3>
<p>Email: {users.EMAIL}</p>
<p>Сообщений: {users.POST_COUNT}</p>
<p>Пользователь #{users.S_ROW_COUNT} из {users.S_NUM_ROWS}</p>
</div>
<!-- END users -->
<!-- ELSE -->
<p>Пользователи не найдены</p>
<!-- ENDIF -->
Вложенные блоки:
PHP:
// PHP код
$template->assign_block_vars('categories', ['CAT_NAME' => 'Programming']);
$template->assign_block_vars('categories.forums', [
'FORUM_NAME' => 'PHP Forum',
'TOPIC_COUNT' => 100
]);
$template->assign_block_vars('categories.forums', [
'FORUM_NAME' => 'JavaScript Forum',
'TOPIC_COUNT' => 85
]);
HTML:
<!-- Шаблон -->
<!-- BEGIN categories -->
<div class="category">
<h2>{categories.CAT_NAME}</h2>
<!-- BEGIN categories.forums -->
<div class="forum">
<a href="#">{categories.forums.FORUM_NAME}</a>
<span>({categories.forums.TOPIC_COUNT} тем)</span>
</div>
<!-- END categories.forums -->
</div>
<!-- END categories -->
BEGINELSE конструкция:
HTML:
<!-- BEGIN news -->
<article>{news.TITLE}</article>
<!-- BEGINELSE -->
<p>Новостей нет</p>
<!-- END news -->
Условия
Простые условия:
HTML:
<!-- IF LOGGED_IN -->
Добро пожаловать!
<!-- ENDIF -->
<!-- IF POST_COUNT gt 100 -->
<span class="veteran">Ветеран форума</span>
<!-- ENDIF -->
Сложные условия:
HTML:
<!-- IF LOGGED_IN and USER_LEVEL ge 2 -->
<a href="admin.php">Админ панель</a>
<!-- ENDIF -->
<!-- IF (POST_COUNT gt 1000) or IS_MODERATOR -->
<span class="star">★</span>
<!-- ENDIF -->
Условия с блоками:
HTML:
<!-- IF topics -->
<!-- BEGIN topics -->
<!-- IF topics.IS_STICKY -->
<div class="sticky">{topics.TITLE}</div>
<!-- ELSEIF topics.IS_LOCKED -->
<div class="locked">{topics.TITLE}</div>
<!-- ELSE -->
<div class="normal">{topics.TITLE}</div>
<!-- ENDIF -->
<!-- END topics -->
<!-- ELSE -->
<p>Тем не найдено</p>
<!-- ENDIF -->
Специальные проверки:
HTML:
<!-- IF USERNAME is even -->
<div class="even-user">...</div>
<!-- ENDIF -->
<!-- IF POST_COUNT is odd by 10 -->
<div class="milestone">...</div>
<!-- ENDIF -->
<!-- IF USER_ID is div by 100 -->
<div class="special-user">...</div>
<!-- ENDIF -->
Включение файлов
Основной синтаксис:
HTML:
<!-- INCLUDE header.tpl -->
<main>
<!-- INCLUDE sidebar.tpl -->
<article>
Основной контент
</article>
</main>
<!-- INCLUDE footer.tpl -->
Условное включение:
HTML:
<!-- IF SHOW_TORRENT_INFO -->
<!-- INCLUDE viewtopic_torrent.tpl -->
<!-- ENDIF -->
<!-- IF TOPIC_HAS_POLL -->
<!-- INCLUDE viewtopic_poll.tpl -->
<!-- ENDIF -->
Примеры включений в TorrentPier:
HTML:
<!-- Редактор сообщений -->
<!-- INCLUDE posting_editor.tpl -->
<!-- Прикрепления -->
<!-- IF ATTACHBOX -->
<!-- INCLUDE posting_attach.tpl -->
<!-- ENDIF -->
<!-- Ajax редактирование -->
<!-- INCLUDE ajax_edit.tpl -->
PHP код в шаблонах
Вставка PHP кода:
HTML:
<!-- PHP -->
echo "Текущее время: " . date('Y-m-d H:i:s');
<!-- ENDPHP -->
<!-- PHP -->
$user_count = count($users);
echo "Всего пользователей: $user_count";
<!-- ENDPHP -->
Доступные переменные в PHP коде:
| Переменная | Описание |
|---|---|
| $L | Ссылка на массив языковых переменных |
| $V | Ссылка на переменные шаблона |
| $lang | Глобальный массив языка |
| $user | Информация о текущем пользователе |
| $bb_cfg | Конфигурация системы |
Пример использования:
PHP:
<!-- PHP -->
if ($V['SHOW_DEBUG']) {
echo '<div class="debug">';
echo 'Время выполнения: ' . $V['EXECUTION_TIME'];
echo '</div>';
}
<!-- ENDPHP -->
Работа с языковыми переменными
Синтаксис языковых переменных:
HTML:
{L_WELCOME} <!-- Простая языковая переменная -->
{L_HELLO_USER} <!-- С подстановкой -->
{L_POSTS_COUNT} <!-- Множественные формы -->
Graceful Fallback:
Если языковая переменная не найдена, отображается исходный ключ без фигурных скобок:
HTML:
{L_MISSING_KEY} → L_MISSING_KEY (если ключ не найден)
{L_WELCOME} → "Добро пожаловать" (если ключ найден)
Примеры языковых переменных:
| Ключ | Английский | Русский |
|---|---|---|
| L_WELCOME | Welcome | Добро пожаловать |
| L_LOGIN | Login | Вход |
| L_LOGOUT | Logout | Выход |
| L_SEARCH | Search | Поиск |
| L_POSTS | Posts | Сообщения |
| L_TOPICS | Topics | Темы |
| L_FORUMS | Forums | Форумы |
Условные языковые переменные:
HTML:
<!-- IF LOGGED_IN -->
<a href="logout.php">{L_LOGOUT}</a>
<!-- ELSE -->
<a href="login.php">{L_LOGIN}</a>
<!-- ENDIF -->
Комбинированное использование:
HTML:
<h1>{L_WELCOME}, {USERNAME}!</h1>
<p>{L_POSTS_COUNT}: {POST_COUNT}</p>
<p>{L_LAST_VISIT}: {LAST_VISIT_TIME}</p>
Конфигурация шаблонов
Файл конфигурации: tpl_config.php
Каждый шаблон содержит файл конфигурации, который определяет:Пути к изображениям:
PHP:
$images['icon_quote'] = $_lang . 'icon_quote.gif';
$images['icon_edit'] = $_lang . 'icon_edit.gif';
$images['icon_profile'] = $_lang . 'icon_profile.gif';
Настройки отображения:
PHP:
$template->assign_vars([
'TEXT_BUTTONS' => config()->get('text_buttons'),
'TOPIC_ATTACH_ICON' => '<img src="' . $_img . 'icon_clip.gif" alt="" />',
'FEED_IMG' => '<img src="' . $_main . 'feed.png" alt="RSS" />',
]);
Условная загрузка элементов:
PHP:
if (isset($vars['post_buttons'])) {
$template->assign_vars([
'CODE_IMG' => config()->get('text_buttons')
? $lang['CODE_TOPIC_TXTB']
: '<img src="' . $images['icon_code'] . '" alt="Code" />',
]);
}
Структура шаблона:
styles/templates/default/├── tpl_config.php # Конфигурация
├── css/ # Стили
├── images/ # Изображения
│ └── lang/ # Языковые изображения
├── *.tpl # Файлы шаблонов
├── common.tpl # Общие элементы
├── page_header.tpl # Заголовок страницы
└── page_footer.tpl # Подвал страницы
Кэширование
Настройки кэширования:
PHP:
$template->use_cache = 1; // Включить кэширование
$template->auto_compile = 1; // Автокомпиляция
$template->cachedir = CACHE_DIR . '/'; // Директория кэша
Принцип работы:
- Первая загрузка: шаблон компилируется в PHP-код
- Сохранение: скомпилированный код сохраняется в кэш
- Последующие загрузки: выполняется кэшированный PHP-код
- Обновление: при изменении шаблона кэш пересоздается
Файлы кэша:
internal_data/cache/tpl_├── xs_default_index.tpl.php
├── xs_default_viewforum.tpl.php
├── xs_default_viewtopic.tpl.php
└── ...
Отладка кэша:
PHP:
// Отключить кэширование для отладки
$template->use_cache = 0;
// Принудительная перекомпиляция
unset($template->files_cache[$handle]);
API для разработчиков
Основные методы класса Template:
Конструктор:
PHP:
$template = new Template($template_root_dir);
Установка файлов шаблонов:
PHP:
$template->set_filename('body', 'index.tpl');
$template->set_filenames([
'body' => 'viewforum.tpl',
'header' => 'page_header.tpl'
]);
Назначение переменных:
PHP:
// Одна переменная
$template->assign_var('USERNAME', $username);
// Множественные переменные
$template->assign_vars([
'SITE_NAME' => $site_name,
'CURRENT_TIME' => bb_date(time()),
'LOGGED_IN' => !IS_GUEST
]);
Назначение блоков:
PHP:
// Простой блок
$template->assign_block_vars('topics', [
'TOPIC_TITLE' => $title,
'TOPIC_ID' => $topic_id,
'REPLIES' => $replies
]);
// Вложенный блок
$template->assign_block_vars('categories.forums', [
'FORUM_NAME' => $forum_name,
'FORUM_ID' => $forum_id
]);
Парсинг и вывод:
PHP:
// Парсинг без вывода
$template->loadfile('body');
// Парсинг с выводом
$template->pparse('body');
Функция print_page():
PHP:
/**
* Основная функция для вывода страниц
*
* @param mixed $args - массив параметров или строка с именем шаблона
* @param string $type - тип страницы ('', 'admin', 'simple')
* @param string $mode - режим ('no_header', 'no_footer')
*/
function print_page($args, $type = '', $mode = '')
// Примеры использования:
print_page('index.tpl');
print_page('admin_board.tpl', 'admin');
print_page(['tpl' => 'login.tpl', 'simple' => true]);
Полный пример:
PHP:
// Инициализация шаблона
$template = new Template(TEMPLATES_DIR . '/default');
// Установка файла шаблона
$template->set_filename('body', 'viewforum.tpl');
// Назначение основных переменных
$template->assign_vars([
'PAGE_TITLE' => 'Форум',
'FORUM_NAME' => $forum['forum_name'],
'FORUM_DESC' => $forum['forum_desc'],
'LOGGED_IN' => !IS_GUEST,
'U_POST_NEW_TOPIC' => "posting.php?mode=newtopic&f={$forum_id}"
]);
// Назначение блока с темами
foreach ($topics as $topic) {
$template->assign_block_vars('topics', [
'TOPIC_TITLE' => $topic['topic_title'],
'TOPIC_ID' => $topic['topic_id'],
'REPLIES' => $topic['topic_replies'],
'LAST_POST_TIME' => bb_date($topic['topic_last_post_time'])
]);
}
// Вывод страницы
print_page('viewforum.tpl');
Примеры использования
Пример 1: Список пользователей
PHP код:
PHP:
$template->assign_vars([
'PAGE_TITLE' => 'Список пользователей',
'TOTAL_USERS' => count($users)
]);
foreach ($users as $i => $user) {
$template->assign_block_vars('users', [
'ROW_CLASS' => ($i % 2) ? 'row1' : 'row2',
'USERNAME' => $user['username'],
'EMAIL' => $user['email'],
'POSTS' => $user['user_posts'],
'JOINED' => bb_date($user['user_regdate']),
'AVATAR' => get_avatar_url($user['user_id']),
'PROFILE_URL' => "profile.php?mode=viewprofile&u={$user['user_id']}"
]);
}
print_page('memberlist.tpl');
Шаблон (memberlist.tpl):
HTML:
<h1>{L_MEMBERLIST}</h1>
<p>{L_TOTAL_USERS}: {TOTAL_USERS}</p>
<!-- IF users -->
<table class="forumline">
<tr>
<th>{L_USERNAME}</th>
<th>{L_EMAIL}</th>
<th>{L_POSTS}</th>
<th>{L_JOINED}</th>
</tr>
<!-- BEGIN users -->
<tr class="{users.ROW_CLASS}">
<td>
<!-- IF users.AVATAR -->
<img src="{users.AVATAR}" alt="" class="avatar" />
<!-- ENDIF -->
<a href="{users.PROFILE_URL}">{users.USERNAME}</a>
</td>
<td>{users.EMAIL}</td>
<td>{users.POSTS}</td>
<td>{users.JOINED}</td>
</tr>
<!-- END users -->
</table>
<!-- ELSE -->
<p>{L_NO_USERS_FOUND}</p>
<!-- ENDIF -->
Пример 2: Форма с ошибками
PHP код:
PHP:
$errors = [];
if ($_POST) {
if (empty($_POST['username'])) {
$errors[] = $lang['USERNAME_REQUIRED'];
}
if (empty($_POST['email'])) {
$errors[] = $lang['EMAIL_REQUIRED'];
}
}
$template->assign_vars([
'HAS_ERRORS' => !empty($errors),
'USERNAME' => $_POST['username'] ?? '',
'EMAIL' => $_POST['email'] ?? '',
'FORM_ACTION' => $_SERVER['PHP_SELF']
]);
foreach ($errors as $error) {
$template->assign_block_vars('errors', [
'ERROR_MSG' => $error
]);
}
print_page('user_form.tpl');
Шаблон (user_form.tpl):
HTML:
<h1>{L_USER_REGISTRATION}</h1>
<!-- IF HAS_ERRORS -->
<div class="error-box">
<h3>{L_ERRORS_FOUND}</h3>
<ul>
<!-- BEGIN errors -->
<li>{errors.ERROR_MSG}</li>
<!-- END errors -->
</ul>
</div>
<!-- ENDIF -->
<form action="{FORM_ACTION}" method="post">
<table>
<tr>
<td>{L_USERNAME}:</td>
<td><input type="text" name="username" value="{USERNAME}" required /></td>
</tr>
<tr>
<td>{L_EMAIL}:</td>
<td><input type="email" name="email" value="{EMAIL}" required /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="{L_SUBMIT}" class="button" />
</td>
</tr>
</table>
</form>
Пример 3: Древовидная структура категорий
PHP код:
PHP:
$categories = get_forum_categories(); // Получение категорий
foreach ($categories as $category) {
$template->assign_block_vars('categories', [
'CAT_ID' => $category['cat_id'],
'CAT_NAME' => $category['cat_title'],
'CAT_URL' => "viewcat.php?c={$category['cat_id']}"
]);
$forums = get_category_forums($category['cat_id']);
foreach ($forums as $forum) {
$template->assign_block_vars('categories.forums', [
'FORUM_ID' => $forum['forum_id'],
'FORUM_NAME' => $forum['forum_name'],
'FORUM_DESC' => $forum['forum_desc'],
'TOPICS' => $forum['forum_topics'],
'POSTS' => $forum['forum_posts'],
'FORUM_URL' => "viewforum.php?f={$forum['forum_id']}",
'IS_SUBFORUM' => $forum['forum_parent'] > 0
]);
}
}
print_page('index.tpl');
Шаблон (index.tpl):
HTML:
<h1>{L_FORUM_INDEX}</h1>
<!-- BEGIN categories -->
<div class="category">
<h2><a href="{categories.CAT_URL}">{categories.CAT_NAME}</a></h2>
<!-- IF categories.forums -->
<table class="forumline">
<tr>
<th>{L_FORUM}</th>
<th>{L_TOPICS}</th>
<th>{L_POSTS}</th>
</tr>
<!-- BEGIN categories.forums -->
<tr>
<td class="<!-- IF categories.forums.IS_SUBFORUM -->subforum<!-- ELSE -->forum<!-- ENDIF -->">
<h4><a href="{categories.forums.FORUM_URL}">{categories.forums.FORUM_NAME}</a></h4>
<!-- IF categories.forums.FORUM_DESC -->
<p>{categories.forums.FORUM_DESC}</p>
<!-- ENDIF -->
</td>
<td class="center">{categories.forums.TOPICS}</td>
<td class="center">{categories.forums.POSTS}</td>
</tr>
<!-- END categories.forums -->
</table>
<!-- ELSE -->
<p>{L_NO_FORUMS}</p>
<!-- ENDIF -->
</div>
<!-- END categories -->
Лучшие практики
1. Организация кода
Разделение на модули:
HTML:
<!-- Заголовок страницы -->
<!-- INCLUDE page_header.tpl -->
<!-- Основной контент -->
<main>
<!-- INCLUDE sidebar.tpl -->
<article>
Контент страницы
</article>
</main>
<!-- Подвал -->
<!-- INCLUDE page_footer.tpl -->
Использование условных включений:
HTML:
<!-- IF SHOW_SIDEBAR -->
<!-- INCLUDE sidebar.tpl -->
<!-- ENDIF -->
<!-- IF SHOW_BREADCRUMBS -->
<!-- INCLUDE breadcrumbs.tpl -->
<!-- ENDIF -->
2. Оптимизация производительности
Минимизация PHP кода в шаблонах:
HTML:
<!-- Плохо -->
<!-- PHP -->
echo expensive_calculation();
<!-- ENDPHP -->
<!-- Хорошо -->
{PRE_CALCULATED_VALUE}
Использование кэширования:
PHP:
// В PHP коде
$template->use_cache = 1;
$template->auto_compile = 1;
3. Безопасность
Экранирование данных:
PHP:
// В PHP коде
$template->assign_vars([
'USER_INPUT' => htmlspecialchars($user_input, ENT_QUOTES),
'SAFE_HTML' => $sanitized_html
]);
Проверка прав доступа:
HTML:
<!-- IF IS_ADMIN -->
<a href="admin.php">{L_ADMIN_PANEL}</a>
<!-- ENDIF -->
<!-- IF AUTH_MOD -->
<a href="modcp.php">{L_MODERATOR_CP}</a>
<!-- ENDIF -->
4. Читаемость кода
Именование переменных:
PHP:
// Хорошие имена
$template->assign_vars([
'FORUM_NAME' => $forum_name,
'TOPIC_COUNT' => $topic_count,
'LAST_POST_TIME' => $last_post_time
]);
// Плохие имена
$template->assign_vars([
'FN' => $forum_name,
'TC' => $topic_count,
'LPT' => $last_post_time
]);
Группировка переменных:
PHP:
// Группировка по функциональности
$template->assign_vars([
// Информация о форуме
'FORUM_ID' => $forum_id,
'FORUM_NAME' => $forum_name,
'FORUM_DESC' => $forum_desc,
// Статистика
'TOPIC_COUNT' => $topic_count,
'POST_COUNT' => $post_count,
// Разрешения
'CAN_POST' => $can_post,
'CAN_REPLY' => $can_reply
]);
5. Обработка ошибок
Graceful degradation:
HTML:
<!-- IF AVATAR_URL -->
<img src="{AVATAR_URL}" alt="{L_AVATAR}" />
<!-- ELSE -->
<div class="no-avatar">{L_NO_AVATAR}</div>
<!-- ENDIF -->
Fallback для языковых переменных:
HTML:
<!-- Переменная отобразится как 'L_MISSING_KEY' если не найдена -->
{L_MISSING_KEY}
<!-- Или с проверкой -->
<!-- IF L_CUSTOM_KEY -->
{L_CUSTOM_KEY}
<!-- ELSE -->
{L_DEFAULT_MESSAGE}
<!-- ENDIF -->
Отладка
1. Отладка переменных
Вывод всех переменных:
HTML:
<!-- PHP -->
echo '<pre>';
print_r($V);
echo '</pre>';
<!-- ENDPHP -->
Проверка существования переменной:
HTML:
<!-- IF DEBUG_MODE -->
<!-- PHP -->
echo isset($V['VARIABLE_NAME']) ? 'EXISTS' : 'NOT EXISTS';
<!-- ENDPHP -->
<!-- ENDIF -->
2. Отладка блоков
Счетчики элементов:
HTML:
<!-- BEGIN items -->
<div>Item #{items.S_ROW_COUNT} of {items.S_NUM_ROWS}</div>
<!-- END items -->
Проверка пустых блоков:
HTML:
<!-- IF items -->
Блок содержит элементы
<!-- ELSE -->
Блок пуст
<!-- ENDIF -->
3. Отладка компиляции
Просмотр скомпилированного кода:
PHP:
// В PHP коде
$template->loadfile('body');
echo '<pre>' . htmlspecialchars($template->compiled_code['body']) . '</pre>';
exit;
Отключение кэширования:
PHP:
$template->use_cache = 0; // Отключить кэш для отладки
4. Логирование
Добавление отладочной информации:
HTML:
<!-- IF DEBUG_MODE -->
<!-- PHP -->
error_log('Template debug: ' . print_r($V, true));
<!-- ENDPHP -->
<!-- ENDIF -->
Дополнительные ресурсы:
- Исходный код: src/Legacy/Template.php
- Примеры шаблонов: styles/templates/default/
- Конфигурация: styles/templates/default/tpl_config.php
Last edited: