Ana Sayfa / Rehberler / Angular İletişim Formu Entegrasyonu (Standalone & Signals)
ENTEGRASYON REHBERİ · ANGULAR & TEK SAYFA UYGULAMALARI

Angular İletişim Formu Entegrasyonu (Standalone & Signals)

Modern Angular 17/18+ projelerinizi Standalone Bileşenler, reaktif Signals ve HttpClient kullanarak Lugatu form altyapısına bağlayın; SMTP yapılandırması olmadan güvenilir teslimat sağlayın.

1. Reaktif Signals Kullanan Standalone İletişim Bileşeni

Modern Angular projelerinde NgModules yerine Standalone Bileşenler ve Signals mimarisi tercih edilir. Bu örnek form, reaktif durum yönetimi ile Lugatu genel form endpoint’ine doğrudan veri gönderir.

contact-form.component.ts typescript
import { Component, signal, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-contact-form',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <form (ngSubmit)="onSubmit()" class="space-y-4 max-w-md">
      <div>
        <label for="name" class="block text-sm font-semibold mb-1">Ad Soyad</label>
        <input id="name" type="text" [(ngModel)]="name" name="name" required class="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label for="email" class="block text-sm font-semibold mb-1">E-posta Adresi</label>
        <input id="email" type="email" [(ngModel)]="email" name="email" required class="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label for="message" class="block text-sm font-semibold mb-1">Mesajınız</label>
        <textarea id="message" rows="4" [(ngModel)]="message" name="message" required class="w-full border rounded-xl p-2.5"></textarea>
      </div>

      <!-- Honeypot spam tuzağı -->
      <input type="text" [(ngModel)]="gotcha" name="_gotcha" style="display:none !important" tabindex="-1" autocomplete="off" />

      <button type="submit" [disabled]="isSubmitting()" class="btn-primary-editorial py-2.5 px-6">
        {{ isSubmitting() ? 'Gönderiliyor...' : 'Mesajı Gönder' }}
      </button>

      <p *ngIf="isSuccess()" class="text-sm text-green-700 font-medium">Teşekkürler! Mesajınız başarıyla iletildi.</p>
      <p *ngIf="errorMessage()" class="text-sm text-red-600">{{ errorMessage() }}</p>
    </form>
  `,
})
export class ContactFormComponent {
  private http = inject(HttpClient);

  name = signal('');
  email = signal('');
  message = signal('');
  gotcha = signal('');

  isSubmitting = signal(false);
  isSuccess = signal(false);
  errorMessage = signal('');

  onSubmit() {
    if (this.gotcha()) return; // Bot gönderimlerini sessizce engelle

    this.isSubmitting.set(true);
    this.errorMessage.set('');

    const payload = {
      fields: {
        name: this.name(),
        email: this.email(),
        message: this.message(),
      },
      honeypot: this.gotcha(),
    };

    this.http.post('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', payload)
      .subscribe({
        next: () => {
          this.isSubmitting.set(false);
          this.isSuccess.set(true);
          this.name.set('');
          this.email.set('');
          this.message.set('');
        },
        error: () => {
          this.isSubmitting.set(false);
          this.errorMessage.set('Gönderim sırasında hata oluştu. Lütfen tekrar deneyin.');
        },
      });
  }
}

2. SSR ve Sunucu Tarafı API Yönlendirmesi

Angular projeniz SSR modunda çalışıyorsa, sunucu API anahtarınızı (lug_live_...) tarayıcıya sızdırmadan Express / Node rotası üzerinden sunucudan sunucuya yönlendirme yapabilirsiniz.

server.ts typescript
server.post('/api/contact', async (req, res) => {
  const { name, email, message, _gotcha } = req.body;
  if (_gotcha) return res.status(200).json({ ok: true });

  try {
    const response = await fetch(`https://www.lugatu.com/api/v1/forms/${process.env.LUGATU_FORM_ID}/submissions`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.LUGATU_API_KEY}`,
        'Content-Type': 'application/json',
        'Idempotency-Key': crypto.randomUUID(),
      },
      body: JSON.stringify({ fields: { name, email, message } }),
    });

    res.status(response.status).json({ ok: response.ok });
  } catch (error) {
    res.status(500).json({ error: 'İletim başarısız' });
  }
});

3. Bot Koruması ve Honeypot Ayarları

Lugatu gizli _gotcha alanını otomatik analiz eder. Alanı display:none ve tabindex="-1" ile gizleyerek otomatik form dolduran botları engelleyebilirsiniz.

tip

Honeypot alanlarına label vermeyin ve autocomplete niteliğini kapalı tutun.

Güvenlik ve Kimlik Doğrulama Standardı

Güvenlik Kuralı: Sunucudan sunucuya API anahtarları (lug_live_...) Angular environment dosyalarına veya derlenmiş JS bundle’larına asla dahil edilmemelidir. Doğrudan tarayıcı gönderimleri için genel form endpoint’ini kullanın.

Sorun Giderme ve Yaygın Hatalar

Angular üzerinden gönderimde HTTP 403 FORBIDDEN_BROWSER_ORIGIN hatası

Genel form endpoint’i tüm tarayıcılardan gelen isteklere izin verir. Eğer yanlışlıkla sunucudan sunucuya endpoint’ini çağırdıysanız genel form endpoint’ine (/api/v1/public/forms/...) geçin.

Sıkça Sorulan Sorular

Lugatu Angular Universal ve SSR ile uyumlu mu?

Evet. İletişim formları kullanıcı etkileşimi sonrası çalıştığı için Angular SSR ve hidrasyon mimarisiyle tam uyumludur.

Kendi formunuzu oluşturmaya hazır mısınız?

Saniyeler içinde ücretsiz başlayın. Kredi kartı gerektirmez.

Ücretsiz Başlayın →