Newwebshop/app/controllers/admin/AdminOverrideController.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');
}
}
}