398 lines
11 KiB
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'];
|
|
}
|
|
}
|