Die TYPO3-Extension inquiry ist eine universelle und hochflexible Lösung, um Besuchern Ihrer Website das Sammeln von Produkten oder Leistungen in einer Anfrageliste zu ermöglichen. Ähnlich wie bei einem Warenkorb können Nutzer Artikel hinzufügen, verwalten und anschließend ein individuelles Angebot anfordern – oder die Liste als PDF exportieren und per Preload-Link erneut aufrufen.
- Universell einsetzbar: Dank eines Adapter-Konzepts kann die Extension mit beliebigen Datensätzen (Produkte, Seiten, News, etc.) arbeiten.
- Moderne User Experience:
- Produkte können ohne Neuladen der Seite per Ajax hinzugefügt oder entfernt werden.
- Dynamische Aktualisierung der Badge-Counter (z. B. im Header).
- Flexibles Formularwesen: Nutzt das TYPO3 Form-Framework. Formulare können einfach per Event-Listener erweitert oder angepasst werden.
- PDF-Export: Die Anfrageliste kann inklusive ausgefüllter Felder als PDF heruntergeladen werden.
- Preload-Link: Jedes PDF enthält einen eindeutigen Link, mit dem die Liste auf der Website wiederhergestellt und die Felder vorausgefüllt werden können.
- Einfache Integration: ViewHelper für Buttons ("In die Anfrageliste") und Links zur Liste werden mitgeliefert.
- Entwicklerfreundlich: Umfangreiche PSR-14 Events ermöglichen tiefgreifende Anpassungen im Prozess (z. B. eigene Finisher, Validierungen oder Datenauflösung).
- Zukunftssicher: Volle Unterstützung für TYPO3 v13.
Die Extension verwaltet eine Liste von Identifikatoren (z. B. UIDs). Über einen Adapter (Event-Listener) entscheiden Sie, wie diese IDs in reale Objekte aufgelöst werden und welche Informationen im Anfrageformular erscheinen sollen.
Listen-Zustände (Items + Formularfeld-Vorausfüllwerte) werden als DB-Snapshots in der Tabelle tx_inquiry_list_snapshot gespeichert. Jeder Snapshot erhält einen deterministischen 32-stelligen Bezeichner (MD5 der serialisierten Daten), der als URL-Parameter weitergegeben wird. URL-Parameter zur direkten Datenübertragung werden nicht mehr verwendet.
Ein Beispiel für einen Adapter finden Sie im Verzeichnis der Extension oder als separates Repository.
Die empfohlene Installation erfolgt über Composer:
composer require wapplersystems/inquiryNach der Installation muss das Datenbankschema aktualisiert werden:
vendor/bin/typo3 database:updateschema- TypoScript einbinden: Fügen Sie das statische TypoScript der Extension zu Ihrem Template hinzu.
- Adapter erstellen: Implementieren Sie Event-Listener für
ResolveItemEvent, um Ihre Objekte (z. B. Produkte) der Extension bekannt zu machen. - ViewHelper nutzen: Integrieren Sie die Buttons in Ihre Fluid-Templates:
{namespace i=WapplerSystems\Inquiry\ViewHelpers} <i:button.toggleItem uid="{product.uid}" /> - Plugins einbinden: Für PDF-Export und Preload werden zusätzliche Plugins/typeNums benötigt (siehe unten).
| typeNum | Action | Zweck |
|---|---|---|
| 678934 | toggleItemStatus |
Artikel hinzufügen / entfernen |
| 678935 | getItems |
Aktuelle Liste zurückgeben ({items}) |
| 678936 | removeItem |
Artikel entfernen |
| 678937 | preloadItems |
Snapshot aus DB laden, Session befüllen, Weiterleitung mit Identifier |
| 678938 | generatePdf |
Snapshot aus DB laden, PDF rendern und ausliefern |
| 678939 | saveListSnapshot |
POST-Endpunkt – Items + Prefill speichern, gibt {identifier} zurück |
| 678940 | getPrefill |
GET – Prefill-Daten für einen Identifier zurückgeben |
Die URLs für typeNum 678939 und 678940 werden automatisch als Meta-Tags in alle Seiten eingefügt:
<meta name="inquiry-save-snapshot" ...>→ URL für typeNum 678939<meta name="inquiry-get-prefill" ...>→ URL für typeNum 678940
- Nutzer klickt auf
.inquiry-generate-pdf. - JavaScript sammelt alle Eingaben mit
[data-inquiry-pdf-key][data-inquiry-pdf-hash]als Prefill-Objekt. - JavaScript sendet
{items, prefill}per POST-JSON ansaveListSnapshotAction(typeNum 678939). - Server speichert den Snapshot in der DB und gibt
{identifier}zurück. - JavaScript navigiert zu
?type=678938&tx_inquiry[identifier]=<identifier>. generatePdfActionlädt den Snapshot, rendert das PDF und liefert es aus.- Das PDF enthält einen Preload-Link:
/?type=678937&tx_inquiry[identifier]=<identifier>.
Im Adapter-Event-Listener werden die Formularfelder, die im PDF erscheinen sollen, mit data-inquiry-pdf-key und data-inquiry-pdf-hash ausgezeichnet (z. B. in buildFormItem()). resolveItem() liest $event->getPdfFields() und rendert ein dediziertes PDF-Template (z. B. Item/ItemPdf.html), das als htmlPreviewPdf am Event gesetzt wird.
- Nutzer klickt den Link im PDF.
preloadItemsAction(typeNum 678937) liest den Identifier, lädt die Items aus dem DB-Snapshot und schreibt sie in die Session.- Weiterleitung zur Listenseite mit
?tx_inquiry[identifier]=<identifier>. - JavaScript erkennt den Identifier in der URL, ruft
getPrefillAction(typeNum 678940) auf und befüllt die Formularfelder mit den zurückgegebenen Werten.
Tabelle tx_inquiry_list_snapshot:
| Spalte | Typ | Beschreibung |
|---|---|---|
identifier |
CHAR(32) PRIMARY KEY |
MD5 von json_encode(['items' => ..., 'prefill' => ...]) |
items |
TEXT (JSON) |
Array von {uid, type, hash} |
prefill |
TEXT (JSON) |
{hash: {key: value}} – Feldwerte für das PDF |
crdate |
INT |
Erstellungszeitstempel |
Der Identifier ist deterministisch: gleiche Items + gleicher Prefill erzeugen immer denselben Hash, sodass doppelte DB-Einträge automatisch vermieden werden.
Nutzen Sie die folgenden Events für individuelle Anpassungen:
BuildInquiryFormEvent: Passt die Formular-Definition an.BuildInquiryFormContactEvent: Ergänzt Kontaktfelder im Formular.BuildInquiryFormItemEvent: Ergänzt item-spezifische Felder pro Artikel.ResolveItemEvent: Löst eine UID in ein Objekt auf; setzthtmlPreview(Web) undhtmlPreviewPdf(PDF).CanResolveItemByIdentifierEvent: Prüft, ob der Adapter für einen gegebenen Typ zuständig ist.CreateEmailToReceiverFinisherEvent: Ermöglicht die Anpassung der E-Mail-Vorlage und des Betreffs.- ... und viele weitere.