Система управління веб-ресурсами Bitrix має модульну структуру, і кожний функціональний блок реалізується за допомогою модулів. Bitrix надає достатню кількість стандартних модулів, але при створенні веб-сайту часто виникає потреба в додатковій функціональності. Тому надається змога створювати модулі самостійно. Наш програміст Вася в статті ділиться власним досвідом створення модулів, наводить приклади для наочності. Це допоможе вам розібратися в головних особливостях створення модулів на Bitrix.
Основні складові модуля це два файли:
Передусім, потрібно прописати інсталятор і деінсталятор модуля, для цього створюється клас в /install/index.php, де назва класу повинна співпадати з ідентифікатором модуля. Наприклад:
Class nakitel_minipic extends CModule { var $MODULE_ID = 'nakitel.minipic'; }В цьому класі потрібно прописати два методи. Перший – DoInstall, який відповідає за встановлення файлів модуля та його реєстрацію на Bitrix. Другий – DoUninstall, котрий призначений відповідно для видалення.
function DoInstall() { $this->InstallFiles(); RegisterModule($this->MODULE_ID); } function DoUninstall() { $this->UnInstallFiles(); UnRegisterModule($this->MODULE_ID); }Важливо пам’ятати про те, що назви і підписи в модулі необхідно зберігати в мовних файлах. Це важливо, щоб завжди залишалась можливість називати і підписувати поля модуля на різних версіях сайту.
Є можливість додавати і встановлювати компоненти, коли їх потрібно використовувати в модулі або сам модуль є засобом для встановлення компонента. В першу чергу, додайте всі файли компонента в свій модуль, а потім в методі установки виконайте копіювання компонента в папку /bitrix/components. Наприклад:
CopyDirFiles( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$this->MODULE_ID. "/install/components", $_SERVER["DOCUMENT_ROOT"]."/bitrix/components", true, true );
Також важливо прописати видалення компонента, коли буде видалятись модуль. Це пов’язано з тим, що при установці модуля його компоненти копіюються в папку bitrix і функціонують окремо. Тому навіть після видалення самого модуля компоненти залишаться, і важливо не забувати встановлені компоненти видаляти.
$folder = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/components/nakitel/"; $files = scandir($folder); $countComponents = 0; foreach ($files as $file) { if (($file == '.') || ($file == '..')) continue; $countComponents++; } if($countComponents > 1) DeleteDirFilesEx("/bitrix/components/nakitel/iblock.element.selection"); else DeleteDirFilesEx("/bitrix/components/nakitel");
Для використання своїх класів модуля в коді потрібно додати файли, бібліотеки і класи в файлі include.php. Варто використовувати метод AddAutoloadClasses(), такий спосіб додасть класи в автозавантаження.
Приклад підключення класів для автоматичного завантаження:
CModule::IncludeModule("nakitel.multilinguality"); $arClasses=array( 'cMainMultiLanguage'=>'classes/general/cMainMultiLanguage.php', 'langSiteData'=>'classes/mysql/langSiteData.php' ); CModule::AddAutoloadClasses("nakitel.multilinguality",$arClasses);
Якщо модуль повинен зберігати для себе унікальну інформацію, використовувати і обробляти її, можна зберегти інформацію в базі даних. Також є можливість додати свої таблиці.
Крім того, існує варіант збереження даних в інформаційному блоці, що дозволить вам не писати скріпти роботи з базою. Такий спосіб може бути швидшим і простішим, але якщо вам не потрібно використовувати всю його функціональність, зберігати і використовувати інформацію в унікальний спосіб, то краще створити таблиці тої структури і того типу, який вам потрібний.
Приклад запуску SQL-запиту, який додасть таблиці в базу при установці модуля:
global $DB, $APPLICATION; $this->errors = false; if(!$DB->Query("SEL ECT 'x' FR OM my_table_name", true)) { $this->errors = $DB->RunSQLBatch( $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/" . $this->MODULE_ID . "/install/db/install.sql" ); } if ($this->errors !== false) { $APPLICATION->ThrowException(implode("", $this->errors)); return false; } return true;
Приклад запуску SQL-запиту, який видалить таблиці з бази при видаленні модуля:
global $DB, $APPLICATION; $this->errors = false; $this->errors = $DB->RunSQLBatch( $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".self::MODULE_ID."/install/db/mysql/uninstall.sql" ); if($this->errors !== false) { $APPLICATION->ThrowException(implode('', $this->errors)); return false; } return true;
Для використання даних з бази своїх таблиць необхідно написати свою модель управління даними. Створіть клас, в якому виконайте дії додавання, оновлення і одержання даних із ваших таблиць.
Під час роботи з базою даних важливо завжди перевіряти правильність інформації, з якою працюєте, зробіть обробку одержаних даних на можливість SQL injection. Bitrix пропонує API для роботи з базою даних, який можна використати. Так ви можете уникнути багатьох помилок під час роботи модуля.
Інколи є потреба встановлення деяких параметрів в модулі, які можна було б використовувати при його роботі. За виведення і редагування налаштувань відповідає скрипт \bitrix\modules\mymodule\options.php. Якщо в модулі буде такий скрипт, то Bitrix створить в адмінці опцію для налаштувань модуля.
Приклад скрипта, який відповідає за виведення і обробку налаштувань модуля:
// підключення модуля CModule::IncludeModule("nakitel.multilinguality"); if ($_POST["Update"] || $_POST["Apply"]) { /* * Збереження або оновлення внесених змін */ } // масив параметрів для вкладок $aTabs = array( array( "DIV" => "edit_page_url", "TAB" => GetMessage("N_LANG_TAB_PAGES"), "ICON" => "main_settings", "TITLE" => GetMessage("N_LANG_TAB_PAGES") ), array( "DIV" => "edit_site_lang_dir", "TAB" => GetMessage("N_LANG_TAB_DIR"), "ICON" => "main_settings", "TITLE" => GetMessage("N_LANG_TAB_DIR") ) ); /* * CAdminTabControl - клас для реалізації вкладок на сторінці панелі управління. */ $tabControl = new CAdminTabControl("tabControl", $aTabs); // ініціалізація вкладок $tabControl->Begin(); ?>$tabControl->BeginNextTab(); ?> $tabControl->BeginNextTab(); ?> $tabControl->Buttons(); ?> $tabControl->End(); ?> = bitrix_sessid_post(); ?>
Якщо модуль має невелику кількість налаштувань, є можливість зберігати і виводити значення, використавши стандартні інструменти Bitrix. Стандартні засоби зручні тоді, коли параметри в модулі не повинні розширюватися і динамічно налаштовуватися.
Приклад збереження і виведення налаштувань в модулі:
// Збереження значення “7” для опції “prop_1” в модулі $moduleId COption::SetOptionString($moduleId, "prop_1", "7"); // Виведення значення опції “prop_1” з модуля $moduleId $value = COption::GetOptionString($moduleId, "prop_1");Список всіх методів класу COption:
У випадку, коли налаштувань в модулі багато і вони мають динамічно додаватися, то зручніше буде створити для цього таблицю в базі даних. Водночас написати модель для роботи з цими даними, щоб через неї редагувати і отримувати потрібні налаштування.
Бувають випадки, коли потрібно відслідковувати події на сайті і виконувати при цьому певні дії. В модулі є можливість зареєструвати подію і встановити при виконанні цієї події певну функціональність. Список всіх подій Bitrix можете переглянути в документації. Реєстрацію подій потрібно проводити під час установки модуля.
Приклад реєстрації метода обробки події додавання і оновлення інформації в інфоблоці:
// реєстрація метода оброблення події при додаванні елемента в інфоблок RegisterModuleDependences( "iblock", "OnAfterIBlockElementAdd", $this->MODULE_ID, "GenerateMiniImg", "OnAfterIBlockElementAddHandler" ); // реєстрація метода оброблення події при оновленні елемента в інфоблоці RegisterModuleDependences( "iblock", "OnAfterIBlockElementUpdate", $this->MODULE_ID, "GenerateMiniImg", "OnAfterIBlockElementUpdateHandler" );Щоб завантажити модуль в Marketplace, він повинен знаходитись в директорії /.last_version і бути заархівованим в формат .zip або .tar.gz. Кодування при цьому має бути windows – 1251. Щоб зручніше і швидше збирати архів, варто використовувати модуль від Bitrix – “Конструктор модулів для Маркетплейса”.
Виконуючи цей не надто складний алгоритм дій, ви зможете створювати власні модулі для системи Bitrix і значно розширити функціональні можливості сайту.