======Items rotieren======
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.
===== Rotation in einer Frage =====
Die Randomisierung oder Rotation von Items in einer Frage wird wie folgt aktiviert:
* Öffnen Sie die Frage im **Fragenkatalog**
* Im Abschnitt //Auswahloptionen// bzw. //Items// wählen Sie den Karteireiter //Einstellungen//.
* Bei der Einstellung //Reihenfolge// wählen Sie die Option "Zufällig rotieren/mischen".
* Speichern Sie die Frage {{:button.save.png?nolink|}}, in der Vorschau können Sie anschließend die Randomisierung prüfen.
Falls einzelne Items (z.B. ein "Sonstiges" mit Texteingabe) von der Rotation ausgenommen werden sollen, öffnen Sie dieses Item im **Fragenkatalog** oder mit dem {{:button.edit.gif?nolink|Bearbeiten}}-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).
===== Manuelle Rotation von Items oder Optionen =====
Sie können die Items bzw. Optionen einer Frage auch mittels [[:de:create:php|PHP-Code]] rotieren. Dazu wird zunächst mittels ''[[:de:create:functions:getitems]]'' eine Liste der Items/Optionen abgerufen, dann per ''shuffle()'' gemischt und schließlich wird die Frage mittels ''[[:de:create:functions: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 ''[[:de:create:functions:put#beispielrandomisierung_i|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'').
===== Parallele Rotation von Items in zwei Fragen =====
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 ''[[:de:create:functions: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);
===== Rotation von Items über mehrere Seiten =====
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 ({{:button.settings.png?nolink|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|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 ''[[:de:create:functions:looppage|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.
===== Items aus unterschiedlichen Fragen rotieren =====
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.
==== Variante 1: Array manuell erstellen ====
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]
];
==== Variante 2: Array automatisch erstellen ====
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];
}
}
==== Items mischen und anzeigen ====
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 ''[[:de:create:functions:looppage]]'' auch so abwandeln, dass jedes Item (oder Blöcke von z.B. jeweils 3 Items) jeweils auf einer eigenen Seite angezeigt werden.