autoloader собственных классов и подключение событий
работая одновременно с несколькими крупными проектами, в которых используется кастомизация бизнес-процессов, может возникнуть вопрос реализации удобной структуры собственных классов и событий в php_interface.
У меня такой вопрос возник, и вот что получилось:
init.php создал в папке /bitrix/php_interface. Это сделано, чтобы учесть проекты с многосайтовостью и сохранить новую структуру как для папки /local, так и для /bitrix.
в данном решение обрабатываются 4 основных, но не обязательных файла:
functions.php - записываем функции, которые будут везде использоваться, например для debug
adminHandlers.php - добавляются события, которые будут отработаны в административной части сайта
publicHandlers.php - добавляются события, которые будут отработаны только на публичной части сайта
handlers.php - добавляются события, которые будут отрабатываться всегда
пример publicHandler.php:
в данном примере подключается метод addJsLibrary из класса Custom\PublicSection\Jsinit.
Класс подгружается по принципу autoloader'а. Т.е. в папке php_interface/classes/public создан файл jsinit.php:
По такой же схеме можно создать любой файл с собственным классом, например: /local/php_interface/classes/handlers/test.php с namespace Custom\Handlers, где класс будет Test. Далее методы класса можно использовать как в событиях, добавляя их в handlers.php, так и в любом необходимом месте, например, собственном компоненте.
В итоге мы получаем отдельные файлы классов, которые подключаются автоматически, и файлы со списками методов подключаемых в события. При этом используем встроенный функционал Bitrix'а.
Буду рад, если кому то помог данным решением!
работая одновременно с несколькими крупными проектами, в которых используется кастомизация бизнес-процессов, может возникнуть вопрос реализации удобной структуры собственных классов и событий в php_interface.
У меня такой вопрос возник, и вот что получилось:
init.php создал в папке /bitrix/php_interface. Это сделано, чтобы учесть проекты с многосайтовостью и сохранить новую структуру как для папки /local, так и для /bitrix.
<?php use \Bitrix\Main\Loader; use \Bitrix\Main\Context; use \Bitrix\Main\EventManager; $request = Context::getCurrent()->getRequest(); $eventManager = EventManager::getInstance(); if(file_exists(Loader::getLocal('php_interface/functions.php'))) {require_once (Loader::getLocal('php_interface/functions.php'));} if($request->isAdminSection()): Loader::registerNamespace( "Custom\AdminSection", Loader::getLocal('php_interface/classes/adminSection') ); if(file_exists(Loader::getLocal('php_interface/adminHandlers.php'))) {require_once (Loader::getLocal('php_interface/adminHandlers.php'));}; else: Loader::registerNamespace( "Custom\PublicSection", Loader::getLocal('php_interface/classes/public') ); if(file_exists(Loader::getLocal('php_interface/publicHandlers.php'))) {require_once (Loader::getLocal('php_interface/publicHandlers.php'));}; endif; Loader::registerNamespace( "Custom\Handlers", Loader::getLocal('php_interface/classes/handlers') ); if(file_exists(Loader::getLocal('php_interface/handlers.php'))) require_once (Loader::getLocal('php_interface/handlers.php')); |
functions.php - записываем функции, которые будут везде использоваться, например для debug
adminHandlers.php - добавляются события, которые будут отработаны в административной части сайта
publicHandlers.php - добавляются события, которые будут отработаны только на публичной части сайта
handlers.php - добавляются события, которые будут отрабатываться всегда
пример publicHandler.php:
<?php $eventManager->addEventHandler('main', 'OnPageStart', array('Custom\PublicSection\Jsinit', 'addJsLibrary'), false, 100); |
Класс подгружается по принципу autoloader'а. Т.е. в папке php_interface/classes/public создан файл jsinit.php:
<?php namespace Custom\PublicSection; class Jsinit { public function addJsLibrary() { $arJsConfig = array( 'owl_carousel' => array( 'js' => '/local/js/owl_carousel/owl.carousel.js', 'css' => '/local/js/owl_carousel/assets/owl.carousel.css', 'rel' => array('jquery'), ), ); foreach ($arJsConfig as $ext => $arExt) { \CJSCore::RegisterExt($ext, $arExt); } } } |
В итоге мы получаем отдельные файлы классов, которые подключаются автоматически, и файлы со списками методов подключаемых в события. При этом используем встроенный функционал Bitrix'а.
Буду рад, если кому то помог данным решением!