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