Изучаем принцип работы хуков в Cotonti CMF

Хуки (hooks) в Cotonti CMF — это механизм расширений, который позволяет подключать код в различные точки жизненного цикла системы без необходимости модификации основного кода фреймворка.

Хуки (hooks) в Cotonti CMF — это механизм расширений, который позволяет подключать код в различные точки жизненного цикла системы без необходимости модификации основного кода фреймворка. Это стандартный механизм в современных фреймворках, который дает возможность разработчикам вставлять свою логику в заранее определенные места (точки подключения) — хуки.

В Cotonti CMF хуки используются для:

  1. Модификации поведения системы: С помощью хуков можно изменить стандартную логику работы фреймворка. Например, можно вставить свой код в момент инициализации страницы, при авторизации пользователя, при выполнении запроса к базе данных и т.д.

  2. Подключения расширений: Разработчики могут создавать плагины или модули, которые подключаются в нужные места через хуки, не нарушая работу других частей системы. Это позволяет добавлять новые возможности и функционал без необходимости изменять основной код фреймворка.

 

$sql = $db->query("SELECT * FROM $db_groups WHERE 1 ORDER BY grp_level DESC, grp_id DESC");

    if($sql->rowCount() > 0)
    {
        /* === Hook - Part1 : Set === */
        $extp = cot_getextplugins('admin.users.row.tags');
        /* ===== */
        foreach ($sql->fetchAll() as $row)
        {
            $members[$row['grp_id']] = (empty($members[$row['grp_id']])) ? '0' : $members[$row['grp_id']];
            $grp_title = isset($L['users_grp_' . $row['grp_id'] . '_title']) ? $L['users_grp_' . $row['grp_id'] . '_title'] : htmlspecialchars($row['grp_title']);
            $grp_desc = isset($L['users_grp_' . $row['grp_id'] . '_desc']) ? $L['users_grp_' . $row['grp_id'] . '_desc'] : htmlspecialchars($row['grp_desc']);
            $t->assign(array(
                'ADMIN_USERS_ROW_GRP_TITLE_URL' => cot_url('admin', 'm=users&n=edit&g='.$row['grp_id']),
                'ADMIN_USERS_ROW_GRP_NAME' => htmlspecialchars($row['grp_name']),
                'ADMIN_USERS_ROW_GRP_TITLE' => $grp_title,
                'ADMIN_USERS_ROW_GRP_DESC' => $grp_desc,
                'ADMIN_USERS_ROW_GRP_ID' => $row['grp_id'],
                'ADMIN_USERS_ROW_GRP_COUNT_MEMBERS' => $members[$row['grp_id']],
                'ADMIN_USERS_ROW_GRP_DISABLED' => $cot_yesno[!$row['grp_disabled']],
                'ADMIN_USERS_ROW_GRP_SKIPRIGHTS' => $row['grp_skiprights'],
                'ADMIN_USERS_ROW_GRP_RIGHTS_URL' => cot_url('admin', 'm=rights&g='.$row['grp_id']),
                'ADMIN_USERS_ROW_GRP_JUMPTO_URL' => cot_url('users', 'g='.$row['grp_id'])
            ));
            /* === Hook - Part2 : Include === */
            foreach ($extp as $pl)
            {
                include $pl;
            }
            /* ===== */
            $t->parse('MAIN.ADMIN_USERS_DEFAULT.USERS_ROW');
        }
    }


Давайте разберем этот участок кода по строкам с подробными комментариями:

$sql = $db->query("SELECT * FROM $db_groups WHERE 1 ORDER BY grp_level DESC, grp_id DESC");

    Запрос к базе данных: Эта строка выполняет SQL-запрос к базе данных, чтобы получить все записи из таблицы групп (переменная $db_groups). WHERE 1 всегда истинно, то есть выборка не ограничена условиями, но сортируется по полям grp_level (по убыванию) и grp_id (по убыванию). Это позволяет получить список групп с сортировкой по уровню и идентификатору группы.

if($sql->rowCount() > 0)

    Проверка наличия данных: Здесь проверяется, есть ли хотя бы одна строка в результатах запроса. Если запрос вернул хотя бы одну запись, то условие выполняется и код в теле if будет выполнен.

