Contao Hook processFormData: Formular-Benachrichtigungen an Slack & Mattermost senden


Formular-Benachrichtigungen an Slack & Mattermost senden

Erfahre, wie du mit dem Contao Hook processFormData automatisch Nachrichten an Slack oder Mattermost sendest – inklusive Webhook- und Codebeispielen.

Lesedauer: ca. 6–10 Minuten

Contao Hook processFormData Automatische Channel-Alerts

Formulare gehören zu den zentralen Elementen fast jeder Contao-Website – ob Kontaktanfragen, Event-Anmeldungen oder Support-Tickets. Doch oft reicht es nicht aus, dass die Daten nur per E-Mail verschickt oder in der Datenbank gespeichert werden.

Gerade in modernen Teams entsteht Kommunikation dort, wo alle ohnehin arbeiten: in Slack oder Mattermost.

In diesem Beitrag zeige ich dir Schritt für Schritt, wie du den Contao Hook processFormData nutzen kannst, um nach einer erfolgreichen Formularübermittlung automatisch eine Nachricht an einen Channel zu senden – sauber integriert in Symfony, flexibel konfigurierbar und mit sofort einsetzbaren Codebeispielen.

Egal ob du Support-Anfragen schneller verteilen, Sales-Leads direkt pushen oder interne Prozesse automatisieren möchtest: Mit Webhooks und wenigen Zeilen PHP lässt sich Contao problemlos an deine Team-Kommunikation anbinden.

Beispiele, wann Contao automatisch eine Nachricht an einen Slack oder Mattermost Channel schicken soll, z. B.:

  • Support-Channel
  • Sales-Channel
  • Gäste-Registrierung
  • Systemmonitoring

Das Beispiel des processFormData Hooks aus der Contao Dokumentation

// src/EventListener/ProcessFormDataListener.php
namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\Form;

#[AsHook('processFormData')]
class ProcessFormDataListener
{
    public function __invoke(array $submittedData, array $formData, array|null $files, array $labels, Form $form): void
    {
        // Do something …
    }
}

1. Grundlagen: Was macht der Hook?

Der Hook wird ausgeführt nachdem ein Formular erfolgreich verarbeitet wurde, aber bevor Contao die Seite weiterleitet. Typische Einsatzfälle:

  • Slack Benachrichtigung bei Kontaktformular
  • Mattermost Nachricht bei Event-Anmeldung
  • Logging in externe Systeme

2. Hook registrieren

<?php
// src/EventListener/FormProcessListener.php

namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;

class FormProcessListener
{
    #[AsHook('processFormData')]
    public function onProcessFormData(array $submittedData, array $formData, array $files, array $labels): void
    {
        // Beispiel: Name aus Formular
        $name = $submittedData['name'] ?? 'Unbekannt';

        // Nachricht erzeugen
        $message = "📩 Neues Formular abgesendet von: *$name*";

        // TODO: Nachricht an Slack/Mattermost senden
    }
}

3. Szenario A: Nachricht an Slack senden

Slack unterstützt sogenannte Incoming Webhooks.

Schritt 1: Slack Webhook erstellen

  1. Slack öffnen
  2. Workspace → Apps → Incoming
  3. Webhooks aktivieren Webhook URL kopieren, z. B.:

https://hooks.slack.com/services/XXX/YYY/ZZZ

Schritt 2: Nachricht senden via HTTP POST

private function sendSlackMessage(string $webhookUrl, string $text): void
{
    $payload = json_encode([
        'text' => $text
    ]);

    $ch = curl_init($webhookUrl);

    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json'
    ]);

    curl_exec($ch);
    curl_close($ch);
}

Nutzung im Hook:

public function onProcessFormData(array $submittedData, array $formData, array $files, array $labels): void
{
    $name = $submittedData['name'] ?? 'Unbekannt';

    $message = "📩 Neues Kontaktformular von *$name*";

    $this->sendSlackMessage(
        $_ENV['SLACK_WEBHOOK'],
        $message
    );
}

.env Datei

SLACK_WEBHOOK="https://hooks.slack.com/services/XXX/YYY/ZZZ"

