Eleventy
Shortcode Eleventy yang merender formulir Ikiform di template Nunjucks, Liquid, dan Markdown, dengan ID formulir disimpan di global data.
Eleventy menghasilkan HTML statis, jadi formulir mengirim tanpa JavaScript client apa pun. Shortcode menyimpan markup di satu tempat dan bekerja sama persis di file Nunjucks, Liquid, dan Markdown.
Penyiapan
Tambahkan shortcode
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"), ); }- Baris-barisnya sengaja digabung tanpa baris kosong. Di Markdown, baris kosong mengakhiri blok HTML, dan sisa formulir akan diperlakukan sebagai teks.
- Ini memakai sintaks ES module. Jika
package.jsonAnda tidak punya"type": "module", beri nama fileeleventy.config.mjs.
Simpan ID formulir di global data
_data/ikiform.js export default { formId: process.env.IKIFORM_FORM_ID ?? "frm_xxxxxxxxxxxxxxxx", thanks: "https://example.com/thanks/", };Global data tersedia di setiap template sebagai
ikiform. URL terima kasih harus absolut danhttps:, karena Ikiform mengabaikan redirect lain.Gunakan
contact.md --- title: Contact --- Questions about pricing? Write to us. {% ikiform ikiform.formId, ikiform.thanks, "Pricing question" %}File Markdown diproses dengan Liquid secara default, jadi tag-nya berfungsi di sana apa adanya. Taruh di barisnya sendiri dan jangan beri indentasi empat spasi, atau Markdown akan merendernya sebagai code block. Tag yang sama berfungsi di file
.njkdan.liquid.
_redirect hanya diikuti jika formulir punya domain yang diizinkan yang mencakup situs Anda. Lihat Aturan untuk _redirect.
Domain yang diizinkan
Cantumkan domain produksi dan setiap host pratinjau. Situs Eleventy biasanya di-deploy ke Netlify atau Cloudflare Pages, yang menangani pratinjau secara berbeda.
| Tempat formulir berjalan | Tambahkan ke Domain yang diizinkan |
|---|---|
npx @11ty/eleventy --serve | localhost. Ini cocok dengan http://localhost:8080: Ikiform hanya membandingkan nama host, tidak pernah port. |
| Domain Anda | example.com, yang juga mencakup www.example.com |
| Netlify | your-site.netlify.app. Deploy preview (deploy-preview-12--your-site.netlify.app) dan branch deploy (branch--your-site.netlify.app) bukan subdomainnya, jadi tambahkan host pratinjau persisnya selama Anda menguji. |
| Cloudflare Pages | your-project.pages.dev. URL pratinjau seperti abc123.your-project.pages.dev adalah subdomainnya, jadi sudah cocok. |
- Jangan pernah menambahkan
netlify.appataupages.devsaja. Setiap situs di host itu akan cocok, termasuk milik orang lain.
Daftar periksa pengujian
- Jalankan dev server dan lihat source halamannya. Formulir seharusnya berupa HTML biasa, bukan di dalam blok
<pre><code>. - Kirim secara lokal dengan
localhostdi domain yang diizinkan dan pastikan kirimannya tercantum di Ikiform. - Deploy pratinjau dan kirim lagi dari host pratinjau.
- Kirim di produksi dan pastikan Anda mendarat di halaman terima kasih Anda.
Pemecahan masalah
| Yang Anda lihat | Alasan | Solusi |
|---|---|---|
| Formulir tampil sebagai kode di halaman | Shortcode diberi indentasi empat spasi di file Markdown | Pindahkan tag ke awal barisnya. |
| Separuh formulir dirender sebagai paragraf | Output shortcode berisi baris kosong, yang mengakhiri blok HTML Markdown | Gabungkan baris tanpa baris kosong, seperti di config di atas. |
SyntaxError: Unexpected token 'export' saat Eleventy dijalankan | Config memakai sintaks ES module di proyek CommonJS | Ganti nama menjadi eleventy.config.mjs, atau tambahkan "type": "module" ke package.json. |
Nunjucks atau Liquid tidak bisa menemukan tag ikiform | Eleventy tidak memuat file config | Pastikan file ada di root proyek dan bernama eleventy.config.js atau .mjs. |
Kiriman masuk ke filter spam dengan origin_mismatch | Halaman yang mengirim tidak ada di domain yang diizinkan formulir | Tambahkan host dari tabel di atas. Jika Reject dipilih, kiriman yang sama mendapat 403 origin_not_allowed. |