0 votes
in SoSci Survey (dt.) by u085794 (270 points)

Lieber Online-Support,

ich habe mal wieder ein Brett vorm Kopf.

Der Code soll auf ein beantwortetes Item zurückgreifen. Da das relevante Item eine Freitexteingabe ist, will ich wenigstens Groß- und Kleinschreibung ignorieren, Tippfehler sind dann halt so. Dabei soll der Code die Frage wiederholen, die richtige Antwort in grün, die falsch in rot darstellen. Bei falscher Antwort soll die richtige Antwort und ein Hinweis folgen.

Die Zeile 'Die richtige Antwort: ' . $richtig; wird mit allen Versuchen, die ich bisher gestartet habe, nie richtig angezeigt. Wo liegt der Fehler? Ich danke schonmal in Voraus für Aufklärung!

Da ich für ein Itemset einfaches Feedback geben möchte (20 Vokabeln, für das andere elaboriertes Feedback), bin ich auch gerade am Überlegen, wie man sowas schlau automatisieren kann. Es handelt sich um persische Vokabeln, daher habe ich sie aktuell in Textfelder zu den Items geschrieben. Das ganze wird nur sehr aufwändig einzupflegen. Falls es dafür eine elegantere Lösung gibt, wäre ich über Vorschläge dankbar.

Beste Grüße & vielen Dank für die Unterstützung!

$html = '<table>';
$itemtext = getItemtext('T102', 'question');
$antwort = value('T102_01', 'text');
$richtig = value('T101'); // Wert von T101 wird zugewiesen

// Überprüfen, ob die Antwort "pflaume" (case-insensitive) ist
if (strtolower($antwort) == 'pflaume') {
    $antwortFarbe = 'green';
} else {
    $antwortFarbe = 'red';
}

$html .= 
    '<tr>
       <td>' . $itemtext . '</td>
     </tr>
     <tr>
       <td>Ihre Antwort:</td>
     </tr>
     <tr>
       <td style="color: ' . $antwortFarbe . ';">' . $antwort . '</td>
     </tr>';

$html .= '</table>';
html($html);

// Überprüfen, ob die Antwort korrekt ist
if (strtolower($antwort) == 'pflaume') {
    text('FB_cor'); // Antwort korrekt
} else {
    text('FB_incor'); // Antwort falsch
    'Die richtige Antwort: ' . $richtig; // richtige Antwort korrekt ausgegeben
    text('T104');  // Elaboriertes Feedback
}

1 Answer

0 votes
by SoSci Survey (347k points)

Leerzeichen am Anfang und Ende werden Sie mit trim() los, die Groß-Kleinschreibung können Sie mit strtolower() nivellieren - allerdings kann das keine Umlaute, aber die sollten die Nutzer:innen hoffentlich nicht groß schreiben. Falls doch, müsste man noch eine Umschreibung von Umlauten vornehmen (ö -> oe etc.).

Okay, also, wenn wir die beiden Dinge haben, dann

if (strtolower(trim($a)) == strtolower(trim($b))) { ... }

So, woher kommen die beiden Dinge? Ich würde da ein Array mit richtigen verwenden, wenn wir im Bereich 5-20 sind. Bei deutlich mehr Wörtern würde ich eher die Datenbank für Inhalte nutzen. Wenn man also nun das Array hätte, sähe es so aus:

$richtig = [
  1 => 'Apfel',
  2 => 'Birne', 
  3 => 'Clementine',
  4 => 'Dattel'
];

Wenn Ihre Abfrage nun in TX01_01 bis TX01_04 steht, könnte das mit loopToPage() wie folgt aussehen.

// Erste Seite
$i = loopToPage('second', 4);
question('TX01', [$i + 1]);

// Zweite Seite
$richtige = [
  1 => 'Apfel',
  2 => 'Birne', 
  3 => 'Clementine',
  4 => 'Dattel'
];
$i = loopIndex();
$antwort = value(id('TX01', $i + 1));
$richtig = $richtige[$i + 1];
u.s.w.
by u085794 (270 points)
Ah, super, das werde ich morgen mal ausprobieren. Bleibt nur noch das Problem mit {'Die richtige Antwort: ' . $richtig;} -> warum wird hier nichts ausgegeben? Wie müsste ich das im Code implementieren? Danke im Voraus.
by SoSci Survey (347k points)
Ich würde darauf tippen, dass $richtig = value('T101') in Ihrem Code einfach nicht die richtige Antwort geliefert hat. Deshalb mein Gegenvorschlag mit dem Array. Was ist T101 denn?
by u085794 (270 points)
T101 ist ein Textfeld, das ich bei der Frage angelegt habe. Vorher stand da $richtig = text('T101'), was ebenso wenig funktioniert hat. Ebenso habe ich schon mit Textbausteinen rumexperimentiert. Alle drei Sachen, die ich probiert habe, das heißt $richtig = value('Kennung'), $richtig = 'Kennung' oder $richtig = Text('Kennung'). Seit $richtig = 'Pflaume'; auch nicht funktioniert hat (Minimalbeispiel), weiß ich nicht, welche Tomaten ich auf den Augen habe... :)
by SoSci Survey (347k points)
> T101 ist ein Textfeld, das ich bei der Frage angelegt habe.

