Eleventy
Ein Eleventy-Shortcode, der ein Ikiform-Formular in Nunjucks-, Liquid- und Markdown-Templates rendert, mit der Formular-ID in globalen Daten.
Eleventy gibt statisches HTML aus, daher sendet das Formular ohne jegliches Client-JavaScript. Ein Shortcode hält das Markup an einer Stelle und funktioniert in Nunjucks-, Liquid- und Markdown-Dateien gleich.
Einrichten
Füge den Shortcode hinzu
eleventy.config.js const escape = (value) => String(value).replace(/[&<>"']/g, (char) => `&#${char.charCodeAt(0)};`); export default function (eleventyConfig) { eleventyConfig.addShortcode("ikiform", (formId, thanks = "", subject = "") => [ `<form class="ikiform" action="https://ikiform.com/f/${encodeURIComponent(formId)}" method="post">`, '<label>Email <input name="email" type="email" autocomplete="email" required></label>', '<label>Message <textarea name="message" rows="5"></textarea></label>', thanks && `<input type="hidden" name="_redirect" value="${escape(thanks)}">`, subject && `<input type="hidden" name="_subject" value="${escape(subject)}">`, '<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>', '<button type="submit">Send</button>', "</form>", ] .filter(Boolean) .join("\n"), ); }- Die Zeilen sind absichtlich ohne Leerzeilen verbunden. In Markdown beendet eine Leerzeile einen HTML-Block, und der Rest des Formulars würde als Text behandelt.
- Hier wird ES-Modul-Syntax verwendet. Wenn deine
package.jsonkein"type": "module"enthält, nenne die Dateieleventy.config.mjs.
Lege die Formular-ID in globalen Daten ab
_data/ikiform.js export default { formId: process.env.IKIFORM_FORM_ID ?? "frm_xxxxxxxxxxxxxxxx", thanks: "https://example.com/thanks/", };Globale Daten sind in jedem Template als
ikiformverfügbar. Die Danke-URL muss absolut undhttps:sein, weil Ikiform andere Weiterleitungen ignoriert.Verwenden
contact.md --- title: Contact --- Questions about pricing? Write to us. {% ikiform ikiform.formId, ikiform.thanks, "Pricing question" %}Markdown-Dateien werden standardmäßig mit Liquid verarbeitet, daher funktioniert der Tag dort wie geschrieben. Setze ihn in eine eigene Zeile und rücke ihn nicht um vier Leerzeichen ein, sonst rendert Markdown ihn als Codeblock. Derselbe Tag funktioniert in
.njk- und.liquid-Dateien.
_redirect wird nur befolgt, wenn das Formular erlaubte Domains hat, zu denen deine Site gehört. Siehe Regeln für _redirect.
Erlaubte Domains
Liste die Produktion und jeden Preview-Host auf. Eleventy-Sites werden häufig auf Netlify oder Cloudflare Pages deployt, die Previews unterschiedlich handhaben.
| Wo das Formular läuft | Zu Allowed domains hinzufügen |
|---|---|
npx @11ty/eleventy --serve | localhost. Passt auf http://localhost:8080: Ikiform vergleicht nur den Hostnamen, nie den Port. |
| Deine Domain | example.com, was auch www.example.com abdeckt |
| Netlify | your-site.netlify.app. Deploy Previews (deploy-preview-12--your-site.netlify.app) und Branch Deploys (branch--your-site.netlify.app) sind keine Subdomains davon, füge also den exakten Preview-Host hinzu, während du eine testest. |
| Cloudflare Pages | your-project.pages.dev. Preview-URLs wie abc123.your-project.pages.dev sind Subdomains davon und passen daher bereits. |
- Füge niemals
netlify.appoderpages.devallein hinzu. Jede Site auf diesem Host würde passen, auch die von anderen Leuten.
Test-Checkliste
- Starte den Dev-Server und sieh dir den Seitenquelltext an. Das Formular sollte einfaches HTML sein, nicht in einem
<pre><code>-Block. - Sende lokal mit
localhostin den erlaubten Domains ab und prüfe, dass die Einsendung in Ikiform aufgelistet ist. - Deploye eine Preview und sende erneut vom Preview-Host ab.
- Sende in der Produktion ab und prüfe, dass du auf deiner Dankesseite landest.
Fehlerbehebung
| Was du siehst | Warum | Lösung |
|---|---|---|
| Das Formular wird auf der Seite als Code angezeigt | Der Shortcode ist in einer Markdown-Datei um vier Leerzeichen eingerückt | Verschiebe den Tag an den Anfang seiner Zeile. |
| Die Hälfte des Formulars wird als Absätze gerendert | Die Ausgabe des Shortcodes enthält eine Leerzeile, die den HTML-Block von Markdown beendet | Verbinde die Zeilen ohne Leerzeilen, wie in der Konfiguration oben. |
SyntaxError: Unexpected token 'export' beim Start von Eleventy | Die Konfiguration nutzt ES-Modul-Syntax in einem CommonJS-Projekt | Benenne sie in eleventy.config.mjs um oder füge "type": "module" zu package.json hinzu. |
Nunjucks oder Liquid findet den ikiform-Tag nicht | Eleventy hat die Konfigurationsdatei nicht geladen | Prüfe, dass die Datei im Projektstamm liegt und eleventy.config.js oder .mjs heißt. |
Einsendungen landen im Spamfilter mit origin_mismatch | Die sendende Seite steht nicht in den erlaubten Domains des Formulars | Füge den Host aus der Tabelle oben hinzu. Mit Reject bekommen dieselben Requests stattdessen 403 origin_not_allowed. |