'class', 'original' => $originalClass, 'path' => $overridePath, 'module' => $moduleName, 'active' => true ]; // Override in Datenbank speichern self::saveOverrideToDatabase($overrideKey, 'class', $originalClass, $overridePath, $moduleName); } /** * Template-Override registrieren */ public static function registerTemplateOverride($originalTemplate, $overridePath, $moduleName) { $overrideKey = 'template_' . $originalTemplate; self::$overrides[$overrideKey] = [ 'type' => 'template', 'original' => $originalTemplate, 'path' => $overridePath, 'module' => $moduleName, 'active' => true ]; // Override in Datenbank speichern self::saveOverrideToDatabase($overrideKey, 'template', $originalTemplate, $overridePath, $moduleName); } /** * Controller-Override registrieren */ public static function registerControllerOverride($originalController, $overridePath, $moduleName) { $overrideKey = 'controller_' . $originalController; self::$overrides[$overrideKey] = [ 'type' => 'controller', 'original' => $originalController, 'path' => $overridePath, 'module' => $moduleName, 'active' => true ]; // Override in Datenbank speichern self::saveOverrideToDatabase($overrideKey, 'controller', $originalController, $overridePath, $moduleName); } /** * Class-Override laden */ public static function loadClass($className) { self::init(); $overrideKey = 'class_' . $className; if (isset(self::$overrides[$overrideKey]) && self::$overrides[$overrideKey]['active']) { $overridePath = self::$overrides[$overrideKey]['path']; if (file_exists($overridePath)) { require_once $overridePath; // Prüfen ob die Override-Klasse existiert if (class_exists($className)) { return true; } } } return false; } /** * Template-Override laden */ public static function loadTemplate($templatePath) { self::init(); $overrideKey = 'template_' . $templatePath; if (isset(self::$overrides[$overrideKey]) && self::$overrides[$overrideKey]['active']) { $overridePath = self::$overrides[$overrideKey]['path']; if (file_exists($overridePath)) { return $overridePath; } } return $templatePath; } /** * Controller-Override laden */ public static function loadController($controllerName) { self::init(); $overrideKey = 'controller_' . $controllerName; if (isset(self::$overrides[$overrideKey]) && self::$overrides[$overrideKey]['active']) { $overridePath = self::$overrides[$overrideKey]['path']; if (file_exists($overridePath)) { require_once $overridePath; return true; } } return false; } /** * Override entfernen */ public static function removeOverride($overrideKey, $moduleName) { if (isset(self::$overrides[$overrideKey])) { self::$overrides[$overrideKey]['active'] = false; } // Override aus Datenbank entfernen self::removeOverrideFromDatabase($overrideKey, $moduleName); } /** * Override-Statistiken abrufen */ public static function getOverrideStatistics() { self::init(); $stats = [ 'class' => 0, 'template' => 0, 'controller' => 0, 'total' => 0 ]; foreach (self::$overrides as $override) { if ($override['active']) { $stats[$override['type']]++; $stats['total']++; } } return $stats; } /** * Overrides aus Datenbank laden */ private static function loadOverridesFromDatabase() { try { $conn = DriverManager::getConnection([ 'url' => getenv('DATABASE_URL') ?: 'mysql://root:password@localhost/webshop' ]); $stmt = $conn->prepare(' SELECT override_key, override_type, original_path, override_path, module_name, active FROM ws_module_override WHERE active = 1 ORDER BY module_name ASC '); $stmt->execute(); $overrides = $stmt->fetchAllAssociative(); foreach ($overrides as $override) { self::$overrides[$override['override_key']] = [ 'type' => $override['override_type'], 'original' => $override['original_path'], 'path' => $override['override_path'], 'module' => $override['module_name'], 'active' => (bool)$override['active'] ]; } } catch (Exception $e) { error_log('Override-Datenbank Fehler: ' . $e->getMessage()); } } /** * Override in Datenbank speichern */ private static function saveOverrideToDatabase($overrideKey, $type, $originalPath, $overridePath, $moduleName) { try { $conn = DriverManager::getConnection([ 'url' => getenv('DATABASE_URL') ?: 'mysql://root:password@localhost/webshop' ]); $stmt = $conn->prepare(' INSERT INTO ws_module_override ( override_key, override_type, original_path, override_path, module_name, active, created_at ) VALUES (?, ?, ?, ?, ?, 1, NOW()) ON DUPLICATE KEY UPDATE override_path = ?, active = 1, updated_at = NOW() '); $stmt->execute([ $overrideKey, $type, $originalPath, $overridePath, $moduleName, $overridePath ]); } catch (Exception $e) { error_log('Override-Speicher Fehler: ' . $e->getMessage()); } } /** * Override aus Datenbank entfernen */ private static function removeOverrideFromDatabase($overrideKey, $moduleName) { try { $conn = DriverManager::getConnection([ 'url' => getenv('DATABASE_URL') ?: 'mysql://root:password@localhost/webshop' ]); $stmt = $conn->prepare(' UPDATE ws_module_override SET active = 0, updated_at = NOW() WHERE override_key = ? AND module_name = ? '); $stmt->execute([$overrideKey, $moduleName]); } catch (Exception $e) { error_log('Override-Entfernung Fehler: ' . $e->getMessage()); } } /** * Override-Pfad generieren */ public static function generateOverridePath($moduleName, $type, $originalPath) { $modulePath = __DIR__ . '/../../modules/' . $moduleName . '/'; switch ($type) { case 'class': return $modulePath . 'override/classes/' . basename($originalPath); case 'template': return $modulePath . 'override/templates/' . $originalPath; case 'controller': return $modulePath . 'override/controllers/' . $originalPath; default: return $modulePath . 'override/' . $originalPath; } } /** * Override-Verzeichnisse erstellen */ public static function createOverrideDirectories($moduleName) { $modulePath = __DIR__ . '/../../modules/' . $moduleName . '/'; $overridePath = $modulePath . 'override/'; $directories = [ $overridePath, $overridePath . 'classes/', $overridePath . 'templates/', $overridePath . 'controllers/' ]; foreach ($directories as $dir) { if (!is_dir($dir)) { mkdir($dir, 0755, true); } } return true; } /** * Override-Kompatibilität prüfen */ public static function checkOverrideCompatibility($originalPath, $overridePath) { if (!file_exists($originalPath)) { return false; } if (!file_exists($overridePath)) { return false; } // Prüfen ob Override-Datei neuer ist $originalTime = filemtime($originalPath); $overrideTime = filemtime($overridePath); return $overrideTime >= $originalTime; } /** * Override-Liste für Admin-Interface */ public static function getOverrideList() { self::init(); $list = []; foreach (self::$overrides as $key => $override) { if ($override['active']) { $list[] = [ 'key' => $key, 'type' => $override['type'], 'original' => $override['original'], 'path' => $override['path'], 'module' => $override['module'] ]; } } return $list; } /** * Override-Priority-System */ public static function getOverridePriority($overrideKey) { // Module-spezifische Prioritäten $priorities = [ 'payment' => 100, 'shipping' => 90, 'theme' => 80, 'default' => 50 ]; if (isset(self::$overrides[$overrideKey])) { $moduleName = self::$overrides[$overrideKey]['module']; foreach ($priorities as $prefix => $priority) { if (strpos($moduleName, $prefix) === 0) { return $priority; } } } return $priorities['default']; } }