Система управління веб-ресурсами 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 і значно розширити функціональні можливості сайту.