Skip to content

Formlar (Demo)

Bu belge gerçek gönderim yapmayan iletişim formunu anlatır. Kullanıcı «Gönder»e basınca yalnızca toast görünür; sunucuya veri gitmez.

Canlı sayfa: Contact (ContactPage.astro). Form stilleri: Fix UI Kullanımı. Sayfa metinleri: Çeviri Metinleri. İletişim verisi: Site Bilgileri.


ParçaDosya
Form markupsrc/components/pages/ContactPage.astro
Toast davranışısrc/components/islands/FormSubmitToast.tsx
Metinlersrc/i18n/pages/contact.ts

Dört dil sarmalayıcısı (contact.astro, tr/iletisim.astro, …) yalnızca ContactPage çağırır — Sayfa Ekle / Kaldır.


<form id="contact-form" class="fix-form" method="get" action="#">
<div class="fix-form__row">
<Label for="contact-name">{t(contactPage.nameLabel, locale)}</Label>
<Input id="contact-name" name="name" type="text" required autocomplete="name" />
</div>
<!-- email, textarea ... -->
<Button type="submit" variant="primary">
{t(contactPage.submit, locale)}
</Button>
</form>
BileşenRol
fix-formForm düzeni (Fix UI CSS)
LabelErişilebilir etiket
InputMetin / e-posta alanları
textarea + fix-inputMesaj alanı
ButtonGönder — variant="primary"

Ayrıntılı sınıflar: Fix UI Kullanımı.

method="get" ve action="#" — tarayıcı varsayılanını nötrler; asıl davranış JS ile kesilir.


Formun üstünde (aynı kart içinde) island mount edilir:

<FormSubmitToast
client:load
formId="contact-form"
message={t(contactPage.toastMessage, locale)}
/>

Dosya: src/components/islands/FormSubmitToast.tsx

useEffect(() => {
const form = document.getElementById(formId);
if (!form) return;
const handler = (event: Event) => {
event.preventDefault();
toast.success(message);
};
form.addEventListener('submit', handler);
return () => form.removeEventListener('submit', handler);
}, [formId, message]);
  • preventDefault → sayfa yenilenmez, ağ isteği yok
  • Sonner toast.success — global Toaster BaseLayout’ta (Font & UI Kullanımı)

formId ile id="contact-form" eşleşmeli.


contact.ts:

toastMessage: ls(
'Thanks! This is a demo — your message was not sent.',
'Teşekkürler! Bu bir demo — mesajınız gönderilmedi.',
),

Kullanıcıya gerçek gönderim olmadığı açıkça söylenir.


Canlıya Geçiş (Not — İmplementasyon Yok)

Section titled “Canlıya Geçiş (Not — İmplementasyon Yok)”

Demo yerine gerçek gönderim için tipik yollar:

YöntemKısa not
Formspree / Getformaction + method="POST", preventDefault kaldırılır veya koşullu
Astro API routesrc/pages/api/contact.ts — sunucuda e-posta veya CRM
Cloudflare WorkerEdge’de doğrulama + webhook

FormSubmitToast yerine başarı/hata toast’u API yanıtına bağlanır. Spam koruması (honeypot, Turnstile) eklenir. Bu rehber kod eklemez — mimari seçim sizin.


DeğişiklikSonuç
formId / id uyumsuzToast tetiklenmez
toastMessage metni4 dilde bildirim metni
preventDefault kaldırmaTarayıcı action’a gider (demo bozulur)
Yeni alan (Input)Form UI genişler; toast aynı kalabilir
client:load kaldırmaIsland hydrate olmaz — submit çalışmaz

  • Her sayfada kopya toast useEffect yazmayın — FormSubmitToast yeniden kullanın.
  • Contact bilgilerini forma hardcode etmeyin — sol kart contact.ts okur.
  • Layout’a ikinci Toaster eklemeyin.
  • Demo iken kullanıcıya «mesajınız iletildi» demeyin — metin dürüst kalsın.


Contact demo formu: fix-form + Fix UI bileşenleri. FormSubmitToast client:load, preventDefault, Sonner toast. Gerçek backend yok. Canlıda Formspree/API/Worker. Toast mantığını sayfa başına kopyalamayın.