pilot911
Новичок
Хуки и расширение функции.
Господа, такой сакраментальный вопрос по хукам, расширяющим функции.
Задача: необходимо обеспечить возможность расширения функциональности модуля, не переписывая его исходный код. Необходимо также каким-то образом вести учёт объявленных точек расширения, предоставляя обзор их текущего набора. Что из себя должна представлять конкретная точка расширения - объект, метод или что-то другое?
Например, есть класс, выводящий поля из таблицы пользователя. Один экстеншен добавляет в эту таблицу поле "money" , второй - поле "phone".
Как в классе, формирующем HTML о пользователе, лучше обработать новые поля таблицы ?
До сего момента делал так:
в конфиге первого экстеншена писал
в конфиге второго
класс loadconfigs заполнял массив
$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_1';
$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_2';
и потом обработка новых полей шла из функции
получается так, что в каждом классе page_manage_ext_1, page_manage_ext_2 вызывается функция main, которая добавляет через шаблонизатор новые поля в HTML.
Господа, такой сакраментальный вопрос по хукам, расширяющим функции.
Задача: необходимо обеспечить возможность расширения функциональности модуля, не переписывая его исходный код. Необходимо также каким-то образом вести учёт объявленных точек расширения, предоставляя обзор их текущего набора. Что из себя должна представлять конкретная точка расширения - объект, метод или что-то другое?
Например, есть класс, выводящий поля из таблицы пользователя. Один экстеншен добавляет в эту таблицу поле "money" , второй - поле "phone".
Как в классе, формирующем HTML о пользователе, лучше обработать новые поля таблицы ?
До сего момента делал так:
в конфиге первого экстеншена писал
PHP:
loadconfigs::extendFunction('page_manage'/* оригинальный класс вывода HTML */, 'page_manage_ext_1', 'main');
PHP:
loadconfigs::extendFunction('page_manage'/* оригинальный класс вывода HTML */, 'page_manage_ext_2', 'main');
$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_1';
$GLOBALS['FUNCTION_EXT']['page_manage']['main'][] = 'page_manage_ext_2';
и потом обработка новых полей шла из функции
PHP:
class page_manage {
function main() {
// формирование стандартных полей
// ............
$this->extendFunction('main');
}
}
PHP:
function extendFunction($function, &$args=array()) {
$current_class = get_class($this);
if (isset($GLOBALS['FUNCTION_EXT'][$current_class][$function])) {
foreach($GLOBALS['FUNCTION_EXT'][$current_class][$function] as $k=>$class) {
if (method_exists($class, $function)) {
$args = call_user_func_array(array($class, $function), array(array('pObj'=>$this,'params'=>$args)));
}
}
}
}
получается так, что в каждом классе page_manage_ext_1, page_manage_ext_2 вызывается функция main, которая добавляет через шаблонизатор новые поля в HTML.