====== Individuelle Antwortprüfung ======

Formale Anforderungen an eine Antwort -- zum Beispiel dass alle Items einer Skala beantwortet wurden oder dass eine offene Texteingabe einem bestimten Muster folgt -- lassen sich mit wenigen Klicks in der Frage festlegen ([[:de:create:checks]]).

Komplexere Überprüfungen können mit ein wenig [[:de:create:php|PHP-Code]] realisiert werden. Dabei wird ein PHP-Filter gemeinsam mit der Funktion [[:de:create:functions:repeatpage|repeatPage()]] verwendet.

**Wichtig:** Der PHP-Code zur Überprüfung der Antwort muss auf der Seite __nach__ der Frage ganz oben platziert werden. Wenn also die zu prüfende Frage auf Seite 2 gestellt wird, dann muss der PHP-Code zur Prüfung auf Seite 3 ganz oben stehen.

**Hinweis:** Überlegen Sie vorab, ob eine Überprüfung der Antwort tatsächlich zielführend ist. Das ist dann der Fall, wenn Teilnehmer ihre Angaben versehentlich in einem falschen Format machen. Wenn Sie hingegen erwarten, dass sich die Teilnahmer mangels Motivation ("nur mal durchklicken") oder absichtlich nicht an die Vorgaben halten, dann ist es oftmals besser, die fehlerhaften Angaben in Kauf zu nehmen und bei der Datenbereinigung zu filtern.

**Tipp:** Weitere Details zur Programmierung von PHP-Filtern finden Sie unter [[:de:create:php-filters]].

**Tipp:** Verwenden Sie die Funktion ''[[:de:create:functions:markfail|markFail()]]'', um Eingabefelder mit fehlerhaften Angaben zu markieren.

Eine Fehlermeldung können Sie anzeigen, wenn Sie als Argument in der Funktion ''repeatPage()'' die Kennung eines Textbausteins eintragen (s. unten). Alternativ können Sie auch einen entsprechenden Textbaustein mittels [[:de:create:functions:text|text()]] anzeigen. Für die zweite Variante wählen Sie beim Anlegen des Textbausteins aus, dass der Text im Stil einer //Warnung// angezeigt wird -- dann erhält er dieselbe Formatierung wie die Standard-Fehlermeldungen.


===== Beispiel: Mehrfachauswahl-Matrix =====

In einer gewöhnlichen Skala kann man einfach überprüfen lassen, ob der Teilnehmer in jeder Zeile eine Option markiert hat. Wenn man aber eine [[:de:create:combine|kombinierte Frage]] verwendet, welche dem Teilnehmer mehrere Kruezchen pro Zeile erlaubt (Mehrfachauswahl-Matrix), dann benötigt man ein wenig PHP-Code zur Überprüfung, ob wirklich in jeder Zeile etwas ausgewählt wurde.

Das folgende Beispiel geht davon aus, dass 4 Mehrfachauswahl-Fragen ("MA01" bis "MA04") mit jeweils 10 Items zu einer Mehrfach-Auswahlmatrix kombiniert wurden. Falls in einer Zeile kein Kreuzchen gesetzt wurde, soll diese hervorgehoben werden und es soll der Text "MA05" als Fehlermeldung angezeigt werden.


==== Variante A ====

Eine Möglichkeit besteht darin, einfach für jede Zeile (Item) die auswählten Items abzuzählen. Wurde nichts gewählt, kommt die Item-Nummer auf eine Liste ''$missing'' und anschließend werden die Fehler markiert.

Die Funktion [[:de:create:functions:id]] erstellt aus der Kennung der Rubrik ("MA"), der Nummer der Frage (z.B. 1) und der Nummer des Items (z.B. 5) die Variablen-Kennung zum Abruf der Antwort (z.B. "MA01_05").

<code php>
// Die nicht-beantworteten Items werden in der Liste $missing gesammelt
$missing = array();
// Die Funktion getItems() liefert eine Liste mit Item-Nummern (=Zeilen)
// De Konstruktion FOREACH durchläuft diese alle in einer Schleife
foreach (getItems('MA01', 'all') as $item) {
  // Alle Spalten (Fragen) für dieses Item in einer FOR-Schleife durchgehen
  $anyChecked = false;
  for ($col = 1; $col <= 4; $col++) {
    $itemID = id('MA', $col, $item);
    if (value($itemID) == 2) {
      $anyChecked = true;
    }
  }
  // Item notieren, falls nichts markiert wurde
  if (!$anyChecked) {
    $missing[] = $item;
  }
}

// Überprüfung, ob ein Item unbeantwortet blieb
if (count($missing) > 0) {
  // Die fehlenden Items hervorheben
  foreach ($missing as $item) {
    markFail(id('MA01', $item));
  }
  // Meldung anzeigen und Seite wiederholen
  repeatPage('MA05');
}
</code>


==== Variante B ====

Wer lieber mit Zahlenmengen arbeitet, kann pro Spalte die nicht angekreuzten Items (Code: 1) ermitteln und deren Schnittmenge bilden.

<code php>
$missing01 = getItems('MA01', '==', 1);
$missing02 = getItems('MA02', '==', 1);
$missing03 = getItems('MA03', '==', 1);
$missing04 = getItems('MA04', '==', 1);
$missing = array_intersect($missing01, $missing02, $missing03, $missing04);

// Überprüfung, ob ein Item unbeantwortet blieb
if (count($missing) > 0) {
  // Die fehlenden Items hervorheben
  foreach ($missing as $item) {
    markFail(id('MA01', $item));
  }
  // Meldung anzeigen und Seite wiederholen
  repeatPage('MA05');
}
</code>


===== Beispiel: Alle Items oder gar keines =====

Der folgende PHP-Code überprüft, ob in einer Skala alle Items beantwortet wurden -- oder gar keines. Die Kennung der Frage (im Beispiel ''AB01'') muss entsprechend der tatsächlichen Frage-Kennung geändert werden, die Fehlermeldung muss als Textbaustein abgespeichert werden. Sofern die Kennung dieses Textbausteins nicht "error_AB01" lautet, muss auch diese Kennung angepasst werden.

<code php>
// Eine Liste aller Items in der Frage erstellen
$items = getItems('AB01');
// Ermitteln der beantworteten Items
$answered = getItems('AB01', '>', 0);
// Fehler und zurück, falls nicht alle oder keines beantwortet wurden
if ((count($answered) > 0) and (count($answered) < count($items))) {
  repeatPage('error_AB01');
}
</code>