FAQ Документация по системе шаблонов TorrentPier [v2.4.* - v2.8.*]

belomaxorka

Разработчик
Administrator
TP version
none

Документация по системе шаблонов TorrentPier​

Содержание​

  1. Введение
  2. Архитектура системы шаблонов
  3. Основные возможности
  4. Синтаксис шаблонов
  5. Доступные переменные
  6. Блоки и циклы
  7. Условия
  8. Включение файлов
  9. PHP код в шаблонах
  10. Работа с языковыми переменными
  11. Конфигурация шаблонов
  12. Кэширование
  13. API для разработчиков
  14. Примеры использования
  15. Лучшие практики
  16. Отладка

Введение​

Система шаблонов 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;     // Настройки кэширования
}

Жизненный цикл шаблона:​

  1. Загрузка шаблона из файла
  2. Компиляция в PHP-код
  3. Кэширование скомпилированного кода
  4. Выполнение и вывод результата

Основные возможности​

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_WELCOMEWelcomeДобро пожаловать
L_LOGINLoginВход
L_LOGOUTLogoutВыход
L_SEARCHSearchПоиск
L_POSTSPostsСообщения
L_TOPICSTopicsТемы
L_FORUMSForumsФорумы

Условные языковые переменные:​

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 . '/'; // Директория кэша

Принцип работы:​

  1. Первая загрузка: шаблон компилируется в PHP-код
  2. Сохранение: скомпилированный код сохраняется в кэш
  3. Последующие загрузки: выполняется кэшированный PHP-код
  4. Обновление: при изменении шаблона кэш пересоздается

Файлы кэша:​

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:
Back
Top