Comments 29
Изучайте документацию по модулям.
модули из папки /local/modules/ нужно оформить в соответсвии с документацией, установить из админки и у них будет свой автолоад без модификации init.php
подписка на события у таких модулей происходит по другому - при установке самого модуля
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=4809&LESSON_PATH=3913.3435.4609.4809
Спс
Чтобы модуль автоматом грузился надо, чтобы кто-то сделал includeModule. Автолоуд сам по себе не произойдет. Я пока нашел только вариант при установке модуля подписаться на событие например OnProlog и там в обработчике система вызовет includeModule.
Ваш подход мне кажется странным. Просто так подключение модуля не нужно, это лишняя нагрузка. Если в каком-то месте нужен функционал модуля, и есть событие в этом месте - регистрируете обработчик события. Событие произойдёт, модуль будет подключен.
Ваш подход мне кажется странным. Просто так подключение модуля не нужно, это лишняя нагрузка. Если в каком-то месте нужен функционал модуля, и есть событие в этом месте - регистрируете обработчик события. Событие произойдёт, модуль будет подключен
Да можно про OnProlog забыть и сразу подписаться на OnAdminSaleOrderViewDraggable (это как раз на странице заказа в админке) и тут и состав заказа полностью передается через параметр:
$eventManager->registerEventHandler( "main", "OnAdminSaleOrderViewDraggable",
$this->MODULE_ID,
"paymentacceptance", "onInit");
Хочу сказать, что в битрикс по факту можно обойтись одним модулем (и это гут), а в вордпрессе и джумле пришлось делать по 2 сущности.
"Автолоуд" произойдет, если модуль установлен.
подписка на события у таких модулей происходит по другому - при установке самого модуля
Да теперь дошло. Именно так - в DoInstall.
Можно ли не редактировать init.php, а как-то добавить из админки старт своего модуля, чтобы он автоматически загружался?
Конечно можно. Добавьте в корень модуля файл include.php , где пропишите какие классы должны быть загружены автолоадом:
CModule::AddAutoloadClasses('mlwebformsantispam', [
'Multiline\MlWebFormsAntispam\MlWebFormsASProc' => 'lib/mlwebformsantispamprocessor.php',
'\Multiline\MlWebFormsAntispam\MlWebFormsASProc' => 'lib/mlwebformsantispamprocessor.php',
]);
Добавьте в корень модуля файл include.php
Спасибо за наводку. Но чего-то include.php никем не вызывается (отладчиком смотрю), пойду почитаю немного доки.
из папки local\modules похоже ни один модуль через include.php не аутолодится...
А вообще модуль в Битрикс корректно установлен, в таблице b_modules он есть с датой активации?
Конечно можно. Добавьте в корень модуля файл include.php , где пропишите какие классы должны быть загружены автолоадом:
Похоже это совсем не то, что я хотел. Получается, что include.php вызывается, когда мы выполняем Loader::includeModule('paymentacceptance'); , то есть мне надо все-равно где-то в коде прописать Loader::includeModule('paymentacceptance'); - правильно?
И чего-то я в базе данных не нашел, где хранятся настройки автозагрузки (модулей, классов и т.д.)
И еще у меня нюанс, что модуль для админки пишу, может это важно...
Мы тоже разрабатываем модули у которых есть часть, работающая в админке Битрикса, ничего дополнительно вручную вызывать не нужно, корректно написанный в соответствие с документацией модуль подключается в админку автоматически. В базе никакие настройки автозагрузки не хранятся, только факт активности модуля.
Мы тоже разрабатываем модули у которых есть часть, работающая в админке Битрикса, ничего дополнительно вручную вызывать не нужно, корректно написанный в соответствие с документацией модуль подключается в админку автоматически
Я за вас рад конечно, но проблемка для меня не решена. Если бы вы поконкретнее показали кто и когда в коде у вас вызывает include.php было бы очень замечательно. А так у меня есть подозрения, что все равно надо править файл init.php. По интернету помониторил не нашел решения.
Похоже разобрался как обойтись без правки init.php!
Надо при установке модуля в методе DoInstall() подписаться на событие например OnProlog модуля main.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$bb = $eventManager->registerEventHandler( "main",
"OnProlog",
$this->MODULE_ID,
"paymentacceptance",
"onProlog"
);
В этом случае система в таблице b_module_to_module зарегистрирует наше событие.
Потом открывая страницу будет испускаться событие OnProlog для нашего модуля paymentacceptance. Но перед этим система попытается загрузить модуль сначала и будет вызван include.php в каталоге нашего модуля. А тут мы уже знаем, что делать.
Главное, что это работает! И не надо править исходники ядра битрикс.
Потом открывая страницу будет испускаться событие OnProlog для нашего модуля paymentacceptance
Нет, неверно. Будет срабатывать событие OnProlog для модуля main. А поскольку Вы зарегистрировали обработчик для этого события, и при регистрации указали на свой модуль, то Ваш модуль будет подключен перед вызовом обработчика.
Вам никто не мешает для своего модуля сделать событие OnProlog - соответственно, обработчик на него можно будет зарегистрировать как:
$eventManager->registerEventHandler( "yourmodule", "OnProlog", ... );
События описаны в этой части курса. Ссылки в конце тоже полезны ( в чём-то даже полезнее самой главы)
Нет, неверно. Будет срабатывать событие OnProlog для модуля main. А поскольку Вы зарегистрировали обработчик для этого события, и при регистрации указали на свой модуль, то Ваш модуль будет подключен перед вызовом обработчика.
Я с вами не согласен. Событие OnProlog для модуля main не существует.
Просто всегда стандартно при загрузки выполняется код, который читает записи в базе данных (в таблице b_module_to_module ). Находит как в коде ниже обработчики (связи с другими модулями) для "main" и "OnProlog" и вызывает их связанные методы через ExecuteModuleEventEx. Просто событиями обычно принято называть что-то, что генерирует ОС, а тут просто зачем-то решили событиями обозвать (не суть).
bitrix\modules\main\include\prolog_before.php
bitrix\modules\main\include.php
CMain::PrologActions(); - это не событие, а просто вызов статического метода класса.
Далее:
foreach (GetModuleEvents("main", "OnProlog", true) as $arEvent)
{
ExecuteModuleEventEx($arEvent);
}
то Ваш модуль будет подключен перед вызовом обработчика
Тут не спорю, в этом и есть весь смысл, т.к. далее и будет вызван include.php в каталоге вашего модуля. Но сам по себе include.php он никак не вызовется.
Вам никто не мешает для своего модуля сделать событие OnProlog - соответственно, обработчик на него можно будет зарегистрировать как:
$eventManager->registerEventHandler( "yourmodule", "OnProlog", ... );
Вот где как ни в в DoInstall() установщика модуля это сделать? И только не yourmodule, а так:
$eventManager->registerEventHandler( "main", "OnProlog",
$this->MODULE_ID,
"paymentacceptance", "onProlog");
Кстати и в документации так и сказано:
registerEventHandler - функция для регистрации обработчиков, расположенных в модулях и использующихся для взаимодействия между модулями системы. Эту функцию необходимо вызвать один раз при инсталляции модуля, после этого функция-обработчик события будет автоматически вызываться в определённый момент, предварительно подключив сам модуль.
Но честно говоря документация битрикс мне не заходит, как-то много красивых слов, когда все просто на самом деле.
Для интереса посмотрел код коммерческих модулей из Marketplace Bitrix - в основном используют такой же подход, вешают на OnBeforeProlog модуля main. Многие даже в "старом" стиле через RegisterModuleDependences а не registerEventHandler.
И чего-то я в базе данных не нашел, где хранятся настройки автозагрузки (модулей, классов и т.д.)
В файле include.php модуля Вы и описываете всё, что относится к загрузке модуля - регистрация классов в автозагрузку, подключение модулей, от которых зависит Ваш модуль, языковые фразы.
У меня тоже висла установка Битрикс, пока не исправил конфиги mysql. Устанавливал на wsl debian.
пока не исправил конфиги mysql.
Да mysql.ini я тоже правил, увеличивал таймауты и лимиты памяти, но мне не помогло.
transaction-isolation = READ-COMMITTED
innodb_flush_log_at_trx_commit = 2 //без этой строчки всё висло
innodb_flush_method = O_DIRECT
thread_cache_size = 4
innodb_strict_mode=OFF
Не лезь туда, оно тебя сожрёт
А, что в битрикс нельзя установить чужой модуль из zip файла в админке? Надо только по ftp закачивать и распаковывать самому?
Добавить в репозиторий (маркетплейс) битрикс свой модуль - это реально?
Можно загрузить zip файл через админку, через управление структурой, там же и распаковать.
Можно добавить модуль в Marketplace, мы это проходили, в принципе ничего сложного.
Можно загрузить zip файл через админку, через управление структурой, там же и распаковать
Спасибо., получилось, установить модуль через админку.
Но по факту в local и в local/modules еще .section.php файлы появились, хотя в общем-то вроде не мешают пока.
Заодно понял, что local будет для каждого сайта индивидуальным.
Свой первый модуль для админки битрикс, первое субъективное впечатление