Dieses Kapitel beschreibt, wie man die einzelnen Items in einer Frage in einer zufälligen Reihenfolge präsentieren kann. Dabei gibt es verschiedene Möglichkeiten der Umsetzung, die in diesem Kapitel erklärt werden.
Die Randomisierung oder Rotation von Items in einer Frage wird wie folgt aktiviert:
Falls einzelne Items (z.B. ein „Sonstiges“ mit Texteingabe) von der Rotation ausgenommen werden sollen, öffnen Sie dieses Item im Fragenkatalog oder mit dem -Symbol und aktivieren Sie die Option Dieses Item beim Mischen der Items ausnehmen.
Hinweis: Die Rotation betrifft natürlich nur die Darstellung im Fragebogen. Die Antworten des Befragten auf ein bestimmtes Item werden immer unter derselben Kennung gespeichert.
Hinweis: In welcher Reihenfolge die Items im Fragebogen angezeigt werden, wird nicht im Datensatz abgespeichert. Falls Sie diese Information benötigen, rotieren Sie die Items mittels PHP-Code (s. unten).
Sie können die Items bzw. Optionen einer Frage auch mittels PHP-Code rotieren. Dazu wird zunächst mittels getItems()
eine Liste der Items/Optionen abgerufen, dann per shuffle()
gemischt und schließlich wird die Frage mittels question()
mit der gewünschten Item-Abfolge als Parameter angezeigt.
$items = getItems('AB01', 'all'); shuffle($items); question('AB01', $items);
Dieses Vorgehen bietet die Möglichkeit, die angezeigte Reihenfolge im Datensatz abzuspeichern. Dies erfolgt mithilfe interner Variablen und dem Befehl put()
.
Beachten Sie allerdings, dass sich hier (anders als bei der Rotation per Knopfdruck) die Reihenfolge ändert, sobald der Teilnehmer die Seite neu lädt oder den Zurück-Knopf im Fragebogen verwendet. Verwenden Sie registerVarible()
und isset()
, um dies zu verhindern. So wird die Zufallsabfolge nur beim ersten Laden der Seite gewürfelt – beim nächsten Laden ist die Variable $itemsAB
bereits gesetzt (isset()
steht für „is set“) und der Teil wird übersprungen.
if (!isset($itemsAB)) { $itemsAB = getItems('AB01', 'all'); shuffle($itemsAB); registerVariable($itemsAB); } question('AB01', $itemsAB);
Hinweis: Nachdem eine mittels registerVariable()
gespeicherte Variable auf allen Seiten des Fragebogens verfügbar ist, können Sie denselben PHP-Code nicht verwenden, um die Items einer anderen Frage zu rotieren. Denn die Variable ist ja bereits gesetzt. Verwenden Sie für die andere Frage einfach einen anderen Variablen-Namen (z.B. $itemsCD
).
Mit der manuellen Rotation (s. oben) können Sie in zwei oder mehr Fragen dieselbe rotierte Item-Abfolge verwenden. Falls die Fragen auf unterschiedlichen Seiten stehen, verwenden Sie auch hierfür registerVariable()
– genau wie im Beispiel oben – um die Abfolge für weitere PHP-Code-Elemente verfügbar zu machen.
if (!isset($itemsAB)) { $itemsAB = getItems('AB01', 'all'); shuffle($itemsAB); registerVariable($itemsAB); } question('AB01', $itemsAB);
Auf derselben oder späteren Seiten kann die Reihenfolge, wie sie in $itemsAB
gespeichert ist, einfach für andere Fragen verwendet werden.
question('AB02', $itemsAB);
Falls Sie in einer Frage sehr viele Items haben, möchten Sie diese vielleicht auf mehrere Seiten verteilen. Normalerweise würden Sie das erledigen, indem Sie die Frage beim Fragebogen zusammenstellen mehrfach einfügen und jeweils bei den Anzeige-Einstellungen (-Knopf) unterschiedliche Items angeben, z.B. „1-10“, „11-20“, etc.
Falls Sie die Verteilung der Items mit einer Randomisierung kombinieren möchten, benötigen Sie ein paar Zeilen PHP-Code.
// Das isset() vermeidet, dass die Rotation etwa wg. fehlenden Antworten verändert wird if (!isset($itemsAB01)) { // Alle Items der Frage AB01 auflisten $itemsAB01 = getItems('AB01', 'all'); // Liste Mischen shuffle($itemsAB01); // Die Liste in Teillisten à 20 Items teilen $itemsAB01 = array_chunk($itemsAB01, 20); // Die Variable für andere Seiten verfügbar machen registerVariable($itemsAB01); } // Die Items über mehrere Seiten verteilt anzeigen $i = loopPage(count($itemsAB01)); question('AB01', $itemsAB01[$i]);
Mit der Funktion loopPage()
kann man innerhalb einer Fragebogen-Seite mehrere unterschiedliche Seiten anzeigen. Alternativ zu den letzten beiden Zeilen kann man die benötigte Anzahl an Seiten im Fragebogen einfügen und jeweils den entsprechenden Item-Bereich anzeigen:
// Erste Seite question('AB01', $itemsAB01[0]); // Zweite Seite question('AB01', $itemsAB01[1]); // Dritte Seite question('AB01', $itemsAB01[2]);
Beachten Sie bitte, dass sich auf den Seiten nur noch der Index in eckigen Klammern ändert. Der Index beginnt bei 0, nicht bei 1 (s. Beispiel oben).
Wichtig: Wenn man beim Fragebogen zusammenstellen direkt eine Seite mit Items startet, dann erhält man die Fehlermeldung, die Variable $itemsAB01
sei unbekannt. Man muss zum Testen jeweils ab der Seite starten, wo die Randomisierung beginnt und damit die Variable $itemsAB01
definiert wird.
In aller Regel ist es einfacher, dass man die zu rotierenden Items alle in einer Frage unterbringt. Im Karteireiter Variablen kann man die Variablennamen ggf. auch so anpassen, dass sich die unterschiedliche Zugehörigkeit zu Konstrukten/Teilskalen in der Auswertung einfach nachvollziehen lässt.
Es gibt aber Situationen, in denen es notwendig ist, Items aus unterschiedlichen Fragen zu mischen. Etwa wenn es Skalenitems sind, die unterschiedliche Antwortoptionen verwenden. Als Basis für die Rotation benötigt man zunächst ein Array, welches seinerseits Arrays mit Frage- und Itemkennung beinhaltet.
Diese Itemliste können Sie natürlich manuell definieren, das sieht dann für zwei Fragen (AB01 und AB02) mit jeweils 4 Items wie folgt aus:
$itemliste = [ ['AB01', 1], ['AB01', 2], ['AB01', 3], ['AB01', 4], ['AB02', 1], ['AB02', 2], ['AB02', 3], ['AB02', 4] ];
Wenn Sie ohnehin alle Items der Fragen verwenden möchten, können Sie diese mittels getItems()
auch automatisch auslesen. Das würde dann aussehen wie folgt:
$fragen = ['AB01', 'AB02']; $itemliste = []; foreach ($fragen as $frage) { foreach (getItems($frage, 'all') as $item) { $itemsliste[] = [$frage, $item]; } }
Das Mischen der Itemliste erfolgt mittels shuffle()
.
shuffle($itemliste);
Für die Anzeige jedes Items muss die Funktion question()
einzeln aufgerufen werden – dabei wird die Frage mit jeweils nur einem Item angezeigt. Damit der Fragetext nicht immer wieder erscheint, muss der Parameter show-title=no
gesetzt werden. Außerdem sorgt spacing=0
dafür, dass zwischen den Items nicht zu viel Abstand bleibt.
Damit über der Frage trotzdem einmal der Fragetext angezeigt wird, wird question()
auch nochmal mit show-items=none
aufgerufen.
question('AB01', 'show-items=none', 'spacing=0'); foreach ($itemliste as $info) { $frage = $info[0]; $item = $info[1]; question($frage, $item, 'show-title=no', 'show-explanation=no', 'spacing=0'); }
Die drei PHP-Codes zum Erstellen der Itemliste, Mischen und zur Präsentation müssen alle in demselben PHP-Code stehen. Wenn es theoretisch möglich ist, dass die Seite aufgrund einer Antwortpflicht oder durch den Zurück-Knopf erneut angezeigt wird, können Sie noch mittels registerVariable()
und isset()
sicherstellen, dass die Liste nur einmal gemischt wird. Der gesamte PHP-Code sieht dann aus wie folgt:
$fragen = ['AB01', 'AB02']; $itemliste = []; foreach ($fragen as $frage) { foreach (getItems($frage, 'all') as $item) { $itemsliste[] = [$frage, $item]; } } // Mischen if (!isset($itemMix)) { $itemMix = $itemliste; registerVariable($itemMix); } // Fragetext anzeigen question('AB01', 'show-items=none', 'spacing=0'); // Items einzeln anzeigen foreach ($itemMix as $info) { $frage = $info[0]; $item = $info[1]; question($frage, $item, 'show-title=no', 'show-explanation=no', 'spacing=0'); }
Der letzte Teil lässt sich mittels loopPage()
auch so abwandeln, dass jedes Item (oder Blöcke von z.B. jeweils 3 Items) jeweils auf einer eigenen Seite angezeigt werden.