Как сделать, чтобы приложение запускалось при открытии любой страницы

Нужно собирать статистику посещения всех страниц (и весь фронтенд, и весь бекенд), можно ли как-то вызывать один из методов моего приложения на всех без исключения страницах WebAsyst? Желательно, чтобы с помощью какого-то хука, а не правкой кодов или добавлением в шаблоны.

Заранее благодарю!

5 ответов

  • 2

    Чтобы прям везде, включая бэкэнд... Не очень просто. На хук не подпишешься.

    Вот такой способ есть. В файле:

    wa-config/SystemConfig.class.php

    Переопределить public function init() и там после вызова parent::init() вставить нужный вам код. Минус в том, что в этот момент фреймворка ещё, по сути, нет. Инициализировать приложение не получится, даже wa() не сработает. Подключаться к БД придётся через отдельное соединение:

    $db_config = $this->getDatabase();
    $m = new waModel($db_config['default']);

    Так можно делать что-то простое, типа дописать строчку в файл или в БД. А парсить и по-человечески сортировать данные в приложении уже после (по крону, например).

    Если надо прям кровь-из-носу инициализировать приложение, могу придумать для этого адовые костыли. Но лучше так не делать. Тем более что запускать лишнее приложение при каждой загрузке страницы может оказаться не очень мудро с точки зрения производительности.

  • 1
    creativit.ru 17 июня 2015 07:50 #

    Леонид, спасибо за ответ!

    Хотелось бы цивилизованный способ, чтобы не лезть в ядро. Чтобы пользователь установил приложение и оно работало (и при обновлении не слетело). И пока я понимаю, что выход есть только для фронтенда - пользователь в шаблон вставляет хелпер (грубо говоря счетчик).

    Насколько я понял с бекендом проблема....пусть будет так.

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

    Да, в целом, счетчик ничего не делает, кроме как записывает данные из суперглобальных переменных в базу. Вся обработка и отображение на бекенде.

    • +2

      wa-config - это не ядро. Ничего не слетит при обновлении. При установке приложения (или, наверное, при нажатии юзером на кнопку "включить") я могу себе представить автоматическое добавление чего надо куда надо. А самая большая опасность в том, что два разных приложения захотят использовать такую технику, и случится что-то плохое.

      Но это, конечно, необычно глубокий уровень чёрной магии, тут спорить не стану.

      Альтернатива (без чёрной магии и без хэлперов в шаблонах) - это подписаться на много хуков, отдельно для каждого имеющегося приложения.

  • 1
    creativit.ru 17 июня 2015 07:50 #

    Леонид, спасибо за ответ!

    Хотелось бы цивилизованный способ, чтобы не лезть в ядро. Чтобы пользователь установил приложение и оно работало (и при обновлении не слетело). И пока я понимаю, что выход есть только для фронтенда - пользователь в шаблон вставляет хелпер (грубо говоря счетчик).

    Насколько я понял с бекендом проблема....пусть будет так.

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

    Да, в целом, счетчик ничего не делает, кроме как записывает данные из суперглобальных переменных в базу. Вся обработка и отображение на бекенде.

  • 1
    creativit.ru 17 июня 2015 08:15 #

    Леонид, про первый способ понял. Огромное спасибо!

    А как в приложении подписаться на хук другого приложения? Я нигде не нашел примеров. И честно говоря не представляю, как например, подписаться на хук routing, который есть во всех приложениях? Если в плагине всё понятно, он подцепляется в хукам родителя, то с приложениями не понятно.

    Если есть где-то описание, то буду благодарен за ссылку. Иначе пойду по первому способу.

    • +2

      Мда, я тоже не нашёл документацию.

      Идея простая. Плагин может подписаться только на события своего родного приложения. А приложение может подписаться на события любого приложения (в том числе свои, если вдруг удобно). Чтобы подписаться, надо создать файл lib/handlers/<app>.<hook>.handler.php с классом yourapp<App><Hook>Handler extends waEventHandler.

      Примеров сколько угодно. В любом приложении есть lib/handlers: Контакты, Блог, Фото, Магазин...

  • 1
    creativit.ru 17 июня 2015 08:47 #

    Спасибо, буду изучать!

Добавить ответ

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