Home / أدلة / تكامل نموذج الاتصال الزاوي (المستقل والإشارات)
دليل التكامل · ANGULAR & SPA

تكامل نموذج الاتصال الزاوي (المستقل والإشارات)

قم بتوصيل تطبيقات Angular 17/18+ بـ Lugatu باستخدام المكونات المستقلة والإشارات التفاعلية وHttpClient لتسليم نموذج اتصال موثوق به دون صيانة خادم SMTP.

1. مكون نموذج الاتصال المستقل مع الإشارات التفاعلية

تفضل Angular الحديثة المكونات والإشارات المستقلة على وحدات NgModules الثقيلة. يوفر هذا التنفيذ نموذج اتصال يمكن الوصول إليه مع التحميل التفاعلي والخطأ وحالات النجاح التي يتم إرسالها مباشرة إلى Lugatu.

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">Your Name</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">Email Address</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">Message</label>
        <textarea id="message" rows="4" [(ngModel)]="message" name="message" required class="w-full border rounded-xl p-2.5"></textarea>
      </div>

      <!-- Honeypot spam defense -->
      <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() ? 'Sending...' : 'Send Message' }}
      </button>

      <p *ngIf="isSuccess()" class="text-sm text-green-700 font-medium">Thank you! Your message has been received.</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; // Silent discard for automated bot submissions

    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('Submission failed. Please try again.');
        },
      });
  }
}

2. SSR وإعادة التوجيه العالمي من خادم إلى خادم

إذا كان تطبيق Angular الخاص بك يعمل باستخدام Angular SSR (محرك Node / Express)، فيمكنك توكيل الاستفسارات من خلال معالج التوجيه من جانب الخادم لحماية مفتاح Lugatu Server-to-Server API الخاص بك.

server.ts typescript
// Express / Node backend endpoint in Angular SSR
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: 'Failed to deliver message' });
  }
});

3. تكوين Bot Defense وHoneypot

يقوم Lugatu بفحص حقل _gotcha تلقائيًا. اجعله غير مرئي للزائرين من البشر باستخدام العرض: لا شيء و tabindex = "-1". تؤدي روبوتات السبام التي تملأ كل مدخلات DOM إلى القمع الصامت.

tip

لا تستخدم أبدًا تسميات النماذج لمدخلات مصيدة الجذب. اترك الإكمال التلقائي قيد إيقاف التشغيل واستثني الحقل من الأسماء التي يمكن لقارئ الشاشة الوصول إليها.

الأمن والمصادقة الثابتة

ثابت الأمان: لا يجب أبدًا تجميع مفاتيح API من خادم إلى خادم (lug_live_...) في أصول Angular من جانب العميل أو ملفات بيئة.ts. استخدم نقطة النهاية العامة لعمليات إرسال العميل المباشرة أو إعادة التوجيه عبر نقاط نهاية الخادم.

استكشاف الأخطاء وإصلاحها وأخطاء العرض الشائعة

HTTP 403 FORBIDDEN_BROWSER_ORIGIN عند الإرسال من Angular

تسمح نقاط نهاية النموذج العامة بعمليات الإرسال المشتركة من أي متصفح. إذا كنت تتصل بنقطة النهاية من خادم إلى خادم (POST /api/v1/forms/{id}/submissions) مباشرةً من Angular، فقم بالتبديل إلى نقطة النهاية العامة (POST /api/v1/public/forms/{id}/submissions) أو أعد توجيهها عبر الواجهة الخلفية.

الأسئلة المتداولة

هل يدعم Lugatu Angular SSR مع ترطيب العميل؟

نعم. يتم تنفيذ عمليات إرسال نماذج Lugatu العامة عبر الجلب من جانب العميل أو HttpClient بعد تفاعل المستخدم، وهو متوافق تمامًا مع Angular SSR وترطيب العميل.

هل أنت مستعد لإنشاء نقطة نهاية النموذج الخاص بك؟

ابدأ مجانًا في ثوانٍ. لا حاجة لبطاقة الائتمان.

ابدأ مجانًا →