Übersetzungen dieser Seite:
 

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 , 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 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 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).

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 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 (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.

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 loopPage() auch so abwandeln, dass jedes Item (oder Blöcke von z.B. jeweils 3 Items) jeweils auf einer eigenen Seite angezeigt werden.

de/create/rotation-items.txt · Zuletzt geändert: 07.04.2021 11:01 von sophia.schauer
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Share Alike 4.0 International
Driven by DokuWiki