Validasi Form HTMX — HTMX

Validasi form di HTMX biasanya dilakukan di server, dengan inline error response. Server-side Validation Daftar Response: Error Email sudah terdaftar…

Validasi form berarti memeriksa isian sebelum diterima. Ada dua lapis: browser memeriksa duluan lewat atribut HTML seperti required, lalu server memeriksa lagi, termasuk hal yang cuma server tahu. Bayangin meja Laundry Bu Rini. Kasir menolak nota yang kolom beratnya kosong, langsung di meja. Nota yang lolos dibawa ke belakang, dan bagian belakang mengecek apakah mesin hari ini masih muat. Kalau gak muat, nota dikembalikan dengan catatan merah di kolom yang salah, dan isian lainnya tetap.

🧪 Tebakan cepat: Server menolak order 25 kg dengan status 422 dan mengirim ulang form berisi pesan error. Belum ada pengaturan htmx apa pun. Apa yang terlihat di halaman? Jawabannya ada di bagian "422 gak ditukar".

Lapis 1: browser memeriksa duluan

<form id="terima" hx-post="/order" hx-target="this" hx-swap="outerHTML">
  <input name="nama" placeholder="Nama" required>
  <input name="berat" type="number" min="1" placeholder="kg" required>
  <span class="error"></span>
  <button>Terima cucian</button>
</form>

Lapis 2: server menolak dengan 422

Mesin Bu Rini muat 30 kg sehari. Papan sudah berisi 10 kg (3 + 2 + 5), jadi sisanya 20 kg. Browser gak tahu angka itu, cuma server. Order 25 kg lolos min="1", lalu server membalas dengan status 422 Unprocessable Content ("isiannya sampai, tapi ditolak") dan form yang sama, berisi pesan:

<form id="terima" hx-post="/order" hx-target="this" hx-swap="outerHTML">
  <input name="nama" placeholder="Nama" required value="Bu Tini">
  <input name="berat" type="number" min="1" placeholder="kg" required value="25" aria-invalid="true">
  <span class="error">Kapasitas mesin hari ini tinggal 20 kg.</span>
  <button>Terima cucian</button>
</form>

422 gak ditukar

Di htmx 2, balasan 4xx dan 5xx gak ditukar. htmx memicu htmx:responseError, dan form-nya tetap seperti tadi, tanpa pesan apa pun. Kasir cuma melihat tombol yang gak bereaksi. Itu jawaban tebakannya.

responseHandling: izinkan 422 ditukar

<meta name="htmx-config" content='{"responseHandling": [
  {"code": "204", "swap": false},
  {"code": "[23]..", "swap": true},
  {"code": "422", "swap": true, "error": true},
  {"code": "[45]..", "swap": false, "error": true}
]}'>

Cek satu kotak sebelum submit

<input name="berat" type="number" min="1" required
       hx-post="/order/cek-berat" hx-trigger="blur"
       hx-target="next .error" hx-swap="innerHTML">
<span class="error"></span>

⚠️ Jebakan yang sering ketemu

TL;DR: Browser memeriksa duluan (required, min) dan menahan submit tanpa request. Server memeriksa lagi, termasuk yang cuma ia tahu, dan membalas 422 dengan form berisi pesan dan isian lama. htmx 2 gak menukar 422 kecuali responseHandling di <meta name="htmx-config"> mengizinkannya: tulis keempat aturan, 422 dengan "swap": true, "error": true di atas [45]... Untuk cek per kotak: hx-post, hx-trigger="blur" (atau keyup changed delay:500ms), hx-target="next .error", dan hx-swap="innerHTML", dengan server membalas 200 berisi pesan atau kosong.

Yang akan kamu pelajari