0 votes
in SoSci Survey (dt.) by s248936 (120 points)

Liebes Support-Team,

ich möchte ungefähr 110 Items zu einer Frage auf mehrere Seiten verteilen (20 Items pro Seite).

Dafür habe ich folgenden Code benutzt:

if (!isset($itemsAN03)) {
$itemsAN03 = getItems('AN03', 'all');

shuffle($itemsAN03);  
$itemsAN03 = array_chunk($itemsAN03, 20);
registerVariable($itemsAN03);
} 
$i = loopPage(count($itemsAN03));
question('AN03', $itemsAN03[$i]);

Jetzt kommt bei mir folgende Fehlermeldung, wenn ich den Fragebogen teste:

![][1]

Außerdem kommt im Bereich "Fragebogen zusammenstellen" folgende Warnung:

![][2]
Was diese put()-Funktion bewirken soll, habe ich nicht wirklich verstanden.

Mein Ziel ist es einfach nur diese 110 Items auf mehrere Seiten zu verteilen, wobei diese Items bei jedem Aufruf in zufälliger Reihenfolge erscheinen. Die Antworten für jedes einzelne Item sollen dann trotzdem richtig zu jedem Item zugeordnet werden.

Ich wäre Ihnen sehr dankbar, wenn Sie mir da weiterhelfen würden.

Vielen Dank im Voraus und liebe Grüße.
[1]: https://support.soscisurvey.de/?qa=blob&qa_blobid=10679598371402484012
[2]: https://support.soscisurvey.de/?qa=blob&qa_blobid=16997174043845443926

by SoSci Survey (328k points)
Eine Frage erlaubt in aller Regel nur 99 Items. Insofern wird es mit den 110 Items ein wenig komplizierter. Haben Sie sich dieser Problematik schon angenommen?

Haben Sie die Frage AB03 eventuell noch auf die Seite gezogen? Wenn Sie sie mittels question() einbinden, dann darf die Frage nicht noch zusätzlich auf die Seite gezogen werden.
by s248936 (120 points)
Liebes Support-Team, vielen Dank für die Rückmeldung.
Inwiefern wird es denn komplizierter? Es ist tatsächlich wichtig für meine Umfrage, dass alle Items in einer Frage platziert sind und bei jedem Aufruf rotieren.

Ich freue mich über eine Rückmeldung und bedanke mich im Voraus.
by s248936 (120 points)
edited by s248936
Alternativ wollte ich noch fragen, ob und wie man folgende Situationen technisch umsetzen kann: Kann ich die Items in 8 verschiedene Blöcke aufteilen, die bei jedem Aufruf aus diesen Blöcken komplett randomisiert rausgezogen und angezeigt werden?

Ich habe es mit folgendem Code probiert aber da kommt dann die Fehlermeldung "Warnung (Seite 3) Für die Frage AN20 wurde kein Item mit der Kennung 0 gefunden":


$fragen = ['AN20', 'AN21'];
$itemliste = [];
foreach ($fragen as $frage) {
  foreach (getItems($frage, 'all') as $item) {
    $itemsliste[] = [$frage, $item];
  }
}
 

if (!isset($itemMix)) {
  $itemMix = $itemliste;
  registerVariable($itemMix);
}
 

question('AN20', 'show-items=none', 'spacing=0');
 

foreach ($itemMix as $info) {
  $frage = $info[0];
  $item = $info[1];
  question($frage, $item, 'show-title=no', 'show-explanation=no', 'spacing=0');
}

2 Answers

0 votes
by SoSci Survey (328k points)

Es ist tatsächlich wichtig für meine Umfrage, dass alle Items in einer Frage platziert sind und bei jedem Aufruf rotieren.

Technisch werden Sie die Items auf mehrere Fragen verteilen und dann zusammengefügt anzeigen müssen: Items aus unterschiedlichen Fragen rotieren - den Code dafür haben Sie ja bereits gepostet. Ich denke nur, dass ein shuffle() fehlt, damit auch etwas rotiert wird:

if (!isset($itemMix)) {
  $itemMix = $itemliste;
  shuffle($itemMix);     // ergänzt
  registerVariable($itemMix);
}

"Warnung (Seite 3) Für die Frage AN20 wurde kein Item mit der Kennung 0 gefunden":

Lassen Sie sich Ihr Array doch mal als Debug-Info anzeigen:

debug($itemMix);

Da dürfte eigentlich in der rechten Spalte keine 0 stehen?

by s248936 (120 points)
Liebes Support-Team,

nach Absprache mit meinem Projektteam, wollte ich Sie fragen, ob das ein zu hoher Aufwand wäre oder ob Sie mir dies bzgl. helfen könnten, diesen JavaScript zu erstellen, damit die Funktion zum Scrollen der grafischen Verankerung trotzdem funktioniert.

Vielen Dank im Voraus für eine Rückmeldung.
by SoSci Survey (328k points)
> ob das ein zu hoher Aufwand wäre

Posten Sie bitte mal einen Pretest-Link direkt zur ersten Seite des Loops. Dann schaue ich mal in die Codes, welche sich um das Scrollen der Verankerung kümmern und prüfe, ob man das mit realistischem Aufwand anpassen kann. Womöglich reicht es, wenn ich noch die ein oder andere Funktion im Script ergänze, damit man den Scrollbereich etwas flexibler definieren kann.
by s248936 (120 points)
by SoSci Survey (328k points)
Ja, danke. Ich sehe zu, dass ich Ihnen bis Mittwoch Genaueres sagen kann.
0 votes
by SoSci Survey (328k points)
edited by SoSci Survey

Für die mit-scrollende Verankerung haben wir inzwischen auch eine Lösung gebaut. Bitte gehen Sie wie folgt vor.

(1) Deaktivieren Sie in Ihren beiden Fragen die Option, dass die Kopfzeile mitscrollen soll. Wählen Sie aus, dass sie einfach oben angezeigt wird.

(2) Ergänzen Sie in Ihrem PHP-Code zwei replace() - einmal für die erste Frage und einmal für das letzte Item auf der Seite.

// Items anzeigen
foreach ($chunks[$i] as $i => $item) {
  if ($i > 0) {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'anchor=none');
  } else {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
  }
}

// Neuer Code
$chunk = $chunks[$i];
replace('%questionID%', $chunk[0][0]);
$lastElement = $chunk[count($chunk) - 1];
replace('%lastItem%', id($lastElement[0], $lastElement[1]));

(3) Ergänzen Sie einen PHP-Befehl, damit die passende JavaScript-BIbliothek geladen wird.

library('TitleScroller');

(4) Und jetzt ergänzen Sie unter dem PHP-Code noch ein wenig JavaScript-Code als HTML-Code.

<script>
var scroller = new S2TitleScroller("%questionID%");
scroller.addItem("%lastItem%");
</script>

Wenn das nicht funktioniert, posten Sie bitte die Debug-Information ... womöglich stimmen die Platzhalter noch nicht ganz. Ach ja ... Sie müssen auch den Browser-Cache noch leeren, damit die aktuelle Version der Bibliothek geladen wird.

by s248936 (120 points)
Liebes Support-Team,

vielen Dank für Ihre Rückmeldung und um Ihr Bemühen. Ich weiß das sehr zu schätzen und finde Ihre Unterstützung wirklich bemerkenswert. DANKE und ein großes Lob an Sie. Ich habe nun die Schritte so umgesetzt und dann kam folgende Info beim Vorschau:

Fehler im Fragebogen (Seite 3)
Für die Funktion replace() wurden nicht ausreichend Argumente angegeben, 2 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.
Fehler im Fragebogen (Seite 3)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined array key 14
Zeile: 37

PHP-Code

034
035  
036
037 $chunk = $chunks[$i];
038 replace('%questionID%', $chunk[0][0]);
039 $lastElement = $chunk[count($chunk) - 1];
040 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 38

PHP-Code

035  
036
037 $chunk = $chunks[$i];
038 replace('%questionID%', $chunk[0][0]);
039 $lastElement = $chunk[count($chunk) - 1];
040 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
041
Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 38

PHP-Code

035  
036
037 $chunk = $chunks[$i];
038 replace('%questionID%', $chunk[0][0]);
039 $lastElement = $chunk[count($chunk) - 1];
040 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
041
Fehler im Fragebogen: count(): Argument #1 ($value) must be of type Countable|array, null given
Zeile: 39

PHP-Code

