0 votes
in SoSci Survey (dt.) by s123746 (155 points)

Ich habe ein Textfeld und vier Fragen nebeneinander pro Seite (davon mehrere Seiten aufeinanderfolgend). Die Fragen sind unterschiedliche Variablen mit gleichem Wortlaut (Concept 1-4), nur der Text im Textfeld (jeweiliges Item) verändert sich.

Ich würde gerne einrichten, dass die Reihenfolge dieser vier Fragen (diese Seite: D101-D104) auf den einzelnen Seiten zufällig erscheint - allerdings nur pro Person, die den Fragebogen ausfüllt. D. h. die vier Fragen sollen innerhalb der Beantwortung immer in der gleichen Reihenfolge auftreten, aber für unterschiedliche Teilnehmende in zufällig unterschiedlicher Reihenfolge.

Ich freue mich über Hilfe, wie ich das umsetzen kann. Vielen Dank!

Die Seite pro Frage sieht bisher in PHP- bzw. HTML-Code so aus:
(Instruktionstext)

    pageCSS('
    tr:first-child th {
        border-bottom: 2px solid black;
    }
');
<table width="100%" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed; width: 100%;">
<colgroup>
    <col width="20%">
    <col width="20%">
    <col width="20%">
    <col width="20%">
    <col width="20%">
  </colgroup>
<tr>
    <th>Item</th>
    <th>Concept 1</th>
    <th>Concept 2</th>
    <th>Concept 3</th>
    <th>Concept 4</th>
  </tr>
    <td>

(Text für "Item", pro Seite unterschiedlich)

    </td>
        <td>
    
    question('D101','show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
    <td>

question('D102','show-title=yes', 'show-explanation=no', 'spacing=0');

    </td>
        <td>
    
    question('D103','show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
    <td>

question('D104','show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
  </tr>
</table>

dann folgt noch:

<script type="text/javascript">
<!--
SoSciTools.attachEvent(window, "load", function(evt) {

    SoSciTools.submitButtonsHide();
});

// -->
</script>
<script type="text/javascript">
<!--

SoSciTools.attachEvent(window, "load", function(evt) {

    var dropdowns = document.querySelectorAll('select[id^="D102"], select[id^="D103"], select[id^="D104"], select[id^="D101"]');


    dropdowns.forEach(function(dropdown) {
        SoSciTools.attachEvent(dropdown, "change", function() {

            var allDropdownsAnswered = true;
            dropdowns.forEach(function(otherDropdown) {
                if (otherDropdown !== dropdown && otherDropdown.selectedIndex === 0) {
                    allDropdownsAnswered = false;
                }
            });

            if (allDropdownsAnswered) {
                SoSciTools.submitPage();
            }
        });
    });
});
// -->
</script>
by s109993 (12.0k points)
Haben Sie sich dieser Kapitel dazu angeschaut? Hier wird relativ gut beschrieben, wie sie Seiten zufällig rotieren könne: https://www.soscisurvey.de/help/doku.php/de:create:rotation-pages?s[]=%2Azuf%C3%A4llige%2A&s[]=%2Aseiten%2A

1 Answer

0 votes
by SoSci Survey (327k points)
edited by SoSci Survey

Möchten Sie nur die Fragen rotieren, oder auch die Titel, die darüber stehen ("Concept 1" u.s.w.) zusammen mit den Fragen?

Ich würde empfehlen, dass Sie (pro Seite) einen Zufallsgenerator mit den 4 Kennungen anlegen, und daraus auch jeweils 4 Codes ziehen.

Auf Basis dieser Ziehung können Sie dann die question()-Befehle anpassen. Das könnte so aussehen.

$fragen = array_values(valueList('RG01', NULL, 'label'));  //bearbeitet

Und aus

 question('D101','show-title=yes', 'show-explanation=no', 'spacing=0');

würde dann

question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');
by s123746 (155 points)
Dankeschön, das Rotieren der Seiten habe ich bereits mit Zufallsgenerator angelegt.
Die Titel "Concept 1" usw. sollen so stehen bleiben, nur die Dropdown-Fragen sollen auf den (rotierenden) Seiten pro Teilnehmende in zufälliger Reihenfolge anzeigen lassen (innerhalb der Beantwortung aber gleichbleibend).

Ich habe jetzt Zufallsgeneratoren für jede Seite mit den vier Fragen und vier Ziehungen erstellt. Kommen diese dann wieder jeweils vor die Seiten mit den dazugehörigen Fragen und darunter die Codes

$fragen = array_value(valueList('RG01'));

(bzw. Statt RG01 die entsprechende Bezeichnung des Zufallsgenerators) und

question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');

und danach jeweils die bereits erstellte Seite mit den vier Fragen?

Oder ändere ich die Codes

question('D101','show-title=yes', 'show-explanation=no', 'spacing=0');

(bzw. jeweilige Bezeichnung der Frage) überall zu

question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0'); ?
by SoSci Survey (327k points)
> Kommen diese dann wieder jeweils vor die Seiten mit den dazugehörigen Fragen und darunter die Codes

Ja.

> Oder ändere ich die Codes

Ja, Sie ersetzen die fixen Frage-Kennungen ('D101', 'D102', ...) durch das, was der Zufallsgenreator gezogen hat ($fragen[0], $fragen[1], ...)
by s123746 (155 points)
Danke! Nachdem ich das so umgesetzt habe, erhalte ich nun (nur für die erste Seite) die Warnung: "Die Funktion array_value() ist nicht bekannt." im PHP-Code unter den Zufallsgeneratoren. Es scheint noch nicht zu funktionieren..
by SoSci Survey (327k points)
Pardon, die Funktion heißt array_values(), da fehlte noch ein "s" im Beispiel-Code.
by s123746 (155 points)
Ohja, danke, damit ist die Warnung weg. Leider funktioniert die zufällige Abfolge dennoch nicht. Beim Testen erscheint folgende Fehlermeldung:

There is no question ID in question().
Questionnaire Error (page 11)
There is an error in the PHP code:
Questionnaire Error: Undefined variable $fragen
line: 3

PHP code

001 namespace s2survey\questionnaire\environment;
002
003 question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');
004 return 'ok';
Questionnaire Error: Trying to access array offset on value of type null
line: 3

PHP code

001 namespace s2survey\questionnaire\environment;
002
003 question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');
004 return 'ok';
by SoSci Survey (327k points)
Haben Sie denn die erste Zeile aus meinem Beispiel-Code oben im (gleichen) PHP-Code stehen? Dort wird $fragen ja definiert.
by s123746 (155 points)
Ich habe jeweils eine Seite mit dem Zufallsgenerator (z. B. 1 = D201, 2 = D202, 3 = D203, 4 = D204, mit jeweils bisher 0 Ziehungen und 4 Zetteln pro Interview) und darunter den PHP-Code $fragen = array_values(valueList('RG01')); (bzw. Bezeichnung des jeweiligen Zufallsgenerators)
Auf der nächsten Seite folgen dann die Codes wie ich sie hier ganz oben beschrieben habe, außer die Zeilen, z. B.:
question('D101','show-title=yes', 'show-explanation=no', 'spacing=0'); geändert zu question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');
question('D102','show-title=yes', 'show-explanation=no', 'spacing=0'); geändert zu question($fragen[1], 'show-title=yes', 'show-explanation=no', 'spacing=0');
question('D103','show-title=yes', 'show-explanation=no', 'spacing=0'); geändert zu question($fragen[2], 'show-title=yes', 'show-explanation=no', 'spacing=0');
question('D104','show-title=yes', 'show-explanation=no', 'spacing=0'); geändert zu question($fragen[4], 'show-title=yes', 'show-explanation=no', 'spacing=0');
by SoSci Survey (327k points)
Die Zeile mit dem $fragen=... muss auf jeder Seite verwendet werden, wo Sie auf $fragen zugreifen möchten. Im selben "PHP-Code" Element, weil PHP-Variablen standardmäßig nur innerhalb eines solchen Blocks gültig sind.
by s123746 (155 points)
Okay, dann kommt zu Beginn der Seite kommt der Zufallsgenerator R003 und danach:
 pageCSS('
    tr:first-child th {
        border-bottom: 2px solid black;
    }
');
<table width="100%" cellspacing="0" cellpadding="0" border="0" style="table-layout:fixed; width: 100%;">
<colgroup>
    <col width="20%">
    <col width="20%">
    <col width="20%">
    <col width="20%">
    <col width="20%">
  </colgroup>
<tr>
    <th>Item</th>
    <th>Concept 1</th>
    <th>Concept 2</th>
    <th>Concept 3</th>
    <th>Concept 4</th>
  </tr>
    <td>
((hier kommt das Item als Text-Element))
</td>
        <td>
    
    $fragen = array_values(valueList('R003'));
question($fragen[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
    <td>

$fragen = array_values(valueList('R003'));
question($fragen[1], 'show-title=yes', 'show-explanation=no', 'spacing=0');

    </td>
        <td>
    
$fragen = array_values(valueList('R003'));
question($fragen[2], 'show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
    <td>

$fragen = array_values(valueList('R003'));
question($fragen[3], 'show-title=yes', 'show-explanation=no', 'spacing=0');

</td>
  </tr>
</table>
<script type="text/javascript">
<!--
SoSciTools.attachEvent(window, "load", function(evt) {

    SoSciTools.submitButtonsHide();
});

// -->
</script>
<script type="text/javascript">
<!--

SoSciTools.attachEvent(window, "load", function(evt) {

    var dropdowns = document.querySelectorAll('select[id^="D102"], select[id^="D103"], select[id^="D104"], select[id^="D101"]');


    dropdowns.forEach(function(dropdown) {
        SoSciTools.attachEvent(dropdown, "change", function() {

            var allDropdownsAnswered = true;
            dropdowns.forEach(function(otherDropdown) {
                if (otherDropdown !== dropdown && otherDropdown.selectedIndex === 0) {
                    allDropdownsAnswered = false;
                }
            });

            if (allDropdownsAnswered) {
                SoSciTools.submitPage();
            }
        });
    });
});
// -->
</script>

?
by SoSci Survey (327k points)
Das wäre eine Möglichkeit. Funktioniert es denn?
by s123746 (155 points)
edited by s123746
Leider nicht - nun kommt die Fehlermeldung "There is no question with the ID 1 in this project." für die vier Fragen und sie erscheinen nicht auf der Seite. Ich habe es so umgesetzt wie oben beschrieben auf allen Seiten.
Die Debug-Information lautet z.B.:
[Processing]    Create page 11 in questionnaire base
[Content]    Create question R004
[Information]    The random generator R004 drew these codes: 3, 4, 1, 2
[Content]    Create question AC06
[Content]    Create question D206
[Information]    valueList(R004) = Array [R004x01:3, R004x02:4, R004x03:1, ...]
[Information]    valueList(R004) = Array [R004x01:3, R004x02:4, R004x03:1, ...]
[Information]    valueList(R004) = Array [R004x01:3, R004x02:4, R004x03:1, ...]
[Information]    valueList(R004) = Array [R004x01:3, R004x02:4, R004x03:1, ...]
[Content]    Create question J001
[Content]    Create question D205
by SoSci Survey (327k points)
Im Aufruf von valueList() fehlt noch ein Parameter 'label' und davor ein NULL, das hatte ich oben übersehen:

$fragen = array_values(valueList('RG01', NULL, 'label'));

Damit sollte der besagte Fehler behoben sein.
by s123746 (155 points)
Vielen Dank, damit funktioniert es jetzt!
Allerdings werden damit die vier Fragen auf jeder Seite in einer neuen zufälligen Reihenfolge präsentiert. Um die kognitive Beanspruchung für die Teilnehmenden möglichst gering zu halten, würde ich gerne eine zufällige Reihenfolge der vier Fragen auf allen aufeinanderfolgenden Seiten beibehalten. Wäre das auch möglich (und wenn ja, wie)?
by SoSci Survey (327k points)
> Allerdings werden damit die vier Fragen auf jeder Seite in einer neuen zufälligen Reihenfolge präsentiert.

Es sind jedesmal neue Fragen, korrekt? Dann müssten Sie auf der Seite zusätzlich in einem Array definieren, die die Kennungen jeweils sind, z.B.

$fragen = [
  1 => 'AB01',
  2 => 'AB02',
  3 => 'AB03',
  4 => 'AB04'
];
$order = array_values(valueList('RG01'));  // absichtlich ohne "label"
$sortiert = [];
foreach ($order as $i) {
    $sortiert[] = $fragen[$i];
}

Und dann im weiteren Code $sortiert statt $fragen verwenden.
by s123746 (155 points)
Dankeschön. Genau, es sind auf jeder Seite neue Fragen.

Ich habe jetzt den PHP-Code:

$fragen = [
  1 => 'D101',
  2 => 'D102',
  3 => 'D103',
  4 => 'D104'
];
$order = array_values(valueList('R003'));  // absichtlich ohne "label"
$sortiert = [];
foreach ($order as $i) {
    $sortiert[] = $fragen[$i];
}

direkt unter dem Zufallsgenerator, dann den Text für die Instruktion und den Code für die Tabelle. Und im Tabellen-Code dann

$sortiert = array_values(valueList('R003', NULL, 'label'));
question($sortiert[0], 'show-title=yes', 'show-explanation=no', 'spacing=0');

von [0] bis [3] für die vier Fragen.
Die Reihenfolge ändert sich leider immer noch auf den unterschiedlichen Seiten.

Oder erstelle ich dann nur einen Zufallsgenerator auf der ersten Seite und verweise auf den (also R003) dann auch auf den folgenden Seiten, z. B. dann auf der nächsten Seite:

$fragen = [
  1 => 'D201',
  2 => 'D202',
  3 => 'D203',
  4 => 'D204'
];
$order = array_values(valueList('R003'));  // absichtlich ohne "label"
$sortiert = [];
foreach ($order as $i) {
    $sortiert[] = $fragen[$i];
}
by SoSci Survey (327k points)
> $sortiert = array_values(valueList('R003', NULL, 'label'));

Diese Zeile muss noch raus - Sie haben $sortiert ja schon im vorigen Teil definiert.

Wenn Sie es nicht ständig neu definieren möchten, dann ergänzen Sie im ersten Block noch ein

....
foreach ($order as $i) {
    $sortiert[] = $fragen[$i];
}
// Ergänzung
registerVariable($sortiert);
by s123746 (155 points)
Großartig, vielen Dank, jetzt klappt alles!

Wie kann ich noch eine Variable erstellen, um die Art der Reihenfolge, die den Teilnehmenden angezeigt wurde, zu speichern (um diese später vergleichen zu können)?
by SoSci Survey (327k points)
Im Prinzip haben Sie die Reihenfolge schon in R003x01 bis R003x04 ... je nachdem, wie Sie das auswerten möchten, können Sie aber z.B. noch die Rangordnung speichern, vgl. https://www.soscisurvey.de/help/doku.php/de:create:functions:put#randomisierung_i

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

...