====== Antworten in einer Folgefrage anzeigen ======

Mittels [[::de:create:placeholders|Platzhaltern]] ist es möglich, eine geschlossene oder offene Antwort des Teilnehmers an anderer Stelle im Fragebogen anzuzeigen (auch als "Piping" bezeichnet).

**Beispiel:** Der Teilnehmer wählt zu Beginn des Fragebogens aus, welches Online-Netzwerk er persönlich am häufigsten verwendet. In späteren Fragen soll dann der Names des Netzwerks (z.B. "diaspora*") in Frage- und Itemtexten erscheinen (z.B. "Wie häufig nutzt du diaspora* an einem üblichen Werktag?")

**Hinweis:** Falls Sie in einer Folgefrage nur bestimmte Skalenitems oder Auswahloptionen in Abhängigkeit von den Antworten des Teilnehmers anzeigen möchten, lesen Sie bitte [[:de:create:filter-items]].

**Hinweis:** Falls Sie bisher noch nicht mit Filtern und PHP-Code gearbeitet haben, lesen Sie vorab bitte die Kapitel [[:de:create:php]] und [[:de:create:filter-solving]].


===== Offene Textantwort verwenden =====

Der Teilnehmer hat auf Seite 2 in einem offenen Texteingabefeld (Kennung ''TX01_01'') den Namen eines Fernsehmoderators genannt. Mittels Antwortprüfung wurde sichergestellt, dass der Teilnehmer auch etwas eingetragen hat. Der angegebene Name soll nun in weiteren Fragetexten oder Skalenitems verwendet werden.

Zunächst wird mit ''[[:de:create:functions:replace]]'' ein Platzhalter für den Namen vorbereitet, z.B. ''%moderator''. Dazu platzieren Sie auf einer Fragebogen-Seite nach der Texteingabefrage (z.B. im Beispiel auf Seite 3 oder später) folgenden PHP-Code:

<code php>
replace('%moderator%', 'TX01_01', 'response');
</code>

Dieser Platzhalter kann nun an beliebiger Stelle im Fragebogen verwendet werden -- natürlich erst ab dort, wo er mittels PHP-Code vorbereitet wurde. So könnte der Fragetext einer Frage auf Seite 3 etwa lauten:

<code>
Bitte beurteilen Sie <strong>%moderator%</strong> in Hinblick auf die folgenden Eigenschaften.
</code>

**Hinweis:** Es ist mittels ''replace()'' nicht möglich, die Eingabe des Teilnehmers direkt auf derselben Fragebogenseite anzuzeigen. Dafür ist [[:de:create:javascript|JavaScript]] erforderlich.

**Hinweis:** Um die korrekte Funktion zu testen, müssen Sie den Fragebogen von Beginn an starten -- oder zumindest ab der Seite mit der offenen Texteingabe, wo der Name abgefragt wird (im Beispiel Seite 2).

**Tipp:** Ist ein Platzhalter erst einmal vorbereitet, behält er seine Gültigkeit auch auf späteren Seiten im Fragebogen. Es ist __nicht__ erforderlich, den PHP-Code auf jeder Seite zu wiederholen.

**Tipp:** Mit dem oben beschriebenen PHP-Code können auch geschlossene Antworten (z.B. aus einer Auswahlfrage) in Folgefragen übernommen werden.

**Tipp:** Alternativ kann die Angabe des Teilnehmers mittels ''[[:de:create:functions:value]]'' ausgelesen werden und anschließend an ''[[:de:create:functions:replace]]'' übergeben werden.

<code php>
$name = value('TX01_01');
replace('%moderator%', $name);
</code>


===== Geschlossene Antworten verwenden =====

Die Verwendung geschlossener Antworten funktioniert genauso, wie bei offenen Antworten.

Das folgende Beispiel geht davon aus, dass der Teilnehmer in Auswahlfrage ''SN01'' das Onlinenetzwerk ausgewählt hat, das er am häufigsten verwendet. Folgender PHP-Code (platziert auf der folgenden Seite oder später) sorgt dafür, dass der Platzhalter ''%sns%'' anschließend immer durch den Namen des ausgewählten Netzwerks ersetzt wird.

<code php>
replace('%sns%', 'SN01', 'response');
</code>

Würde man die Antwort auf ''SN01'' mittels ''[[:de:create:functions:value]]'' auslesen, bekommt man zunächst den numerischen Antwort-Code. Möchte man den Text der Antwortoption zur weiteren Verarbeitung auslesen, kann man entweder den Befehl ''[[:de:create:functions:getitemtext]]'' verwenden -- oder wesentlich einfacher -- bei ''value()'' als zweiten Parameter '''label''' angeben.

<code php>
$antwort = value('SN01', 'label');
html('<h1>'.$antwort.'</h1>');
</code>