036
037 $chunk = $chunks[$i];
038 replace('%questionID%', $chunk[0][0]);
039 $lastElement = $chunk[count($chunk) - 1];
040 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
041
042 library('TitleScroller');
Warnung (Seite 3)
Für den Platzhalter %questionID% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.
Warnung (Seite 3)
Für den Platzhalter %lastItem% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.
by SoSci Survey (328k points)
> Trying to access array offset on value of type null

Arg, da bin ich wohl mit der Array-Struktur noch ein wenig durcheinander gekommen.

Was zeigt debug($chunk) denn an?

$chunk = $chunks[$i];
debug($chunk);  // Ergänzen
replace('%questionID%', $chunk[0][0]);
by s248936 (120 points)
Es kommt wieder dieselbe Fehlermeldung. Habe ich denn evtl. die Codes falsch platziert?

Hier die Meldung:

Fehler im Fragebogen (Seite 3)
Für die Funktion replace() wurden nicht ausreichend Argumente angegeben, 2 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.
Fehler im Fragebogen (Seite 3)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined array key 14
Zeile: 37

PHP-Code

034
035  
036
037 $chunk = $chunks[$i];
038 debug($chunk);
039 replace('%questionID%', $chunk[0][0]);
040 $lastElement = $chunk[count($chunk) - 1];
Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 39

PHP-Code

036
037 $chunk = $chunks[$i];
038 debug($chunk);
039 replace('%questionID%', $chunk[0][0]);
040 $lastElement = $chunk[count($chunk) - 1];
041 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
042
Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 39

PHP-Code

036
037 $chunk = $chunks[$i];
038 debug($chunk);
039 replace('%questionID%', $chunk[0][0]);
040 $lastElement = $chunk[count($chunk) - 1];
041 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
042
Fehler im Fragebogen: count(): Argument #1 ($value) must be of type Countable|array, null given
Zeile: 40

PHP-Code

037 $chunk = $chunks[$i];
038 debug($chunk);
039 replace('%questionID%', $chunk[0][0]);
040 $lastElement = $chunk[count($chunk) - 1];   ---> Zeile 40 ist rot markiert
041 replace('%lastItem%', id($lastElement[0], $lastElement[1]));
042
043 library('TitleScroller');
Warnung (Seite 3)
Für den Platzhalter %questionID% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.
Warnung (Seite 3)
Für den Platzhalter %lastItem% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.
by SoSci Survey (328k points)
> Es kommt wieder dieselbe Fehlermeldung.

debug() liefert nur zusätzlich Informationen, wenn Sie den Fragebogen im Debug-Modus (gelber Pfeil) starten - am Fehler ändert es nichts. Die Informationen brauche ich bitte.
by s248936 (120 points)
Ich vermute mal es ist folgende Info:

Hinweis (Seite 3)
Debug-Information für $chunk:
Keine Daten (null)
by SoSci Survey (328k points)
NULL ist definitiv zu wenig :)

Ich vermute, im ersten Schritt müsste $chunks durch $itemsAN03 oder $itemliste (o.ä.) ersetzt werden. Wie sieht Ihr Code denn in Gänze aus?
by s248936 (120 points)
Das ist der PHP-Code:

if (!isset($items)) {
  $questions = ['AN03','AN04'];
 
 // Liste mit allen Items erstellen
  $items = [];
  foreach ($questions as $qstID) {
    $qstItems = getItems($qstID, 'all');
    foreach ($qstItems as $itemID) {
      $items[] = [$qstID, $itemID];
    }
  }
  
// Liste mischen
  shuffle($items);
  registerVariable($items);
}
// Fragetext anzeigen
question('AN03', 'spacing=0', 'show-items=no');
 
$chunks = array_chunk($items, 15);
$i = loopPage(count($chunks));

// Items anzeigen
foreach ($chunks[$i] as $i => $item) {
  if ($i > 0) {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'anchor=none');
  } else {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no');
  }

}

// Neuer Code

$chunk = $chunks[$i];
debug($chunk);
replace('%questionID%', $chunk[0][0]);
$lastElement = $chunk[count($chunk) - 1];
replace('%lastItem%', id($lastElement[0], $lastElement[1]));

library('TitleScroller');


Und dann kommt noch ein HTML-Code:
<script>
var scroller = new S2TitleScroller("%questionID%");
scroller.addItem("%lastItem%");
</script>


Ziel ist es, aus den zwei Fragen randomisiert die Items rauszuziehen, davon immer 15 Pro Seite anzuzeigen und optimalerweise bleibt die Kopfzeile beim Scrollen oben stehen
by SoSci Survey (328k points)
Danke. Die beiden Codes stehen im selben PHP-Code Element, korrekt?

