shop-old/modules/admin_import_editor.php
2026-04-20 01:03:43 +02:00

221 lines
6.5 KiB
PHP

<?php
/**
* @version $Id: admin_plugin_editor.php
* @package Easyshop
* @copyright Copyright (C) 2005 - 2011 TA-EDV
* @license proprietary
* @author Richard Kammermayer <rk@ta-edv.de>
* Easyshop is a web shop system
*/
class admin_import_editor {
private $base_object;
private $config;
private $layout_object;
private $import_object;
function __construct($base_object, $layout_object) {
$this->base_object = $base_object;
$this->layout_object = $layout_object;
include './core/import.class.php';
$this->import_object = new Import($base_object);
}
function run() {
if (isset($_GET['action'])) {
$action = $_GET['action'];
} else if (isset($_POST['action'])) {
$action = $_POST['action'];
} else {
$action = false;
}
if (isset($_GET['id'])) {
$id = $_GET['id'];
} else if (isset($_POST['id'])) {
$id = $_POST['id'];
} else {
$id = false;
}
if ($action == 'save') {
$this->save();
} else if ($action == 'upload_file') {
$this->upload($id);
$this->import_object->id = $id;
$data = $this->import_object->get_data();
$this->layout_object->assign('form_data', $data);
$this->layout_object->assign('error', $this->import_object->error);
return $this->layout_object->fetch('admin_import_editor.tpl');
} else if ($action == 'delete') {
$this->delete($id);
} else if ($action == 'delete_logo') {
$this->delete_logo($id);
}
else {
// get object data
if ($id) {
$this->import_object->id = $id;
$data = $this->import_object->get_data();
$this->layout_object->assign('form_data', $data);
}
$error = isset($this->import_object->error) ? $this->import_object->error : '';
$this->layout_object->assign('error', $error);
return $this->layout_object->fetch('admin_import_editor.tpl');
}
}
private function upload($id) {
$log_object = Logger::get_instance();
if (!$log_object) {
// Fallback, wenn Logger nicht verfügbar ist
$log_object = new class {
public function info($type, $message) { error_log("[$type] $message"); }
public function error($type, $message) { error_log("ERROR[$type] $message"); }
};
}
$log_object->info('fileupload','Starte Upload-Prozess');
header('Content-Type: application/json');
try {
if (!$id) {
throw new Exception('Keine ID angegeben');
}
$temp_file = $_FILES['Filedata']['tmp_name'];
if ($temp_file == '') {
throw new Exception('Keine Datei hochgeladen');
}
// Validiere Datei
$file_info = pathinfo($_FILES['Filedata']['name']);
if (strtolower($file_info['extension']) !== 'csv') {
throw new Exception('Nur CSV-Dateien sind erlaubt');
}
if ($_FILES['Filedata']['size'] > 5 * 1024 * 1024) {
throw new Exception('Datei ist zu groß (max. 5MB)');
}
// Speichere die Datei
$result = $this->import_object->save_file($id, $temp_file);
if (!$result) {
throw new Exception('Fehler beim Speichern der Datei');
}
// Hole Import-Konfiguration aus der DB
$sql = "SELECT import_filter, post_process_case FROM import WHERE id = ?";
$stmt = $this->base_object->db->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
// Initialisiere Variablen
$import_filter = '';
$post_process_case = '';
$stmt->bind_result($import_filter, $post_process_case);
$stmt->fetch();
$stmt->close();
// Sicherheitsprüfung
$allowed_scripts = ['preisupdate.py', 'sdbimport.py'];
if (!in_array($import_filter, $allowed_scripts)) {
throw new Exception("Unbekanntes Importscript!");
}
$python_script = dirname(__FILE__) . '/import/' . $import_filter;
$uploaded_file = './tmp/import/'.basename($_FILES['Filedata']['name']);
$command = "python3 {$python_script} {$uploaded_file} 2>&1";
$output = [];
$return_var = 0;
exec($command, $output, $return_var);
$log_object->info('python_output', implode("\n", $output));
if ($return_var !== 0) {
throw new Exception('Fehler beim Ausführen des Python-Scripts: ' . implode("\n", $output));
}
// Post-Processing
$updated_count = 0;
switch ($post_process_case) {
case 'update_prices':
foreach ($output as $line) {
if (strpos($line, "eindeutige Artikel verarbeitet") !== false) {
if (preg_match('/Insgesamt (\d+) eindeutige/', $line, $matches)) {
$updated_count = intval($matches[1]);
break;
}
}
}
break;
case 'update_sdb_count':
$updated_count = count($output); // oder smarter
break;
default:
$log_object->info('postprocess', "Kein Post-Processing definiert für Fall: $post_process_case");
}
// Aktualisiere Import-Datum und Anzahl
$sql = "UPDATE import SET last_import_date = NOW(), count_imported_items = ? WHERE id = ?";
$stmt = $this->base_object->db->prepare($sql);
$stmt->bind_param('ii', $updated_count, $id);
$stmt->execute();
// Datei löschen
if (file_exists($uploaded_file)) {
unlink($uploaded_file);
}
// Erfolgreiche Antwort
$this->layout_object->assign('info_message', 'CSV-Datei erfolgreich importiert!');
die(json_encode([
'status' => 'success',
'message' => "Import erfolgreich. {$updated_count} Datensätze verarbeitet."
]));
} catch (Exception $e) {
$log_object->error('upload_error', $e->getMessage());
$this->layout_object->assign('error_message', $e->getMessage());
$uploaded_file = './tmp/import/'.basename($_FILES['Filedata']['name']);
if (file_exists($uploaded_file)) {
unlink($uploaded_file);
}
die(json_encode([
'status' => 'error',
'message' => $e->getMessage()
]));
}
}
private function save() {
// Implementierung der save-Methode
// Hier können Sie die Logik zum Speichern der Import-Daten hinzufügen
$this->layout_object->assign('info_message', 'Import-Daten gespeichert.');
return $this->layout_object->fetch('admin_import_editor.tpl');
}
private function delete($id) {
// Implementierung der delete-Methode
$this->import_object->set_object_property('id', $id);
$this->import_object->delete();
$this->layout_object->assign('info_message', 'Import gelöscht.');
return $this->layout_object->fetch('admin_import_editor.tpl');
}
private function delete_logo($id) {
// Implementierung der delete_logo-Methode
$this->import_object->set_object_property('id', $id);
// Hier können Sie die Logik zum Löschen des Logos hinzufügen
$this->layout_object->assign('info_message', 'Logo gelöscht.');
return $this->layout_object->fetch('admin_import_editor.tpl');
}
}