====== Direktes Feedback für Befragte ====== Diese Anleitung beschreibt unterschiedliche Anwendungsfälle, wenn die Befragten nach dem Klick auf "Weiter" direkt ein Feedback bekommen sollen, ob ihre Antwort richtig oder falsch war. Solch ein direktes Feedback wird beispielsweise in Online-Schulungen eingesetzt. Der der Ausgestaltung des Feedbacks gibt es sehr viele Möglichkeiten. Diese Anleitung deckt exemplarisch einige dieser Möglichkeiten ab. Das Grundprinzip ist aber stets dasselbe: Mittels ''[[:de:create:functions:value]]'' wird die Antwort des/der Befragten aus dem Datensatz ausgelesen und der korrekten Antwort gegenübergestellt. Die korrekte Antwort wird direkt im PHP-Code kodiert oder (bei großen Projekten mit vielen Fragen) in der [[:de:create:databank]] abgelegt. Je nach Ergebnis des Abgleichs wird dann mittels [[:de:create:php-filters|PHP-Filter]] angezeigt, dass die Antwort korrekt ist oder eben nicht. Im Fall einer falschen Antwort kann man optional die korrekte Antwort anzeigen und/oder die Befragten müssen mittels "Zurück" zur vorherigen Seite zurückkehren und ihre Antwort korrigieren. Diese Anleitung ist in zwei Teile gegliedert. Im ersten Teil wird erklärt, wir man die Richtigkeit der Antwort in unterschiedlichen Designs überprüft. Im zweiten Teil werden unterschiedliche Varianten des Feedbacks erklärt. **Tipp:** Wenn Sie ein Gesamtergebnis ausgeben möchten, z.B. den Anteil korrekter Antworten, dann lesen Sie die Anleitung [[:de:create:points]]. ===== Prüfen der Antwort ===== Der Abgleich zwischen der gegebenen Antwort und der korrekten Antwort hängt von zwei Faktoren ab: * Zum einen das Antwortformat, hier ist besonders wichtig, ob man nur einen Wert vergleicht (z.B. in einer einfachen Auswahl) oder ob mehrere Werte verglichen werden müssen (z.B. in einer Mehrfachauswahl oder wenn die Antwort mehrere Einzelantworten beinhaltet). * Zum anderen ist für die Implementierung wichtig, ob das Feedback nur für eine Handvoll Fragen benötigt wird oder ob es um einen längeren Fragenkatalog geht. Im zweiten Fall ist es zielführend, mit [[:de:create:array|Arrays]] und ''[[:de:create:functions:looptopage]]'' zu arbeiten, sodass man den PHP-Code nicht vielfach kopieren muss. In den folgenden Beispiele wird jeweils nur ein Text "Ihre Antwort ist richtig" (Text mit der Kennung "FB01") oder "Ihre Antwort ist falsch" (Kennung "FB02") als Feedback angezeigt. Weiter unten in der Anleitung wird erklärt, wie ein elaboriertes Feedback implementiert wird. Der PHP-Code wird jeweils auf einer __zusätzlichen__ Seite __nach__ der Seite mit der eigentlichen Frage platziert. Ausnahme ist die Lösung mit ''loopToPage()''. Dort werden für eine ganze Reihe von Fragen nur zwei Seiten benötigt, die mehrfach angezeigt werden: Eine Seite für die Fragen (es wird in jeder Wiederholung eine andere Frage gezeigt) und eine Seite für das Feedback. ==== Einfache Auswahl ==== Dieser grundlegende Vergleich zwischen einer Antwort und dem korrekten Wert ist zugleich die Grundlage für alle weiteren Filter. Im folegnden PHP-Code wird überprüft, ob in der Auswahlfrage "AB01" die Option mit dem Antwortcode 3 ausgewählt wurde: if (value('AB01') == 3) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } ==== Mehrfachauswahl ==== Eine Mehrfachauswahl hat für jede Auswahloption eine Variable. Diese kann den Wert 1 (nicht angekreuzt) oder 2 (angekreuzt) annehmen. Um eine Mehrfachauswahl korrekt zu beantworten, muss für jede Auswahloption überprüft, worden, ob diese korrekte benatwortet wurde -- also ob die korrekt ausgewählt oder korrekt freigelassen wurde. Nehmen wir als Beispiel eine Mehrfachauswahl AB02 mit 4 Antwortoptionen, von denen die zweite und vierte angekreuzt werden müssen,um korrekt zu antworten: * (AB02_01) Apfel * (AB02_02) Aubergine * (AB02_03) Erdbeere * (AB02_04) Erdapfel Für die Überprüfung gibt es nun zwei Möglichkeiten. Der erste Fall verbindet 4 einzelne Antwortprüfungen mittels logischem "Und" ([[:de:create:filter-boolean]]). Dies ist relativ einfach, aber sehr unhandlich: if ((value('AB02_01') == 1) && (value('AB02_02') == 2) && (value('AB02_03') == 1) && (value('AB02_04') == 2)) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } Denselben Code kann man auch ein wenig übersichtlicher schreiben, das macht ihn aber nur wenig handlicher: if ( (value('AB02_01') == 1) && (value('AB02_02') == 2) && (value('AB02_03') == 1) && (value('AB02_04') == 2) ) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } Eleganter wird es, wenn man das korrekte Antwortschema als Array definiert (''[1,2,1,2]'') und diese Liste mit der Liste der gegeben Antworten vergleicht, wie sie ''[[:de:create:functions:valuelist]]'' liefert. Allerdings muss hier noch die Funktion ''array_values()'' verwendet werden, denn ''valueList()'' liefert auch die Variablen-Kennungen, welche den Vergleich stören würden. $antwort = array_values(valueList('AB02')); $korrekt = [1,2,1,2]; if ($antwort == $korrekt) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } Falls man etwas mehr Flexibilität benötigt, kann man auch mit einer FOR-Schleife mehrere Variablen vergleichen (siehe unten). ==== Vergleich mehrerer Variablen ==== Wenn eine Seite mehrere Fragen umfasst, dann kann man auch dies mit ''valueList()'' lösen wie oben bei der Mehrfachauswahl gezeigt. Allerdings wird das aufwändiger, weil die Variablennamen u.U. einzeln angegeben werden müssen. Als Beispiel nehmen wir die beiden Fragen "AB01" und "AB02", welche beide richtig beantwortet werden müssen. Also eine 3 für die Variable "AB01" und die Werte 1, 2, 1, 2 für die Variablen "AB02_01" bis "AB02_04". $antwort = array_values(valueList(['AB01', 'AB02_01', 'AB02_02', 'AB02_03', 'AB02_04'])); $korrekt = [3,1,2,1,2]; if ($antwort == $korrekt) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } Eine alternative Lösung ist die Verwendung einer FOR-Schleife. Dabei werden die Variablen-Kennung und die korrekten Antworten zunächst als Array definiert und dann in der Schleife einzeln überprüft. Wenn ein Vergleich falsch ist, ist die komplette Antwort falsch. $solution = [ 'AB01' => 3, 'AB02_01' => 1, 'AB02_02' => 2, 'AB02_03' => 1, 'AB02_04' => 2 ]; $allRight = true; foreach ($solution as $varID => $correct) { if (value($varID) != $correct) { $allRight = false; } } if ($allRight) { text('FB01'); // Antwort korrekt } else { text('FB02'); // Antwort falsch } ===== Auf falsche Antworten reagieren ===== Die Reaktion auf eine richtige oder falsche Antwort kann ganz unterschiedlich gestaltet werden. Wesentliche Bausteine sind: * Die PHP-Funktion ''[[:de:create:functions:text]]'' zur Anzeige eines vordefinierten Textes. * Die PHP-Funktion ''[[:de:create:functions:option|option('nextbutton', false)]]'' zum Ausblenden des Weiter-Knopfes, sodass Befragte erst auf die vorherige Seite zurückkehren und die Antwort korrigieren müssen. * Die PHP-Funktion ''[[:de:create:functions:repeatpage]]'', um eine Meldung zu zeigen und direkt zur vorigen Seite zurückzukehren. * Die PHP-Funktionen ''[[:de:create:functions:getitems]]'', ''[[:de:create:functions:getitemtext]]'' und ''[[:de:create:functions:html]]'', um die vorherige Frage nochmal anzuzeigen und falsche/richtige Antwortoptionen zu markieren. ==== Einen Text anzeigen ==== Die einfachste Variante, nämlich einen Text "Ihre Antwort war richtig" zu zeigen, wurde oben bereits mehrfach verwendet. Wenn Sie im Fragenkatalog in eine Rubrik Ihrer Wahl einen //Text hinzufügen// und für die //Darstellung// die Option "Formatierter Text" auswählen, können Sie den Text auch ein klein wenig gestalten. Wenn Sie den Text etwas ansprichsvoller gestalten möchten, wählen bei //Darstellung// die Option "HTML-Code" und verwenden Sie HTML und CSS ([[:de:create:texts#texte_formatieren|Texte formatieren]]):
Ihre Antwort ist richtig.
Zur weiteren Gestaltung können Sie auch Bilder verwenden, siehe [[:de:create:images]]. Die Einbindung des Textes erfolgt, wie oben gezeigt, mittels ''text()''. Das folgende Beispiel geht davon aus, dass die Text für die positive Rückmeldung die Kennung "FB01" und der Text für die negative Rückmeldung die Kennung "FB02". Die [[:de:create:variables#php-variablen|PHP-Variable]] ''$allRight'' wäre weiter oben im PHP-Code definiert worden -- etwa so wie im Beispiel oben. Im IF-Filter kann natürlich auch eine andere Bedingung stehen (siehe oben). if ($allRight) { text('FB01'); } else { text('FB02'); } ==== Weiter-Knopf blockieren ==== Mit der Funktion ''[[:de:create:functions:option|option('nextbutton', false)]]'' kann man bei einer falschen Antwort auch den Zurück-Knopf ausblenden. if ($allRight) { text('FB01'); } else { text('FB02'); option('nextbutton', false); } ==== Direkt zur vorigen Seite springen ==== Mit der Funktion ''[[:de:create:functions:repeatpage]]'' kann man im Fall einer falschen Antwort auch direkt die Seite mit der Frage wiederholen. if (!$allRight) { repeatPage('FB02'); } Die positive Meldung wäre in diesem Fall obsolet. ===== Detailliertes Feedback ===== Etwas aufwändiger ist es, wenn man die Frage und die falschen und richtigen Antworten direkt als Feedback zeigen möchte. Der folgende PHP-Code prüft zunächst die Antworten auf unterschiedliche Fragen "AB01" bis "AB05" und zeigt dann für jede Teilfrage an, ob diese korrekt beantwortet wurde oder nicht. // Hier die Fragen und die korrekten Antworten eintragen $antworten = [ 'AB01' => 1, 'AB02' => 2, 'AB03' => 2, 'AB04' => 1, 'AB05' => 1 ]; // Hier folgt der PHP-Code für die Anzeige foreach ($antworten as $frage => $correct) { html('
'.getItemtext($frage, 'question').'
'); $antwort = value($frage); if ($antwort == $correct) { html('
✔️ '.getItemtext($frage, $antwort).'
'); } else { html('
❌ '.getItemtext($frage, $antwort).'
'); html('
⚠️ '.getItemtext($frage, $correct).'
'); } html('
'); } // Hier das Layout pageCSS(' div.question { margin-bottom: 3em; } div.question div.text { font-weight: bold; margin-bottom: 0.5em; } div.question div.correct { margin-bottom: 0.5em; color: green; } div.question div.wrong { margin-bottom: 0.5em; text-decoration: line-through; } div.question div.better { margin-bottom: 0.5em; color: green; font-weight: bold; } ');
===== Viele Fragen ===== Wenn eine größere Anzahl Fragen auf einzelnen Seiten präsentiert werden soll, dann kommt die Funktion ''loopToPage()'' zum Einsatz. Die Liste der Fragen inklusive Antworten wird in einem Array definiert. Im Fragebogen werden zwei Seiten benötigt. Die erste Seite bekommt im folgenden Beispiel die [[:de:glossary#seitenkennung|Seitenkennung]] "frage", die zweite Seite bekommt die Seitenkennung "feedback". Auf der Seite "frage" wird die Liste der Fragen und korrekter Antworten definiert. Im folgenden Beispiel für Mehrfachauswahlfragen "AB02" bis "AB06". Mittels ''registerVariable()'' wird dieses Array auch für Seite 2 verfügbar gemacht. $fragen = [ 'AB02' => [1,2,1,2], 'AB03' => [2,2,1,1], 'AB04' => [2,1,1,2], 'AB05' => [1,2,2,1], 'AB06' => [1,1,1,2] ]; registerVariable($fragen); $i = loopToPage('feedback', count($fragen)); // Frage anzeigen $frageIDs = array_keys($fragen); $frageID = $frageIDs[$i]; question($frage); Auf der zweiten Seite "feedback" wird dann die Antwort überprüft und das Feedback angezeigt. $i = loopIndex(); $frageIDs = array_keys($fragen); $frageID = $frageIDs[$i]; $correct = $fragen[$frageID]; $answer = array_values(valueList($frageID)); if ($answer == $correct) { text('FB01'); } else { text('FB02'); }