CModule::IncludeModule — предшественник современного
Loader::includeModule из D7. В коде старого ядра и во множестве
чужих решений из Маркетплейса он встречается до сих пор, и разработчику
важно понимать оба варианта одинаково хорошо.
Базовый вызов
<?php
if (CModule::IncludeModule('iblock')) {
$result = CIBlockElement::GetList([], ['IBLOCK_ID' => 5]);
} else {
// модуль недоступен
}
Метод возвращает true при успешном подключении и false
при неудаче — точно так же, как его современный аналог. Разница не в поведении,
а в реализации: CModule::IncludeModule относится к старому ядру
и не использует пространства имён.
Чем отличается от Loader::includeModule
CModule::IncludeModule |
Loader::includeModule |
|
|---|---|---|
| Ядро | Старое (main.core) | D7 |
| Пространство имён | Нет | Bitrix\Main\Loader |
| Проверка установки отдельно | Не предусмотрена штатно | ModuleManager::isModuleInstalled() |
| Рекомендуется для нового кода | Нет | Да |
| Результат для одного и того же модуля | Идентичен | |
Оба метода в итоге проверяют одно и то же состояние модуля — подключён он или нет. Смешивать их в одном проекте не страшно: подключение через один способ делает класс доступным независимо от того, каким методом его вызвали в другом месте кода.
Нужна помощь с Битрикс?
Диагностика, если возвращает false
Причины неудачного подключения одинаковы для обоих методов: опечатка в системном имени модуля, модуль не установлен, отсутствует в редакции продукта или истекла лицензия. Точное имя модуля всегда можно свериться со списком в разделе Настройки → Настройки продукта → Модули — идентификатор указан там же, рядом с названием.
Где встречается сегодня
- в компонентах старого ядра, которые до сих пор используются на многих сайтах;
- в решениях из Маркетплейса, написанных до перехода на D7;
- в проектах с большой историей, где переход на новый способ не был завершён.
Переписывать существующий рабочий код только ради замены на
Loader::includeModule обычно не имеет практического смысла —
поведение идентично. А вот в новом коде разумно сразу использовать
современный способ: он даёт больше инструментов диагностики
через ModuleManager.
Проверка перед подключением
У обоих методов общая практическая проблема: сам вызов не объясняет,
почему подключение не удалось — отсутствие модуля, недоступность
в редакции продукта и истёкшая лицензия выглядят одинаково,
просто как false. Для старого способа удобно совмещать
проверку с современным классом диагностики:
<?php
use Bitrix\Main\ModuleManager;
$moduleId = 'catalog';
if (!CModule::IncludeModule($moduleId)) {
if (!ModuleManager::isModuleInstalled($moduleId)) {
echo 'Модуль не установлен или отсутствует в редакции';
} else {
echo 'Модуль установлен, но подключить не удалось — проверьте лицензию';
}
}
Такая связка работает независимо от того, каким способом — старым
или новым — вы подключаете сам модуль: ModuleManager
относится к диагностике состояния, а не к самому подключению,
и одинаково пригоден в обоих случаях.
Итог
CModule::IncludeModule и Loader::includeModule
решают одну и ту же задачу — подключение модуля перед использованием
его классов — и возвращают одинаковый результат для одного и того же
модуля. Первый относится к старому ядру и встречается в унаследованном
коде, второй — стандарт для всего, что пишется сегодня.
