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

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

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

Читать дальше →

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

Здравствуйте, вопрос вот в чем
Есть файл шаблона. И нем есть примерно такой вызов:
{hook run='footer_end'}


Как мне надо изменить файл шаблона чтобы можно было сделать следующее (условный язык):

 {if hook_has_returned('footed_end')}
    ХУК выполнился и все нормально
 {else}
    ХУК не выполнился, надо вывести заглушку
 {/if}

Найти места хуков в скомпилированном шаблоне?

Подскажите, пожалуйста, можно ли где найти месторасположение и идентификацию хуков (пустых, не объявленных) в уже скомпилированном шаблоне, т.е., странице сайта?
Может, они обернуты в пустые со специфическими id или еще какими параметрами?

Стоит задача — с помощью JS визуально подсветить места расположения хуков на страницах сайта. И получить их идентификатор, например, template_header_banner_begin

Как бы решение проблемы в лоб — догадываюсь, отпарсить шаблоны — получить список хуков, зарегистрировать все хуки с визуально пустым содержимым, присвоить неотображаемым элементам — желаемый id… но мне кажется, это неправильно…

Спасибо за идеи, мысли и тп. по этому поводу.

Еще раз про JS-хуки - мое представление о том, как должно быть

Ежу понятно, что гибкость и расширяемость – это одни из основных характеристик любой CMS. И LiveStreet в этом плане весьма неплохо организован. Но, на мой взгляд, иногда движку не хватает какой-то концептуальной структурированности. Давайте рассмотрим, как мы можем расширять и менять скины (шаблоны), серверную часть (PHP) и клиентскую часть (javascript).
Читать дальше →

Хуки JS в LS, краткое руководство для тех, кто запутался

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

Вступление


Механизм делегирования кода ЖС в ЛС можно осуществлять такими наиболее часто употребляемыми методами в зависимости от поставленной задачи:

Читать дальше →

Где найти исходный код хука?

Начал изучать LS, но никак не могу понять, кто такие хуки.
Прочитал в документации и искал по всему сайту, но до меня никак не доходит.

Например в шаблоне header.tpl буквально в пятой строчке есть вызов хука «html_head_begin»

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html lang="ru">
<head>
	{hook run='html_head_begin'}
	
	<title>{$sHtmlTitle}</title>
	
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<meta name="description" content="{$sHtmlDescription}" />
	<meta name="keywords" content="{$sHtmlKeywords}" />


а теперь внимание вопрос.
Где в исходных кодах можно найти, что делает этот хук? в каких папках и директориях копать?

если я где-то затупил — поправьте пожалуйста.

UPD: Та дам! Если кто-то еще не разобрался, что такое хуки, то вот вам колхозное определение.
Хук — это место в шаблоне, которое обозначается примерно так:
{hook run='menu_topic_action_add_item'}


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

public function RegisterHook()
    {
	$this->AddHook('menu_topic_action_add_item', 'TopicEditAfter');
    }
	
	public function TopicEditAfter()
    {
		$aType = $this->PluginCategory_Category_GetType();
		$this->Viewer_Assign('aType', $aType);
		return $this->Viewer_Fetch(Plugin::GetTemplatePath('category') .  'menu.settings_category.tpl');
    }


Т.е. мы говорим движку: «я хочу запустить эту белеберду в месте, где стоит хук „menu_topic_action_add_item“. Поэтому, если вы нашли в коде конструкцию
{hook run='menu_topic_action_add_item'}


то не пугайтесь, это значит, что тут может запускаться некий код. А может и не запускаться :)

И не забывайте, что при регистрации хука шаблона надо вначале писать „template_“, т.е. если вы в шаблоне нашли
{hook run="menu_topic_action_add_item"}


то определять его надо так:
public function RegisterHook()
    {
	$this->AddHook('tеmplate_menu_topic_action_add_item', 'TopicEditAfter');
    }
	
    }

Пытаюсь добавить поле БД и 2 метода к модулю User, не получается

До этого редактировал напрямую User.mapper.class.php и User.entity.class.php в движке, захотел от этого избавиться, сделал по образцу плагина l10n:
plugins/sport/classes/hooks/HookSport.class.php:
Читать дальше →

[РЕШЕНО]Использование хуков в плагине

Дочитал документацию и этот топик, пытаюсь добавить поле при регистрации, но, похоже, поставил функцию не там, где её ищет движок:

//PluginMyPlugin.class.php
public function Init() {
      $this->Hook_AddExecFunction('template_form_registration_end','add_field',10);
    }
    public function add_field($aVars) {
      var_dump("some additional field");
    }

В этом случае при регистрации появляется следующая ошибка:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'add_field' not found or invalid function name in /var/www/localhost/htdocs/live/engine/modules/hook/Hook.class.php on line 139

Также пробовал создавать внутри плагина каталог classes/hooks с файлом hookMyPlugin.class.php:
class PluginMyPlugin_HookMyPlugin extends Hook {
public function RegisterHook ()
{
  this -> AddHook('template_form_registration_end','RegEnd',__CLASS__,10);
}
public function RegEnd ($aVars) {
  //return $this -> Viewer_Fetch (Plugin::GetTemplatePath (__CLASS__) . 'reg_end.tpl');
  var_dump("Hook it!");
}
}

Но в этом случае совсем ничего не происходит. Если просто добавить хук в /classes/hooks в корневой каталог, то всё работает. Но хотелось бы расположить все файлы внутри каталога плагина