Beispiel: Veranstaltungen anbieten

In diesem Fallbeispiel erläutern wir das Gerüst einer kleinen Webanwendung, mit der es Besuchern ermöglicht wird, ihre Teilnahme an einer Veranstaltung zu- oder abzusagen. Wir haben hierfür die fiktive Firma Bäcker Inc gewählt, die ihren Bäckermeistern die Möglichkeit gibt, an einer Fortbildung teilzunehmen.

Es gibt zwei Workshops, “Industrieller Einsatz von Schokolade” und “Obstverarbeitung in der Konditorei”. Jeder Bäckermeister kann frei wählen, an welchen Workshops er teilnehmen möchte. Die Entscheidungen der potenziellen Teilnehmer werden im OMC gespeichert, so dass beispielsweise Teilnahmeinformationen per Mailings an die betreffenden Personen verschickt werden können.

Diese Anwendung setzt Folgendes voraus:

  • Die potenziellen Teilnehmer wurden im OMC als Personen angelegt.

  • Die Veranstaltung wurde im OMC angelegt (siehe Eine Veranstaltung durchführen).

  • Die Veranstaltung hat einen Titel, einen Webservice-Namen sowie mindestens die beiden Detail-Felder schokolade und obst. Diese Felder stehen für die beiden Workshops.

  • Die potenziellen Teilnehmer wurden in die Veranstaltung im OMC eingetragen.

  • An die potentiellen Teilnehmer wurde eine Einladung per Mailing versandt. In die E-Mails wurde ein kodierter Link aufgenommen, der zur Registrierungsseite (hier eventform.php) führt.

  • Die Registrierungsseite wird über den Link in der E-Mail geöffnet.

Die Registrierungsseite enthält ein Formular, mit dem die folgende Funktionalität abgedeckt wird:

  • Ein potenzieller Teilnehmer kann sich für die Teilnahme an der Fortbildungsveranstaltung registrieren und die gewünschten Workshops auswählen.
  • Ein (potenzieller) Teilnehmer kann zu einem späteren Zeitpunkt seine Workshop-Auswahl ändern.
  • Ein für die Veranstaltung registrierter Teilnehmer kann sich wieder abmelden.

Beim Aufruf der Registrierungsseite aus der Einladungsmail heraus wird zunächst ermittelt, welche Person die Seite angefordert hat. Anschließend werden seine Teilnahme an der angegebenen Veranstaltung und die Veranstaltung selbst ausgelesen. Nun kann der Teilnehmer das Formular ausfüllen, um (erneut) festzulegen, ob er teilnehmen möchte und welche Workshops er besuchen möchte. Nach dem Abschicken des Formulars wird eventform.php erneut mit den benötigten Parametern aufgerufen, so dass die Entscheidungen des Teilnehmers zum OMC übertragen werden können.

Die Datei eventform.php besteht aus zwei Teilen, die wir zum besseren Verständnis separat eräutern, der Kommunikation mit dem OMC (und der Verarbeitung des Formularinhalts) sowie dem eigentlichen Formular.

Kommunikation mit dem OMC

Wir setzen hier voraus, dass die Datei eventform.php über den Link in der Einladungsmail aufgerufen wird. Da dieser Link einen Tracking-Code enthält, können die betreffende Personen-ID und die Mailing-ID (und aus dem Mailing das Event) ohne Weiteres ermittelt werden.

Alternativ oder zusätzlich könnte vorgesehen werden, dass ein potentieller Teilnehmer sich direkt (nicht über den E-Mail-Link) an der Website anmeldet und anschließend die Details seiner Teilnahme an der Veranstaltung festlegt.

Die Datei eventform.php beginnt mit dem folgenden Code:

<?php

require_once 'omc_connector/OMC_Connector.php';

$trackingCode = $_REQUEST['_cc'];

try {
  $_decoded = OMC_Mailing::decode($trackingCode);
  $contact = OMC_Contact::find($_decoded->contact_id);
  $_mailing = OMC_Mailing::find($_decoded->mailing_id);
  $event = OMC_Event::find($_mailing->event_id);
  $participation = $contact->eventParticipation($_mailing->event_id);
} catch (OMC_Exception $e) {
  echo "Beim dekodieren ist ein Fehler aufgetretten.";
}