4. Szenario B: Nachricht an Mattermost senden

Mattermost unterstützt ebenfalls Incoming Webhooks.

Schritt 1: Webhook in Mattermost erstellen

  1. Mattermost → Channel öffnen
  2. Menü → Integrations → Incoming Webhooks
  3. Neue URL generieren:

https://mattermost.example.com/hooks/abc123xyz

Schritt 2: Mattermost Nachricht senden

Mattermost Payload:

{
  "text": "Hallo Channel!"
}

PHP Code:

private function sendMattermostMessage(string $webhookUrl, string $text): void
{
    $payload = json_encode([
        'text' => $text
    ]);

    file_get_contents($webhookUrl, false, stream_context_create([
        'http' => [
            'method'  => 'POST',
            'header'  => "Content-Type: application/json\r\n",
            'content' => $payload
        ]
    ]));
}

Nutzung:

$message = "🎟️ Neue Event-Anmeldung: {$submittedData['email']}";

$this->sendMattermostMessage(
    $_ENV['MATTERMOST_WEBHOOK'],
    $message
);

.env Datei

MATTERMOST_WEBHOOK="https://mattermost.example.com/hooks/abc123xyz"

5. Szenario C: Nur bestimmte Formulare melden

Oft soll nicht jedes Formular Benachrichtigungen auslösen.

Beispiel: Nur Formular mit ID 3 oder Name contact_form

if ($formData['id'] !== 3) {
    return;
}

oder

if ($formData['formID'] !== 'contact_form') {
    return;
}

6. Szenario D: Schöne Formatierung (Markdown)

Slack & Mattermost unterstützen Markdown:

$message = <<<TEXT
📩 *Neues Formular erhalten*

👤 Name: {$submittedData['name']}
📧 Email: {$submittedData['email']}
📝 Nachricht: {$submittedData['message']}
TEXT;

7. Best Practice: Symfony HttpClient statt cURL

Empfohlen für moderne Contao-Versionen:

use Symfony\Contracts\HttpClient\HttpClientInterface;

public function __construct(private HttpClientInterface $client) {}

private function send(string $url, string $text): void
{
    $this->client->request('POST', $url, [
        'json' => ['text' => $text]
    ]);
}

8. Komplettbeispiel Listener (Slack)

Empfohlen für moderne Contao-Versionen:

<?php

namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Symfony\Contracts\HttpClient\HttpClientInterface;

class FormProcessListener
{
    public function __construct(private HttpClientInterface $client) {}

    #[AsHook('processFormData')]
    public function onProcessFormData(array $submittedData, array $formData): void
    {
        if ($formData['formID'] !== 'contact_form') {
            return;
        }

        $text = "📩 Neue Nachricht von {$submittedData['name']}";

        $this->client->request('POST', $_ENV['SLACK_WEBHOOK'], [
            'json' => ['text' => $text]
        ]);
    }
}

Fazit

Mit dem Hook processFormData kannst du sehr elegant:

  • Slack Alerts
  • Mattermost Notifications
  • System Events

direkt nach Formularabsendung auslösen. In einer Ausbaustufe könntest du auch Anhänge aus Formularen mitsenden.

Frag uns gern an, wenn du Hilfe benötigst.

Zurück

Ähnliche Beiträge

*******************

Liebe Leser,
Menschen sind nicht ausschließlich Frauen, Männer, weiblich, männlich, divers – Menschen können vielfältiger sein! Wir möchten euch ALLE als Menschen ansprechen, egal von welchem Geschlecht oder welcher Kultur. Sprachlich ist es schwierig, euch alle „richtig“ anzusprechen. Daher verwenden wir – auch für eine bessere Lesbarkeit – bei Personenbezeichnungen meist die männliche Form, wie Dienstleister oder Partner. Aber eins ist uns wichtig: Keiner soll sich ausgeschlossen fühlen.

Zudem sind wir Verfechter des DU #gernperdu und gestalten so unsere tägliche Kommunikation etwas lockerer und persönlicher. Auch hier gilt: Wir bringen allen die gleiche Wertschätzung entgegen.

*******************