andreyryabin / sprint.migration

Миграции для разработчиков (1С-Битрикс)
http://marketplace.1c-bitrix.ru/solutions/sprint.migration/
MIT License
172 stars 56 forks source link

Эксепшен после установки #10

Closed mbakirov closed 5 years ago

mbakirov commented 5 years ago

Привет! Поставил модуль, но сразу после установки админка начала кидаться эксепшенами... Если нет времени, то я на досуге поковыряю и сделаю пулл-реквест

2018-11-23 00:15:09 - Host: cvetochka.ru - UNCAUGHT_EXCEPTION - [Error]
Class 'Sprint\Migration\Locale' not found (0)
/home/cvetok/public_html/bitrix/modules/sprint.migration/locale/ru.php:3
#0: include
    /home/cvetok/public_html/bitrix/modules/sprint.migration/include.php:5
#1: include_once(string)
    /home/cvetok/public_html/bitrix/modules/main/lib/loader.php:109
#2: Bitrix\Main\Loader::includeModuleInternal(string)
    /home/cvetok/public_html/bitrix/modules/main/lib/loader.php:96
#3: Bitrix\Main\Loader::includeModule(string)
    /home/cvetok/public_html/local/php_interface/init.php:36
#4: {closure}(string)

#5: spl_autoload_call(string)
    /home/cvetok/public_html/bitrix/modules/sprint.migration/locale/ru.php:3
#6: include(string)
    /home/cvetok/public_html/bitrix/modules/sprint.migration/install/index.php:25
#7: sprint_migration->sprint_migration()
    /home/cvetok/public_html/bitrix/modules/main/classes/general/update_client_partner.php:2477
#8: CUpdateClientPartner::__GetModuleInfo(string)
    /home/cvetok/public_html/bitrix/modules/main/classes/general/update_client_partner.php:1051
#9: CUpdateClientPartner::GetCurrentModules(NULL)
    /home/cvetok/public_html/bitrix/modules/main/classes/general/update_client_partner.php:526
#10: CUpdateClientPartner::GetRequestedModules(string)
    /home/cvetok/public_html/bitrix/modules/main/admin/update_system_partner.php:31
#11: require_once(string)
    /home/cvetok/public_html/bitrix/admin/update_system_partner.php:2
andreyryabin commented 5 years ago

Привет, через маркет поставил?

mbakirov commented 5 years ago

Ага

andreyryabin commented 5 years ago

не знаю какой тут можно пулреквест сделать, файл bitrix/modules/sprint.migration/classes/Sprint/Migration/Locale.php же на месте? возможно сломан автолоадер

andreyryabin commented 5 years ago

на #3 обращение к /local/php_interface/init.php:36 что-то там ломает автоладер видимо, может написан свой загрузчик?

mbakirov commented 5 years ago

Да, есть свой =) И он раньше регистрируется...И ищет он имена по битрикс-конвенции https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3524&LESSON_PATH=3913.5062.3524...

andreyryabin commented 5 years ago

а можете дать пример кода в вашем init.php - хочу воспроизвести у себя и починить

mbakirov commented 5 years ago
spl_autoload_register(function($className) {
    $arClass = explode("\\", $className);
    $moduleName = strtolower(sprintf('%s.%s', $arClass[0], $arClass[1]));
    $moduleName = str_replace('bitrix.', '', $moduleName);

    // module include
    Loader::includeModule($moduleName);

    $moduleLibDir = $_SERVER['DOCUMENT_ROOT'].'/local/modules/'.$moduleName.'/lib/';
    if (!is_dir($moduleLibDir)) {
        return false;
    }

    $classFilePath = $moduleLibDir.implode('/', array_slice($arClass, 2)).'.php';
    if (file_exists($classFilePath) && is_file($classFilePath)) {
        /** @noinspection PhpIncludeInspection */
        require_once($classFilePath);
        return true;
    }

    return false;
});
andreyryabin commented 5 years ago

ну судя по коду я бы подключение модуля добавил внутрь проверки на существование файла

вот сюда

` if (file_exists($classFilePath) && is_file($classFilePath)) {

    // module include
    Loader::includeModule($moduleName);

    /** @noinspection PhpIncludeInspection */
    require_once($classFilePath);
    return true;
}

`

так получится более осмысленно, вы проверяете есть ли директория lib и есть ли нужный файл класса, только после этого стоит инклудить сам модуль

andreyryabin commented 5 years ago

да и проверка на директорию if (!is_dir($moduleLibDir)) { return false; }

тоже не нужна помоему, там же в итоге проверяется путь до файла

mbakirov commented 5 years ago

Дельное замечание. Спасибо

andreyryabin commented 5 years ago

в версии 3.0.4 я подключил стандартный битриксовый автозагрузчик и перенес классы модуля в lib/ так что автопоключение модулей в вашем примере будет работать и с этим модулем