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

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/pass2 sind UI-only Felder (sollten zu pass gemapped 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

  1. Feld-Mapping:

    • pass1 + pass2pass (md5 hash)
    • admin_role_id nur wenn > 0
    • Leere Strings bei Datums-Feldern filtern ("0000-00-00")
  2. Whitelist für DB-Felder:

    • Nur Spalten updaten die wirklich existieren
    • Schützt vor SQL Errors
  3. Error-Handling:

    • Try-Catch um SQL-Queries
    • Logging in eigene Datei
    • Sinnvolle Fehlermeldungen
  4. Validierung:

    • E-Mail Format
    • Required Fields
    • Duplikat-Check

Nächste Schritte

Phase 1: CustomerManager erstellen

  • modules/admin2000/classes/CustomerManager.php erstellen
  • Database-Spalten-Whitelist definieren
  • update() Methode mit Error-Handling
  • Feld-Mapping implementieren (pass1/pass2pass)

Phase 2: Integration

  • In admin2000.php CustomerManager 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 pass gemapped)
  • customer_password_action (Dropdown für Passwort-Aktionen)

Lessons Learned

  1. Legacy = READ ONLY:

    • Nie wieder Legacy CRUD-Methoden nutzen ohne Analyse
    • Nur GET-Methoden sind safe
    • UPDATE/CREATE = grüne Wiese
  2. Debugging:

    • file_put_contents() zu Debug-Datei funktioniert
    • error_log() erscheint nicht in Plesk PHP-FPM Logs
    • Browser DevTools zeigt nur "500" - kein Stack Trace
  3. 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.log im httpdocs root
  • Diese Datei: /modules/ADMIN2000_NOTES.md