Bitt ergänzen Sie noch folgende Zeilen und teilen Sie mir die Debug-Ausgabe mit:

$chunks = array_chunk($items, 15);
$i = loopPage(count($chunks));
// Ergänzen
debug($chunks);
debug($i);

// Und weiter unten
$chunk = $chunks[$i];
// Ergänzen
debug($chunk);
by s248936 (120 points)
Genau, das steht alles im PHP-Code, außer eben der folgende Teil steht im HTML-Code:

<script>
var scroller = new S2TitleScroller("%questionID%");
scroller.addItem("%lastItem%");
</script>

Es kommt nun folgende Fehlermeldung:

debug()    Inhalt:
[0]    [0]Array [AN04, 24]    [1]Array [AN03, 48]    [2]Array [AN04, 20]    [3]Array [AN03, 8]    [4]Array [AN04, 48]    [5]Array [AN04, 3]    [6]Array [AN03, 17]    [7]Array [AN03, 42]    [8]Array [AN04, 41]    [9]Array [AN04, 39]    [10]Array [AN03, 37]    [11]Array [AN03, 58]    [12]Array [AN04, 36]    [13]Array [AN04, 43]    [14]Array [AN03, 36]
[1]    [0]Array [AN04, 8]    [1]Array [AN04, 12]    [2]Array [AN03, 52]    [3]Array [AN04, 38]    [4]Array [AN03, 59]    [5]Array [AN03, 34]    [6]Array [AN04, 4]    [7]Array [AN03, 32]    [8]Array [AN04, 23]    [9]Array [AN04, 46]    [10]Array [AN03, 56]    [11]Array [AN04, 13]    [12]Array [AN03, 63]    [13]Array [AN03, 43]    [14]Array [AN03, 62]
[2]    [0]Array [AN04, 15]    [1]Array [AN04, 34]    [2]Array [AN03, 28]    [3]Array [AN04, 17]    [4]Array [AN03, 49]    [5]Array [AN03, 27]    [6]Array [AN04, 33]    [7]Array [AN03, 51]    [8]Array [AN03, 18]    [9]Array [AN03, 53]    [10]Array [AN03, 25]    [11]Array [AN04, 51]    [12]Array [AN04, 6]    [13]Array [AN04, 44]    [14]Array [AN03, 55]
[3]    [0]Array [AN04, 10]    [1]Array [AN03, 54]    [2]Array [AN03, 12]    [3]Array [AN03, 4]    [4]Array [AN03, 26]    [5]Array [AN03, 3]    [6]Array [AN03, 10]    [7]Array [AN03, 64]    [8]Array [AN04, 22]    [9]Array [AN03, 6]    [10]Array [AN03, 9]    [11]Array [AN04, 1]    [12]Array [AN03, 22]    [13]Array [AN03, 5]    [14]Array [AN04, 21]
[4]    [0]Array [AN04, 40]    [1]Array [AN04, 37]    [2]Array [AN03, 60]    [3]Array [AN03, 1]    [4]Array [AN03, 40]    [5]Array [AN03, 21]    [6]Array [AN04, 9]    [7]Array [AN04, 28]    [8]Array [AN03, 50]    [9]Array [AN03, 31]    [10]Array [AN03, 45]    [11]Array [AN04, 50]    [12]Array [AN04, 14]    [13]Array [AN04, 26]    [14]Array [AN03, 14]
[5]    [0]Array [AN03, 29]    [1]Array [AN03, 2]    [2]Array [AN04, 18]    [3]Array [AN03, 24]    [4]Array [AN04, 29]    [5]Array [AN03, 13]    [6]Array [AN03, 39]    [7]Array [AN04, 25]    [8]Array [AN04, 7]    [9]Array [AN03, 7]    [10]Array [AN03, 65]    [11]Array [AN04, 47]    [12]Array [AN03, 61]    [13]Array [AN04, 49]    [14]Array [AN03, 47]
[6]    [0]Array [AN03, 20]    [1]Array [AN04, 2]    [2]Array [AN04, 42]    [3]Array [AN03, 38]    [4]Array [AN03, 35]    [5]Array [AN04, 30]    [6]Array [AN03, 33]    [7]Array [AN03, 46]    [8]Array [AN03, 11]    [9]Array [AN03, 44]    [10]Array [AN03, 41]    [11]Array [AN03, 19]    [12]Array [AN03, 16]    [13]Array [AN04, 35]    [14]Array [AN04, 19]
[7]    [0]Array [AN03, 15]    [1]Array [AN03, 23]    [2]Array [AN04, 45]    [3]Array [AN04, 11]    [4]Array [AN04, 31]    [5]Array [AN04, 27]    [6]Array [AN04, 32]    [7]Array [AN03, 57]    [8]Array [AN03, 30]    [9]Array [AN04, 16]    [10]Array [AN04, 5]

debug()    Inhalt: $i = 0 (integer)

Eine Frage an Sie: Wie sehr halten Sie es für sinnvoll oder umsetzbar, ein Live-Meeting via Zoom zu machen, in dem ich Ihnen mein Bildschirm teile?
by SoSci Survey (328k points)
Danke, jetzt fehlt noch die Debug-Information von dem $chunk-Teil (das dritte debug()) - wird da noch etwas angezeigt?

> Wie sehr halten Sie es für sinnvoll oder umsetzbar, ein Live-Meeting via Zoom zu machen, in dem ich Ihnen mein Bildschirm teile?

Heute Nacht zwischen 3:00 und 3:15 Uhr hätte ich vielleicht noch ein paar freie Minuten für solchen Luxus. Also ... nein, eher nicht ;)

Aber Sie können mir mitteilen, wie der Link zum Fragebogen ist und mir (hier, formlos) gestatten, dass ich mich einmal direkt in das Projekt einloggen darf. Wenn Sie mir dann noch sagen, in welchem Fragebogen und auf welcher Seite ich nachsehen soll, kann ich es mir einmal live ansehen.
by s248936 (120 points)
Ok, ich gestatte Ihnen hiermit, dass Sie sich einmalig in das Projekt einloggen können.
Fragebogen: base
Seite: 3

https://www.soscisurvey.de/antinomien/

Eine Frage noch zu dieser Warnung, auch auf Seite 3:
Warnung
Bitte beachten Sie, dass die von random() oder shuffle() erzeugten Zufallswerte nicht automatisch im Datensatz gespeichert werden. Zum Speichern können Sie ggf. die Funktion put() verwenden.

Also die Antworten werden beim Ausfüllen schon richtig abgespeichert im Datensatz, deshalb verstehe ich den Sinn dieser Warnung nicht. Welche Zufallswerte sind denn damit gemeint?
by SoSci Survey (328k points)
Okay ... ich musste ein wenig suchen ... das Problem war die Kombination dieser beiden Zeilen:

$i = loopPage(count($chunks));
...
foreach ($chunks[$i] as $i => $item) {

Da wird die Variable $i für zwei unterschiedliche Dinge verwendet - und die zweite Zeile überschreibt das $i aus der ersten Zeile. Ich habe das zweite $i mal durch $k ersetzt.

Außerdem musste ich die separate Anzeige des Titels noch ändern, sodass der Titel nun gemeinsam mit dem ersten Item angezeigt wird. Sonst arbeitet die Lösung zum Scrollen nicht.

Stellen Sie sicher, dass AN03 und AN04 dieselben Fragetexte eingetragen haben.

> Also die Antworten werden beim Ausfüllen schon richtig abgespeichert im Datensatz, deshalb verstehe ich den Sinn dieser Warnung nicht. Welche Zufallswerte sind denn damit gemeint?

Wenn Sie nachher wissen wollten, in welcher Reihenfolge die Items angezeigt werden, und welche zusammen auf einer Seite, dann wäre diese Information im Datensatz nicht verfügbar.

In Ihrem Fall werden Sie das wohl auch nicht brauchen. Aber es gab schon Fälle, wo Nutzer:innen ihre experimentelle Variation per shuffle() erledigt hatten. Und als die Gruppenzuordnung dann nicht im Datensatz auftauchte ... das wünscht man eigentlich niemandem.
by s248936 (120 points)
Liebes Support-Team,

das klappt nun und die Umfrage ist Online. Ich bedanke mich ganz herzlich für Ihre tolle Unterstützung. Ich bin wirklich sehr begeistert von Ihrer Hilfe. Das werde ich auch so in meinem Umfeld weitergeben. Nochmals vielen Dank an das Team.

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

...