tabsl / tabslfeedback
Feedback-Formular für Backend und Frontend mit KI-Aufbereitung und GitLab-Ticket-Anlage.
Requires
- php: >=7.4
- ext-curl: *
- ext-fileinfo: *
- ext-json: *
README
OXID eShop Modul für ein Feedback-Formular in Backend und Shop. Der Freitext des Melders wird von OpenAI zu Titel und Beschreibung aufbereitet; daraus entsteht ein GitLab-Issue mit Screenshots und technischem Kontext.
Statt „Das geht nicht" per Telefon oder E-Mail — ohne URL, ohne Browser, ohne Screenshot, und ohne dass jemand die Meldung von Hand ins Ticketsystem überträgt.
Funktionen
Zwei Einstiege, getrennt schaltbar — im Backend ein Link im Header oben links, im Shop ein kleiner Button auf jeder Seite (Position wählbar). „Beide aus" ist ein zulässiger Zustand; fehlen die GitLab-Pflichtangaben, erscheint gar kein Einstieg.
Screenshots aus der Zwischenablage — Bild kopieren, im Formular Strg+V
bzw. ⌘+V. Mehrere Bilder pro Meldung, jedes mit Vorschau und einzeln
entfernbar. Feedback ohne Bild bleibt möglich.
KI-Aufbereitung mit Rückfallebene — der ursprüngliche Wortlaut steht immer zusätzlich im Issue. Fehlt der API-Key oder antwortet OpenAI nicht, entsteht das Issue trotzdem: mit Rohtext, Screenshots, Kontext und einem Vermerk, dass keine Aufbereitung stattfand. Der Melder bemerkt keinen Unterschied.
Technischer Kontext am Ticket — in einem eingeklappten Block: Herkunft der
Meldung, aufgerufene Seite, Referrer, Browser inkl. Version und Betriebssystem,
Fenster- und Bildschirmgröße, Shop-ID, Sprache, Währung, Theme mit Version,
aktive Module mit Versionen, Shop- und PHP-Version. Bei angemeldeten Kunden
optional Kundennummer, Name und E-Mail. Seite und Referrer werden zuvor
bereinigt: Sitzungskennungen und geheimnisverdächtige Parameter (sid,
stoken, token, password, secret …) werden durch … ersetzt; fachlich
nützliche Parameter wie Kategorie, Suchbegriff oder Seitenzahl bleiben erhalten.
Formular ohne sichtbaren Button öffnen
Jede Shop-Seite lässt sich mit ?tabslFeedback=1 aufrufen — das Formular öffnet
sich sofort, auch bei ausgeblendetem Button. Gedacht für Testende und Redaktion:
Man verschickt den Link, ohne den Button für alle einzuschalten. ?tabslFeedback=0
(ebenso false, off, no) verhindert nur das sofortige Öffnen; ein
eingeschalteter Button bleibt sichtbar.
⚠️ Der Parameter ist bewusst nicht durch ein Geheimnis geschützt, und sein Name steht in diesem quelloffenen Repository. Die Einstellung „Feedback-Button im Shop anzeigen" regelt deshalb nur die Sichtbarkeit, nicht die Erreichbarkeit: Sobald die GitLab-Angaben vollständig sind, nimmt der Shop Feedback entgegen — auch bei ausgeblendetem Button. Wer das nicht möchte, lässt die GitLab-Angaben leer oder deaktiviert das Modul. Gegen automatisierten Missbrauch schützt allein
tabslTurnstile(siehe unten).
Schnellstart
composer require tabsl/tabslfeedback vendor/bin/oe-console oe:module:activate tabslFeedback
Alternativ manuell nach source/modules/tabsl/tabslFeedback/ entpacken und im
Backend unter Erweiterungen → Module aktivieren.
GitLab vorbereiten
- Projekt-ID — steht auf der Startseite des Zielprojekts unter dem Projektnamen bzw. im Menü ⋮ → „Projekt-ID kopieren".
- Zugangs-Token — im Zielprojekt unter Settings → Access tokens einen
Project Access Token mit Scope
apiund Rolle Reporter (oder höher) anlegen. Einem persönlichen Token vorziehen: dessen Reichweite umfasst alle Projekte des Kontos, ein Project-Access-Token nur dieses eine. - Benutzer-ID der zuständigen Person — steht in deren GitLab-Profil. Bleibt das Feld leer, entstehen Issues ohne Zuweisung.
Modul konfigurieren
Backend → Erweiterungen → Module → tabslFeedback → Einstellungen:
| Einstellung | Bedeutung | Standard |
|---|---|---|
tabslfeedback_admin_enabled |
Feedback-Link im Backend-Header einblenden | aus |
tabslfeedback_frontend_enabled |
Feedback-Button im Shop einblenden (nur Sichtbarkeit, nicht Erreichbarkeit) | aus |
tabslfeedback_button_position |
bottom-left, center oder bottom-right |
bottom-right |
tabslfeedback_gitlab_url |
Basis-Adresse der GitLab-Instanz inkl. Schema, ohne /api/v4 — Pflicht |
leer |
tabslfeedback_gitlab_project_id |
Numerische ID des Zielprojekts — Pflicht | leer |
tabslfeedback_gitlab_token |
Project-Access-Token mit Scope api — Pflicht |
leer |
tabslfeedback_gitlab_assignee_id |
Benutzer-ID für die Zuweisung; leer = keine Zuweisung | leer |
tabslfeedback_openai_key |
OpenAI API-Key; leer = Ticket ohne Aufbereitung | leer |
tabslfeedback_openai_model |
Verwendetes Modell | gpt-4o-mini |
tabslfeedback_ticket_language |
source = Sprache der Meldung behalten, en = immer Englisch |
source |
tabslfeedback_show_contact_fields |
Optionale Felder für Name und E-Mail anzeigen | aus |
tabslfeedback_send_customer_data |
Bei angemeldeten Kunden Kundennummer, Name und E-Mail ins Ticket übernehmen | aus |
Fehlt eine der drei GitLab-Pflichtangaben — oder das http:// bzw. https://
in der Adresse —, erscheint weder Header-Link noch Frontend-Button: ein
Formular, das kein Ticket erzeugen kann, wird gar nicht erst angeboten. Das
Modul enthält keine Vorbelegung für Adressen, Projekt-IDs oder Zugangsdaten.
⚠️ Die GitLab-Adresse sollte auf
https://lauten. Der Zugangs-Token wird als HTTP-Header übertragen; überhttp://wandert er unverschlüsselt durchs Netz. Für interne Instanzen bleibthttp://möglich, wird aber bei jeder Absendung im Shop-Log vermerkt.
Grenzwerte
Fest eingebaut, bewusst nicht konfigurierbar: 5 Bilder je Meldung, 10 MB je Bild, 20 MB für alle Bilder zusammen, 5.000 Zeichen Freitext, je 255 Zeichen für Name und E-Mail; Formate PNG, JPG, GIF, WebP.
Alle Grenzen werden serverseitig durchgesetzt. Damit mehrere Screenshots
durchkommen, sollten post_max_size und memory_limit der PHP-Installation
oberhalb von 20 MB liegen.
Welche Daten gehen an wen
Grundlage für die Datenschutzerklärung des einsetzenden Shops. Übermittelt wird ausschließlich beim Absenden einer Meldung.
An OpenAI (api.openai.com) — ausschließlich der Freitext der Meldung.
Nicht: Screenshots, Name, E-Mail, Kundendaten, Umgebungsdaten, IP-Adresse,
Shop-Adresse. Schreibt ein Melder personenbezogene Angaben in den Freitext,
werden diese mit übertragen — darauf hat das Modul keinen Einfluss. Ohne
API-Key findet keine Übermittlung statt.
An die konfigurierte GitLab-Instanz — Freitext, aufbereiteter Titel und
Beschreibung, alle Screenshots, optional Name und E-Mail sowie der oben
beschriebene technische Kontext. Kundendaten nur bei aktivem
tabslfeedback_send_customer_data. Nicht: IP-Adresse, Warenkorb- und
Bestellkontext, Browser-Konsolenmeldungen. Bei einer eigenen GitLab-Installation
verlassen die Daten die eigene Infrastruktur nicht.
An Cloudflare (challenges.cloudflare.com) — nur bei aktivem
tabslTurnstile: der Turnstile-Token und die von Cloudflare selbst erhobenen
Browser-Signale. Die IP-Adresse des Melders wird ausdrücklich nicht
weitergegeben; das optionale Feld remoteip bleibt leer.
Nirgendwohin — das Modul legt keine eigene Datenbanktabelle an und speichert Meldungen nirgends im Shop. Kein Zwischenspeicher, keine Wiedervorlage: Ist GitLab nicht erreichbar, ist die Meldung verloren, und der Melder erhält eine Fehlermeldung statt einer falschen Bestätigung.
Ins Shop-Log
Damit ausbleibende Tickets auffallen, hält das Modul technische Störungen im
Shop-Log fest, jeweils mit dem Präfix [tabslFeedback]:
| Ereignis | Stufe |
|---|---|
| Issue-Anlage fehlgeschlagen (Meldung verloren) | error |
| Screenshot-Upload fehlgeschlagen (Bild fehlt im Ticket) | error |
| KI-Aufbereitung fehlgeschlagen — inkl. HTTP-Status und Fehlermeldung | error |
| Absendung bei unvollständiger Konfiguration abgewiesen | error |
| Unerwarteter Fehler beim Absenden (einzeilig und gekürzt) | error |
| Zustand des Schutzmoduls nicht ermittelbar | error |
| Schutzmodul aktiv, liefert aber nicht die erwartete Schnittstelle | error |
GitLab-Adresse nutzt http statt https |
warning |
| Bot-Prüfung nicht bestanden (Normalbetrieb) | info |
Nicht protokolliert werden Meldungstext, Kontaktangaben, Kundendaten, Screenshots und Zugangsdaten.
Hinweis: OXID protokolliert standardmäßig erst ab Stufe
error. FürwarningundinfomusssLogLevelinsource/config.inc.phpgesetzt werden:$this->sLogLevel = 'warning';Entsteht ein Ticket ohne Aufbereitung, steht der Grund als
errorim Log — etwaopenai request failed — http 401, api: invalid_api_key. Abgelaufener Schlüssel, erschöpftes Kontingent und Zeitüberschreitung sind daran unterscheidbar.
Missbrauchsschutz im Shop
Das Frontend-Formular ist öffentlich erreichbar. Jede Absendung erzeugt ein GitLab-Issue und einen kostenpflichtigen OpenAI-Aufruf — ein Bot kann also sowohl das Projekt fluten als auch Kosten verursachen.
Das Modul unterstützt dafür tabslTurnstile (Cloudflare Turnstile für OXID 6): Ist es installiert, aktiviert und mit Site-Key konfiguriert, erscheint im Formular ein Turnstile-Widget und die Absendung wird serverseitig geprüft — besteht die Prüfung nicht, entsteht weder ein Issue noch wird OpenAI angesprochen. Fehlt das Modul, läuft tabslFeedback vollständig weiter; der Schutz entfällt ersatzlos, ohne Fehler und ohne Installationsaufforderung. Das Backend-Formular ist von der Prüfung ausgenommen, da bereits durch die Anmeldung geschützt.
⚠️ Der öffentliche Betrieb des Frontend-Formulars ohne Schutzmodul erfolgt auf eigenes Risiko. Wer keinen Bot-Schutz einsetzen möchte, sollte das Frontend-Formular deaktiviert lassen und nur das Backend-Formular nutzen.
Es gibt bewusst kein eigenes Rate-Limiting: ohne Zwischenspeicher wäre es nur über die Session abbildbar und damit gegen Bots wirkungslos.
Kosten
GitLab — keine zusätzlichen Kosten. OpenAI — je Meldung ein Aufruf mit
dem Freitext (höchstens 5.000 Zeichen) und einer kurzen Antwort; mit dem
voreingestellten gpt-4o-mini liegen die Kosten pro Meldung bei Bruchteilen
eines Cents, Bilder werden nicht übermittelt. Cloudflare Turnstile —
dauerhaft kostenlos.
Was das Modul nicht tut
- Keine Feedback-Übersicht, kein Archiv, keine Wiedervorlage — GitLab ist die einzige Ablage
- Keine Hintergrundverarbeitung: das Ticket entsteht beim Absenden
- Keine Bildauswertung durch die KI
- Keine Labels, keine Priorität, keine Kategorisierung, keine Duplikaterkennung
- Keine Rückmeldung an den Melder über den Bearbeitungsstand
- Genau ein GitLab-Projekt je Shop; keine Jira-, GitHub- oder E-Mail-Ziele
Kompatibilität
OXID eShop 6.x, PHP 7.4 und PHP 8.x. Getestet mit den Themes wave und ps;
das Frontend-Widget bindet sich an den Block base_js und setzt weder jQuery
noch Bootstrap voraus.
Support
Open Source, ohne Anspruch auf Support oder Reaktionszeiten. Fehlerberichte und Verbesserungsvorschläge sind über die GitHub-Issues willkommen; eine Bearbeitung erfolgt nach Möglichkeit.
Changelog
Siehe CHANGELOG.md.
License
GNU General Public License v3.0 — siehe LICENSE.
Copyright
Tobias Merkl | https://oxid-module.eu