Структурирование информации
1. Очевидно, что пора уже создать на форуме разработчиков разделы как на форуме тех. поддержки. Нужен отдельный раздел с постами работников Webasyst - искать инфу не очень удобно. Разделы: Обновления Webasyst, Статьи, Вопросы, Обсуждения.
2. Добавить в приложения конфиг hooks.php/events.php содержащий хуки и их описание. Как вариант, добавить в app.php.
return array(
'frontend_product' => array(
'name' => 'frontend_product',
'description' => 'Интерфейсный хук, расширяющий содержимое страницы товара на витрине.',
'params' => 'array $params ...',
'return' => 'array ...',
'example' => '...',
),
// ...
);
Вариант 2: добавить класс содержащий handler-методы для хуков приложения.
/**
* Интерфейс хэлпера для хуков.
* Наследующий класс должен содержать публичные методы описывающие обработчики хуков.
* Название методой совпадает с названием событий.
*/
interface waiAppHooks
{
}
/**
* Класс наследующий интерфейс, в данном случае содержит хуки приложения "Магазин".
*/
class shopHoocks implements waiAppHooks
{
/**
* Интерфейсный хук, расширяющий содержимое страницы товара на витрине.
*
* @param array $product
* array data массив с информацией о товаре
* shopProduct product экземпляр класса товара
* @return array
* string menu cодержимое рядом со ссылками на дополнительные страницы товара
* string cart cодержимое рядом с кнопкой «В корзину»
* string block блок дополнительной информации в боковой части страницы
* string block_aux блок дополнительной информации в основной части описания товара
*/
public function frontend_product(array $product)
{
return array(
'menu' => '...',
'cart' => '...',
'block' => '...',
'block_aux' => '...',
);
}
/**
* Обрабатывается непосредственно перед полным сбросом содержимого интернет-магазина.
* Удобно использовать для очистки данных плагина в базе данных.
*
* @return void
*/
public function reset()
{
$model = new shopMyPluginFooModel;
$model->truncate();
}
}
/**
* Класс хэлпер для получения информации о хуках приложения
*/
class waAppHooks
{
/**
* @var waiAppHooks
*/
protected $helper;
/**
* @var array hooks ['name' => 'method', 'description' => 'method comment', 'example' => 'method code']
*/
protected $hooks = [];
/**
* Create helper.
* @param string $app_id
* @return void
*/
public function __construct($app_id)
{
$class = $app_id.'Hooks';
if (!class_exists($class)) {
$path = wa()->getAppPath('lib/classes/'.$class.'.php', $app_id);
if (!file_exists($path)) {
throw new waException('Class "'.$class.'" not exist.');
}
include_once $path;
}
$this->helper = new $class;
}
/**
* Get hooks info.
* @return array
*/
public function getAll()
{
$methods = get_class_methods($this->helper);
if (count($methods) != count($this->hooks)) {
foreach (array_diff($methods, array_keys($this->hooks)) as $method) {
$this->get($method);
}
}
return $this->hooks;
}
/**
* Get hook info.
* @param string $name event name
* @return array
*/
public function get($name)
{
if (!isset($this->hooks[$name])) {
if (!method_exists($this->helper, $name)) {
throw new waException('Event "'.$name.'" not exist.');
}
$method = new ReflectionMethod($this->helper, $name);
$this->hooks[$name] = array(
'name' => $name,
'description' => $this->getComment($method),
'example' => $this->getCode($method),
);
}
return $this->hooks[$name];
}
/**
* Get method comment.
* @param ReflectionMethod $method
* @return string
*/
protected function getComment(ReflectionMethod $method)
{
$lines = explode("\n", $method->getDocComment());
$lines = array_slice($lines, 1, -1);
foreach ($lines as & $line) {
$line = trim($line);
$line = mb_substr($line, 2);
}
return implode("\n", $lines);
}
/**
* Get method code.
* @param ReflectionMethod $method
* @return string
*/
protected function getCode(ReflectionMethod $method)
{
$start_line = $method->getStartLine();
$lines = file($method->getFileName());
$offset = mb_strlen($lines[$start_line]) - mb_strlen(ltrim($lines[$start_line]));
$lines = array_slice(
$lines,
$start_line - 1,
$method->getEndLine() - $start_line + 1
);
foreach ($lines as & $line) {
$line = mb_substr($line, $offset);
}
return trim(implode('', $lines));
}
}Это автоматом решит проблему с обновлением инфы по хукам на сайте.
Добавление новых комментариев к этой теме отключено.










2 комментария
Если не ошибаюсь, то информация о хуках собирается автоматически. Может просто не запускали еще после релиза.
Врядли или алгоритм кривой, даже сейчас там не все хуки указаны.