/* === Hook - Part1 : Set === */
$extp = cot_getextplugins('admin.users.row.tags');
/* ===== */

    Хук 1 (Part1): Это часть кода, где происходит вызов функции cot_getextplugins(), которая получает все плагины (хук) для события 'admin.users.row.tags'. Хуки — это расширения фреймворка, которые позволяют сторонним разработчикам подключать свой код в заранее определенные места фреймворка. Здесь, хук используется для выполнения дополнительной логики, связанной с обработкой строк пользователей в админке. Результат работы хука сохраняется в переменной $extp.

foreach ($sql->fetchAll() as $row)

    Перебор результатов запроса: Функция fetchAll() возвращает все строки результата запроса как массив. foreach перебирает каждую строку и обрабатывает данные для каждой группы.

$members[$row['grp_id']] = (empty($members[$row['grp_id']])) ? '0' : $members[$row['grp_id']];

    Инициализация счетчика участников: Для каждой группы проверяется, существует ли уже ключ в массиве $members с идентификатором группы grp_id. Если нет — создается и присваивается значение '0' (то есть для этой группы еще нет участников). Если же группа уже присутствует в массиве, то значение остается прежним.

$grp_title = isset($L['users_grp_' . $row['grp_id'] . '_title']) ? $L['users_grp_' . $row['grp_id'] . '_title'] : htmlspecialchars($row['grp_title']);

    Заголовок группы: Эта строка проверяет, есть ли в массиве $L элемент с ключом users_grp_{grp_id}_title, который предполагает локализацию заголовка группы. Если такой элемент существует, то используется его значение. В противном случае, используется оригинальный заголовок группы из базы данных (через htmlspecialchars для защиты от XSS).

$grp_desc = isset($L['users_grp_' . $row['grp_id'] . '_desc']) ? $L['users_grp_' . $row['grp_id'] . '_desc'] : htmlspecialchars($row['grp_desc']);

    Описание группы: Подобным образом, эта строка проверяет наличие локализованного описания группы в массиве $L. Если локализация не найдена, используется описание группы из базы данных с экранированием специальных символов для предотвращения XSS.

$t->assign(array(
    'ADMIN_USERS_ROW_GRP_TITLE_URL' => cot_url('admin', 'm=users&n=edit&g='.$row['grp_id']),
    'ADMIN_USERS_ROW_GRP_NAME' => htmlspecialchars($row['grp_name']),
    'ADMIN_USERS_ROW_GRP_TITLE' => $grp_title,
    'ADMIN_USERS_ROW_GRP_DESC' => $grp_desc,
    'ADMIN_USERS_ROW_GRP_ID' => $row['grp_id'],
    'ADMIN_USERS_ROW_GRP_COUNT_MEMBERS' => $members[$row['grp_id']],
    'ADMIN_USERS_ROW_GRP_DISABLED' => $cot_yesno[!$row['grp_disabled']],
    'ADMIN_USERS_ROW_GRP_SKIPRIGHTS' => $row['grp_skiprights'],
    'ADMIN_USERS_ROW_GRP_RIGHTS_URL' => cot_url('admin', 'm=rights&g='.$row['grp_id']),
    'ADMIN_USERS_ROW_GRP_JUMPTO_URL' => cot_url('users', 'g='.$row['grp_id'])
));

    Присваивание переменных для шаблона: Здесь происходит подготовка данных для вывода в шаблон. Каждый элемент в массиве array() присваивается переменной, которая затем будет доступна в шаблоне. Это включает в себя:
        URL для редактирования группы.
        Название и описание группы.
        Количество участников группы.
        Статус группы (активна или нет).
        Право доступа группы.
        Другие данные, такие как URL для прав и для перехода к группе пользователей.

/* === Hook - Part2 : Include === */
foreach ($extp as $pl)
{
    include $pl;
}
/* ===== */

    Хук 2 (Part2): Это вторая часть хука, где для каждого плагина, найденного в cot_getextplugins('admin.users.row.tags'), подключается файл плагина. Это дает возможность сторонним разработчикам вставить собственный код в это место. Все плагины, которые привязаны к событию 'admin.users.row.tags', будут выполнены.

$t->parse('MAIN.ADMIN_USERS_DEFAULT.USERS_ROW');

    Рендеринг шаблона: Здесь происходит вызов метода parse() объекта шаблона $t. Этот метод использует шаблон с идентификатором 'MAIN.ADMIN_USERS_DEFAULT.USERS_ROW' и вставляет в него все данные, которые были подготовлены до этого. Таким образом, каждая строка группы будет отображена в интерфейсе администратора.

}

    Закрытие цикла foreach: Завершается перебор всех групп и обработка данных.

Ключевые моменты:

    Хуки: В коде есть два хука: один для получения плагинов, второй — для их включения. Это позволяет добавлять или изменять поведение кода без изменения основного кода.
    Подготовка данных: Все данные для отображения группы готовятся с учетом локализации и безопасности (например, htmlspecialchars для предотвращения XSS).
    Использование шаблонов: Данные передаются в шаблон, который будет их рендерить на странице.


Разберираем работу хуков на примере этого кода, и постараемся объяснить схематически, чтобы проще было понять принцип их работы.

Принцип работы хуков:

    Что такое хук?
    Хук — это специальное место в коде, в которое разработчик или плагин может "вставить" свой код, чтобы изменить или расширить стандартную функциональность системы, не изменяя исходного кода самой программы.

    Как это работает в коде выше?
        В коде есть два хука:
            Hook - Part1 : Set
            Hook - Part2 : Include

    Хуки могут быть использованы для динамического расширения функциональности, добавления дополнительного кода, который будет выполняться на определенном этапе работы программы.

Схематическое объяснение

    Визуализация работы первого хука (Part1 - Set):

    Мы сначала выполняем SQL-запрос, получаем группы, а затем передаем все данные в шаблон.

    Но, прежде чем отправить данные в шаблон, на этапе Part1 происходит вызов функции:

$extp = cot_getextplugins('admin.users.row.tags');

Эта функция ищет все плагины, которые зарегистрированы для хука 'admin.users.row.tags'. Плагины могут быть сторонними модулями, которые хотят добавить или изменить поведение кода.

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

Код выполняется → Хук запускает поиск подключенных плагинов → Плагины (если есть) выполняют свой код

Визуально:

    Код основной программы
       |
       V
    Хук Part1 (cot_getextplugins('admin.users.row.tags'))
       |
       V
    Плагины (если подключены) выполняют свой код
       |
       V
    Продолжаем выполнение основного кода

    Если плагинов нет, просто продолжается выполнение основного кода. Плагины — это как "дополнительные модули", которые могут что-то изменить или добавить в процессе работы программы.

    Визуализация работы второго хука (Part2 - Include):

    После того как данные подготовлены и переданы в шаблон, в Part2 происходит включение плагинов.

foreach ($extp as $pl)
{
    include $pl;
}

Это означает, что если какие-либо плагины были найдены (они содержатся в переменной $extp), то для каждого плагина будет выполнен его код. Мы подключаем (включаем) каждый плагин и даем ему возможность выполнить какие-то действия.

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

Основной код исполнился → Хук запускает выполнение плагинов → Плагины выполняют свой код

Визуально:

    Основной код
       |
       V
    Хук Part2 (include плагины)
       |
       V
    Плагины подключаются и выполняют свои действия
       |
       V
    Код продолжает выполнение

    Эти плагины могут изменять, дополнять или манипулировать данными перед тем, как они будут выведены в шаблон.

Пример работы хуков на примере кода:

    Step 1: Мы делаем запрос в базу данных и получаем все группы.

    Step 2: Прежде чем обработать эти данные, мы вызываем хук Part1:
    В это время, если есть подключенные плагины (которые хотят что-то изменить), их код будет выполнен. Например, плагин может изменить, как именно данные групп будут отображаться в таблице.

    Step 3: Данные групп передаются в шаблон для вывода.

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

Простое объяснение:

Представьте, что у вас есть конвейер, который собирает продукты (в нашем случае — это данные о группах):

    Ты получаешь все продукты (группы) с базы данных.
    Прежде чем передать их на финальную сборку, ты спрашиваешь у других людей (плагинов), хотят ли они что-то добавить или изменить в этих продуктах. Если кто-то хочет — он добавляет или меняет что-то.
    После этого все данные проходят через финальный этап сборки, и они уже готовы для отображения пользователю.

Хуки — это как промежуточные точки, где другие "участники" могут вмешаться в процесс и изменить его, не меняя саму основную работу конвейера.

7 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 17.01.2025 14:25
  • Последнее обновление: 17.01.2025 14:34

Похожие страницы

Описание работы метода text() в Cotonti CMF
1 Описание работы метода text() в Cotonti CMF Cotonti — это мощная система управления контентом (CMS), используемая для
Список хуков в файле "forums.posts.php" Cotonti CMF
2 В файле "forums.posts.php" Cotonti CMF используются различные хуки, которые обеспечивают гибкость в обработке