Тест хуков
Господа, я накидал простейший механизм хуков. Предлагаю потестить его на производительность на рабочем проекте.
Для теста необходимо:
1. создать файл /classes/modules/hooktest/HookTest.class.php с содержимым
2. Открыть метод EventShowTopicPersonal (/classes/actions/ActionBlog.class.php) и
добавить строчку
перед комментарием
3. Повторить пункт 2 с методом метод EventShowTopic (/classes/actions/ActionBlog.class.php)
Для теста необходимо:
1. создать файл /classes/modules/hooktest/HookTest.class.php с содержимым
<?
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
class LsHookTest extends Module {
private $aHooks = array();
public function Init() {
//for ($i=0;$i<10000;$i++)
$this->hookInvoke("before_topic_show","HookTest_AddCopyright");
}
public function addCopyright($aVars){
$aVars["topic"]->setTitle("");
$aVars["topic"]->setText($aVars["topic"]->getText()." © 2009");
//$this->Viewer_ClearBlocks('right');
//$this->Viewer_AddBlocks('right',array('stream','tags','blogs'));
}
public function hookRun($sHookName,$aVars){
if (isset($this->aHooks[$sHookName]))
foreach ($this->aHooks[$sHookName] as $sCallBack){
call_user_func_array(array(&$this, $sCallBack),array($aVars));
}
}
public function hookInvoke($sHookName,$sCallBack){
$this->aHooks[$sHookName][] = $sCallBack;
}
}
?>
2. Открыть метод EventShowTopicPersonal (/classes/actions/ActionBlog.class.php) и
добавить строчку
$this->HookTest_HookRun("before_topic_show",array("topic"=>&$oTopic));
перед комментарием
/**
* Загружаем переменные в шаблон
*/
3. Повторить пункт 2 с методом метод EventShowTopic (/classes/actions/ActionBlog.class.php)
10 комментариев
знак & в php5 не обязателен
нужно определить список необходимых точек для хуков
Мне для галереи:
init_action (actions/Init.class.php -> InitAction())
topic_show
topic_personal_show (может, объединить)
blog_show_good
blog_show_new
blog_show_bad
topic_add_show (экран создания топика)
profile_whois_show
Первым словом можно указывать название класса: a_blog (ActionBlog) или m_blog (LsBlog), а вторым событие (думаю, может отличаться от метода).
И в конце, если надо, можно добавить before/after
предлагаю только методы модулей и методы отдельных хаков
по реализации:
системный модуль Hooks
в каталоге /classes/hooks/ хранить автозагружаемые хуки, которые наследуются от абстрактного, а в нём уже идет обращение к модулю hooks
тогда поставить хук мы сможем двумя способами:
1. создав класс хука
2. установить хук в любом месте через модуль Hooks
так?
a_blog_topic_show.
По реализации да, отлично!
Можно еще сразу подумать о шаблонах. Там тоже иногда вставки надо делать…