Что такое hook в программировании

Что такое хуки и как их использовать: краткий гайд с примерами

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Хуки — это технология, которая перехватывает вызовы функций и помогает использовать возможности React без написания классов.

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

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

Встроенные хуки

Хуки можно создавать самостоятельно, но в React существует ряд встроенных хуков, которыми можно пользоваться прямо сейчас.

useState()

Хук состояния — useState() — добавляет динамическую логику функциональных компонентов:

Хук возвращает функцию и значение состояния для обновления.

Пример. Рендеринг счетчика. При нажатии на кнопку его значение увеличится:

Функциональный компонент наделяется внутренним состоянием, которое будет сохраняться между рендерами.

useCallback()

Хук useCallback() оптимизирует рендеринг компонентов:

А также возвращает мемоизированную версию Callback (когда результат выполнения сохраняется). При этом массив зависимостей не передается.

useContext()

Хук useContext() передает данные дочерним элементам:

А также возвращает текущее значение контекста.

useMemo()

Хук useMemo() позволяет запоминать функции без необходимости их вызова при каждом новом рендеринге:

А еще — возвращает мемоизированное значение.

useEffect()

Хук эффекта — useEffect() — выполняет в компонентах функций такие эффекты как вызов API, запросов и подобные:

Пример. Установка компонентом заголовка документа после обновления DOM:

React запускает функции с эффектами после каждого рендера.

useReduce()

useRef()

Хук useRef() создает изменяемую переменную (упрощает доступ к элементам React и узлам DOM):

Хук возвращает ref-объект, который будет сохраняться в течение времени жизни самого компонента.

useImperativeHandle()

Пример. Использование useImperativeHandle с forwardRef:

Хук useImperativeHandle() контролирует возвращаемое значение. Довольно часто этот хук используют в библиотеках компонентов, где нужна кастомизация поведения элементов DOM.

useDebugValue()

Хук useDebugValue() отображает значение для отладки.

Пример. Создание своего React-хука:

Хук useDebugValue() будет вызван тогда, когда будет открыт React DevTools.

useLayoutEffect()

Хук useLayoutEffect() запускается в React только после фиксации в DOM всех обновлений.

Правила хуков

Как создать хуки?

Пусть в компоненте, принадлежащем чату (приложению), отображается уведомление о нахождении пользователя «В сети»:

Давайте сделаем имена пользователей из списка контактов, которые находятся онлайн, зелеными.

Чтобы решить эту задачу, в компонент FriendListItem можно скопировать логику, которая приведена выше:

Конечно, этот способ совсем не простой и короткий.

Но использование хуков избавляет от добавления дополнительных функций в дерево компонентов.

Разделить логику между двумя функциями JavaScript можно, если извлечь ее в еще одну, третью функцию.

Первый пользовательский хук — useFriendStatus() :

Этот хук подписывает нас на статус пользователя. friendID является здесь аргументом:

Что здесь произошло? Мы извлекли код из двух функций и поместили в отдельную функцию.

Важно! Используйте use в начале каждого хука. Это нужно для автоматической проверки правил хуков.

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

Как мы уже говорили, хуки — это те же функции. А потому можно передавать информацию между ними.

Давайте рассмотрим пример использования компонента, демонстрирующего, находится ли пользователь сейчас онлайн:

Идентификатор пользователя сохраняется в recipientID и обновляется в случае выбора в другого пользователя.

Так можно узнать, находится ли пользователь в сети.

Пользовательские хуки гибкие, их можно использовать в связке друг с другом.

Ограничения при использовании хуков

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

Например, в одном компоненте можно использовать сразу несколько хуков эффектов или состояний:

React определяет порядок, при котором вызываются хуки. Именно так он узнает, какому useState() какое состояние соответствует. Поскольку в примере порядок вызовов одинаков при каждом рендере, он является рабочим:

Но что получится, если поместить хук в условие?

Теперь каждый последующий вызов хука будет сдвигаться на единицу, возникнут ошибки. Вот почему хуки должны вызываться на верхнем уровне компонентов.

Компоненты чаще всего определяются как обычные функции:

Также они могут определяться в виде стрелочных функций:

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

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

Заключение

В сравнении с классами, у хуков есть ряд своих преимуществ. Упрощается логика жизненного цикла, появляются возможности гибкой оптимизации (мемоизация), нет необходимости сохранять имена методов и работать с прототипами.

Кастомные хуки позволяют быстрее и легче шейрить логику (она сразу закладывается в хуки). Это ведет к уменьшению вложенности дерева компонентов. React получает возможность пристальнее отслеживать изменения в компонентах.

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

