Як отримати id модуля OpenCart в коді

OpenCartBot - 11.11.2025
Як отримати id модуля OpenCart в коді

Якщо ви розробник модуля або хочете кастомізувати існуючий модуль, то будете здивовані, що не можете перевірити id модуля у коді. За замовчуванням OpenCart не передає module_id у налаштування модуля і це особливо прикро для мультимодулів, що дозволяють створювати декілька екземплярів модуля з різними налаштуваннями.

Навіщо потрібен module_id

Ідентифікатор модуля - це унікальний номер кожного модуля в системі. Він важливий у багатьох сценаріях використання. Коли ви створюєте кілька екземплярів одного модуля з різними налаштуваннями, module_id дозволяє розрізняти їх між собою. При взаємодії з базою даних module_id дає можливість створювати запити, які працюють тільки з даними конкретного екземпляра модуля. Це важливо для модулів, які зберігають користувацькі налаштування або результати роботи чи для кешування. Або просто для перевірки у коді, якщо вам потрібно додати щось лише для певного конкретного модуля, а не для всіх його суміжних копій.

За замовчуванням OpenCart передає в контроллер модуля тільки налаштування з поля setting бази даних. Коли система викликає модуль, вона розпаковує JSON з налаштуваннями, але втрачає інформацію про сам ідентифікатор модуля. Це означає, що всередині контроллера модуля розробник не має прямого доступу до module_id без додаткових маніпуляцій з кодом.

Рішення через OCMOD

Найпростішим способом вирішення цієї проблеми є створення OCMOD модифікатора, який автоматично додає module_id до налаштувань модуля. Цей підхід практично не порушує стандартну архітектуру OpenCart і забезпечує сумісність з усіма існуючими модулями.

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name>Fix: Add module_id to setting</name>
    <code>fix-module_id</code>
    <version>1.0.0</version>
    <author><![CDATA[<kbd>opencartbot</kbd>]]></author>
    <link>https://opencartbot.com/en/</link>
    <file path="catalog/model/setting/module.php" error="skip">
        <operation error="skip">
            <search><![CDATA[
                return json_decode($query->row['setting'], true);
            ]]></search>
            <add position="replace"><![CDATA[
            $settings = json_decode($query->row['setting'], true);
            $settings['module_id'] = $module_id;
            return $settings;
            ]]></add>
        </operation>
    </file>
</modification>

Завантажити готовий ocmod-модифікатор

Модифікатор змінює метод getModule у файлі catalog/model/setting/module.php. Замість простого повернення розпарсених JSON налаштувань, система тепер додає до цього масиву поле module_id з відповідним значенням.

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

Встановлення та активація модифікатора

Після завантаження перейдіть в розділ Розширення → Модифікації (Extensions → Modifications) і натисніть кнопку Оновити для застосування змін. Система автоматично застосує модифікацію до потрібного файлу.

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

Приклад використання module_id в коді модуля

Після встановлення модифікатора ви можете легко використовувати module_id у своїх модулях. У контроллері модуля ідентифікатор стає доступним через масив налаштувань:

class ControllerExtensionModuleYourModule extends Controller {
    public function index($setting) {
        $module_id = isset($setting['module_id']) ? $setting['module_id'] : 0;
        
        // Використання для кешування
        $cache_key = 'your_module.' . $module_id;
        $data = $this->cache->get($cache_key);
        
        // Для роботи з базою даних
        $this->db->query("UPDATE custom_table SET data = 'value' 
                         WHERE module_id = '" . (int)$module_id . "'");
        
        // Для збереження логів
        $this->log->write('Module ' . $module_id . ' executed successfully');
    }
}

Якщо потрібно передати module_id в шаблон модуля, додайте в контролер модуля такий рядок:

$data['module_id'] = isset($setting['module_id']) ? $setting['module_id'] : 0;

Як бачите, отримати id модуля дуже просто і ми показали вам один із методів, найпростіший і найшвидший, як це можна зробити. Це дозволить вам розширити можливості вашої системи і кастомізувати ваші модулі під себе.


Рекомендовані модулі


Інші статті