Formular-ID

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

  1. 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.json kein "type": "module" enthält, nenne die Datei eleventy.config.mjs.
  2. 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 ikiform verfügbar. Die Danke-URL muss absolut und https: sein, weil Ikiform andere Weiterleitungen ignoriert.

  3. 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äuftZu Allowed domains hinzufügen
npx @11ty/eleventy --servelocalhost. Passt auf http://localhost:8080: Ikiform vergleicht nur den Hostnamen, nie den Port.
Deine Domainexample.com, was auch www.example.com abdeckt
Netlifyyour-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 Pagesyour-project.pages.dev. Preview-URLs wie abc123.your-project.pages.dev sind Subdomains davon und passen daher bereits.
  • Füge niemals netlify.app oder pages.dev allein hinzu. Jede Site auf diesem Host würde passen, auch die von anderen Leuten.

Test-Checkliste

  1. Starte den Dev-Server und sieh dir den Seitenquelltext an. Das Formular sollte einfaches HTML sein, nicht in einem <pre><code>-Block.
  2. Sende lokal mit localhost in den erlaubten Domains ab und prüfe, dass die Einsendung in Ikiform aufgelistet ist.
  3. Deploye eine Preview und sende erneut vom Preview-Host ab.
  4. Sende in der Produktion ab und prüfe, dass du auf deiner Dankesseite landest.

Fehlerbehebung

Was du siehstWarumLösung
Das Formular wird auf der Seite als Code angezeigtDer Shortcode ist in einer Markdown-Datei um vier Leerzeichen eingerücktVerschiebe den Tag an den Anfang seiner Zeile.
Die Hälfte des Formulars wird als Absätze gerendertDie Ausgabe des Shortcodes enthält eine Leerzeile, die den HTML-Block von Markdown beendetVerbinde die Zeilen ohne Leerzeilen, wie in der Konfiguration oben.
SyntaxError: Unexpected token 'export' beim Start von EleventyDie Konfiguration nutzt ES-Modul-Syntax in einem CommonJS-ProjektBenenne sie in eleventy.config.mjs um oder füge "type": "module" zu package.json hinzu.
Nunjucks oder Liquid findet den ikiform-Tag nichtEleventy hat die Konfigurationsdatei nicht geladenPrüfe, dass die Datei im Projektstamm liegt und eleventy.config.js oder .mjs heißt.
Einsendungen landen im Spamfilter mit origin_mismatchDie sendende Seite steht nicht in den erlaubten Domains des FormularsFüge den Host aus der Tabelle oben hinzu. Mit Reject bekommen dieselben Requests stattdessen 403 origin_not_allowed.