0 votes
in SoSci Survey (dt.) by s024483 (250 points)

Hallo,

Ich habe drei multiple choice Fragen miteinander kombiniert, um folgenden Fragebogen zu kreieren:

Dabei kann für jedes Alter (von 9 - 20) angegeben werden, welche der drei angegebenen Sportarten jemand ausgeführt hat (Mehrfachantworten möglich). Hier meine Frage: Ist es irgendwie möglich, zu prüfen, ob Antworten ausgelassen wurden und dem Probanden das rückzumelden? Ich weiß, dass es spaltenweise geht (die Spalten beziehen sich ja auf die ursprünglichen Fragen), aber gibt es einen Trick, es stattdessen zeilenweise zu machen? Also, dass geprüft wird, dass pro Altersgruppe mindestens eine Antwort gegeben wurde?

1 Answer

0 votes
by SoSci Survey (330k points)

Wenn wirklich sichergestellt ist, dass Sie in jeder Zeile ein Kreuzchen erwarten, dann lässt sich das mit ein wenig PHP-Code schon realisieren.

Dafür würden Sie einfach jede Zeile (=jedes Item) durchgehen und die Kreuzchen zählen. Also auf der Folgeseite:

$missing = [];
foreach (getItems('AB01', 'all') as $item) {
  if (!(
    (value(id('AB01', $item)) == 2) ||
    (value(id('AB02', $item)) == 2) ||
    (value(id('AB03', $item)) == 2)
  )) {
    $missing[] = $item;
  }
}

if (count($missing) > 0) {
  repeatPage('problemo');
}

Das foreach arbeitet die Items/Zeilen ab. Der IF-Filter prüft, ob nicht (!) mindestens eines angekreuzt (2) wurde. Wenn ja, dann kommt die Nummer des betroffenen Items in die Liste $missing.

by s024483 (250 points)
Danke. Der Code funktioniert grundsätzlich schon bei mir, allerdings gibt es noch zwei Probleme:

1) Bei repeatPage ist es scheinbar nicht möglich, eine neue Frage einzubauen, die es Probanden ermöglicht, die Fragen zu überspringen und auf eine andere Seite weitergeitet zu werden (wenn sie wirklich keine Lust haben, jede Zeile zu prüfen). Ich habe es jedenfalls probiert und dann eine entsprechende Fehlermeldung bekommen, dass nur die Seite wiederholt werden kann, ggf. mit Fehlertext.
2) Je nach Alter der Probanden werden bei mir eine unterschiedliche Anzahl von Zeilen angezeigt wird - das führt dann bei jüngeren Probanden zu Fehlermeldungen bei der Prüfung, weil bestimmte Items nicht angezeigt werden können und dann auch nicht beantwortet werden. Code:

$items = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14); // Items 1-14 werden immer gefragt
    if (value('SD04_01') == 19) {
      $items[] = 15; // 19 year old gets one extra item
    }
    // Fragen stellen
    question('FL13','combine=FL14', 'combine=FL15', 'combine=FL16', 'combine=FL17', 'combine=FL18',  'combine=FL19',   $items);  // Combines questions
by SoSci Survey (330k points)
> 1) Bei repeatPage ist es scheinbar nicht möglich, eine neue Frage einzubauen

Das Nachhaken mit Option zum Überspringen muss in diesem Fall mittels PHP-Code implementiert werden. Und zwar können Sie auf der vorigen Seite die Frage "will nicht mehr ankreuzen" wie folgt einbinden:

if (getRoute() == 'repeat') {
  question('XY01');
}

Die Antwort auf XY01 können Sie dann in dem Filter für repeatPage() mit beachten.

> Je nach Alter der Probanden werden bei mir eine unterschiedliche Anzahl von Zeilen angezeigt

In dem Fall müssen Sie das getItems('AB01', 'all') durch das Array ersetzen, das Sie bereits auf der vorigen Seite erstellen. Den Code zum Erstellen des Arrays können Sie einfach auf die Seite mit dem Check kopieren.
by s024483 (250 points)
Großartig. getRoute funktioniert schon mal.

Wie genau muss das array eingefügt werden? Ich habe mehrere Varianten ausprobiert und bekomme immer Fehlermeldungen. Beispielcode, der nicht funktioniert:

$missing = []; foreach ($items = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
    if (value('SD04_01') == 19) {
      $items[] = 15;
    }) as $item) { if (!( (value(id('FL13', $item)) == 2) || (value(id('FL14', $item)) == 2) || (value(id('FL15', $item)) == 2) )) { $missing[] = $item; } } if (count($missing) > 0) { repeatPage('problemo');  }
by SoSci Survey (330k points)
Übernehmen Sie den PHP-Code von der vorigen Seite, wo Sie $items definieren. Nur das question() am Ende lassen Sie weg.

Und dann tauschen Sie in dem Code oben diese Zeile

