[РЕШЕНО]Использование хуков в плагине
1
Дочитал документацию и этот топик, пытаюсь добавить поле при регистрации, но, похоже, поставил функцию не там, где её ищет движок:
В этом случае при регистрации появляется следующая ошибка:
Также пробовал создавать внутри плагина каталог classes/hooks с файлом hookMyPlugin.class.php:
Но в этом случае совсем ничего не происходит. Если просто добавить хук в /classes/hooks в корневой каталог, то всё работает. Но хотелось бы расположить все файлы внутри каталога плагина
//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 в корневой каталог, то всё работает. Но хотелось бы расположить все файлы внутри каталога плагина
Решил перековырять немного ядро
5
Мои нововведения:
Плюсы
Сырцы
engine/classes/Engine.class.php raw
engine/modules/hook/Hook.class.php raw
func_list_plugins() (поместить в engine/include/function.php)
Давайте потестим и обсудим, насколько всё это полезно?
зыж. модифицированное ядро отлично работает на моей тестовой площадке livestreet.ochecho.ru/
- Хуки вокруг инициализации модулей _before и _after за счет методов InitModule
- Переработанный __autoload
- Получение информации о классе методом GetClassInfo вплоть до пути к класс-файлу
Плюсы
- Никаких более регулярок для парсинга имени класса в других скриптах, всё в одном месте
- Нет более вилок в коде по поводу регистра в именах классов и методов. Везде учитывается регистр (собственно, чем нам грозит php6, насколько я помню)
- Стандартные хуки вокруг инициализации модулей — это просто прекрасно, я считаю, мне часто нужны были
- func_list_plugins() — замена куче дублирующегося кода
- Переработанный __autoload автоматом инклюдит все возможные классы, имена которых описаны по правилам ядра.
Сырцы
engine/classes/Engine.class.php raw
engine/modules/hook/Hook.class.php raw
func_list_plugins() (поместить в engine/include/function.php)
function func_list_plugins($bAll = false){
$sPluginsDir = Config::Get('path.root.server').'/plugins';
$sPluginsListFile = $sPluginsDir.'/plugins.dat';
$aPlugin = array();
if($bAll){
$aPluginRaw = array();
$aPaths = glob("$aPluginRaw/*", GLOB_ONLYDIR);
if($aPaths)
foreach($aPaths as $sPath){
$aPluginRaw[] = basename($sPath);
}
}else{
$aPluginRaw = @array_map('trim', file($sPluginsListFile));
}
if($aPluginRaw)
foreach($aPluginRaw as $sPlugin){
$sPluginXML = "$sPluginsDir/$sPlugin/plugin.xml";
if(is_file($sPluginXML)){
$aPlugin[] = $sPlugin;
}
}
return $aPlugin;
}Давайте потестим и обсудим, насколько всё это полезно?
зыж. модифицированное ядро отлично работает на моей тестовой площадке livestreet.ochecho.ru/
Объясните пожалуйста, как вывести произвольный текст в произвольное место шаблона?
2
т.е. есть, к примеру, плагин или модуль и я хочу вывести результат работы какого-нить из его методов в шаблон
header_top.tpl
если есть возможность вызова методов не из плагина/модуля, то просветите тоже, если таковые имеются :)
p.s. вопрос навеян модулем «лента друзей», который тут в качестве примера предлагался, но не понятно, как мне зайдя в блоги сразу увидеть сколько у друзей прибавилось новых топиков не кликая по ним (не переходя в роут router.page.friends и не вызывая экшн)
заранее благодарен!:)
header_top.tpl
если есть возможность вызова методов не из плагина/модуля, то просветите тоже, если таковые имеются :)
p.s. вопрос навеян модулем «лента друзей», который тут в качестве примера предлагался, но не понятно, как мне зайдя в блоги сразу увидеть сколько у друзей прибавилось новых топиков не кликая по ним (не переходя в роут router.page.friends и не вызывая экшн)
заранее благодарен!:)
Подключение плагинов под Windows [rev. 688]
Файл: Engine.class.php, функция InitPlugins
При обработке файла /classes/plugins/plugins.dat сформированного в Windows редакторе, в переменной $sPluginName остаются два символа с кодами 13 и 10.
Предлагаемое решение проблемы: обработка $sPluginName функцией trim.
Аналогичные проблемы найдены в:
Engine.class.php, функция InitPluginHooks
Lang.class.php, функиця LoadLangFiles
loader.php, строка 136
275: if($aPluginList = @file(Config::Get('path.root.server').'/classes/plugins/plugins.dat')) {
276: foreach ($aPluginList as $sPluginName) {
При обработке файла /classes/plugins/plugins.dat сформированного в Windows редакторе, в переменной $sPluginName остаются два символа с кодами 13 и 10.
Предлагаемое решение проблемы: обработка $sPluginName функцией trim.
275: if($aPluginList = @file(Config::Get('path.root.server').'/classes/plugins/plugins.dat')) {
276: foreach ($aPluginList as $sPluginName) {
+277: $sPluginName=trim($sPluginName);
Аналогичные проблемы найдены в:
Engine.class.php, функция InitPluginHooks
Lang.class.php, функиця LoadLangFiles
loader.php, строка 136
- -1
- 30 декабря 2009, 12:38
- HangGlider
- 1