Перейти к содержанию

Хук integrate_theme_context

Хук, появившийся в SMF 2.1. Помогает управлять переменными в начале загрузки страницы.

Расположение⚓︎

Sources/Subs.php

<?php

call_integration_hook('integrate_theme_context');

Sources/Theme.php

<?php

IntegrationHook::call('integrate_theme_context');

Как видим, хук не имеет параметров; в нем доступны для использования любые переменные, определённые до его вызова.

Назначение⚓︎

Это хук, который позволяет вам модифицировать глобальный массив $context непосредственно перед тем, как он будет передан в шаблон (theme) для отрисовки страницы.

Массив $context — это главный «транспорт» для передачи данных из PHP-логики в шаблоны (файлы .template.php) и в сами темы (файлы .php и .tpl в папке Themes). В нем содержится вся информация, необходимая для отображения страницы: от заголовка и содержимого сообщений до данных о пользователе и структуры меню.

Использование⚓︎

Как подключать хуки

<?php

if (! defined('SMF'))
    die('No direct access...');

class YourModName
{
    // Подключаем используемые хуки
    public function hooks(): void
    {
        add_integration_function('integrate_theme_context', self::class . '::themeContext#', false, __FILE__);
    }

    // Например, в Optimus через этот хук добавляются свои мета-теги
    public function themeContext(): void
    {
        global $modSettings, $context;

        if (! empty($modSettings['optimus_meta'])) {
            $tags = unserialize($modSettings['optimus_meta']);

            foreach ($tags as $name => $value) {
                if (! empty($value)) {
                    $context['meta_tags'][] = ['name' => $name, 'content' => $value];
                }
            }
        }
    }
}

Особенности и лучшие практики⚓︎

Всё уже загружено: К моменту вызова этого хука загружено абсолютно всё: база данных, пользовательские данные, права доступа, языковые строки. Вы можете использовать любые функции SMF.

Не для логики: этот хук предназначен для подготовки данных к выводу, а не для выполнения основной бизнес-логики. Логика должна выполняться раньше, в хуках, специфичных для действий (например, integrate_actions).

Производительность: Не делайте в этом хуке тяжелых запросов к базе данных или сложных вычислений, так как он выполняется при каждой загрузке страницы. Кэшируйте результаты, если это необходимо.

Конфликты: Будьте осторожны с названиями ключей в массиве $context. Используйте уникальные префиксы для ваших модов (например, my_mod_some_value), чтобы избежать перезаписи ключей другими модами или самим SMF.

Хук вызывается после определения основных метаданных SMF ($context['page_title'], $context['meta_keywords'], $context['meta_tags']), поэтому его удобно использовать для дополнения или изменения этих переменных.

Комментарии