no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


Nächste Überarbeitung
de:create:rotation-itemmix [06.03.2020 20:21] admin
Zeile 1: Zeile 1:
 +====== 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.
 +
 +<code php>
 +$questions = ['AB01', 'AB02', 'AB03'];
 +$items = [];
 +foreach ($questions as $qstID) {
 +  $qstItems = getItems($qstID, 'all');
 +  foreach ($qstItem as $itemID) {
 +    $items[] = [$qstID, $itemID];
 +  }
 +}
 +</code>
 +
 +Das Ergebnis in ''$items'' könnte also z.B. wie folgt aussehen:
 +
 +<code php>
 +[
 +  ['AB01', 1],
 +  ['AB01', 2],
 +  ['AB01', 3],
 +  ['AB02', 1],
 +  ['AB02', 2],
 +  ['AB02', 3],
 +  ['AB03', 1],
 +  ['AB03', 2],
 +  ['AB03', 3]
 +]
 +</code>
 +
 +Diiese 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.
 +
 +<code php>
 +foreach ($items as $item) {
 +  $qstID = $item[0];
 +  $itemID = $item[1];
 +  question($qstID, [$itemID], 'spacing=0', 'show-title=no', 'show-explanation=no');
 +}
 +</code>
 +
 +Oder etwas kompakter  geschrieben:
 +
 +<code php>
 +foreach ($items as $item) {
 +  question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
 +}
 +</code>
 +
 +Natürlich sollte über den Items noch der Fragetext stehen. Der vollständige PHP-Code sieht demnach aus wie folgt:
 +
 +<code php>
 +if (isset($items)) {
 +  $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);
 +  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');
 +}
 +</code>
 +
 +
 +===== 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.
 +
 +<code php>
 +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');
 +}
 +</code>
 +
 +
 +===== 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:
 +
 +<code php>
 +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');
 +  }
 +}
 +</code>
de/create/rotation-itemmix.txt · Zuletzt geändert: 14.02.2024 13:41 von michaelavogel1
 
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