Newwebshop/app/Core/Override.php

398 lines
11 KiB
PHP

<?php
/**
* Copyright seit 2024 Webshop System
*
* Override-System für PrestaShop-Modul-Kompatibilität
*
* @author Webshop System
* @license GPL v3
*/
namespace App\Core;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Exception;
class Override
{
private static $overrides = [];
private static $initialized = false;
/**
* Override-System initialisieren
*/
public static function init()
{
if (self::$initialized) {
return;
}
self::loadOverridesFromDatabase();
self::$initialized = true;
}
/**
* Class-Override registrieren
*/
public static function registerClassOverride($originalClass, $overridePath, $moduleName)
{
$overrideKey = 'class_' . $originalClass;
self::$overrides[$overrideKey] = [
'type' => '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'];
}
}