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










7 ответов
Чтобы прям везде, включая бэкэнд... Не очень просто. На хук не подпишешься.
Вот такой способ есть. В файле:
wa-config/SystemConfig.class.php
Переопределить public function init() и там после вызова parent::init() вставить нужный вам код. Минус в том, что в этот момент фреймворка ещё, по сути, нет. Инициализировать приложение не получится, даже wa() не сработает. Подключаться к БД придётся через отдельное соединение:
$db_config = $this->getDatabase();
$m = new waModel($db_config['default']);
Так можно делать что-то простое, типа дописать строчку в файл или в БД. А парсить и по-человечески сортировать данные в приложении уже после (по крону, например).
Если надо прям кровь-из-носу инициализировать приложение, могу придумать для этого адовые костыли. Но лучше так не делать. Тем более что запускать лишнее приложение при каждой загрузке страницы может оказаться не очень мудро с точки зрения производительности.
Леонид, спасибо за ответ!
Хотелось бы цивилизованный способ, чтобы не лезть в ядро. Чтобы пользователь установил приложение и оно работало (и при обновлении не слетело). И пока я понимаю, что выход есть только для фронтенда - пользователь в шаблон вставляет хелпер (грубо говоря счетчик).
Насколько я понял с бекендом проблема....пусть будет так.
Есть альтернатива хелперу для фронтенда? Чтобы пользователь даже шаблоны не трогал, а счетчик работал? Может быть вы бы добавили какое-то условие? Например, если у приложения есть какой-то определенный файл, тогда его вызывать на каждой странице? Ну либо, чтобы из приложения можно было бы цепляться к хукам других приложений - это вообще бы песня была.
Да, в целом, счетчик ничего не делает, кроме как записывает данные из суперглобальных переменных в базу. Вся обработка и отображение на бекенде.
wa-config - это не ядро. Ничего не слетит при обновлении. При установке приложения (или, наверное, при нажатии юзером на кнопку "включить") я могу себе представить автоматическое добавление чего надо куда надо. А самая большая опасность в том, что два разных приложения захотят использовать такую технику, и случится что-то плохое.
Но это, конечно, необычно глубокий уровень чёрной магии, тут спорить не стану.
Альтернатива (без чёрной магии и без хэлперов в шаблонах) - это подписаться на много хуков, отдельно для каждого имеющегося приложения.
Леонид, спасибо за ответ!
Хотелось бы цивилизованный способ, чтобы не лезть в ядро. Чтобы пользователь установил приложение и оно работало (и при обновлении не слетело). И пока я понимаю, что выход есть только для фронтенда - пользователь в шаблон вставляет хелпер (грубо говоря счетчик).
Насколько я понял с бекендом проблема....пусть будет так.
Есть альтернатива хелперу для фронтенда? Чтобы пользователь даже шаблоны не трогал, а счетчик работал? Может быть вы бы добавили какое-то условие? Например, если у приложения есть какой-то определенный файл, тогда его вызывать на каждой странице? Ну либо, чтобы из приложения можно было бы цепляться к хукам других приложений - это вообще бы песня была.
Да, в целом, счетчик ничего не делает, кроме как записывает данные из суперглобальных переменных в базу. Вся обработка и отображение на бекенде.
Леонид, про первый способ понял. Огромное спасибо!
А как в приложении подписаться на хук другого приложения? Я нигде не нашел примеров. И честно говоря не представляю, как например, подписаться на хук routing, который есть во всех приложениях? Если в плагине всё понятно, он подцепляется в хукам родителя, то с приложениями не понятно.
Если есть где-то описание, то буду благодарен за ссылку. Иначе пойду по первому способу.
Мда, я тоже не нашёл документацию.
Идея простая. Плагин может подписаться только на события своего родного приложения. А приложение может подписаться на события любого приложения (в том числе свои, если вдруг удобно). Чтобы подписаться, надо создать файл lib/handlers/<app>.<hook>.handler.php с классом yourapp<App><Hook>Handler extends waEventHandler.
Примеров сколько угодно. В любом приложении есть lib/handlers: Контакты, Блог, Фото, Магазин...
Спасибо, буду изучать!