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');
}