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'а.
Буду рад, если кому то помог данным решением!