if (isset($_POST['submit'])) {
  try {
    switch($_POST['submit']) {
      case "Abmelden": 
        $participation->refuse();
        header('Location: refuse_success.php');
      case "Registrieren":
        $participation->register($_POST['workshops']);
        header('Location: success.php');
      case "Aktualisieren":
        $participation->updateDetails($_POST['workshops']);
        header('Location: success.php');
    }
  } catch (OMC_Exception $e) {
    echo "Anmelden/Abmelden/Aktualisieren ist ein Fehler aufgetreten.";
  }
}

?>

Zunächst wird im obigen Abschnitt wieder der OMC Connector eingebunden:

require_once 'omc_connector/OMC_Connector.php';

Anschließend wird der als URL-Parameter übergebene Tracking-Code (die URL könnte beispielsweise so aussehen: http://example.com/eventform.php?_cc=FGADG45DF323) in der Variablen $trackingCode abgelegt:

$trackingCode = $_REQUEST['_cc'];

Da bei den nun folgenden OMC-Aufrufen Fehler auftreten können (etwa, wenn das OMC nicht erreichbar ist), behandeln wir die OMC_Exception:

try {
  ...
} catch (OMC_Exception $e) {
  echo "Beim Dekodieren ist ein Fehler aufgetreten.";
}

Um eine Person als Teilnehmer einer Veranstaltung an- oder abmelden zu können, benötigen wir die gegenwärtigen Informationen über die Person in Bezug auf die Veranstaltung. Um diese Informationen zu erhalten, wird zunächst der Tracking-Code dekodiert. Dies liefert ($_decoded) eine Personen-ID sowie eine Mailing-ID, aus denen entsprechende Instanzen ($contact und $_mailing) erzeugt werden. Das Mailing wird nur benötigt, um daraus die betreffende Veranstaltung zu ermitteln und als Instanz ($event) anzulegen. Anschließend werden noch die Teilnahme-Details der Person in $participation gespeichert:

  $_decoded = OMC_Mailing::decode($trackingCode);
  $contact = OMC_Contact::find($_decoded->contact_id);
  $_mailing = OMC_Mailing::find($_decoded->mailing_id);
  $event = OMC_Event::find($_mailing->event_id);
  $participation = $contact->eventParticipation($_mailing->event_id);

Die relevanten Informationen über die Person als (potenzieller) Veranstaltungsteilnehmer sind nun vorhanden, und wir können jetzt prüfen, ob auch Formulardaten verfügbar sind, d.h., ob die Person ihre Teilnahme spezifiziert und das Formular abgeschickt hat. Auch hier werden auftretende Fehler abgefangen:

if (isset($_POST['submit'])) {
  try {
    ...
  } catch (OMC_Exception $e) {
    echo "Anmelden/Abmelden/Aktualisieren ist ein Fehler aufgetretten.";
  }
}

Zur Verarbeitung der Formulardaten ziehen wir die Submit-Aktion heran, die beim Abschicken des Formulars gesetzt wird (siehe unten). Bei jeder der drei Aktionen wird die entsprechende Methode der Teilnehmerdaten-Instanz ($participation) aufgerufen – refuse(), register() bzw. updateDetails() –, die die gewünschte Änderung an das OMC überträgt. Anschließend wird der Teilnehmer zu einer entsprechenden Bestätigungsseite weitergeleitet:

    switch($_POST['submit']) {
      case "Abmelden": 
        $participation->refuse();
        header('Location: refuse_success.php');
      case "Registrieren":
        $participation->register($_POST['workshops']);
        header('Location: success.php');
      case "Aktualisieren":
        $participation->updateDetails($_POST['workshops']);
        header('Location: success.php');
    }

Falls der Besucher auf Abmelden geklickt hat, trägt $participation->refuse() den Teilnehmer aus dem Event aus.

Sofern der Besucher auf Registrieren geklickt hat, sind seine gewünschten Workshops im Hash $_POST['workshops'] hinterlegt und werden mit $participation->register($_POST['workshops']) im Event eingetragen. Dieser Befehl setzt gleichzeitig den Teilnahmestatus der betreffenden Person auf registriert.

War der Besucher bereits registriert und hat auf Aktualisieren geklickt, um seine Workshop-Auswahl zu aktualisieren, werden die Teilnehmer-Details mit $participation->updateDetails($_POST['workshops']) aktualisiert. Das betreffende Event im OMC muss über die zu setzenden Detail-Felder verfügen. Andernfalls kann es zu Datenverlust kommen.

Das Formular

Hier zunächst das vollständige Formular, das anschließend erläutert wird:

<h1>Registierung für die Bäckermeister-Fortbildung</h1>
<h2>Sehr geehrter <?= $contact->first_name ?> <?= $contact->last_name ?>, </h2>
<p>Die Bäckermeister-Fortbildung findet vom
 <?= $event->starts_at->format('d.m.Y') ?> bis zum
 <?= $event->ends_at->format('d.m.Y') ?>  statt.</p>
<? if($participation->state == "reg") { ?>
  <p>Sie haben sich für die Veranstaltung bereits registriert.
     Sie können hier Ihre Angaben noch ändern.</p>
<? } ?>

<form action="" method="POST">
  <input type="hidden" name="_cc" value="<?= $trackingCode ?>" />
  <input type="hidden" name="workshops[schokolade]" value="no" />
  <input type="hidden" name="workshops[obst]" value="no" />
  <input type="hidden" name="last_update" value="<?= date() ?>" />

  <p>Bitte wählen Sie die gewünschten Workshops aus:</p>
  <fieldset>
    <legend>Workshops</legend>
    <input type="checkbox" name="workshops[schokolade]" value="yes" 
      <?= $participation->details->schokolade == "yes" ?  'checked' : ''?> />
    <label>Industrieller Einsatz von Schokolade</label><br/>
    <input type="checkbox" name="workshops[obst]" value="yes" 
      <?= $participation->details->obst == "yes" ?  'checked' : '' ?> />
    <label>Obstverarbeitung in der Konditorei</label><br/>
  </fieldset>

  <? if($participation->state == "reg") { ?>
      <input type="submit" value="Aktualisieren" name="submit" />
      <input type="submit" value="Abmelden" name="submit" />
  <? } else { ?>
      <input type="submit" value="Registrieren" name="submit" />
  <? } ?>

</form>

Zunächst werden eine kurze persönliche Begrüßung sowie einige Angaben über die Veranstaltung (Beginn und Ende) ausgegeben:

<h1>Registierung für die Bäckermeister-Fortbildung</h1>
<h2>Sehr geehrter <?= $contact->first_name ?> <?= $contact->last_name ?>, </h2>
<p>Die Bäckermeister-Fortbildung findet vom
 <?= $event->starts_at->format('d.m.Y') ?> bis zum
 <?= $event->ends_at->format('d.m.Y') ?>  statt.</p>

Wenn der Besucher sich bereits für die Veranstaltung registriert hat, so teilen wir ihm dies mit:

<? if($participation->state == "reg") { ?>
  <p>Sie haben sich für die Veranstaltung bereits registriert.
     Sie können hier Ihre Angaben noch ändern.</p>
<? } ?>

Anschließend folgt das eigentliche Formular. Um die Personendaten auch beim nächsten Aufruf von eventform.php verfügbar zu haben, setzen wir den Tracking-Code und auch den Zeitpunkt der letzten Änderung als versteckte Eingabefelder. Ferner wird no als Voreinstellung für die beiden Workshops schokolade und obst gesetzt.

<form action="" method="POST">
  <input type="hidden" name="_cc" value="<?= $trackingCode ?>" />
  <input type="hidden" name="workshops[schokolade]" value="no" />
  <input type="hidden" name="workshops[obst]" value="no" />
  <input type="hidden" name="last_update" value="<?= date() ?>" />

Nun lassen wir den Teilnehmer die Workshops auswählen und verwenden dabei die Werte der Teilnehmer-Details des Events als Voreinstellung:

  <p>Bitte wählen Sie die gewünschten Workshops aus:</p>
  <fieldset>
    <legend>Workshops</legend>
    <input type="checkbox" name="workshops[schokolade]" value="yes" 
      <?= $participation->details->schokolade == "yes" ?  'checked' : ''?> />
    <label>Industrieller Einsatz von Schokolade</label><br/>
    <input type="checkbox" name="workshops[obst]" value="yes" 
      <?= $participation->details->obst == "yes" ?  'checked' : '' ?> />
    <label>Obstverarbeitung in der Konditorei</label><br/>
  </fieldset>

Je nach Teilnehmerstatus der Person werden schließlich Buttons angezeigt, mit denen das Formular abgeschickt werden kann:

  <? if($participation->state == "reg") { ?>
      <input type="submit" value="Aktualisieren" name="submit" />
      <input type="submit" value="Abmelden" name="submit" />
  <? } else { ?>
      <input type="submit" value="Registrieren" name="submit" />
  <? } ?>

</form>

Beim Wiedereintritt in eventform.php kann auf der Basis des submit-Parameters und der anderen Formularwerte die gewünschte Aktion im OMC durchgeführt werden.