Без них такая логика при наличии нескольких побочных эффектов в компоненте разбивалась бы на разные методы жизненного цикла. А благодаря мемоизации компоненты не будут обновлены или пересозданы. В memo можно поместить все функциональные компоненты.

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

Источник

Хуки — это просто

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Хуки — это технология перехвата вызовов функций в чужих процессах. Хуки, как и любая достаточно мощная технология, могут быть использованы как в благих целях (снифферы, аудио\видеограбберы, расширения функционала закрытого ПО, логирование, багфиксинг) так и со злым умыслом (трояны, кряки, кейлоггеры). О хуках уже не раз писали и на Хабре и не на Хабре. Но вот в чём беда — почему-то каждая статья о хуках буквально со второго абзаца начинает рассказывать о «таблице виртуальных функций», «архитектуре памяти» и предлагает к изучению огромные блоки ассемблерного кода. Известно, что каждая формула в тексте снижает количество читателей вдвое, а уж такие вещи — так и вовсе вчетверо. Поэтому нужна статья, которая расскажет о хуках просто. Под катом нет ассемблера, нет сложных терминов и буквально два десятка строк очень простого кода на С++. Если вы давно хотели изучить хуки, но не знали с чего начать — начните с этой статьи.

Реальная задача

Для лучшего понимания того, что мы делаем — поставим себе какую-нибудь реальную задачу. Давайте, например сделаем так, чтобы браузер Firefox при заходе на Хабр писал в своём заголовке «Привет, Хабр!» вместо того, что там пишется сейчас (а сейчас там пришется «*** / Хабрахабр — Mozilla Firefox», где *** — меняется в зависимости от раздела). Да, я знаю, что это можно сделать правкой исходников Firefox, браузерными плагинами, юзерскриптами и еще десятком способов. Но мы в учебных целях сделаем это хуками.

Совсем чуть-чуть теории

Когда Вы запускаете любое приложение — операционная система создаёт его процесс. Грубо говоря, exe-файл копируется в память, далее определяется какие именно библиотеки (dll-файлы) ему нужны для работы (эта информация записана в начале каждого exe-файла), эти библиотеки ищутся (в папке с программой и в системных папках) и загружаются в память процесса. Потом определяется, какие именно функции библиотек использует программа и где они находятся (в какой библиотеке и где именно в этой библиотеке). Строится табличка вида «функция SomeFunction1() — библиотека SomeLibrary1.dll — %адрес_функции_SomeFunction1()%». Когда программе понадобиться вызвать эту функцию — она найдет в своей памяти нужную библиотеку, отсчитает нужный адрес и передаст туда управление.

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Суть хукинга — заставить программу поверить, что нужная ей функция находится в другом месте.

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Делается это таким образом — мы пишем свою библиотеку SomeLibrary2.dll, в которой будет находится наша функция SomeFunction2(). Далее мы загружаем эту библиотеку в память чужого процесса (в ОС Windows есть специальная функция для этого) и изменяем ту самую табличку, о которой я писал чуть выше, так, чтобы теперь она содержала запись «функция SomeFunction1() — библиотека SomeLibrary2.dll — %адрес_нашей_функции_SomeFunction2()%». Для того, чтобы понять, как вручную сделать всё описанное в этом абзаце, нужно знать весьма прилично всего — как устроена память в Windows, как вызываются функции, как им передаются аргументы и т.д. Это сложно. Ну на самом деле не очень, просто можно обойтись и без этого. Если вам это нужно — почитайте какую-нибудь продвинутую статью (а хоть бы из тех, что указаны в начале). Мы пойдем другим путем — используем готовую библиотеку Microsoft Detours, которая сделает всю грязную работу за нас.

Пару слов о Microsoft Detours

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииПроста в изучении и использовании
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииВесьма эффективна
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииХорошая документация
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииСодержит много примеров в исходниках
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииРазработана Microsoft — неплохо «дружит» с ОС
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииБесплатна для исследовательских целей и некоммерческих проектов
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииНе требует знания ассемблера

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииЗакрыта
Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииСтоит приличных денег для коммерческого использования или х64-архитектуры

В целом, я бы посоветовал начинать изучение хуков именно с Detours — если это будет всего лишь вашим разовым развлечением, то этого вполне хватит, у вас быстро всё получится и вам понравится. Если же хуки понадобятся в серьёзном проекте — вы легко переключитесь на бесплатные и открытые (но чуть более сложные) библиотеки типа mhook, купите Detours или напишете свой велосипед (для последних двух решений нужны весьма веские причины).
О том где взять и как собрать Detours я писал вот тут.

