Skip to content

WapplerSystems/t3-inquiry

Repository files navigation

TYPO3 Extension inquiry

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.

TYPO3 13 License

🚀 Vorteile & Funktionen

  • 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.

🛠 Funktionsweise

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.

📥 Installation

Die empfohlene Installation erfolgt über Composer:

composer require wapplersystems/inquiry

Nach der Installation muss das Datenbankschema aktualisiert werden:

vendor/bin/typo3 database:updateschema

📋 Einrichtung

  1. TypoScript einbinden: Fügen Sie das statische TypoScript der Extension zu Ihrem Template hinzu.
  2. Adapter erstellen: Implementieren Sie Event-Listener für ResolveItemEvent, um Ihre Objekte (z. B. Produkte) der Extension bekannt zu machen.
  3. ViewHelper nutzen: Integrieren Sie die Buttons in Ihre Fluid-Templates:
    {namespace i=WapplerSystems\Inquiry\ViewHelpers}
    <i:button.toggleItem uid="{product.uid}" />
  4. Plugins einbinden: Für PDF-Export und Preload werden zusätzliche Plugins/typeNums benötigt (siehe unten).

🔢 typeNums & Endpunkte

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

📄 PDF-Export

Ablauf

  1. Nutzer klickt auf .inquiry-generate-pdf.
  2. JavaScript sammelt alle Eingaben mit [data-inquiry-pdf-key][data-inquiry-pdf-hash] als Prefill-Objekt.
  3. JavaScript sendet {items, prefill} per POST-JSON an saveListSnapshotAction (typeNum 678939).
  4. Server speichert den Snapshot in der DB und gibt {identifier} zurück.
  5. JavaScript navigiert zu ?type=678938&tx_inquiry[identifier]=<identifier>.
  6. generatePdfAction lädt den Snapshot, rendert das PDF und liefert es aus.
  7. Das PDF enthält einen Preload-Link: /?type=678937&tx_inquiry[identifier]=<identifier>.

Adapter-Integration

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.

🔗 Preload-Link

Ablauf

  1. Nutzer klickt den Link im PDF.
  2. preloadItemsAction (typeNum 678937) liest den Identifier, lädt die Items aus dem DB-Snapshot und schreibt sie in die Session.
  3. Weiterleitung zur Listenseite mit ?tx_inquiry[identifier]=<identifier>.
  4. JavaScript erkennt den Identifier in der URL, ruft getPrefillAction (typeNum 678940) auf und befüllt die Formularfelder mit den zurückgegebenen Werten.

🗄 Datenbankschema

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.

🏗 Events

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; setzt htmlPreview (Web) und htmlPreviewPdf (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.

Authors

About

The extension is a universal TYPO3 extension that allows visitors to create enquiries for quotes.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors