Blitz & Donner Formular WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA
WordPress Gutenberg Formbuilder – seitenbasierte Formulare, Submissions-DB, Admin, IndexedDB-Drafts
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/blitzdonner/gutenberg-formbuilder/archive/refs/heads/main.zipWordPress-Plugin: Formular-Builder nur mit Gutenberg-Blöcken, serverseitige Speicherung der Einsendungen, lokale Entwürfe im Browser (IndexedDB).
Aktuelle Version: in gutenberg-formbuilder.php → GFB_PLUGIN_VERSION / Header Version: (bei Releases immer beide Stellen sowie blocks/form/block.json → version anheben, damit Browser-Caches für editor.js / frontend.js / CSS greifen). GitHub-Releases: Releases inkl. Installations-ZIP; Änderungsliste: CHANGELOG.md.
Sprachen: Öffentliche Formular- und Fehlermeldungen nutzen WordPress-i18n (load_plugin_textdomain auf init, Ordner languages/). Mitgeliefert sind u. a. Englisch (en_US), Französisch (fr_FR), Italienisch (it_IT); Quellstrings im Code sind Deutsch. Die gewählte Locale entspricht typischerweise Einstellungen → Allgemein → Sprache der Website (mehrsprachige Plugins können den locale-Filter setzen). Details: INSTALL.md.
Formular: Erscheinungsbild und Farben
Am Block Formular (gfb/form) steuern:
- Farbmodus (
appearanceMode):theme(Theme-Standard),auto(Systemprefers-color-scheme),lightoderdark. - Zwei Paletten: Formularfarben (Hell) (
colorLabel,colorText, …) und Formularfarben (Dunkel) (darkColorLabel, …). Beide sind unabhängig einstellbar. - Inspector: Wo verfügbar, nutzt der Editor
PanelColorGradientSettings(Farbe inkl. Transparenz und Verläufe). Dafür werdendisableCustomColors/disableCustomGradientsfür diese Panels auf „erlaubt“ gesetzt, damit auch ohne Theme-Gradient-Palette eigene Verläufe möglich sind. Fallback:PanelColorSettingsmitenableAlpha.
Speichern / Callbacks (Editor): ColorGradientControl ruft bei Farbwahl nacheinander onColorChange(wert) und onGradientChange() ohne Argument auf (internes Zwei-Slot-Modell von WordPress). Die Zuordnung auf ein Attribut pro Zeile behandelt diese Hilfsaufrufe über kurzlebige Flags, damit der Wert nicht sofort wieder geleert wird.
Frontend
- Der Wrapper rendert als
<div class="gfb-form-wrapper" data-gfb-appearance="theme|auto|light|dark">. - Benutzerdefinierte Farben kommen als Inline-CSS-Variablen
--gfb-light-*/--gfb-dark-*;assets/form.cssmappt sie auf die genutzten *`--gfb-`** (Labels, Text, Felder, Button) je nach Modus. - Die Formular-Karte (Padding, Rahmen, Hintergrund, Schatten) entspricht der Editor-Vorschau, damit Text und Felder nicht «auf der weissen Seite» liegen, während nur die Inputs dunkel wirken.
- Hintergrund Formularbereich (
colorFormShell/darkColorFormShell): Einfarbig wird derselbe Wert für oben/unten in einen vertikalen Verlauf gelegt (--gfb-shell-top/--gfb-shell-bottom→linear-gradient(180deg, …)). Ist der Wert selbst ein CSS-Verlauf, wäre ein Verschachteln in diesem äusseren Verlauf ungültig (Browser verwirft die Deklaration → wirkt weiss). Lösung: PHP setzt bei erkanntem Verlauf die Klassengfb-form-shell-gradient--lightbzw.gfb-form-shell-gradient--dark;form.csssetzt dannbackground: var(--gfb-light-form-shell)bzw.var(--gfb-dark-form-shell)direkt. BeiappearanceMode=autoundprefers-color-scheme: darksorgt eine Zusatzregel dafür, dass ohne Dunkel-Verlauf-Klasse wieder der Standard-Shell-Verlauf genutzt wird. - PHP:
GFB_Plugin::sanitize_gfb_color()akzeptiert u. a. 3/4/6/8-stelliges Hex,transparent/currentColor,var(--…)(optional mit einfachem Fallback), klassische und modernergb/rgba/hsl/hsla, CSS-Verläufe (linear-gradient,radial-gradient,conic-gradient,repeating-*) sowiecolor-mix,oklch,oklab,hwb,lch,lab— jeweils mit Klammer-Check, Längenlimit und Ausschluss vonurl(),expression()usw.
Editor
- Vorschau-Container:
data-gfb-appearance+ dieselben Variablen;assets/form.cssundassets/gfb-editor.csswerden pereditor.jsin den Block-Canvas-Iframe eingehängt (gfbSyncEditorFormStylesheet: Link-IDsgfb-editor-canvas-form-stylesheetbzw.gfb-editor-chrome-stylesheet, URLs ausgfbEditorAssets.editorCanvasFormStylesUrlundgfbEditorAssets.editorChromeStylesUrl), sobald mindestens eingfb/form-Block im Dokument existiert (inkl.appearanceMode=theme, damit die Theme-Vorschau dem Frontend nahekommt). - Feldblöcke beziehen Kontext über
usesContext(u. a.gfb/appearanceMode, Hell-/Dunkel-Farben); Feld-Overrides im Inspector nutzen dieselbe Farb-/Verlauf-Logik wie das Formular (renderGfbColorPanel,mapColorSettingsToGradientSettingsinassets/editor.js). - Feld-Label in der Canvas-Vorschau: Ist das Attribut
labelleer oder nur Leerzeichen, wird kein sichtbares Label gerendert (keine Platzhalter wie „Textfeld“ mehr). Checkbox zeigt dann nur die Box; Radio-Gruppe ohne Gruppenüberschrift, wenn das Label leer ist. Der Block Absenden behält bei leerem Button-Text weiterhin den übersetzten Standard-Text in der Vorschau. Details:docs/FARBEN-UND-VERLAUFE.md.
Hinweis CSS: Eigenschaften wie color: oder border-color: erwarten Farben, keine Verläufe. Verläufe wirken sinnvoll z. B. bei Feldhintergrund, Button-Hintergrund und Hintergrund Formularbereich (background).
Ausführlicher technischer Abriss: docs/FARBEN-UND-VERLAUFE.md.
Formular: E-Mail-Benachrichtigung
Am Block Formular (gfb/form) → Inspector E-Mail-Benachrichtigung:
| Einstellung | Kurz |
|---|---|
| E-Mail nach Absenden senden | Standard aus; bei Aktivierung wird nach erfolgreicher Speicherung wp_mail ausgelöst. |
| Empfänger | FormTokenField mit E-Mail-Validierung pro Token; Standard-Vorschau = Admin-E-Mail (beim Anlegen des Formulars und erneut, wenn der Block verlassen wird und das Feld leer ist). Leer gespeichert → Versand an Admin-E-Mail. Max. 10 Empfänger. |
| Betreff | Optional; leer = Standard ([Seitenname] + Formularname/ID). Platzhalter: {{feldname}}, {{label_feldname}}. |
| Absender-E-Mail | Admin-E-Mail, eigene feste Adresse oder ein E-Mail-Feld aus dem Formular als From-Adresse (sonst Fallback Admin). |
| Absendername | Optional; leer = Seitentitel. Platzhalter {{feldname}}, {{label_feldname}} wie beim Betreff. |
Sicherheit / Inhalt: Einstellungen kommen nur aus Block-Attributen (nicht aus POST). Verschlüsselte Felder und Dateien erscheinen in der Mail nicht im Klartext. Ausführlich: docs/EMAIL-BENACHRICHTIGUNG.md.
Formular: Bestätigungsmail an die ausfüllende Person (Autoresponder + Double-Opt-in)
Am Block Formular → Inspector Bestätigungsmail an Absender/in. Spezifikation: docs/BESTAETIGUNGSMAIL-SPEC.md.
| Einstellung | Kurz |
|---|---|
| Modus | keine (Standard), sofort (Quittung direkt nach Absenden) oder mit Bestätigungslink (Double-Opt-in: erst Link-Mail, die Voll-Quittung folgt nach dem Klick). |
| Empfänger | Explizite Wahl eines E-Mail-Felds des Formulars (Dropdown). Ohne gewähltes/gültiges Feld kein Versand; die Einsendung läuft normal. |
| Inhalt | Zwei Container-Blöcke im Formular: Bestätigungsmail – Inhalt und Bestätigungslink-Mail – Inhalt (Absatz, Überschrift, Liste, Bild, Trenner, Knopf). Platzhalter {{feldname}}, {{label_feldname}}; der Block Alle Feldwerte fügt die Daten-Tabelle ein. Link-Mail: Pflicht-Platzhalter {{bestaetigungslink}} (fehlt er, hängt der Server den Link an). Leerer/fehlender Container → eingebaute Standard-Vorlage. Die Daten-Tabelle beschriftet jede Zeile immer mit dem Feldlabel – dem gesetzten oder dem Standard-Titel des Feldtyps («E-Mail», «Telefon», …), nie mit dem technischen Namen. |
Sicherheit / Datenschutz (Kurzfassung):
- From ist fest
noreply@site-domain(Filtergfb_receipt_from/gfb_receipt_from_name), nie die feldgesteuerte Absenderlogik der Betreiber-Mail. Return-Path wird gesetzt; zuverlässige Zustellung setzt SPF/DKIM/DMARC voraus. - Sofort-Modus nur mit erzwungenem Captcha (serverseitig) – sonst wäre das Formular eine anonyme Mail-Kanone.
- Send-Gate atomar und fail-closed: 50 Mails/Stunde/Site, 10/Stunde/IP, 3/Stunde/Empfängeradresse (Filter
gfb_receipt_gate_limits). - Vertrauliche Felder erscheinen im Sofort-Modus nur als «vertraulich gespeichert»; Klartext erst in der Quittung nach bestätigter Adresse. Dateien nie als Anhang – nur Dateiname.
- Bestätigungslink: 7 Tage gültig, Einmal-Nutzung, Token nur als gepfefferter Hash gespeichert, Bestätigung ausschliesslich per POST auf einer datenfreien Landeseite.
- Retention: Nie bestätigte Einsendungen werden nach 45 Tagen gelöscht (Filter
gfb_receipt_retention_days). - Status pro Einsendung im Backend: «an Mailserver übergeben» / «Übergabe fehlgeschlagen» – nie «zugestellt». Der DOI-Klick ist der einzige positive Zustellnachweis.
Spam-Schutz (Friendly Captcha)
Optionaler, serverseitig geprüfter Spam-Schutz über Friendly Captcha – einen EU-Anbieter (Deutschland). Statt Bilderrätsel löst der Browser eine Proof-of-Work-Aufgabe. Friendly Captcha setzt keine Cookies, betreibt kein Fingerprinting, kein Tracking und führt keinen Drittlandtransfer durch.
| Einstellung | Kurz |
|---|---|
| Datensparsamkeit | Im Standardbetrieb braucht es keine Einwilligung – Rechtsgrundlage ist das berechtigte Interesse (Spam-Abwehr). Das Captcha-Element lädt erst bei Formular-Interaktion, nicht beim Seitenaufbau – kein Vorab-Aufruf des Anbieters. |
| Verifikation | Serverseitig gegen die offizielle siteverify-Schnittstelle (Version 2, global.frcapi.com). Im Frontend liegt nur der Site-Key; das Secret bleibt serverseitig. |
| Erzwingungsmodus | Mit Ausnahme bei Serverausfall: Captcha Pflicht; nur wenn der Anbieter nicht erreichbar ist, geht der Versand trotzdem durch. Streng: auch bei Serverausfall kein Versand. |
| Admin-Vorlagen | Mitgeliefert und kopierbar: ein Textbaustein für die Datenschutzerklärung und ein interner Vermerk zur Interessenabwägung – jeweils als unverbindliche Vorlage gekennzeichnet. |
Die Admin-Bereiche ClamAV-Einstellungen und Datenschutz sind in einklappbaren Akkordeons dargestellt. Ausführlich: docs/CAPTCHA-INTEGRATION-SPEC.md.
Für die nächste Person: wo weitermachen?
- Plugin-Root: dieses Verzeichnis ist das gesamte Plugin (
gutenberg-formbuilder.phpist der Einstieg). - Version: bei Releases
GFB_PLUGIN_VERSIONund den HeaderVersion:ingutenberg-formbuilder.phpgemeinsam anheben, damit Browser-Caches füreditor.js/frontend.js/ CSS greifen. - Wichtige Pfade:
includes/class-gfb-plugin.php– Block-Registrierung, Form-Render (inkl.data-gfb-appearance, Farb-Variablen), Schema für Submitincludes/class-gfb-submit-handler.php– Validierung, DB-Insert, E-Mail-Benachrichtigung (send_notification_mail)includes/class-gfb-admin-submissions.php– Admin-Seite „Formular-Einträge“, Löschen (Redirect imload-*-Hook!)assets/editor.js– alle Block-edit/save-Definitionenassets/frontend.js– IndexedDB-Entwürfe, Wiederherstellung (restoreMode: Standard automatisch), Debounce, Safari-Hacksassets/form.css– Frontend-Styles (wp_enqueue_style( 'gfb-form' )bei jedem gerenderten Formular, inkl.appearanceMode=theme); im öffentlichen Frontend wirdgfb-editor.cssnicht geladen.assets/gfb-editor.css– nur Block-Editor-Canvas: zusammen mitform.cssperassets/editor.js→gfbSyncEditorFormStylesheet()in den Canvas-Iframe (Link-IDsgfb-editor-canvas-form-stylesheet/gfb-editor-chrome-stylesheet), sobald eingfb/form-Block existiert. Dieblock.json-Dateien setzen dafür keineditorStyle.assets/admin-submissions.css– nur Referenz; im Admin wird CSS inline aus der Datei gelesen (kein zuverlässigerplugins_url()auf manchen Local-Setups)
- Bekannte technische Entscheidungen:
- Formular-ID (
formId): Pro Block-Instanz stabil; bei Duplizieren/Einfügen des Formulars vergibtsyncFormInstanceeine neueformId(gfb_…ausclientId). Submit, Schema, Admin-Filter und Payload-Auswertung binden immer zuerst an diese ID. - Technische Feldnamen: Im Inspector editierbar (
GfbFieldNameInspector); bleiben über Speichern stabil (nicht mehr an jedem Reload anclientIdgekoppelt). Neues Feld oder Feld-Duplikat → einmaliger Vorschlag aus Label (eindeutig innerhalb des Formulars, ggf._2). Duplikat im Editor → Fehlerhinweis; serverseitigerr_duplicate. AttributenameClientIdmarkiert die Block-Instanz. - Payload im Admin:
GFB_Plugin::get_submission_payload_for_row()liefert nur Felder des Schemas der gespeichertenform_id(relevant bei mehreren Formularen mit gleichen Feldnamen auf einer Seite). - Editor-Styling:
enqueue_block_editor_assetsallein reicht für die Canvas-Vorschau nicht; deshalb hängteditor.jsbei vorhandenemgfb/form-Blockform.cssundgfb-editor.cssin den Canvas-Iframe (gfbSyncEditorFormStylesheet, URLs ausgfbEditorAssetsinincludes/class-gfb-plugin.php→wp_localize_script). - Eingabetext vs. Theme: In
form.css/gfb-editor.cssnutzen sichtbare Feld-Textecolorund-webkit-text-fill-colormit!important, damit Block-Themes die Plugin-Farben (--gfb-text/ Hell-Dunkel-Variablen) nicht überschreiben. Bei Theme + eigene Farben greifen zusätzliche Regeln auf.gfb-form-wrapper[data-gfb-appearance="theme"].gfb-form-colors-custom. - Submit / Schema: Die Server-Validierung sucht den
gfb/form-Block perGFB_Plugin::locate_form_block_for_post()in Beitragsinhalt, Bibliotheks-/Musterblöcken (core/block→wp_block), Template-Parts (core/template-part) und typischen FSE-Templates (wp_template). Fehlermeldung „Formularschema nicht gefunden“ entsteht, wenn der Block dort nicht vorkommt (früher nurpost_content); zusätzliche Markup-Quellen per Filtergfb_form_schema_markup_sources. - Formularbereich als Verlauf: Klassen
gfb-form-shell-gradient--light/--darkwerden inincludes/class-gfb-plugin.phpgesetzt, wenn der jeweilige Shell-Wert ein CSS-Verlauf ist; Auswertung übergfb_sanitized_attr_is_css_gradient()(basiert aufsanitize_gfb_color()). - Admin-Löschen: Redirect nur in
load-toplevel_page_gfb-submissions, nicht inrender_page, sonst „headers already sent“.
- Formular-ID (
Installation
- Ordner
gutenberg-formbuildernachwp-content/plugins/kopieren oder klonen. - Im WordPress-Admin Plugin aktivieren (legt u. a.
wp_gfb_submissions,wp_gfb_files,wp_gfb_auditan; ab 2.0 zusätzlich privates Storage und Cron — sieheINSTALL.md). - Seite/Beitrag bearbeiten → Block „Formular“ einfügen.
Anforderungen
- WordPress ≥ 6.6 (laut Plugin-Header)
- PHP ≥ 7.4
Funktionsumfang (Kurz)
- Container-Block
gfb/formmit InnerBlocks; Feldblöckegfb/field-*+gfb/field-submit(verstecktes Feld: optionales Label (Hinweis) nur für Editor/Eintragsdarstellung, nicht im Frontend-Formular); Datum / Uhrzeit / Termin: optionaler Voreingestellter Wert im Inspector, Standard leer (kein HTML-value); Frontendpatternundplaceholderaus Einstellungen → Allgemein (date_format/time_format, z. B.dd.mm.yyyy) - Erfolgsbereich (
gfb/form-success, nur innerhalb vongfb/form): beliebige InnerBlocks, die nach erfolgreichem Absenden anstelle des Formulars erscheinen, wenn keine Folgeseite gewählt ist. Im Text stehen Platzhalter{{feldname}}(technischer Name) und optional{{label_feldname}}; die Werte setztassets/frontend.jspersessionStorage-Snapshot beim Absenden (Datei-Felder:[Datei]). Mit gewählter Folgeseite bleibt das bisherige Verhalten (Hinweiszeile / Redirect-Zielseite). Im Erfolgsbereich kann der Block Platzhalter-Hilfe (gfb/token) die technischen Feldnamen in einem Auswahlfeld anbieten; nach der Wahl wird{{feldname}}(übermittelter Wert) an dieser Stelle als Absatz eingefügt (nur Editor). Optional weiterhin{{label_feldname}}manuell für die Anzeige-Bezeichnung. - Submit über
admin_post/admin_post_noprivmit gestaffelter Abwehrkette: Nonce → HMAC-Token → Honeypot → Rate-Limit → Captcha (Friendly Captcha, optional; siehe Abschnitt Spam-Schutz unten) - E-Mail-Benachrichtigung pro Formular (optional): Empfänger, Betreff, Absender — siehe Abschnitt oben und
docs/EMAIL-BENACHRICHTIGUNG.md - Einsendungen in
{prefix}gfb_submissions(JSONpayload, inkl._gfb_labelsfür Labels zum Zeitpunkt des Absendens) - Admin-Menü Formular-Einträge (Liste, Detail, Löschen, CSV-Export): Export eines einzelnen Formulars als UTF-8-BOM-CSV (Semikolon, RFC-4180); verschlüsselte Felder maskiert oder – mit Cap
gfb_decrypt_submissions– im Klartext; IP-Adresse nur bei Klartext-Export; CSV-Injection-Härtung; Audit-Einträge für jeden Export - Lokale Entwürfe (IndexedDB): Standard ist automatische Wiederherstellung ohne Browser-Dialog; optional Nachfragen (
restoreMode: prompt) im Block Formular → Formulareinstellungen; Button Entwurf löschen (abschaltbar)
Repository-Layout
gutenberg-formbuilder.php # Bootstrap, Konstanten, Version
includes/ # PHP: Plugin, Submit, Admin
assets/ # editor.js, frontend.js, CSS
blocks/*/block.json # Block-Metadaten
languages/ # Übersetzungen (*.po / *.mo), siehe INSTALL.md
docs/ # Zusatzdoku (Farben/Verläufe, E-Mail-Benachrichtigung, Testprotokolle, …)
Kompatibilität
Zuletzt geprüft gegen WordPress 7.1 (20.08.2026, Plugin 2.11.2 und 2.13.0, PHP 8.2.29):
alle Mail-Varianten, Double-Opt-in samt Angriffsfällen, Uploads, Backend und der ab 7.1
durchgehend iframe-gekapselte Editor. Kein PHP-Fehler, kein ungültiger Block.
Vollständiges Protokoll mit den drei offenen Befunden:
docs/TESTPROTOKOLL-WP-7.1.md.
Auto-Publish (Release → Update-Server)
Ein veröffentlichtes reguläres GitHub-Release wird automatisch auf
plugins.blitzdonner.ch publiziert. Der Workflow
.github/workflows/publish-update.yml baut das ZIP und durchläuft vier Gates
(php -l, Header-Version === Tag, Konstante === Tag, ZIP-Struktur, SemVer). Es
sendet nichts an
den Server: Der Update-Server verlangt eine Ed25519-Signatur, und der private
Schlüssel liegt bewusst nur auf dem Entwicklungsrechner, nie in der CI.
Veröffentlicht wird darum von Hand – ZIP bauen, mit bd-sign.php signieren, per
Deploy-Token an den Publish-Endpunkt senden. Ablauf Schritt für Schritt:
docs/AUTO-PUBLISH.md.
Damit ist der Release abgeschlossen. Ein Plugin wird nie auf einer Website
von Hand aktualisiert – die Installationen holen sich die neue Fassung selbst.
Kein wp plugin update auf Kundenseiten, kein rsync, kein Lizenz-Token
nachtragen. Die Verbotsliste steht im Abschnitt «Der einzige Weg auf eine
Website» in docs/AUTO-PUBLISH.md.
Entwicklung
- Kein npm-Build: JS/CSS sind Quelldateien.
- Nach Änderungen an JS/CSS die Version in
gutenberg-formbuilder.phperhöhen, an beiden Stellen (HeaderVersion:undGFB_PLUGIN_VERSION). Diese Konstante steht im Query-Stringver=jeder eingebundenen Datei und leert damit die Browser-Caches;assets/editor.jsundassets/frontend.jshängen daran (register_assets()inincludes/class-gfb-plugin.php). Dieversion-Felder in denblock.jsonsind reine Metadaten und beeinflussen den Cache nicht. - PHP-Syntax prüfen:
php -l datei.php(falls PHP im PATH).
Inserter einschränken – nur über den eigenen Block
Soll ein Block des Plugins in einem Editor-Kontext nicht angeboten werden, geschieht das clientseitig über supports.inserter in assets/editor.js (Beispiel: gfb/confirm-status, nur im Site Editor sichtbar).
Der Filter allowed_block_types_all darf den Wert true niemals in eine Positivliste aus WP_Block_Type_Registry umwandeln. Diese Registry kennt ausschliesslich serverseitig registrierte Blöcke. Jeder Block, den ein anderes Plugin allein im Editor-JavaScript anmeldet, fehlt darin und wäre gesperrt – und Gutenberg blendet zusätzlich jede Vorlage aus, die einen gesperrten Block auf oberster Ebene enthält. Genau das geschah zwischen 2.10.0 und 2.11.1 (siehe CHANGELOG.md, 2.11.2).
Zuletzt dokumentiert (Auszug): Technische Feldnamen (stabil, editierbar, nameClientId), formId pro Formular-Instanz, E-Mail-Benachrichtigung (docs/EMAIL-BENACHRICHTIGUNG.md), Erfolgsbereich, Platzhalter-Hilfe (gfb/token), Datum/Zeit (pattern/placeholder aus WP-Datumsformat), Safari/WebKit-Fallback (Admin-Option), Entwürfe, Submit-Detailnotices, Schema-Suche (locate_form_block_for_post).
Datum, Uhrzeit, Termin (Frontend)
Die Blöcke gfb/field-date, gfb/field-time und gfb/field-datetime rendern serverseitig (includes/class-gfb-field-renderer.php):
| Ausgabe | Quelle | Beispiel bei date_format = d.m.Y |
|---|---|---|
pattern |
Regex aus PHP-Formatzeichen | \d{2}\.\d{2}\.\d{4} |
placeholder |
Anzeigemaske (nur ohne eigenen Block-Platzhalter) | dd.mm.yyyy |
Die serverseitige Validierung beim Absenden erwartet weiterhin ISO-Strings (Y-m-d, H:i, Y-m-d\TH:i in includes/class-gfb-submit-handler.php).
Safari / WebKit (ohne Blink): Standardmäßig wandelt assets/frontend.js die Felder in Texteingaben um (stabiler bei 12h-Format und Validierung). Abschaltbar unter Formular-Einträge → Sicherheit → Formular (Frontend). Deaktiviert bleiben native type="date" / time / datetime-local; Safari kann in leeren Feldern trotzdem das heutige Datum als graue Anzeige zeigen — das ist Browser-Verhalten, kein gespeicherter Wert. Mit aktivem Fallback und leerem Feld: placeholder aus den WP-Einstellungen, kein Übernehmen von Safaris „heute“ als value (data-gfb-has-default).
Chrome, Firefox, Edge und Opera nutzen weiterhin die nativen Picker (unabhängig von der Admin-Option).
Zeitfeld: „Ungültiger Wert“ (Browser)
Die Meldung „Ungültiger Wert“ bei <input type="time"> kommt von der HTML5-Validierung im Browser, nicht von der Plugin-PHP-Logik (die erwartet weiterhin normales HH:MM im 24-Stunden-Format).
Typische Ursache: System/Browser mit 12-Stunden-UI — im Stunden-Segment sind oft nur 1–12 erlaubt; eine Eingabe wie 18 für die Stunde wirkt dort ungültig, obwohl 18:30 in einem reinen 24h-Modell korrekt wäre.
Das gerenderte <form class="gfb-form"> trägt das Attribut lang="…" (WordPress-Locale via determine_locale()), damit Steuerelemente stärker an die Sprache der Website gekoppelt sind — in manchen Browser/OS-Kombinationen reduziert das 12h-/24h-Reibungen. Trotzdem kann das Verhalten browser- und systemabhängig bleiben; bei hartnäckigen Fällen helfen 24-Stunden-Anzeige in den Systemeinstellungen oder ein anderer Browser zum Test.
Hinweis nach Absenden: Die Erfolgs-/Fehlerzeile kommt aus der Redirect-URL (gfb_status, …). Nach dem Laden entfernt frontend.js diese Parameter mit history.replaceState, damit ein Reload das Formular ohne feststeckenden Hinweis zeigt. Entwurf löschen blendet die Notice zusätzlich aus und bereinigt die URL.
Texte anpassen
Seit 2.11.0 gilt: Jeder Satz, den eine ausfüllende Person zu sehen bekommt, ist im Backend änderbar – unter Formular-Einträge → Texte. Die 83 Texte sind in sieben Gruppen geordnet:
| Gruppe | Inhalt |
|---|---|
| Formular | Absende-Knopf, Datei-Hinweise, «verschlüsselt»-Kennzeichnung, Captcha-Beschriftung |
| Overlays beim Absenden | Sende-Animation und Erfolgs-Quittung |
| Meldungen nach dem Absenden | Erfolgs- und Fehlermeldungen über dem Formular |
| Feldprüfung | Hinweise zu einzelnen Feldern (Pflichtfeld, ungültige E-Mail …) |
| Bestätigungsmail | Betreffzeilen, Standard-Vorlagen, Bausteine der Datentabelle, Schluss-Sätze |
| Benachrichtigung an den Betrieb | Betreffzeilen und Status-Vermerke der eigenen Mails |
| Bestätigungsseiten | Die zwei Seiten, auf denen der Bestätigungslink landet |
- Bezeichnung der Website in Mails: Vorgabe ist die vereinfachte Domain (
varellion.ch), wählbar sind auch der Website-Titel oder eine eigene Bezeichnung. Sie erscheint in den Betreffzeilen, über der Datentabelle, in der Fusszeile und als Absendername. Filtergfb_site_label. - Anrede-Umschalter ganz oben: Sie (Vorgabe) oder Du. Er wechselt die Anredeform aller eingebauten Standardtexte auf einen Schlag; eigene Texte bleiben, wie sie eingetragen wurden. 27 der 83 Texte tragen überhaupt eine Anrede, der Rest ist anredefrei.
- Leeres Feld = eingebauter Standardtext (übersetzt in de/en/fr/it). Der Standard steht als Platzhalter im Feld und darunter im Klartext – in der gewählten Anredeform.
- Ein eigener Text gilt site-weit für alle Formulare und Sprachen. Gespeichert wird nur, was abweicht.
- Platzhalter sind geschützt: Texte wie
Bitte fülle das Feld "%s" aus.brauchen ihr%s. Fehlt es oder kommt eines hinzu, lehnt die Seite den Text ab und behält den bisherigen – so kann eine Textänderung die Ausgabe nicht brechen. - Für Code: Filter
gfb_text( $text, $key, $args )übersteuert einzelne Texte; die Registry liegt inincludes/class-gfb-texts.php.
Nicht auf dieser Seite: die Oberfläche des Backends selbst (sie richtet sich an die Betreiberin und ist nur übersetzbar) sowie die Inhalte, die ohnehin im Editor entstehen – Feldbeschriftungen, Erfolgsbereich und die Mail-Container.
Erfolgsbereich: Nachricht und Platzhalter
Gilt nur, wenn im Block Formular keine Folgeseite gewählt ist und mindestens ein Block Erfolgsbereich (gfb/form-success) eingefügt wurde.
- Darstellung: Nach erfolgreichem Absenden rendert PHP kein
<form>mehr, sondern nur noch den Inhalt der Erfolgsbereiche (InnerBlocks wie Absätze, Überschriften, …). Die Standard-Erfolgsnotice entfällt in diesem Fall. - Sichtbarkeit garantiert (seit 2.10.2): Die Rückleitung trägt einen Anker – bei Erfolg zum Erfolgsbereich (
#gfb-erfolg-{formId}), im Fehlerfall zum Formular (#gfb-form-{formId}); der Browser scrollt nativ, ohne JavaScript. Zusätzlich zeigt das Frontend bei Erfolg ein viewport-zentriertes Quittungs-Overlay (Häkchen, «Erfolgreich übermittelt»), das aktiv geschlossen werden muss (Knopf, Esc oder Klick daneben); beim Schliessen springen Fokus und Scroll zum Erfolgsbereich (role="status").prefers-reduced-motionwird respektiert. Mit gewählter Folgeseite (Danke-Seite) gibt es weder Anker noch Overlay – dort ist die Seite selbst die Bestätigung. - Platzhalter: Im Text stehen
{{feldname}}für den übermittelten Wert (technischer POST-Name des Feldes) und optional{{label_feldname}}für die Bezeichnung aus dem Block-Schema (sichtbares Label zum Zeitpunkt der Speicherung). - Datenquelle: Beim Absenden schreibt
assets/frontend.jseinen Snapshot der Feldwerte insessionStorage(Schlüsselgfb_submit_snapshot:+ derselbe Wert wiedata-gfb-keyam Formular). Nach dem Redirect ersetzt das Skript die Platzhalter in den Textknoten des Erfolgsbereichs. Datei-Felder liefern im Snapshot nur den Platzhaltertext[Datei](kein Dateiinhalt). - Platzhalter-Hilfe (
gfb/token, nur im Erfolgsbereich): Auswahlliste der technischen Feldnamen; nach der Wahl wird ein Absatz mit{{feldname}}eingefügt (der Hilfsblock wird dabei entfernt). Für Fliesstext im gleichen Absatz den Token nachträglich anpassen oder manuell setzen. - Grenzen: Platzhalter funktionieren nicht bei Weiterleitung auf eine andere Folgeseite (dort liegt der Formularblock nicht). Ohne
sessionStorage(blockiert, privates Fenster ohne derselben Navigation) bleiben Platzhalter sichtbar, werden aber nicht ersetzt.
Submit-Fehler: „Formularschema nicht gefunden“
Nach dem Absenden leitet WordPress u. a. auf eine URL mit gfb_status=error, gfb_code=err_schema und passender gfb_form=… um, wenn die serverseitige Suche keinen gfb/form-Block mit der gesendeten formId findet (Validierung in includes/class-gfb-submit-handler.php). Die nutzersichtliche Meldung kommt aus GFB_Submit_Handler::status_message_for() (nicht aus einem Klartext-Parameter in der URL).
Seit 1.0.0 durchsucht GFB_Plugin::locate_form_block_for_post() u. a.:
post_contentder Seite/ des Beitrags (gfb_post_idaus dem Formular),- eingebettete Bibliotheks-/Musterblöcke (
core/block→wp_block), - Template-Parts (
core/template-part), - typische FSE-Block-Templates (
wp_template, z. B.page-{slug},page,single,singular,index).
Wenn der Fehler bleibt: Formular liegt vermutlich in einem anderen Template (z. B. eigenes archive-…) oder ausserhalb von WordPress-Blöcken. Dann per PHP den Filter gfb_form_schema_markup_sources nutzen und zusätzliche Block-Markup-Strings an $sources anhängen (siehe Docblock in includes/class-gfb-plugin.php).
MVP-Grenzen / Ideen für später
- Mehrschritt, bedingte Logik, CRM-Webhooks
- Tests (PHPUnit / E2E)
Lizenz
GPL-2.0-or-later (GNU General Public License, Version 2 oder später) – dieselbe Lizenz wie WordPress-Core. Volltext in LICENSE. Der Quellcode ist offen einsehbar, nutzbar, veränderbar und weitergabefähig; Weitergaben und abgeleitete Werke stehen wieder unter der GPL.
Releases
5 releases.
These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.