Страницы

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

Изучаем принцип работы хуков в Cotonti CMF
8 мин чтения
Теги: Нет тегов

Хуки (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 выполняет подключение и выполнение кода плагинов. Это дает возможность плагинам вмешаться на финальной стадии и, например, отредактировать или добавить дополнительные элементы на страницу, прежде чем она будет отображена пользователю.

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

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

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

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

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

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

Информация

Admin_Cot_Base

Оффлайн

Admin_Cot_Base

Последняя авторизация: 11.03.2026 01:35

  • Страница размещена: 16.03.2025 04:02
  • Последнее обновление: 16.03.2025 04:02

CleanCot © Среда, 03 июня 2026 04:35


Версия PHP: 8.4.6
Страница создана за 0.05167 секунды

Режим совместимости: legacyMode Выключен

Версия ядра: v.0.9.26 beta / Версия БД: v.0.9.26