ShelestovAnt
@ShelestovAnt
Верстаю и программирую

Как записать данные в базу при установке модуля?

Всем привет.

Народ, я что-то не могу сообразить как можно записать данные в базу при установке модуля.
Вот код в install.php
function InstallDB(){
        global $DB, $APPLICATION;
        if (file_exists($f = dirname(__FILE__).'/db/mysql/install.sql'))
        {
            foreach($DB->ParseSQLBatch(file_get_contents($f)) as $sql)
                $DB->Query($sql);

            RegisterModuleDependences('main', 'OnPageStart', $this->MODULE_ID, 'DemoData', 'AddDemoDataOptions');
        }
        if ($this->errors !== false)
        {
            $APPLICATION->ThrowException(implode("<br>", $this->errors));
            return false;
        }
        return true;
    }


в папке lib есть файл DemoData.php с классом DemoData и функцией AddDemoDataOptions.
в include.php
use Bitrix\Main\Loader;

Loader::registerAutoLoadClasses("partner.demosite", array(
    'DemoData' => 'lib/DemoData.php',
));


событие OnPageStart указал для теста и кстати какое правильно в таком случае использовать?

но ничео не происходит, что делаю не так?
  • Вопрос задан
  • 852 просмотра
Пригласить эксперта
Ответы на вопрос 2
gromdron
@gromdron
Работаю с Bitrix24
Ну окей, погнали.

(file_exists($f = dirname(__FILE__).'/db/mysql/install.sql'))

1) Как вообще получилась такая адовая конструкцию? Она же не читается, да и не нужна она (см. ниже)

2) Файл dirname(__FILE__).'/db/mysql/install.sql') всегда присутствует в директории модуля.
За свою практику, я еще не встречал шибко-умных-парней, которые бы лезли в чужой модуль и удаляли файлы, поэтому если он есть в модуле, то он есть всегда.
Хочешь проверить дополнительно? Проверяй, только если он не найден - хотя бы ошибку выводи, а то сейчас все в холостую - нет файла -> нет события -> непонятно почему не работает

3) Хочешь выполнить батч? Ну так и делайте это как битрикс. Посмотри хотя бы на модуль торгового каталога:

if(!$DB->Query("SELECT 'x' FROM b_catalog_group", true))
    $errors = $DB->RunSQLBatch($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/catalog/install/db/".strtolower($DB->type)."/install.sql");


Обрати внимание на: strtolower($DB->type), если планируешь делать модуль оставь хотя бы лазейку, чтобы потом не переделывать.

4) Переходи уже на d7!
В папке модуля в include.php оставь пустой комментарий с тегами php

И в /lib/demodata.php пропиши:

namespace Partner\Demosite;

class DemoData


Тогда тебе не нужно будет править автолоадер при появлении нового класса и геморроя будет меньше

5) После п.4 смотри на новый лоадер (и раз уж пишешь по-старинке, вот старый код, новый можешь в том же модуле торгового каталога посмотреть):

RegisterModuleDependences('main', 'OnPageStart', $this->MODULE_ID, '\Partner\Demosite\DemoData', 'AddDemoDataOptions');


P.S. Я надеюсь в uninstall ты удаляешь подписки на события.

А теперь ответ на вопрос: если хочешь загрузить какие-нибудь данные в БД - делай это в методе DoInstall() в самом конце после успешной регистрации модуля, а не на событиях. Если их слишком много - выдели несколько шагов.
Ответ написан
babarun
@babarun Куратор тега 1С-Битрикс
Безумный план моих идей в руках больных людей
Для начала советую воспользоваться стандартным конструктором модулей:
marketplace.1c-bitrix.ru/solutions/bitrix.mpbuilder
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы