mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-04-02 14:24:27 -04:00
This implements a clean plugin architecture based on PR #4255 discussion: Core Components: - PluginInterface: Standard contract all plugins must implement - BasePlugin: Abstract class with common functionality - PluginManager: Discovers and loads plugins from app/Plugins/ - Plugin_config: Model for plugin settings storage Architecture: - Each plugin registers its own event listeners via registerEvents() - No hardcoded plugin dependencies in core Events.php - Generic event triggers (item_sale, item_change, etc.) remain in core code - Plugins can be enabled/disabled via database settings - Clean separation: plugin orchestrators vs MVC components Example Implementations: - ExamplePlugin: Simple plugin demonstrating event logging - MailchimpPlugin: Integration with Mailchimp for customer sync Admin UI: - Plugin management controller at Controllers/Plugins/Manage.php - Plugin management view at Views/plugins/manage.php Database: - ospos_plugin_config table for plugin settings (key-value store) - Migration creates table with timestamps Documentation: - Comprehensive README with architecture patterns - Simple vs complex plugin examples - MVC directory structure guidance
99 lines
3.6 KiB
PHP
99 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers\Plugins;
|
|
|
|
use App\Controllers\Secure_Controller;
|
|
use App\Libraries\Plugins\PluginManager;
|
|
use CodeIgniter\HTTP\ResponseInterface;
|
|
|
|
class Manage extends Secure_Controller
|
|
{
|
|
private PluginManager $pluginManager;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct('plugins');
|
|
$this->pluginManager = new PluginManager();
|
|
$this->pluginManager->discoverPlugins();
|
|
}
|
|
|
|
public function getIndex(): string
|
|
{
|
|
$plugins = $this->pluginManager->getAllPlugins();
|
|
$enabledPlugins = $this->pluginManager->getEnabledPlugins();
|
|
|
|
$pluginData = [];
|
|
foreach ($plugins as $pluginId => $plugin) {
|
|
$pluginData[$pluginId] = [
|
|
'id' => $plugin->getPluginId(),
|
|
'name' => $plugin->getPluginName(),
|
|
'description' => $plugin->getPluginDescription(),
|
|
'version' => $plugin->getVersion(),
|
|
'enabled' => isset($enabledPlugins[$pluginId]),
|
|
'has_config' => $plugin->getConfigView() !== null,
|
|
];
|
|
}
|
|
|
|
echo view('plugins/manage', ['plugins' => $pluginData]);
|
|
return '';
|
|
}
|
|
|
|
public function postEnable(string $pluginId): ResponseInterface
|
|
{
|
|
if ($this->pluginManager->enablePlugin($pluginId)) {
|
|
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_enabled')]);
|
|
}
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_enable_failed')]);
|
|
}
|
|
|
|
public function postDisable(string $pluginId): ResponseInterface
|
|
{
|
|
if ($this->pluginManager->disablePlugin($pluginId)) {
|
|
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_disabled')]);
|
|
}
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_disable_failed')]);
|
|
}
|
|
|
|
public function postUninstall(string $pluginId): ResponseInterface
|
|
{
|
|
if ($this->pluginManager->uninstallPlugin($pluginId)) {
|
|
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_uninstalled')]);
|
|
}
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_uninstall_failed')]);
|
|
}
|
|
|
|
public function getConfig(string $pluginId): ResponseInterface
|
|
{
|
|
$plugin = $this->pluginManager->getPlugin($pluginId);
|
|
|
|
if (!$plugin) {
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_not_found')]);
|
|
}
|
|
|
|
$configView = $plugin->getConfigView();
|
|
if (!$configView) {
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_no_config')]);
|
|
}
|
|
|
|
$settings = $plugin->getSettings();
|
|
echo view($configView, ['settings' => $settings, 'plugin' => $plugin]);
|
|
return $this->response;
|
|
}
|
|
|
|
public function postSaveConfig(string $pluginId): ResponseInterface
|
|
{
|
|
$plugin = $this->pluginManager->getPlugin($pluginId);
|
|
|
|
if (!$plugin) {
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_not_found')]);
|
|
}
|
|
|
|
$settings = $this->request->getPost();
|
|
unset($settings['_method'], $settings['csrf_token_name']);
|
|
|
|
if ($plugin->saveSettings($settings)) {
|
|
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.settings_saved')]);
|
|
}
|
|
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.settings_save_failed')]);
|
|
}
|
|
} |