foreach (getItems('AB01', 'all') as $item) {

wie folgt aus:

foreach ($items as $item) {
by s024483 (250 points)
Funktioniert. Ich bin jetzt schon weiter gekommen, als ich es überhaupt für möglich gehalten habe, also vielen Dank dafür. Meine letzten beiden Fragen wären dann:

1) Kann man die Zeile(n), welche ausgelassen wurde(n) (also wo das missing zustande gekomme ist), noch markieren?
2) In der voreingestellten Version zum Antworten überprüfen erscheint nach der Auswahl von "yes" auf "I do not want to answer", ein zusätzliches Feld "next", welches den Teilnehmer auf die nächste Seite bringt. Ich nehme an, dass ist ein html code durch das dynamische Element. Gibt es diesen Code irgendwo, so dass ich ihn hier auch einfügen könnte, um das Ganze noch hübscher/anwenderfreundlicher zu machen?

Zur Erinnerung noch mein Code: missing = []; foreach ($items as $item) { if (!( (value(id('FL13', $item)) == 2) || (value(id('FL14', $item)) == 2) || (value(id('FL15', $item)) == 2)  )) { $missing[] = $item; } } if (count($missing) > 0) { repeatPage('problemo');  }
by SoSci Survey (330k points)
ad 1) Das sollte mit markFail() möglich sein. Am besten machen Sie das direkt unter dem $missing[] = $item;

markFail(id('AB01', $item));

ad 2) Sie müssten buttonCode('next') verwenden, um den Weiter-Knopf an der Stelle einzubinden. Allerdings wird der Knopf dann am Ende der Seite verschwinden... im Prinzip könnten Sie auch den HTML-Code vom Original-Knopf (außer der HTML-ID) kopieren.
by s024483 (250 points)
Danke für die schnellen Antworten, sogar am Wochenende.

zu 1) Mein Versuch führt dazu, dass nur die Frage und das letzte Item (also die letzte Zeile der kombinierten Frage) markiert wurden, obwohl in allen Zeilen missings waren.

Code:
$missing = [];
foreach ($items as $item);
markFail(id('FL13', $item)); {
 if (!( (value(id('FL13', $item)) == 2)
   || (value(id('FL14', $item)) == 2)
   || (value(id('FL15', $item)) == 2)
))
{ $missing[] = $item;
  }
} if (count($missing) > 0) {
   repeatPage('problemo');  
}

zu 2) Ich habe es geschafft, den Button durch html code an der Stelle erscheinen zu lassen (wie das geht, steht ja hier: https://www.soscisurvey.de/help/doku.php/en:create:functions:buttoncode). Allerdings war er dann immer da und ist nicht erst erschienen, wenn jemand die Frage "I do not want to answer" mit "yes" beantwortet hat. Mir ist nicht klar, wie ich das mit einer if-Bedingung verknüpfen kann.
by SoSci Survey (330k points)
ad 1) Wie oben geschrieben: Das markFail() gehört direkt unter das $missing[] = $item; - also in den IF-Teil.

ad 2) Den Aufruf von buttonCode() und html() müssten Sie in das IF packen, wo auch die Will-nicht-Antworten-Frage angezeigt wird.
by s024483 (250 points)
Danke zum Hinweis mit 1). Funktioniert jetzt einwandfrei.

zu 2) Der Code funktioniert so, dass jetzt immer der next button unter der Frage angezeigt wird, sobald repeatPage ausgeführt wird. Er soll aber erst dann angezeigt werden, wenn auf der gleichen Seite auch "yes" ausgewählt hat (und damit klar ist, dass derjenige die Items, die dann kommen, nicht ausfüllen wird) - so wie dass bei der voreingestellten Funktion bei soscisurvey auch ist. Wie kann ich klar machen, dass nur wenn value('FI06') == 1 erfüllt ist, der next button vom Ende der Seite unter die Frage wechseln soll? Mir ist nicht klar, wie das dynamisch umgesetzt wird, weil sosci den Wert von FI06 ja erst auf der nächsten Seite ausliest (und dann ist es schon zu spät für die Funktion, die ich gerne hätte).

if (getRoute() == 'repeat') {
question('FI06');
$buttonNext = buttonCode('next');  // saves the HTML code for the
 
// Insertion of the HTML codes into the questionnaire, e.g. in a table
html('
  <table cellspacing="10" cellpadding="0">
  <colgroup>
    <col width="60%">
    <col width="40%">
  </colgroup>
  <tr>
    <td>Press this button
        to go to the next page &rarr;</td>
    <td>'.$buttonNext.'</td>
  </tr>
    </table>
');
}
by SoSci Survey (330k points)
>  Er soll aber erst dann angezeigt werden, wenn auf der gleichen Seite auch "yes" ausgewählt hat

Dann müssen Sie noch ein klein wenig mit JavaScript basteln:
https://www.soscisurvey.de/help/doku.php/de:create:dynamic

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

...