Хитрый план

Куда ставить хук

Переходим в Firefox, открываем Хабр, дожидаемся изменения заголовка на нужный и возвращаемся в Api Monitor чтобы остановить мониторинг. Скорее всего, вы будете удивлены количеством вызванных функций — их могут быть сотни тысяч буквально за несколько секунд мониторинга. А мы ведь еще и следим далеко не за всем. Да-да, это всё реально происходит внутри безобидного открытия всего одного сайта в браузере! А вы еще жалуетесь, что эта пара секунд — слишком долго. 🙂

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Найти нужную нам функцию поможет поиск по вкладке с результатами мониторинга. Вбиваем в поиск «WM_SETTEXT» и убеждаемся, что действительно имеются вызовы функции SendMessageW с этим параметром — с высокой вероятностью это и есть установка заголовка окна. Обратите внимание на «W» в конце названия функции — оно означает, что используется её юникодная версия. Для установки хуков важно знать точное имя подменяемой функции и теперь мы его знаем.

Делаем свою библиотеку

4. Открываем свойства проекта и на вкладке настроек линкера добавляем в поле Additional Dependencies значение «C:\Program Files\Microsoft Research\Detours Express 3.0\lib.X86\detours.lib». Внимание, у вас путь может быть другой — смотря куда установили библиотеку Detours.

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Давайте разберем исходник. В начале мы подключаем заголовочные файлы Windows (чтобы пользоваться функцией SendMessageW) и Detours (чтобы иметь возможность ставить\снимать хуки).
В сложной на первый взгляд строке №3 мы всего лишь сохраняем реальный указатель на функцию SendMessageW в переменную TrueSendMessageW. Это нам понадобиться для двух целей:

Функция DllMain вызывается операционной системой в определенных случаях — например, в моменты аттача\детача библиотеки к процессу. Тут тоже всё просто. В момент аттача нам нужно установить хуки, в момент детача — снять. Библиотека Detour требует делать это транзакциями, и в этом есть смысл — представьте себе что будет, если сразу несколько желающих захотят поставить хуки в один процесс. Самое важное в этом коде это строка

Именно она заставляет процесс «поверить» что теперь вместо настоящей функции SendMessageW нужно вызывать нашу MySendMessageW. Ради этой строки всё и затевалось. Если кому интересно, однажды я писал аналог этой функции вручную. С учетом всех возможных комбинаций типов функций и архитектур это заняло у меня несколько недель. Вы вот только что их сэкономили — поздравляю.

Источник

Windows hook: просто о сложном

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программированииЧто такое хук?
Что такое хук функций и для чего он нужен? В переводе с английского «hook» — ловушка. Поэтому о назначении хуков функции в Windows можно догадаться — это ловушка для функции. Иными словами, мы ловим функцию и берем управление на себя. После этого определения нам открываются заманчивые перспективы: мы можем перехватить вызов любой функции, подменить код на свой, тем самым изменив поведение любой программы на то, которое нам нужно (конечно, в рамках определенных ограничений).

Целью данной статьи является демонстрация установки хука и его непосредственная реализация.

— Нельзя поверить в невозможное!
— Просто у тебя мало опыта, – заметила Королева. – В твоем возрасте я уделяла этому полчаса каждый день! В иные дни я успевала поверить в десяток невозможностей до завтрака!

Где мне реально пригодились эти знания

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

• Контроль входящего http-траффика и подмена «взрослого» контента на более безобидный.
• Логирование информации в случае копирования каких-либо файлов с подконтрольной сетевой папки.
• Незначительная модификация кода в проекте, от которого были утеряны исходники (да, и такое тоже случается)

Методы установки хуков

Давайте перейдем от общих фраз к более детальному рассмотрению хуков. Мне известно несколько разновидностей реализации хука:

● Использование функции SetWindowsHookEx. Это весьма простой, оттого и ограниченный, метод. Он позволяет перехватывать только определенные функции, в основном связанные с окном (например, перехват событий, которые получает окно, щелчков мышкой, клавиатурного ввода). Достоинством этого метода является возможность установки глобальных хуков (например, сразу на все приложениях перехватывать клавиатурный ввод).
● Использование подмены адресов в разделе импорта DLL. Суть метода заключается в том, что любой модуль имеет раздел импорта, в котором перечислены все используемые в нем другие модули, а также адреса в памяти для экспортируемых этим модулем функций. Нужно подменить адрес в этом модуле на свой и управление будет передано по указанному адресу.
● Использование ключа реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_Dlls. В нем необходимо прописать путь к DLL, но сделать это могут только пользователи с правами администратора. Этот метод хорош, если приложение не использует kernel32.dll (нельзя вызвать функцию LoadLibrary).
● Использование инъектирования DLL в процесс. На мой взгляд, это самый гибкий и самый показательный способ. Его-то мы и рассмотрим более подробно.

