====== Items aus unterschiedlichen Fragen mischen ======
Diese Anleitung erklärt, wie Sie Items aus unterschiedlichen Fragen durchmischen ([[:de:create:rotation]]) und gemeinsam auf einer oder mehreren Seiten anzeigen.
===== Einfache Lösung =====
In den meisten Fällen ist es deutlich (!) einfacher, die Items alle in einer Frage anzulegen. Zuerst die Items des ersten Konstrukts, dann die Items des zweiten Konstrukts u.s.w. Dies ist möglich, wenn insgesamt weniger als 100 Items rotiert werden sollen.
Die Speicherung aller Items in einer Frage vereinfacht die Rotation deutlich: [[:de:create:rotation#rotation_der_items_oder_optionen|Rotation der Items oder Optionen]].
Wenn Sie die Zugehörigkeit der Items zu den Konstrukten noch verdeutlichen möchten, dann können Sie in der Frage unter //Weitere Einstellungen// -> //Variablen// die Namen der Variablen entsprechend anpassen.
===== Lösung mit mehreren Fragen =====
Wenn Sie entschieden haben, dass die Items in unterschiedlichen Fragen gespeichert werden sollen, dann müssen Sie jedes Item separat mit einem ''[[:de:create:functions:question]]''-Befehl anzeigen und dafür sorgen, dass (a) der Fragetext nur einmal oben erscheint und (b) die weiteren Items ohne Abstand direkt darunter angezeigt werden.
Zunächst muss natürlich eine Liste ([[:de:create:array|Array]]) aller Items erstellt werden. In diesem Array muss neben der Item-Kennung auch die Frage-Kennung vermerkt werden. Im folgenden Beispiel sollen die Items der Fragen "AB01", "AB02" und "AB03" gemischt werden. Der folgende PHP-Code erstellt eine leere Liste ''$items'', ermittelt für jede (''foreach'') Frage deren Items und speichert für jedes (''foreach'') davon einen Eintrag in die Liste ''$items''. Dieser Eintrag ist seinerseits wieder ein Array, welches die Frage-Kennung und die Item-Nummer beinhaltet.
$questions = ['AB01', 'AB02', 'AB03'];
$items = [];
foreach ($questions as $qstID) {
$qstItems = getItems($qstID, 'all');
foreach ($qstItems as $itemID) {
$items[] = [$qstID, $itemID];
}
}
Das Ergebnis in ''$items'' könnte also z.B. wie folgt aussehen:
[
['AB01', 1],
['AB01', 2],
['AB01', 3],
['AB02', 1],
['AB02', 2],
['AB02', 3],
['AB03', 1],
['AB03', 2],
['AB03', 3]
]
Diese Liste wird nun mittels ''shuffle()'' gemischt. Durch ''isset()'' und ''registerItems()'' wird sichergestellt, dass die Liste nur einmal erstellt und gemischt wird und nicht erneut, wenn die Seite nochmals geladen wird (z.B. weil nicht alle Items beantwortet worden sind).
Weiterhin sorgt der folgende PHP-Code dafür, dass für jedem Listeneintrag (''foreach'') mittels ''question()'' das jeweilige Item aus der Liste angezeigt wird.
foreach ($items as $item) {
$qstID = $item[0];
$itemID = $item[1];
question($qstID, [$itemID], 'spacing=0', 'show-title=no', 'show-explanation=no');
}
Oder etwas kompakter geschrieben:
foreach ($items as $item) {
question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
}
Natürlich sollte über den Items noch der Fragetext stehen. Der vollständige PHP-Code sieht demnach aus wie folgt:
if (!isset($items)) {
$questions = ['AB01', 'AB02', 'AB03'];
// Liste mit allen Items erstellen
$items = [];
foreach ($questions as $qstID) {
$qstItems = getItems($qstID, 'all');
foreach ($qstItems as $itemID) {
$items[] = [$qstID, $itemID];
}
}
// Liste mischen
shuffle($items);
registerVariable($items);
}
// Fragetext anzeigen
question('AB01', 'spacing=0', 'show-items=no');
// Items anzeigen
foreach ($items as $item) {
question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
}
===== Anzeige auf mehreren Seiten =====
Falls die Items nicht alle auf einer Seite gezeigt werden sollen, kann man die Liste mittels ''array_chunk()'' aufteilen (im folgenen Beispiel in Blöcke á 12 Items) und diese dann jeweils auf einer eigenen Seite präsentieren.
if (!isset($itemBlocks)) {
$questions = ['AB01', 'AB02', 'AB03'];
// Liste mit allen Items erstellen
$items = [];
foreach ($questions as $qstID) {
$qstItems = getItems($qstID, 'all');
foreach ($qstItem as $itemID) {
$items[] = [$qstID, $itemID];
}
}
// Liste mischen
shuffle($items);
// Liste aufteilen
$itemBlocks = array_chunk($items, 12);
registerVariable($itemBlocks);
}
// Auf mehreren Seiten präsentieren
$i = loopPage(count($itemBlocks));
// Fragetext anzeigen
question('AB01', 'spacing=0', 'show-items=no');
// Items anzeigen
$items = $itemBlocks[$i];
foreach ($items as $item) {
question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
}
===== Schattierung =====
Die automatische Schattierung der Items funktioniert hier nicht mehr, denn technisch gesehen ist jedes Item nun das erste (und einzige) in der dargebotenen Frage. Sie können aber im ''question()''-Befehl auch für eine alternierende Schattierung sorgen:
foreach ($items as $n => $item) {
if ($n % 2 == 0) {
question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'shading=all-shaded');
} else {
question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'shading=all-unshaded');
}
}
===== Verankerung scrollen =====
Bei Fragen können Sie normalerweise einstellen, dass die Verankerung mit der Seite scrollt. Das funktioniert hier nicht mehr, weil jedes Item als seine eigene Frage dargestellt wird. Falls dennoch eine mitscrollende Verankerung benötigt wird, muss diese manuell eingebunden werden.
(1) Deaktivieren Sie in Ihren Fragen die Option, dass die Kopfzeile mitscrollen soll. Wählen Sie aus, dass sie nur einmal oben angezeigt wird.
(2) Ergänzen Sie in Ihrem PHP-Code zwei `replace()` - einmal für die erste Frage und einmal für das letzte Item auf der Seite.
$firstItem = $items[0];
$lastItem = $items[count($items) - 1];
replace('%questionID%', $firstItem[0]);
replace('%lastItem%', id($lastItem[0], $lastItem[1]);
(3) Ergänzen Sie außerdem einen PHP-Befehl, um die passende JavaScript-Bibliothek einzubinden.
library('TitleScroller');
(4) Unter dem PHP-Code ergänzen Sie den eigenlichen JavaScript-Code (als HTML-Code).