Обзор плагинов
🔌 Плагины
Плагины расширяют функциональность apidcms без правки ядра. Каждый плагин — изолированная папка в plugins/имя_плагина/.
В ядро входят два плагина: Account (личный кабинет) и Cart (корзина).
Где найти
В админ-панели: боковое меню → Плагины (иконка 🧩).
Управление плагинами
Список плагинов (/admin/plugins)
Таблица всех плагинов: название, версия, описание, статус. Доступны кнопки Активировать / Деактивировать и Настроить.
Страница плагина (/admin/plugins/имя)
Три вкладки:
- Инфо — название, версия, статус, зависимости, содержимое
plugin.json - Шаблоны — список
.twig-файлов плагина, кнопка «Редактировать» - Настройки — форма с параметрами плагина (валюта, лимиты и т.д.)
Редактор шаблонов (/admin/plugins/имя/шаблонов/файл.twig)
Полноценный редактор кода. Сохранение по Ctrl+S или кнопкой.
Установка и удаление
- Установка: скопировать папку плагина в
plugins/имя_плагина/на хостинге, затем активировать через админку - Удаление: деактивировать в админке, затем удалить папку
plugins/имя_плагина/ - Вкл/выкл: через админку кнопками Активировать/Деактивировать
⚠️ При удалении папки плагина таблицы в базе данных остаются. При деактивации — тоже.
🔐 Плагин Account — Личный кабинет
Регистрация, авторизация и профиль пользователей.
Маршруты:
/register— регистрация/login— вход/profile— профиль/logout— выход
Особенности:
- Remember-me (cookie на 30 дней)
- Twig-функции:
is_logged_in(),current_user()
Таблицы: users, user_tokens
🛒 Плагин Cart — Корзина
Добавление товаров в корзину для сайтов-каталогов.
AJAX-эндпоинты:
POST /cart/add— добавить товарPOST /cart/update— изменить количествоPOST /cart/remove— удалить товар
Страницы:
/cart— корзина с +/- и удалением
Twig-функции: cart_count(), cart_total()
Таблица: cart_items
Настройки плагинов
Каждый плагин может иметь настраиваемые параметры (валюта, лимиты, поведение). Настройки находятся во вкладке «Настройки» на странице плагина и сохраняются в plugin.json.
📊 Таблицы плагинов в админке
Плагины могут объявлять свои таблицы через поле tables в plugin.json. Это позволяет админке показывать таблицы плагина на главной странице в отдельной группе «Плагины» (рядом с системными и пользовательскими).
Пример plugin.json с таблицами:
{
"name": "account",
"version": "1.0.0",
"description": "Личный кабинет",
"tables": ["plugin_account_users", "plugin_account_tokens"]
}
После добавления поля tables таблицы плагина появятся в секции «Плагины» на дашборде админки.
🏷️ Соглашение об именовании таблиц
Все таблицы плагинов должны использовать префикс plugin_{name}_. Это предотвращает конфликты имён с пользовательскими таблицами (например, если пользователь создаст таблицу users через админку, а плагин Account попытается создать свою).
Формат: plugin_{имя_плагина}_{назначение}
Примеры:
plugin_account_users— таблица пользователей плагина Accountplugin_cart_items— таблица элементов корзины плагина Cartplugin_credits_transactions— таблица транзакций плагина Credits
Правила:
- Имя плагина — только
[a-z][a-z0-9]*(без подчёркиваний) - Имя таблицы — строчные буквы и подчёркивания
- Полное имя:
plugin_{name}_{purpose}
Миграции с верификацией схемы
Каждая миграция плагина должна не только создавать таблицы (CREATE TABLE IF NOT EXISTS), но и верифицировать схему существующих таблиц через PRAGMA table_info и ALTER TABLE ADD COLUMN. Это гарантирует, что при обновлении плагина новые колонки будут добавлены без потери данных.
Пример миграции с PRAGMA-верификацией:
$pm->addAction('db.migrate', function ($db) use ($pluginDir) {
$migrationFile = $pluginDir . '/migrations/001_create.sql';
if (!file_exists($migrationFile)) return;
$sql = file_get_contents($migrationFile);
$statements = array_filter(array_map('trim', explode(';', $sql)));
foreach ($statements as $stmt) {
if (!empty($stmt)) {
try { $db->exec($stmt); }
catch (\Exception $e) { error_log("Migration error: " . $e->getMessage()); }
}
}
// Schema verification
$expectedColumns = [
'plugin_myplugin_items' => [
'id' => 'INTEGER',
'name' => 'TEXT',
'created_at' => 'DATETIME'
]
];
foreach ($expectedColumns as $table => $columns) {
try {
$existing = $db->query("PRAGMA table_info(\"{$table}\")")->fetchAll();
$existingNames = array_column($existing, 'name');
foreach ($columns as $colName => $colType) {
if (!in_array($colName, $existingNames)) {
$db->exec("ALTER TABLE \"{$table}\" ADD COLUMN \"{$colName}\" {$colType} DEFAULT ''");
error_log("Added missing column {$table}.{$colName}");
}
}
} catch (\Exception $e) {
error_log("Schema verification error: " . $e->getMessage());
}
}
}, 10, 'myplugin');
Внешние ключи
Если таблица ссылается на таблицу другого плагина (например, plugin_account_users), плагин должен:
- Указать зависимость в
plugin.json:"dependencies": ["account"] - Использовать полное имя таблицы в FOREIGN KEY