Написание хуков/плагинов LiveStreet

3
Вечер добрый, хотя, уже ночь.
Знакомлюсь с livestreet, а точнее с написанием плагинов/хуков. Настал тот момент, когда начал «строить» свой проект.
Возникла потребность добавить некий «второй» рейтинг для пользователей, который не будет связан с основным и будет регулировать некоторые действия на сайте.
Немного прочитав, понял, что правкой в двиг такое не стоит делать, ибо скоро и обновления, да и вообще принято это делать хуками/плагинами ( не так ли? ).
Прошу подкиньте материал по ним, пока что нашел следующее:
http://mindlis.ru/livestreet/urok-1-napisanie-plaginov-livestreet-051-hello-world.html
http://social.ilya-afanasyev.ru/blog/sites/88.html
http://livestreet.ru/blog/sollutions/9962.html

Пользователь beauty_free добавил http://github.com/medar/livestreetplugin
http://livestreet.ru/blog/dev_documentation/4499.html
http://livestreet.ru/blog/5071.html

А verdet подкинул:
docs.livestreetcms.com/api/1.0/
docs.livestreetcms.com/template/1.0/


Буду благодарен, а в дальнейшем надеюсь, этот топик станет сборником для новичков

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

5
Начал изучать 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:

Читать дальше
  • -1
  • 14 августа 2011, 10:10
  • syjgin

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

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

//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 в корневой каталог, то всё работает. Но хотелось бы расположить все файлы внутри каталога плагина

Хуки работы с контентом

 
Было бы очень неплохо добавить ко всем хукам манипуляции с контентом (ну типа topic_edit_before, blog_edit_after и т.д и т.п.) параметр, указывающий реального пользователя изменяющего этот контент. Ведь, например, топик может поменять и админ и модератор. И в обработчике хука было бы очень неплохо это знать.
  • +1
  • 08 марта 2011, 00:32
  • kerby

А есть ли системный хук на отображение страницы?

 
Собственно вопрос в сабже. Нужен именно системный хук, вызываемый при отображении страницы и именно один раз… Все, какие нашел вызываются, почему-то, два-три раза. Нормально работает темплейтные, типа html_head_end, но хочется именно системный, чтобы не зависить от текущего шаблона.
  • 0
  • 17 января 2011, 21:16
  • kerby

В подвале появилась ссылка

1
У меня простой (надеюсь) вопрос. Пару дней назад, после того как я удалил из главного меню ссылку Разделы (так у меня называются Блоги) — я просто зашёл в header_top.tpl и удалил оттуда соответствующий li. Ссылка из топа пропала, но через пару дней я заметил её в подвале (внизу слева): www.varim.ru/ — причём, ссылка ведёт на страницу /index/ (вроде ссылка сверху вела на /blog/)

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

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

Помогите, люди добрые!

Выглядит это так:

Как прервать акшин?

 
При выполнении хука хотелось бы прервать выполнение текущего акшина(отправка формы) и вернуться на страницу отправки/редактирования. Подскажите как корректнее это сделать.
  • 0
  • 04 октября 2010, 11:20
  • tih

Livestreet: дао разработчика - 2

51
Первая часть цикла

Дао — это действие, процесс, поток. Чем чаще вы смотрите на код других плагинов, тем больше вы понимаете, как делать свой.
Накачайте плагинов под 0.4.2 и расматривайте, что у них внутри. Без этого вы не сможете начать писать свои плагины.

Я сделал типовой шаблон, из которого удобно делать свои собственные плагины. Располагается он тут:
http://github.com/medar/livestreetplugin
Чтобы скачать его, надо нажать в правом верхнем углу кнопку «Download Source». Желающие могут форкать и вносить изменения.

В файле находится «рыба» плагина с названием abcplugin.

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

Livestreet: дао разработчика - 1

25
Я сейчас работаю над одним проектов, в качестве платформы для которого я выбрал Livestreet. Так как с инфой для программистов у этого движка туго, я буду выкладывать те вещи, который я узнал о движке здесь. Надеюсь, это поможет остальным начинающим программистам на LS.

Я работаю с движком всего несколько дней, поэтому что-то в описании может быть неточно или неполно. Не стесняйтесь поправлять.

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

Итак.

Для начала стоит пробежаться по существующей документации для разработчика (http://trac.lsdev.ru/livestreet/wiki/DeveloperDoc), чтобы понимать термины.
Откройте в IDE движок, пробежитесь по папкам движка, по плагину page, который идет в комплекте с движком.

В движке Livestreet:
Экшены, содержащие Ивенты (action, events) — это, кто знаком с MVC — контроллеры.
Модули (module) — куски кода, которые осуществляют некий функционал (например, функционирование блогов, топиков, комментов). В процессе своей работы они обращаются к Мапперам (mapper) для того, чтобы пообщаться с базой данных. Все sql-запросы пишутся именно в мапперах. Мапперы в свою очередь используют Сущности (entity), которые переводят массивы, отданные mysql в объекты, с которыми потом работает движок.

Способ модификации кода Livestreet два.

1. Через переопределение существующих функций. Меняется целиком существующая функция в модуле/маппере/сущности, или добавляется своя. Подробно: livestreet.ru/blog/dev_documentation/4499.html

2. Через хуки. При этом вставляется код в указанное место движка.
Хуки можно вставить в места, определенные конструкцией $this->HookRun(...); в движке, а также на начало и конец любого модуля, зарегистрированного в системе (не важно, системный он, или установлен каким-то плагином). Подробно про хуки в моделях: livestreet.ru/blog/dev_documentation/3991.html.

Переопределения эти делаются в плагинах. Подробнее о плагинах и их устройстве: livestreet.ru/blog/dev_documentation/3531.html

Как делать эти самые плагины — подробно поговорим во второй части.

Вторая часть