Блог
//Особливості створення модулів на 1С-BitrixОсобливості створення модулів на 1С-Bitrix
Uk
11 Червня 2017

Особливості створення модулів на 1С-Bitrix

Nakitel, Накитель, Ми розробляємо майбутнє

Система управління веб-ресурсами Bitrix має модульну структуру, і кожний функціональний блок реалізується за допомогою модулів. Bitrix надає достатню кількість стандартних модулів, але при створенні веб-сайту часто виникає потреба в додатковій функціональності. Тому надається змога створювати модулі самостійно. Наш програміст Вася в статті ділиться власним досвідом створення модулів, наводить приклади для наочності. Це допоможе вам розібратися в головних особливостях створення модулів на Bitrix.

Модуль - це модель даних, а також API для доступу до цих даних.
Створюючи модулі, ми змогли суттєво розширити можливості наших сайтів. Наприклад, модуль “Багатомовність сайту” дає можливість керувати мовними версіями сайту, прив’язувати перекладені сторінки між собою і виводити меню для переключення між ними на одній ліцензії. Модуль для автоматичної генерації малих зображень, який зменшує зображення за вказаними параметрами і дозволяє зберігати ці зображення у властивості інформаційного блоку.
І це тільки невелика частина. Щоб зручно використовувати розроблену додаткову функціональність в інших проектах, варто просто загорнути скрипт у модуль.

Особливості створення модулів:

1.     Основа модуля

Основні складові модуля це два файли:

  • /install/index.php
  •  /install/version.php

Передусім, потрібно прописати інсталятор і деінсталятор модуля, для цього створюється клас в /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);
}
Важливо пам’ятати про те, що назви і підписи в модулі необхідно зберігати в мовних файлах. Це важливо, щоб завжди залишалась можливість називати і підписувати поля модуля на різних версіях сайту.

2. Встановлення компонентів через модуль

Є можливість додавати і встановлювати компоненти, коли їх потрібно використовувати в модулі або сам модуль є засобом для встановлення компонента. В першу чергу, додайте всі файли компонента в свій модуль, а потім в методі установки виконайте копіювання компонента в папку /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");

3. Підключення бібліотек і класів модуля

Для використання своїх класів модуля в коді потрібно додати файли, бібліотеки і класи в файлі include.php. Варто використовувати метод AddAutoloadClasses(), такий спосіб додасть класи в автозавантаження. 

Приклад підключення класів для автоматичного завантаження:

CModule::IncludeModule("nakitel.multilinguality");
$arClasses=array(
   'cMainMultiLanguage'=>'classes/general/cMainMultiLanguage.php',
   'langSiteData'=>'classes/mysql/langSiteData.php'
);
CModule::AddAutoloadClasses("nakitel.multilinguality",$arClasses);

4. Робота з базою даних в модулі

Якщо модуль повинен зберігати для себе унікальну інформацію, використовувати і обробляти її, можна зберегти інформацію в базі даних. Також є можливість додати свої таблиці.

Крім того, існує варіант збереження даних в інформаційному блоці, що дозволить вам не писати скріпти роботи з базою. Такий спосіб може бути швидшим і простішим, але якщо вам не потрібно використовувати всю його функціональність, зберігати і використовувати інформацію в унікальний спосіб, то краще створити таблиці тої структури і того типу, який вам потрібний.

Приклад запуску 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 для роботи з базою даних, який можна використати. Так ви можете уникнути багатьох помилок під час роботи модуля.

5. Опції модуля

Інколи є потреба встановлення деяких параметрів в модулі, які можна було б використовувати при його роботі. За виведення і редагування налаштувань відповідає скрипт \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();
?>

    BeginNextTab(); ?>
    
    BeginNextTab(); ?>
    
    Buttons(); ?>
    
    End(); ?>
    

Якщо модуль має невелику кількість налаштувань, є можливість зберігати і виводити значення, використавши стандартні інструменти Bitrix. Стандартні засоби зручні тоді, коли параметри в модулі не повинні розширюватися і динамічно налаштовуватися.

Приклад збереження і виведення налаштувань в модулі:

// Збереження значення “7” для опції “prop_1” в модулі $moduleId 
COption::SetOptionString($moduleId, "prop_1", "7");

// Виведення значення опції “prop_1” з модуля $moduleId
$value = COption::GetOptionString($moduleId, "prop_1");
Список всіх методів класу COption: 

  • GetOptionString - повертає строкове значення параметра.
  • GetOptionString - встановлює строкове значення параметра.
  • GetOptionInt - повертає числове значення параметра.
  • SetOptionInt - встановлює числове значення параметра.
  • RemoveOption - видаляє параметр з бази.

У випадку, коли налаштувань в модулі багато і вони мають динамічно додаватися, то зручніше буде створити для цього таблицю в базі даних. Водночас написати модель для роботи з цими даними, щоб через неї редагувати і отримувати потрібні налаштування.

6. Установка та реєстрація подій Bitrix в модулі

Бувають випадки, коли потрібно відслідковувати події на сайті і виконувати при цьому певні дії. В модулі є можливість зареєструвати подію і встановити при виконанні цієї події певну функціональність. Список всіх подій 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 і значно розширити функціональні можливості сайту.