Структурирование информации

5

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 комментария

  • +1
    km km 26 ноября 2018 23:08 #

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

    Добавить комментарий

    Чтобы добавить комментарий, зарегистрируйтесь или войдите