Список хуков LiveStreet CMS 1.0.1

На днях написал черновик по списку хуков и так забыл о нем, пока не увидел новое видео от Максима и сразу вспомнил об этом тексте, решив под общий шумок вокруг хуков добавить и эту статью. Я видел разные топики, где спрашивали "есть ли список хуков?". Да, есть. Вот он.

Привожу список стандартных хуков для чистой официальной ЛС 1.0.1, большинство из них неявно прописаны в движке, поэтому попытка найти их вызовы в коде у вас не выйдет т.к. часть их них автоматически формируется ядром движка.
Из стандартной поставки ЛС хуки в сумме вызываются 486 раз, некоторые по нескольку раз. Это нормально. Здесь приведены 161 хук, которые доступны в ЛС 1.0.1, в порядке их вызова, начиная с самого первого, исключая дальнейшие повторения.


module_Hook_init_after
module_Plugin_init_before
module_Plugin_init_after
module_Cache_init_before
module_Cache_init_after
module_Security_init_before
module_Security_init_after
module_Session_init_before
module_Session_init_after
module_Lang_init_before
lang_init_start
module_Viewer_init_before
viewer_init_start
module_Viewer_init_after
module_viewer_assign_before
module_viewer_assign_after
module_Lang_init_after
module_Message_init_before
module_session_get_before
module_session_get_after
module_Message_init_after
module_User_init_before
module_Database_init_before
module_Database_init_after
module_database_getconnect_before
module_database_getconnect_after
module_cache_get_before
module_cache_get_after
module_cache_set_before
module_cache_set_after
module_Geo_init_before
module_user_getusercurrent_before
module_user_getusercurrent_after
module_Geo_init_after
module_geo_gettargetsbytargetarray_before
module_geo_gettargetsbytargetarray_after
module_cache_clean_before
module_cache_clean_after
module_User_init_after
engine_init_complete
init_action
module_Ls_init_before
module_Ls_init_after
module_ls_senderrun_before
module_ls_senderrun_after
action_init_actionindex_before
module_Topic_init_before
module_Topic_init_after
module_topic_getcounttopicscollectivenew_before
module_Blog_init_before
module_Blog_init_after
module_blog_getaccessibleblogsbyuser_before
module_blog_getaccessibleblogsbyuser_after
module_topic_getcounttopicscollectivenew_after
module_topic_getcounttopicspersonalnew_before
module_topic_getcounttopicspersonalnew_after
action_init_actionindex_after
action_event_index_before
module_viewer_sethtmlrssalternate_before
module_viewer_sethtmlrssalternate_after
module_viewer_sethtmlcanonical_before
module_viewer_sethtmlcanonical_after
module_topic_gettopicsgood_before
module_lang_get_before
module_lang_get_after
module_user_getusersadditionaldata_before
module_user_getusersadditionaldata_after
module_blog_getblogsadditionaldata_before
module_blog_getblogsadditionaldata_after
module_Vote_init_before
module_Vote_init_after
module_vote_getvotebyarray_before
module_vote_getvotebyarray_after
module_Favourite_init_before
module_Favourite_init_after
module_favourite_getfavouritesbyarray_before
module_favourite_getfavouritesbyarray_after
module_topic_gettopicsgood_after
topics_list_show
module_viewer_makepaging_before
module_viewer_makepaging_after
action_event_index_after
action_shutdown_actionindex_before
action_shutdown_actionindex_after
module_session_getid_before
module_session_getid_after
module_session_set_before
module_session_set_after
module_Talk_init_before
module_Talk_init_after
module_talk_getcounttalknew_before
module_talk_getcounttalknew_after
module_topic_getcountdrafttopicsbyuserid_before
module_topic_getcountdrafttopicsbyuserid_after
module_viewer_display_before
template_html_head_begin
template_html_head_end
module_viewer_addblock_before
module_viewer_addblock_after
template_body_begin
template_write_item
template_container_class
template_header_banner_begin
template_main_menu_item
template_main_menu
template_userbar_nav
template_userbar_stat_item
template_userbar_item_first
template_userbar_item_last
template_header_banner_end
template_menu_blog
template_wrapper_class
module_viewer_getblocks_before
module_viewer_getblocks_after
module_Comment_init_before
module_Comment_init_after
module_comment_getcommentsonline_before
module_blog_getinaccessibleblogsbyuser_before
module_blog_getinaccessibleblogsbyuser_after
module_topic_gettopicsadditionaldata_before
module_topic_gettopicsadditionaldata_after
module_comment_getcommentsonline_after
module_viewer_getlocalviewer_before
module_lang_getlangmsg_before
module_lang_getlangmsg_after
module_viewer_getlocalviewer_after
template_block_stream_nav_item
module_topic_getopentopictags_before
module_topic_getopentopictags_after
module_Tools_init_before
module_Tools_init_after
module_tools_makecloud_before
module_tools_makecloud_after
template_block_tags_nav_item
module_blog_getblogsrating_before
module_blog_getblogsrating_after
template_menu_blog_index_item
template_content_begin
module_topic_isallowtopictype_before
module_topic_isallowtopictype_after
template_topic_content_begin
template_topic_content_end
template_block_topic_share
template_topic_show_vote_stats
template_topic_show_info
template_content_end
template_footer_menu_user_item
template_footer_menu_navigate_item
template_copyright
template_footer_end
template_body_end
module_database_getstats_before
module_database_getstats_after
module_cache_getstats_before
module_cache_getstats_after
module_viewer_fetch_before
template_statistics_performance_begin
template_statistics_performance_item
template_statistics_performance_end
module_viewer_fetch_after
module_viewer_display_after

