Hugo
Ein Hugo-Partial und -Shortcode, die ein Ikiform-Formular aus Site-Params rendern, in Layouts und in Markdown-Inhalten.
Hugo erzeugt einfaches HTML, und ein einfacher Formular-POST ist alles, was Ikiform braucht, also musst du kein JavaScript hinzufügen. Der einzige Hugo-spezifische Haken ist Markdown: Hugos Renderer entfernt rohes HTML aus Inhaltsdateien, solange du markup.goldmark.renderer.unsafe nicht einschaltest, und ein eingefügtes Formular wird zu <!-- raw HTML omitted -->. Ein Shortcode hält das HTML stattdessen in einem Template.
Einrichten
Formular-ID zu deiner Config hinzufügen
hugo.toml baseURL = "https://example.com/" [params.ikiform] formId = "frm_xxxxxxxxxxxxxxxx" thanks = "/thanks/"baseURLmuss deine echtehttps:-Adresse sein. Das Partial macht damit austhankseine absolute URL, und Ikiform folgt nurhttps:-Weiterleitungen.Partial erstellen
layouts/_partials/ikiform-form.html {{ $id := .id | default site.Params.ikiform.formId }} {{ $thanks := .thanks | default site.Params.ikiform.thanks }} <form class="ikiform" action="https://ikiform.com/f/{{ $id }}" method="post"> <label>Email <input name="email" type="email" autocomplete="email" required></label> <label>Message <textarea name="message" rows="5"></textarea></label> {{ with .subject }}<input type="hidden" name="_subject" value="{{ . }}">{{ end }} {{ with $thanks }}<input type="hidden" name="_redirect" value="{{ . | absURL }}">{{ end }} <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden> <button type="submit">{{ .button | default "Send" }}</button> </form>Ruf es immer mit einem
dictauf, auch wenn es leer ist. Jeder Schlüssel ist optional und fällt auf die Site-Params zurück.In einen Shortcode packen
layouts/_shortcodes/ikiform.html {{ partial "ikiform-form.html" (dict "id" (.Get "id") "subject" (.Get "subject") "button" (.Get "button")) }}Hugo 0.146 hat Templates nach
layouts/_partialsundlayouts/_shortcodesverschoben. Nutze bei älteren Versionenlayouts/partialsundlayouts/shortcodes.Verwenden
In einer beliebigen Inhaltsdatei:
content/contact.md --- title: Contact --- Questions about pricing? Write to us. {{< ikiform subject="Pricing question" >}}Oder in einem Layout, für ein Formular auf jeder Seite:
layouts/_partials/footer.html <footer> {{ partial "ikiform-form.html" (dict "subject" "Footer enquiry") }} </footer>
Füge für die Weiterleitung eine Seite content/thanks.md hinzu. Ikiform folgt _redirect nur, wenn das Formular erlaubte Domains hat, die deine Site enthalten; ohne sie sehen Besucher die Danke-Seite von Ikiform. Siehe Regeln für _redirect.
Erlaubte Domains
Liste deine Produktionsdomain auf und jeden Ort, an dem du eine Vorschau der gebauten Site ansiehst.
| Wo das Formular läuft | Zu Allowed domains hinzufügen |
|---|---|
hugo server | localhost. Das passt auf http://localhost:1313: 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. |
| GitHub Pages | username.github.io. Projekt-Sites unter username.github.io/repo nutzen denselben Host, ein Eintrag deckt also alle ab. |
- Füge niemals
netlify.app,pages.devodergithub.ioallein hinzu. Jede Site auf diesem Host würde passen, auch die anderer Leute.
Test-Checkliste
- Führe
hugo serveraus, öffne die Seite und sieh dir den Quelltext an. Du solltest das<form>sehen, nicht<!-- raw HTML omitted -->. - Sende lokal mit
localhostin den erlaubten Domains ab. Du landest auf der Danke-Seite von Ikiform, weilabsURLeinehttp://localhost-Adresse liefert und nurhttps:-Weiterleitungen befolgt werden. - Deploye eine Preview, sende von dort ab und prüfe, dass die Einsendung in Ikiform gelistet und nicht als Spam markiert ist.
- Sende auf deiner Produktionsdomain ab und prüfe, dass du auf
/thanks/landest.
Fehlerbehebung
| Was du siehst | Warum | Lösung |
|---|---|---|
<!-- raw HTML omitted --> an der Stelle des Formulars | Das Formular wurde direkt in Markdown eingefügt | Nutze den Shortcode. |
Hugo schlägt fehl mit template for shortcode "ikiform" not found | Die Shortcode-Datei liegt in einem Ordner, den deine Hugo-Version nicht liest | Nutze layouts/_shortcodes ab 0.146 und layouts/shortcodes davor. |
Die Danke-Seite von Ikiform statt /thanks/ in Produktion | Keine erlaubten Domains, oder baseURL ist http: | Füge deine Domain hinzu und setze baseURL auf deine https:-Adresse. |
404 not_found nach dem Absenden | params.ikiform.formId fehlt, daher endet die Action auf /f/ | Setze die Formular-ID in hugo.toml. |
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. |