Woher würde das die richtige Antwort bekommen?

>  Seit $richtig = 'Pflaume'; auch nicht funktioniert hat (Minimalbeispiel), weiß ich nicht, welche Tomaten ich auf den Augen habe... :)

Platzieren Sie direkt darunter ein debug($richtig) und ein html('<p>Richtig: '.$richtig.'</p>');

Wenn das funktioniert, können wir uns weiter vorarbeiten :) Der PHP-Code, den ich vorgeschlagen habe kommt ja im Prinzip nur oberhalb Ihres PHP-Codes, und Sie lassen dann nur die beiden folgenden Zeilen weg:

$antwort = value('T102_01', 'text');
$richtig = value('T101'); // Wert von T101 wird zugewiesen

Oh ja, und Ihrem Code fehlte einfach nur die Info, was mit dem zusammengesetzten String passieren soll, also der html()-Befehl, damit es zur Ausgabe wird:

} else {
    text('FB_incor'); // Antwort falsch
    html('Die richtige Antwort: ' . $richtig); // richtige Antwort korrekt ausgegeben
    text('T104');  // Elaboriertes Feedback
}
by u085794 (270 points)
ich habe jetzt nochmal die Strategie geändert und auf eine Datenbank zurückgegriffen. Die Hilfedatei dazu war sehr aufschlussreich. Z001 ist eine interne Variable, die ich mit einer Urne verknüpft habe. Ich weiß aber nicht, ob das funktioniert, da alle Personen alle 20 Ausprägungen sehen sollen, nur halt randomisiert,

Die Grundform von Seite 1 (Abfrage) sieht jetzt so aus:

$word = urnDraw('block_1', 'Z001');
$key = 'A'.value('Z001_01');  // Ein "A" vor die Zahl schreiben
$inhalt = dbGet($key);

html('
  <h1>'.$inhalt[0].'</h1>
');

$chosen = 'T1_' . value('Z001_01');
question($chosen);

Ich habe für alle 20 Items einzelne Abfragen angelegt, die jetzt ordnungsgemäß angezeigt werden. Die Position habe ich jetzt nicht extra mitgeloggt, weiß aber, wie das geht.

Für die Seite 2 bin ich schon an der basalen Wiederholung gescheitert:

$antwort = value('T1_' . value('Z001_01'), text);

html('
  <h2>'.$antwort.'</h2>
');

Wie kann ich auf die vorher ausgewählt Seite und die entsprechende Antwort referenzieren? Das elaborierte Feedback steht nun in Zeile 3 der Datenbank. Die müsste ich doch auch in den Vergleich reingebastelt bekommen. Leider kriege ich das gerade nicht zusammen...
by SoSci Survey (347k points)
> Z001 ist eine interne Variable, die ich mit einer Urne verknüpft habe.

In aller Regel ist der Zufallsgenerator einfacher und erlaubt weniger Fehler als die Urne. Nur als Anregung.

Mit dem Zufallsgenerator bekommen Sie es auch hin, dass 20 unterschiedliche Werte gezogen werden. Die Urne garantiert Ihnen das nicht.

> $word = urnDraw('block_1', 'Z001');

Sie verwenden $word nicht weiter, das ist auch gut, denn da bekommen Sie nicht das Wort, sondern eine Info, wie häufig die Urne schon geleert wurde.

> $chosen = 'T1_' . value('Z001_01');
> question($chosen);

Das ist m.E. schon nicht ganz korrekt. Ich weiß jetzt nicht genau, was in Ihrer Urne steht, aber eine Fragekennung hat keinen Unterstrich an Position 3. Das 'T1_' scheint mir daher falsch.

> Für die Seite 2 bin ich schon an der basalen Wiederholung gescheitert

Ich denke, das es auch hier wieder an der Kennung scheitert. Lassen Sie sich doch mal anzeigen, was Sie da zusammenbauen in der Klammer:

debug('T1_' . value('Z001_01'));
by u085794 (270 points)
ich habe jetzt so viel umgebaut, dass ich eine neue Frage stelle. Ich habe mich ein bisschen von der Hilfedatei "einwickeln lassen", da ist die Nutzung von Datenbanken nur mit einer Urne erklärt. Danke für die Ideen!

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...