Инъектирование возможно, потому что функция ThreadStart, которая передается функции CreateThread, имеет схожую сигнатуру с функцией LoadLibrary (да и вообще структура dll и исполняемого файла очень схожи). Это позволяет указать метод LoadLibrary в качестве аргумента при создании потока.

Алгоритм инъектирования DLL выглядит так:

1. Находим адрес функции LoadLibrary из Kernel32.dll для потока, куда мы хотим инжектировать DLL.
2. Выделяем память для записи аргументов этой функции.
3. Создаем поток и в качестве ThreadStart функции указываем LoadLibrary и ее аргумент.
4. Поток идет на исполнение, загружает библиотеку и завершается.
5. Наша библиотека инъектирована в адресное пространство постороннего потока. При этом при загрузке DLL будет вызван метод DllMain с флагом PROCESS_ATTACH. Это как раз то место, где можно установить хуки на нужные функции. Далее рассмотрим саму установку хука.

Подход, используемый при установке хука, можно разбить на следующие составные части:

1. Находим адрес функции, вызов которой мы хотим перехватывать (например, MessageBox в user32.dll).
2. Сохраняем несколько первых байтов этой функции в другом участке памяти.
3. На их место вставим машинную команду JUMP для перехода по адресу подставной функции. Естественно, сигнатура функции должна быть такой же, как и исходной, т. е. все параметры, возвращаемое значение и правила вызова должны совпадать.
4. Теперь, когда поток вызовет перехватываемую функцию, команда JUMP перенаправит его к нашей функции. На этом этапе мы можем выполнить любой нужный код.

Далее можно снять ловушку, вернув первые байты из п.2 на место.

Итак, теперь нам понятно, как внедрить нужную нам DLL в адресное пространство потока и каким образом установить хук на функцию. Теперь попробуем совместить эти подходы на практике.

Наше тестовое приложение будет довольно простым и написано на С#. Оно будет содержать в себе кнопку для показа MessageBox. Для примера, установим хук именно на эту функцию. Код тестового приложения:

В качестве инъектора рассмотрим два варианта. Инъекторы, написанные на С++ и С#. Почему на двух языках? Дело в том, что многие считают, что С# — это язык, в котором нельзя использовать системные вещи, — это миф, можно :). Итак, код инъектора на С++:

Теперь тоже самое, но только на С#. Оцените, насколько код более компактен, нет буйства типов (HANDLE, LPVOID, HMODULE, DWORD, которые, по сути, означают одно и тоже).

Теперь самое интересное — код библиотеки, которая устанавливает хуки. Эта библиотека написана на С++, пока без аналога на C#.

Ну и несколько картинок напоследок. До установки хука:

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

В следующем нашей материале мы постараемся написать код библиотеки, которая устанавливает хуки на C#, т. к. механизм инъектирования управляемого кода заслуживает отдельной статьи.

Источник

Хуки — это просто (часть 2)

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Для лучшего понимания данной статьи рекомендуется сначала прочитать первую часть.

madCodeHook

Библиотека с богатым прошлым. Первая её версия вышла в далёком 2000-ом году, предназначалась для использования под Delphi и мало что умела. Тем ни менее за последующие годы автор весьма неплохо её развивал: сделал SDK для С++, внедрил поддержку 64-битных систем, всех версий Windows от 9х до Win 8.1, реализовал драйвер для внедрения хуков во все новосозданные процессы, ну и вообще достаточно активно работал над проектом (апдейты и сейчас выходят регулярно). По ходу дела из-из нежелания быть подмогой вирусописателям библиотека потеряла бесплатную версию, однако цены, начинающиеся от 349 евро делают её реальной альтернативой и нереально дорогой Microsoft Detours, и малоудобной mhook, и нестабильной (по моему опыту) EasyHook.

Ограничения evaluation-версии

В общем, для изучения — ничего критически мешающего. Для коммерческого продукта в любом случае нужно покупать лицензию.

Вспоминаем нашу задачу

