4.1 KiB
4.1 KiB
Admin2000 - Development Notes
Aktuelles Problem: Save funktioniert nicht (2025-10-25)
Problem-Analyse
- Customer Editor lädt korrekt, alle Daten werden angezeigt
- Beim Speichern: Error 500
- Debug-Log zeigt: Crash in Legacy
Customer->update()(customer.class.php:1474) - Keine weiteren Logs nach "Calling customer->save()"
Root Cause
Legacy Customer->update() Methode:
- Baut dynamisch SQL UPDATE mit allen übergebenen Feldern
- Crasht wahrscheinlich bei nicht-existierenden DB-Spalten
- Problem-Felder:
pass1,pass2,admin_role_id(0) pass1/pass2sind UI-only Felder (sollten zupassgemapped werden)admin_role_id= 0 sollte gefiltert werden oder leer bleiben- Kein Error-Handling, kein Logging im Legacy-Code
Debug-Dateien
/var/www/vhosts/intelectra.de/httpdocs/admin2000_debug.log- Live Debug Output- Letzter Eintrag: "Calling customer->save()" - danach Crash
Lösung: CustomerManager-Klasse (Grüne Wiese)
Konzept
Skalpell-Modus für Legacy:
- Legacy Customer-Klasse bleibt READ-ONLY
- Nur
get_data(),get_by_id()etc. nutzen - KEINE Änderungen am Legacy-Code
Neue Admin2000 CRUD-Logik:
- Eigene CustomerManager-Klasse für Admin2000
- Sauberes Error-Handling + Logging
- UPDATE und CREATE sauber getrennt
- Nur existierende DB-Spalten updaten
Geplante Struktur
/modules/admin2000/
├── admin2000.php (Controller)
└── classes/
└── CustomerManager.php (neue CRUD-Klasse)
├── get($id) - liest aus Legacy
├── update($id, $data) - eigene UPDATE-Logik
├── create($data) - eigene CREATE-Logik
├── validate($data) - Eingabe-Validierung
└── mapFormToDb($form_data) - Feld-Mapping
CustomerManager Features
-
Feld-Mapping:
pass1+pass2→pass(md5 hash)admin_role_idnur wenn > 0- Leere Strings bei Datums-Feldern filtern ("0000-00-00")
-
Whitelist für DB-Felder:
- Nur Spalten updaten die wirklich existieren
- Schützt vor SQL Errors
-
Error-Handling:
- Try-Catch um SQL-Queries
- Logging in eigene Datei
- Sinnvolle Fehlermeldungen
-
Validierung:
- E-Mail Format
- Required Fields
- Duplikat-Check
Nächste Schritte
Phase 1: CustomerManager erstellen
modules/admin2000/classes/CustomerManager.phperstellen- Database-Spalten-Whitelist definieren
update()Methode mit Error-Handling- Feld-Mapping implementieren (
pass1/pass2→pass)
Phase 2: Integration
- In
admin2000.phpCustomerManager statt Legacy Customer nutzen save_customer()umbauen auf CustomerManager->update()- Debug-Logging entfernen wenn fertig
Phase 3: Testing
- Save testen mit verschiedenen Feldkombinationen
- Passwort-Änderung testen
- Leere Felder testen
- Admin-Role-Änderung testen
DB-Spalten (customers Tabelle)
Existierende Spalten (aus get_data() bekannt):
- id, number, locked, group_id
- honorific, firstname, surname
- phone, mobile, fax, email, website
- show_tax, burth_date
- company, tax_number, tax_id, eu_business
- account_holder, account_number, bank, bank_number, iban, swift_bic
- direct_debit_active, rechnung_active, skonto
- freetextfield1-6, has_item_export, newsletter_sub, info
- pass (md5 hash)
- admin_role_id (vermutlich)
UI-only Felder (nicht in DB):
- pass1, pass2 (werden zu
passgemapped) - customer_password_action (Dropdown für Passwort-Aktionen)
Lessons Learned
-
Legacy = READ ONLY:
- Nie wieder Legacy CRUD-Methoden nutzen ohne Analyse
- Nur GET-Methoden sind safe
- UPDATE/CREATE = grüne Wiese
-
Debugging:
file_put_contents()zu Debug-Datei funktionierterror_log()erscheint nicht in Plesk PHP-FPM Logs- Browser DevTools zeigt nur "500" - kein Stack Trace
-
Skalpell-Modus:
- "Ich habe gedacht" = VERBOTEN
- Nur Fakten aus Legacy-Code nutzen
- Keine Annahmen, keine "Optimierungen"
Kontakt / Fragen
Bei Fragen zu Admin2000:
- Debug-Log:
admin2000_debug.logim httpdocs root - Diese Datei:
/modules/ADMIN2000_NOTES.md