tabsl/tabslfeedback

Feedback-Formular für Backend und Frontend mit KI-Aufbereitung und GitLab-Ticket-Anlage.

Maintainers

Package info

github.com/tabsl/tabslFeedback

Type:oxideshop-module

pkg:composer/tabsl/tabslfeedback

Transparency log

Statistics

Installs: 84

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-07-25 16:20 UTC

This package is auto-updated.

Last update: 2026-07-25 16:22:44 UTC


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

  1. Projekt-ID — steht auf der Startseite des Zielprojekts unter dem Projektnamen bzw. im Menü ⋮ → „Projekt-ID kopieren".
  2. Zugangs-Token — im Zielprojekt unter Settings → Access tokens einen Project Access Token mit Scope api und 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.
  3. 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/v4Pflicht leer
tabslfeedback_gitlab_project_id Numerische ID des Zielprojekts — Pflicht leer
tabslfeedback_gitlab_token Project-Access-Token mit Scope apiPflicht 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; über http:// wandert er unverschlüsselt durchs Netz. Für interne Instanzen bleibt http:// 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ür warning und info muss sLogLevel in source/config.inc.php gesetzt werden: $this->sLogLevel = 'warning';

Entsteht ein Ticket ohne Aufbereitung, steht der Grund als error im Log — etwa openai 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