Pull to refresh

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.

  1. Можно ли не редактировать 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 он есть с датой активации?

А вообще модуль в Битрикс корректно установлен, в таблице b_modules он есть с датой активации?

Нормально устанавливается и деинсталлируется. В b_module он есть (paymentacceptance 2024-09-18 14:10:23 )

DoInstall() и DoUnInstall() срабатывают, может туда регистрацию автозагрузки прописать?

Конечно можно. Добавьте в корень модуля файл 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

innodb_flush_log_at_trx_commit = 2 //без этой строчки всё висло

Попробовал, у меня =2 прибило локальную базу данных так, что пришлось переустанавливать все заново

Не лезь туда, оно тебя сожрёт

Не превращайте хабр во флуд

  1. А, что в битрикс нельзя установить чужой модуль из zip файла в админке? Надо только по ftp закачивать и распаковывать самому?

  2. Добавить в репозиторий (маркетплейс) битрикс свой модуль - это реально?

  1. Можно загрузить zip файл через админку, через управление структурой, там же и распаковать.

  2. Можно добавить модуль в Marketplace, мы это проходили, в принципе ничего сложного.

Можно загрузить zip файл через админку, через управление структурой, там же и распаковать

Спасибо., получилось, установить модуль через админку.
Но по факту в local и в local/modules еще .section.php файлы появились, хотя в общем-то вроде не мешают пока.

Заодно понял, что local будет для каждого сайта индивидуальным.

Sign up to leave a comment.

Articles