481 lines
14 KiB
PHP
481 lines
14 KiB
PHP
<?php
|
|
/**
|
|
* Copyright seit 2024 Webshop System
|
|
*
|
|
* Admin Controller für Override-System
|
|
*
|
|
* @author Webshop System
|
|
* @license GPL v3
|
|
*/
|
|
|
|
namespace App\Controllers\Admin;
|
|
|
|
use App\Core\Controller;
|
|
use App\Core\Override;
|
|
use App\Core\Context;
|
|
use App\Core\ServiceContainer;
|
|
|
|
class AdminOverrideController extends Controller
|
|
{
|
|
private $override;
|
|
private $context;
|
|
private $container;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
|
|
$this->override = Override::getInstance();
|
|
$this->context = Context::getContext();
|
|
$this->container = ServiceContainer::getInstance();
|
|
|
|
// Admin-Berechtigung prüfen
|
|
$this->checkAdminPermission();
|
|
}
|
|
|
|
/**
|
|
* Override-Übersicht anzeigen
|
|
*/
|
|
public function index()
|
|
{
|
|
$overrides = $this->override->getOverrideList();
|
|
$statistics = $this->override->getOverrideStatistics();
|
|
|
|
$data = [
|
|
'overrides' => $overrides,
|
|
'statistics' => $statistics,
|
|
'page_title' => 'Override-Verwaltung',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override']
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/index', $data);
|
|
}
|
|
|
|
/**
|
|
* Override erstellen
|
|
*/
|
|
public function create()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$this->handleCreateOverride();
|
|
}
|
|
|
|
$modules = $this->getAvailableModules();
|
|
$overrideTypes = ['class', 'template', 'controller'];
|
|
|
|
$data = [
|
|
'modules' => $modules,
|
|
'override_types' => $overrideTypes,
|
|
'page_title' => 'Override erstellen',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override'],
|
|
['title' => 'Override erstellen', 'url' => '/admin/override/create']
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/create', $data);
|
|
}
|
|
|
|
/**
|
|
* Override bearbeiten
|
|
*/
|
|
public function edit($id)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
if ($this->request->isPost()) {
|
|
$this->handleEditOverride($id);
|
|
}
|
|
|
|
$modules = $this->getAvailableModules();
|
|
$overrideTypes = ['class', 'template', 'controller'];
|
|
|
|
$data = [
|
|
'override' => $override,
|
|
'modules' => $modules,
|
|
'override_types' => $overrideTypes,
|
|
'page_title' => 'Override bearbeiten',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override'],
|
|
['title' => 'Override bearbeiten', 'url' => '/admin/override/edit/' . $id]
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/edit', $data);
|
|
}
|
|
|
|
/**
|
|
* Override löschen
|
|
*/
|
|
public function delete($id)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->setFlashMessage('error', 'Override nicht gefunden');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
if ($this->override->removeOverride($override['override_key'], $override['module_name'])) {
|
|
$this->setFlashMessage('success', 'Override erfolgreich gelöscht');
|
|
} else {
|
|
$this->setFlashMessage('error', 'Fehler beim Löschen des Overrides');
|
|
}
|
|
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override aktivieren/deaktivieren
|
|
*/
|
|
public function toggle($id)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->setFlashMessage('error', 'Override nicht gefunden');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
$newStatus = !$override['active'];
|
|
|
|
if ($this->override->updateOverrideStatus($id, $newStatus)) {
|
|
$statusText = $newStatus ? 'aktiviert' : 'deaktiviert';
|
|
$this->setFlashMessage('success', "Override erfolgreich $statusText");
|
|
} else {
|
|
$this->setFlashMessage('error', 'Fehler beim Ändern des Override-Status');
|
|
}
|
|
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override-Validierung
|
|
*/
|
|
public function validate($id)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->setFlashMessage('error', 'Override nicht gefunden');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
$validationResults = $this->override->validateOverride($id);
|
|
|
|
$data = [
|
|
'override' => $override,
|
|
'validation_results' => $validationResults,
|
|
'page_title' => 'Override-Validierung',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override'],
|
|
['title' => 'Override-Validierung', 'url' => '/admin/override/validate/' . $id]
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/validate', $data);
|
|
}
|
|
|
|
/**
|
|
* Override-Backup erstellen
|
|
*/
|
|
public function backup($id)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->setFlashMessage('error', 'Override nicht gefunden');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
if ($this->override->createBackup($id)) {
|
|
$this->setFlashMessage('success', 'Backup erfolgreich erstellt');
|
|
} else {
|
|
$this->setFlashMessage('error', 'Fehler beim Erstellen des Backups');
|
|
}
|
|
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override-Backup wiederherstellen
|
|
*/
|
|
public function restore($id, $backupId)
|
|
{
|
|
$override = $this->getOverrideById($id);
|
|
|
|
if (!$override) {
|
|
$this->setFlashMessage('error', 'Override nicht gefunden');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
if ($this->override->restoreBackup($id, $backupId)) {
|
|
$this->setFlashMessage('success', 'Backup erfolgreich wiederhergestellt');
|
|
} else {
|
|
$this->setFlashMessage('error', 'Fehler beim Wiederherstellen des Backups');
|
|
}
|
|
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override-Statistiken
|
|
*/
|
|
public function statistics()
|
|
{
|
|
$statistics = $this->override->getOverrideStatistics();
|
|
$performanceData = $this->override->getPerformanceData();
|
|
$compatibilityData = $this->override->getCompatibilityData();
|
|
|
|
$data = [
|
|
'statistics' => $statistics,
|
|
'performance_data' => $performanceData,
|
|
'compatibility_data' => $compatibilityData,
|
|
'page_title' => 'Override-Statistiken',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override'],
|
|
['title' => 'Override-Statistiken', 'url' => '/admin/override/statistics']
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/statistics', $data);
|
|
}
|
|
|
|
/**
|
|
* Override-Einstellungen
|
|
*/
|
|
public function settings()
|
|
{
|
|
if ($this->request->isPost()) {
|
|
$this->handleSettingsUpdate();
|
|
}
|
|
|
|
$settings = $this->override->getSettings();
|
|
|
|
$data = [
|
|
'settings' => $settings,
|
|
'page_title' => 'Override-Einstellungen',
|
|
'breadcrumb' => [
|
|
['title' => 'Dashboard', 'url' => '/admin/dashboard'],
|
|
['title' => 'Override-Verwaltung', 'url' => '/admin/override'],
|
|
['title' => 'Override-Einstellungen', 'url' => '/admin/override/settings']
|
|
]
|
|
];
|
|
|
|
return $this->render('admin/override/settings', $data);
|
|
}
|
|
|
|
/**
|
|
* Override erstellen verarbeiten
|
|
*/
|
|
private function handleCreateOverride()
|
|
{
|
|
$data = $this->request->getPost();
|
|
|
|
$validation = $this->validateOverrideData($data);
|
|
|
|
if (!$validation['valid']) {
|
|
$this->setFlashMessage('error', $validation['message']);
|
|
return;
|
|
}
|
|
|
|
$overrideKey = $data['override_type'] . '_' . $data['original_path'];
|
|
$overridePath = $this->override->generateOverridePath(
|
|
$data['module_name'],
|
|
$data['override_type'],
|
|
$data['original_path']
|
|
);
|
|
|
|
// Override-Verzeichnisse erstellen
|
|
$this->override->createOverrideDirectories($data['module_name']);
|
|
|
|
// Override registrieren
|
|
switch ($data['override_type']) {
|
|
case 'class':
|
|
$this->override->registerClassOverride(
|
|
$data['original_path'],
|
|
$overridePath,
|
|
$data['module_name']
|
|
);
|
|
break;
|
|
|
|
case 'template':
|
|
$this->override->registerTemplateOverride(
|
|
$data['original_path'],
|
|
$overridePath,
|
|
$data['module_name']
|
|
);
|
|
break;
|
|
|
|
case 'controller':
|
|
$this->override->registerControllerOverride(
|
|
$data['original_path'],
|
|
$overridePath,
|
|
$data['module_name']
|
|
);
|
|
break;
|
|
}
|
|
|
|
$this->setFlashMessage('success', 'Override erfolgreich erstellt');
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override bearbeiten verarbeiten
|
|
*/
|
|
private function handleEditOverride($id)
|
|
{
|
|
$data = $this->request->getPost();
|
|
|
|
$validation = $this->validateOverrideData($data);
|
|
|
|
if (!$validation['valid']) {
|
|
$this->setFlashMessage('error', $validation['message']);
|
|
return;
|
|
}
|
|
|
|
if ($this->override->updateOverride($id, $data)) {
|
|
$this->setFlashMessage('success', 'Override erfolgreich aktualisiert');
|
|
} else {
|
|
$this->setFlashMessage('error', 'Fehler beim Aktualisieren des Overrides');
|
|
}
|
|
|
|
$this->redirect('/admin/override');
|
|
}
|
|
|
|
/**
|
|
* Override-Daten validieren
|
|
*/
|
|
private function validateOverrideData($data)
|
|
{
|
|
if (empty($data['module_name'])) {
|
|
return ['valid' => false, 'message' => 'Modul-Name ist erforderlich'];
|
|
}
|
|
|
|
if (empty($data['override_type'])) {
|
|
return ['valid' => false, 'message' => 'Override-Typ ist erforderlich'];
|
|
}
|
|
|
|
if (empty($data['original_path'])) {
|
|
return ['valid' => false, 'message' => 'Original-Pfad ist erforderlich'];
|
|
}
|
|
|
|
// Prüfen ob Modul existiert
|
|
if (!$this->moduleExists($data['module_name'])) {
|
|
return ['valid' => false, 'message' => 'Modul existiert nicht'];
|
|
}
|
|
|
|
// Prüfen ob Original-Datei existiert
|
|
if (!$this->originalFileExists($data['original_path'], $data['override_type'])) {
|
|
return ['valid' => false, 'message' => 'Original-Datei existiert nicht'];
|
|
}
|
|
|
|
return ['valid' => true];
|
|
}
|
|
|
|
/**
|
|
* Verfügbare Module abrufen
|
|
*/
|
|
private function getAvailableModules()
|
|
{
|
|
$modulesDir = __DIR__ . '/../../../modules/';
|
|
$modules = [];
|
|
|
|
if (is_dir($modulesDir)) {
|
|
$moduleDirs = scandir($modulesDir);
|
|
|
|
foreach ($moduleDirs as $dir) {
|
|
if ($dir !== '.' && $dir !== '..' && is_dir($modulesDir . $dir)) {
|
|
$configFile = $modulesDir . $dir . '/config.json';
|
|
|
|
if (file_exists($configFile)) {
|
|
$config = json_decode(file_get_contents($configFile), true);
|
|
$modules[$dir] = $config['name'] ?? $dir;
|
|
} else {
|
|
$modules[$dir] = $dir;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $modules;
|
|
}
|
|
|
|
/**
|
|
* Override nach ID abrufen
|
|
*/
|
|
private function getOverrideById($id)
|
|
{
|
|
return $this->override->getOverrideById($id);
|
|
}
|
|
|
|
/**
|
|
* Prüfen ob Modul existiert
|
|
*/
|
|
private function moduleExists($moduleName)
|
|
{
|
|
$modulePath = __DIR__ . '/../../../modules/' . $moduleName;
|
|
return is_dir($modulePath);
|
|
}
|
|
|
|
/**
|
|
* Prüfen ob Original-Datei existiert
|
|
*/
|
|
private function originalFileExists($path, $type)
|
|
{
|
|
$basePath = __DIR__ . '/../../../';
|
|
|
|
switch ($type) {
|
|
case 'class':
|
|
return file_exists($basePath . 'app/classes/' . $path);
|
|
|
|
case 'template':
|
|
return file_exists($basePath . 'templates/' . $path);
|
|
|
|
case 'controller':
|
|
return file_exists($basePath . 'app/controllers/' . $path);
|
|
|
|
default:
|
|
return file_exists($basePath . $path);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Einstellungen aktualisieren
|
|
*/
|
|
private function handleSettingsUpdate()
|
|
{
|
|
$data = $this->request->getPost();
|
|
|
|
foreach ($data['settings'] as $key => $value) {
|
|
$this->override->updateSetting($key, $value);
|
|
}
|
|
|
|
$this->setFlashMessage('success', 'Einstellungen erfolgreich aktualisiert');
|
|
$this->redirect('/admin/override/settings');
|
|
}
|
|
|
|
/**
|
|
* Admin-Berechtigung prüfen
|
|
*/
|
|
private function checkAdminPermission()
|
|
{
|
|
$employee = $this->context->getEmployee();
|
|
|
|
if (!$employee || !$employee->hasPermission('override_management')) {
|
|
$this->setFlashMessage('error', 'Keine Berechtigung für Override-Verwaltung');
|
|
$this->redirect('/admin/dashboard');
|
|
}
|
|
}
|
|
}
|