Как видим — первым хуком стартует модуль хуков module_Hook_init_after, который срабатывает сразу после инициализации механизма хуков :)

Хуки, которые начинаются на
  • module_ — это хуки вызова методов модулей и для каждого модуля вызывается два хука:
    
        module_ИМЯМОДУЛЯ_МЕТОД_before
        module_ИМЯМОДУЛЯ_МЕТОД_after
    

    т.е. до и после вызова метода.

  • хуки без префикса, как, например
    lang_init_start
    — это обычные стандартные хуки, которые явно прописаны в коде и найти их можно путем поиска по файлам движка.

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

  • template_ — хуки, которые прописаны в шаблоне, только без самого префикса template_, но привязываться к ним нужно используя этот префикс.

Это кросспост из гида по ЛС.

23 комментария

avatar
Низкий поклон! Как же это нужно. Еще бы описание к каждому.
avatar
Названия вполне мнемоничны
avatar
вот для вас старая, но все статья livestreet.ru/blog/dev_documentation/3991.html
avatar
И отсортировать по алфавиту надо бы :)
avatar
нет, мне кажется что как раз в порядке вызова более логично.
avatar
а наверное Вы правы, да…
avatar
Отлично, спасибо большое!
  • NPC
  • 0
avatar
Хуки вида module_* не рекомендуется использовать, помнится их хотели вообще убрать. Используйте Inherit.
avatar
да, при их отключении время загрузки локально уменьшилось на 0.8 сек.
avatar
А вот сразу вопрос. Есть плагин который весит на module_*_after. Написали еще один плагин для того же события, для которого очень желательно, чтобы он отрабатывал гарантированно после этого первого плагина. В случае использования того же хука — всё просто: $iPriority = +1000. А как быть в случае Inherit?
avatar
А как быть в случае Inherit?
Отрабатываются в порядке активации плагинов
avatar
Это по вашему решение? Откуда мне знать в каком порядке активировались плагины где-то там? Инструкцию писать вида «если-то»? А если задача стоит не просто «после такого-то», а «после всех что есть»? Механизм хуков даёт какую-никакую, но гарантию…
avatar
Я дал не решение, а ответил на вопрос.

Узнать, в каком порядке активировались плагины, элементарно — достаточно посмотреть в файл plugins.dat

Если говорить именно о решении, то оно, разумеется, сложнее. Как пример: плагин aceAdminPanel у меня ВСЕГДА активируется первым (даже, если до него какие-то другие плагины были активированы), а aceBlogExtender активируется всегда последним
avatar
Ну, понимаете, пока нет решения этой проблемы на уровне фреймворка я оцениваю Inherit, как весьма изящное, но ограниченно применимое решение. IMHO разумеется.
avatar
А с module_*_before всё еще хуже. Потому, что если надо быть уверенным, что переопределённый метод отработвывает до хуков, то выбора вообще нет…
avatar
Не понял, что значит «до хуков», module_*_before — это и есть хук
avatar
Как сделать inherit метода, на котором before хуки, да притом так чтоб этот inherit отработал ДО этих хуков? Насколько я понимаю — никак.
avatar
Элементарно, Ватсон! Это ведь просто ООП, и никакой магии. Вот так метод плагина выполнится ДО оригинального метода модуля:
function SomeMethod() {
    // plugin code is here
    parent::SomeMethod();
}

А так — после:
function SomeMethod() {
    parent::SomeMethod();
    // plugin code is here
}
avatar
Это понятно. Не очень понятно когда, выполнятся before хуки оригинального метода? В первом случае.
avatar
Игровой портал v2.0. Качай игры бесплатно, а так же играй в них онлайн. Огромная коллекция Flash игр, более 1000 штук game-explorer.ru/
avatar
Можно ли как-то повесить хук на метод EventAjaxValidateFields экшена ActionRegistration?
avatar
Там же есть стандартный хук:
$this->Hook_Run('registration_validate_field', array('aField'=>&$aField));
avatar
Уже разобрался. Спасибо)
Дописываю плагин антиспам. В момент ввода ящика нужна проверка по базе спамеров.
Реализовал через переопределение сущности Email.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.