Eine Sonderrolle nehmen Mehrfachauswahl-Fragen ein. Hier kann man entweder die einzelnen Auswahloptionen betrachten (jede wird durch eine eigene Variable repräsentiert, vgl. **Variablen-Übersicht**) oder die gesamte Frage.

  * Der Befehl ''value('MA01')'' angewendet auf die Mehrfachauswahl ''MA01'' liefert nicht (!) den Code der ersten ausgewählte Option, sondern die Anzahl der ausgewählten (nicht-exklusiven) Optionen.
  * Der Befehl ''value('MA01', 'label')'' liefert eine Komma-getrennte Liste der ausgewählten Optionen. Gleiches gilt für die Verwendung von ''replace('%platzhalter%', 'MA01', 'response')''.


===== Sonstiges-Eingabefelder =====

Verwendet man eine Auswahlfrage mit einer offenen Residualkategorie "Sonstiges: %%___%%", dann funktioniert ''replace('%sns%', 'SN01', 'response')'' weiterhin. Wählt der Teilnehmer eine der vorgegeben Auswahloptionen, wird der Platzhalter durch diese ersetzt. Wählt er eine Auswahloption mit offenen Eingabefeld, so wird der Platzhalter durch die Texteingabe des Teilnehmer ersetzt.

<code php>
replace('%sns%', 'SN01', 'response');
</code>

Die Funktion ''value()'' ist ein wenig strenger. ''value('SN01', 'label')'' liefert den Text "Sonstiges:". Gibt man hingegen als dritten Parameter '''free''' an (''value('SN01', 'free')''), so erhält man entweder die ausgewählte Option oder -- falls eine Option mit offenen Eingabefeld gewählt wurde -- die offene Eingabe des Teilnehmers.


===== Mehrere offene Antworten übernehmen =====

Dem Teilnehmer wird eine Frage vom Typ "Offene Texteingabe" ("TX01")  __oder__ "Offene Nennungen" ("TX02") angezeigt. Die Frage erlaubt bis zu 10 Antworten. Nun sollen in einer Folgefrage (z.B. Mehrfachauswahl, Rangordnung, Skala) die Antworten als Items bzw. Optionen angezeigt werden.

Die Schwierigkeit in diesem Beispiel besteht darin, dass der Teilnehmer evtl. nur einen Teil der Eingabefelder ausfüllt. Die Folgefrage darf also nur die entsprechenden Items/Optionen anzeigen. Außerdem wäre es müßig, 10-mal ''redirect()'' zu schreiben. Eine FOR-Schleife erledigt die Wiederholung.

Damit es mit der Folgefrage (z.B. "FF01") funktioniert, müssen Sie diese wie folgt anlegen: Die Frage muss genauso viele Items/Optionen haben, wie Texteingaben möglich sind (im Beispiel 10). Und als Texte für die Items/Optionen werden Platzhalter verwendet, z.B. ''%text1%'' bis ''%text10%''.

<code>
%text1%
%text2%
%text3%
%text4%
%text5%
%text6%
%text7%
%text8%
%text9%
%text10%
</code>

**Tipp:** Sie können neben dem Platzhalter natürlich noch weiteren Text verwenden, z.B. "Bewertung %text1%".

Der folgende PHP-Code liest mittels ''[[:de:create:functions:value]]'' alle 10 möglichen Eingabefelder aus, überprüft, ob etwas eingetragen wurde, bereitet die Platzhalter ''%text1%'' bis ''%text10%'' vor und zeigt die Frage FF01 mit den passenden Items/Optionen an.

<code php>
$frage = 'TX01';
$items = array();
for ($i=1; $i<=10; $i++) {
  $itemID = id($frage, $i);
  $antwort = value($itemID);
  if (trim($antwort) != '') {
    replace('%text'.$i.'%', $antwort);
    $items[] = $i;
  }
}
// Folgefrage anzeigen
if (count($items) > 0) {
  question('FF01', $items);
}
</code>

Zur Erklärung des PHP-Codes: Der IF-Filter am Ende sorgt dafür, dass die Folgefrage übersprungen wird, wenn der Teilnehmer gar kein Eingabefeld ausgefüllt hat. Die Funktion ''trim()'' entfernt Leerzeichen am Anfang und Ende des eingegebenen Textes, sodass ein paar Leerzeichen im Textfeld nicht als gültige Antwort interpretiert werden. Die Funktion ''sprintf()'' mit dem Parameter '''%02d''' sorgt dafür, dass eine Zahl zweistellig mit führender Null angezeigt wird (also z.B. ''01'' statt nur ''1'').

**Hinweis:** Sollte der PHP-Code nicht das gewünschte Ergebnis liefern, sei nochmals auf das Kapitel [[:de:create:filter-solving]] verwiesen.