====== Fragen rotieren ====== Im nachfolgenden wird erklärt, wie die Reihenfolge ganzer Fragen rotiert wird. Falls Sie bisher noch nie mit PHP-Code gearbeitet haben, lesen Sie bitte die Anleitung [[php]]. **Tipp:** Falls Sie bestimmte Fragen stets gemeinsam anzeigen möchten, folgenden Sie der Anleitung [[:de:create:rotation-pages]]. **Tipp:** Falls Sie nur die Items einer Frage rotieren möchten, lesen Sie bitte das Kapitel [[:de:create:rotation-items]]. Für die Rotation von Fragen gibt es zwei Möglichkeiten: - Für die meisten Fälle ist die einfache Lösung [[:de:create:rotation-questions#rotation_mittels_zufallsgenerator|Rotation mittels Zufallsgenerator]] besser geeignet. - Die kompliziertere Lösung zur [[:de:create:rotation-questions#rotation_mittels_shuffle|Rotation mittels ''shuffle()'']] wird unten beschrieben. In __jedem__ Fall legen Sie die Fragen, die rotiert werden sollen, __vorab__ im **Fragen-Katalog** an. =====Rotation mittels Zufallsgenerator===== Legen Sie im **Fragenkatalog** einen [[:de:create:questions:random]] an. Im Zufallsgenerator geben Sie als //Inhalt (Zettel)// die Kennungen der Fragen ein, die rotiert abgefragt werden sollen. AB01 AB02 CC03 DE01 DE02 Tragen Sie außerdem unter //Weitere Einstellungen// im Karteireiter //Ziehung// bei //Anzahl Zettel pro Interview// die Anzahl der Fragen ein, die rotiert werden sollen. Im obigen Beispiel mit 5 Fragen also eine 5. {{:de:create:scr.rotation-questions.random-generator.png?nolink|Zufallsgenerator}} ==== Fragen präsentieren ==== **Wichtig!** Die Fragen, die in zufälliger Abfolge dargeboten werden sollen, werden __nicht__ in den Fragebogen hineingezogen! Stattdessen wird beim **Fragebogen zusammenstellen** der Zufallsgenerator im Fragebogen platziert und darunter ein PHP-Code. Wie genau der PHP-Code aussieht, hängt davon ab, ob die Fragen gemeinsam auf einer Seite erscheinen sollen oder getrennt auf separaten Seiten. Platzieren Sie den Zufallsgenerator und den PHP-Code an der Stelle im Fragebogen, wo die Fragen angezeigt werden sollen. Egal, ob Sie die Fragen gemeinsam oder auf separaten Seiten anzeigen, benötigen Sie beim **Fragebogen zusammenstellen** dafür nur __eine einzige__ Seite. ==== Fragen gemeinsam auf einer Seite ==== Oben auf der Seite platzieren Sie den Zufallsgenerator (im folgenden Beispiel hat dieser die Kennung RG01). Darunter folgenden PHP-Code: $fragen = valueList('RG01', NULL, 'label'); foreach ($fragen as $kennung) { question($kennung); } Mit der Funktion ''valueList()'' wird die vom Zufallsgenerator mit der Kennung "RG01" gezogene und gemischte Fragen-Liste abgerufen und in die Variable ''$fragen'' gespeichert. Die ''foreach''-Schleife ruft dann automatisch für jede Fragekennung die Funktion ''question()'' auf, welche die Frage anzeigt. Das bedeutet, dass Sie die Fragen nicht mehr extra eingeben müssen. Sie können den PHP-Code genau so nutzen und müssen nur die Fragekennung Ihres Zufallsgenerators eintragen. ==== Fragen auf separaten Seiten ==== Um die Fragen getrennt auf einzelnen Seiten anzuzeigen, verwenden Sie im PHP-Code anstatt einer ''foreach''-Schleife den Befehl ''[[:de:create:functions:looppage]]''. $fragen = valueList('RG01', NULL, 'label'); $kennung = loopPage($fragen); question($kennung); Damit haben Sie die rotierte Abfolge der Fragen bereits gewährleistet. Außerdem speichert der Zufallsgenerator automatisch die Präsentationsfolge. Der folgende Teil der Anleitung erklärt eine alternative Lösung. ===== Rotation mittels shuffle() ===== Die Rotation von Fragen ist im Prinzip auch ohne Zufallsgenerator mit dem PHP-Befehl ''shuffle()'' möglich. In diesem Fall wird die Präsentations-Reihenfolge nicht gespeichert. Das folgende Beispiel zeigt, wie man die Reihenfolge von 5 Fragen auf einer Seite im Fragebogen rotieren kann (zur Erklärung von Arrays s. [[filter-items#arrays|Items in eine anderen Frage übernehmen]]). // Teil 1: Liste der Fragen erstellen und mischen if (!isset($fragen)) { // Liste der Frage-Kennungen definieren $fragen = [ 'AB01', 'AB02', 'CC03', 'DE01', 'DE02' ]; // Die Liste zufällig mischen shuffle($fragen); // Die Rotation für eine eventuelle Wiederholung der Seite zwischenspeichern registerVariable($fragen); } // Teil 2: Fragen anzeigen foreach ($fragen as $kennung) { question($kennung); } Die IF-Konstruktion in Teil 1 in Kombination mit ''isset()'' und ''registerVariable()'' ist dafür zuständig, dass die Rotation im gesamten Interview nur ein einziges Mal vorgenommen wird. Das ist wichtig, wenn die Seite erneut aufgerufen wird (z.B. weil eine Frage nicht beantwortet wurde oder weil Sie einen "Zurück"-Knopf erlauben) oder wenn die Fragen auf getrennten Seiten präsentiert werden sollen. **Hinweis:** Falls Sie derartige PHP-Codes an unterschiedlichen Stellen im Fragebogen verwenden, dann verwenden Sie für die Liste mit den Fragen (oben: ''$fragen'') jeweils einen anderen Variablennamen (z.B. ''$fragen1'', ''$fragen2'', ''$fragen3''). Das ''isset()'' sorgt ansonsten dafür, dass keine neue Fragen-Liste definiert wird. Falls Sie die Fragen getrennt auf separaten Seiten anzeigen möchten, ändern Sie den zweiten Teil wie folgt. // Teil 2: Fragen anzeigen $i = loopPage(count($fragen)); question($fragen[$i]); ===== Fragen zusammen mit weiterem Inhalt rotieren ===== Einen Schritt weiter muss man gehen, um weitere Daten (z.B. ein Bild als Stimulus) mit den Fragen zusammen zu rotieren. Wenn also vor Frage 1 immer "bild1.png" und vor Frage 2 immer "bild2.gif" angezeigt werden soll. Aber vom Prinzip her ändert sich nichts. Im folgenden Beispiel zeigt jede Seite nur eine Kombination aus Bild und Frage. **Tipp:** Wer weniger programmieren möchte, findet in der Anleitung [[:de:create:rotation-pages]] eine einfachere Lösung. if (!isset($blocks)) { // Liste mit Frage-Kennungen und zugehörigen Bildern $blocks = [ ['AB01', 'bild1.png'], ['AB02', 'bild2.gif'], ['AB03', 'bild3.jpg'], ['AB04', 'bild4.png'] ]; // Die Liste mischen shuffle($blocks); // Die Listen auf allen Seiten verfügbar machen registerVariable($blocks); } // Anzeige der Blöcke $i = loopPage(count($blocks)); // Bild anzeigen html('

Wahlplakat

'); // Frage anzeigen question($blocks[$i][0]);