В первой части статьи мы использовали хуки для того, чтобы заставить браузер Mozilla Firefox при заходе на Хабр писать в своём заголовке «Привет, Хабр!». Во-первых, мне лень придумывать новую задачу, а во-вторых даже правильнее будет реализовать снова тоже самое на базе другой библиотеки — можно сравнить скорость разработки, объём и сложность кода. Кроме того, в первой части мы уже разобрались куда и какие хуки нужно вешать, так что сэкономим на этом немного времени.

Практика

4. Подкидываем в наши проекты заголовочный файл и lib-файл из SDK madCodeHook. При установке библиотеки по-умолчанию они находятся по адресу C:\Program Files (x86)\madCollection\madCodeHook\Dll. В evaluation-версии нам доступна только динамическая линковка, так что забираем файлы madCHook — dynamic.h и madCHook — dynamic — microsoft.lib, можно их для краткости переименовать в madCHook.h и madCHook.lib.

5. Пишем код. Ключевые моменты:

6. Компилируем, запускаем Firefox, запускаем mchEvaluation.exe, запускаем инжектор, в браузере переходим на Хабр. Результат:

Что такое hook в программировании. Смотреть фото Что такое hook в программировании. Смотреть картинку Что такое hook в программировании. Картинка про Что такое hook в программировании. Фото Что такое hook в программировании

Выводы

В плане удобства работы с evaluation-версией madCodeHook немного проигрывает Microsoft Detours, полнофункциональные версии в этом плане примерно равны. Кода писать madCodeHook требует даже меньше. В составе madCodeHook есть драйвер для внедрения библиотек на общесистемном уровне (во все существующие и новые процессы), в Detours эту задачу нужно решать собственным сервисом или драйвером. По скорости и стабильности библиотеки показались мне аналогичными. madCodeHook не вызывает ощущения «энтерпрайзности», как продукт Microsoft, что одновременно и хорошо и плохо: автора легко можно поймать на форуме (что хорошо), но там же написано «я могу уйти в отпуск на 6 недель в любое время года» (что плохо). Сообщество madCodeHook сосредоточено на их форуме, сообщество Microsoft Detours как-то раскидано по Stackoverflow, wasm.ru, форумам MSDN и ощущения целостности не создаёт.

В общем, библиотека madCodeHook оставляет хорошее впечатление, можно пользоваться.

Источник

Хуки в PHP — расширение функций и контроллеров ядра¶

Общая информация¶

Многие функции и методы CS-Cart имеют специальные хуки.

Хуки позволяют модифицировать и расширять возможности платформы с помощью модуля.

С помощью хука можно:

Хуки расположены в функциях и методах ядра CS-Cart.

Общий принцип использования и работы с хуками:

Доступно очень много хуков:

Как выглядит и как использовать хук?¶

Хуки в PHP выглядят так:

Чтобы подключиться к хуку, вам необходимо:

Инициализировать подключение к хуку.

В данный файл добавьте функцию:

Если используте несколько хуков, передавайте названия хуков через запятую:

Создайте функцию, которая будет выполняться в хуке.

Функция должна иметь название вида: fn_[id_модуля]_[название_хука]($[параметры_хука_через_запятую])

В функции будут доступны все параметры передаваемые в хук.

Чтобы функция могла влиять на параметры (изменять снаружи), их необходимо передавать как ссылки ( &$param )

Живой пример¶

Предположим, что нам нужно добавить какую то новую информацию о товаре, если товара нет на складе.

Подключимся к последнему хуку и добавим нужную нам информацию с помощью модуля “Мои изменения”:

Добавим в него код:

Создадим функцию для подключения к хуку.

Создадим файл app/addons/my_changes/func.php

Добавим новую функцию, которая сработает в хуке:

Включим модуль “Мои изменения”.

Как проверить что оно работает?

Используйте функцию fn_print_r($product_data); до хука, после хука или внутри хука. Она распечатает на экран содержимое массива.

Как я могу использовать именно этот пример?

Создайте новую вкладку с SMARTY блоком для карточки товара. В данном SMARTY блоке вы можете использовать информацию из массива <$product_data>, в том числе вашу новую информацию, например, для каких либо условий.

Разграничение редакций¶

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

Нам нужно расширить данную функцию в Multi-Vendor. Таким образом, в файле /app/functions/fn.multivendor.php создаем функцию:

Код для определенной редакции¶

Или же использовать отрицание:

Первая часть кода означает, что этот код появится в перечисленных редакциях, вторая же часть — что код НЕ появится в этих редакциях

Хуки в PHP скриптах¶

Версионные теги так же используют фукнцию fn_allowed_for :

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *