ID du formulaire

Svelte et SvelteKit

Un composant Svelte 5 qui envoie depuis le navigateur, et une form action SvelteKit qui envoie avec une clé secrète.

Composant Svelte

Installez le SDK avec npm install @ikiform/sdk, puis envoyez le formulaire depuis le navigateur :

ContactForm.svelte
<script>
  import { submit } from "@ikiform/sdk";

  let status = $state("idle");
  let errors = $state({});
  let message = $state("");

  async function onsubmit(event) {
    event.preventDefault();
    status = "sending";
    const result = await submit("frm_xxxxxxxxxxxxxxxx", new FormData(event.currentTarget));
    if (result.ok) {
      status = "sent";
      return;
    }
    errors = result.error.fields ?? {};
    message = result.error.message;
    status = "error";
  }
</script>

{#if status === "sent"}
  <p>Thanks, we got it.</p>
{:else}
  <form {onsubmit}>
    <label>
      Email
      <input name="email" type="email" required />
    </label>
    {#if errors.email}<p>{errors.email[0]}</p>{/if}
    <label>
      Message
      <textarea name="message"></textarea>
    </label>
    <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
    {#if status === "error" && !errors.email}<p role="alert">{message}</p>{/if}
    <button disabled={status === "sending"}>Send</button>
  </form>
{/if}

Form action SvelteKit

Une form action fonctionne sans JavaScript et est améliorée une fois JavaScript chargé. L'action envoie à Ikiform avec une clé secrète stockée dans IKIFORM_SECRET_KEY. Pour une page prérendue sans serveur, voir SvelteKit.

src/routes/contact/+page.server.js
import { env } from "$env/dynamic/private";
import { fail } from "@sveltejs/kit";

export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    const body = new URLSearchParams();
    for (const [name, value] of data) if (typeof value === "string") body.append(name, value);
    const response = await fetch("https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx", {
      method: "POST",
      headers: { Accept: "application/json", Authorization: `Bearer ${env.IKIFORM_SECRET_KEY}` },
      body,
    });
    const result = await response.json();
    if (!result.ok) return fail(response.status, { message: result.error.message, fields: result.error.fields ?? {} });
    return { sent: true };
  },
};
src/routes/contact/+page.svelte
<script>
  import { enhance } from "$app/forms";

  let { form } = $props();
</script>

{#if form?.sent}
  <p>Thanks, we got it.</p>
{:else}
  <form method="POST" use:enhance>
    <label>
      Email
      <input name="email" type="email" required />
    </label>
    {#if form?.fields?.email}<p>{form.fields.email[0]}</p>{/if}
    <label>
      Message
      <textarea name="message"></textarea>
    </label>
    {#if form?.message && !form?.fields?.email}<p role="alert">{form.message}</p>{/if}
    <button>Send</button>
  </form>
{/if}
Les envois depuis votre serveur viennent tous de l'adresse IP de votre serveur, donc les limites de débit par visiteur d'Ikiform comptent tous les visiteurs ensemble. Le préréglage Standard autorise 5 envois par minute par IP et par formulaire, ce qu'un site fréquenté peut atteindre. Envoyez depuis le navigateur quand c'est possible, ou choisissez la limite de débit Relaxed ou Custom pour les formulaires que vous faites passer par un serveur.