0 votes
in SoSci Survey (dt.) by s078657 (160 points)

Hallo,

ich würde gerne wissen ob / wie ich den folgenden Code aus dem Handbuch erweitern kann, damit ich nicht nur alle Items aus einer Frage damit über mehrere Seiten shuffeln kann, sondern Items aus mehreren Fragen (in meinem Fall 2 Fragen)?

if (!isset($itemsAB01)) {
$itemsAB01 = getItems('AB01', 'all');
shuffle($itemsAB01);
$itemsAB01 = array_chunk($itemsAB01, 20);
registerVariable('itemsAB01');
}

$i = loopPage(count($itemsAB01));
question('AB01', $itemsAB01[$i]);

Danke!

1 Answer

+1 vote
by SoSci Survey (328k points)
selected by s078657
 
Best answer

Damit das funktioniert, müssen Sie für jedes Item den question() Befehl aufrufen. Und Sie benötigen eine Liste, die nicht nur die Item-Nummern, sondern auch noch die Frage-Kennung pro Item beinhaltet. Diese könnten Sie etwa wie folgt erstellen:

$fragen = array('AB01', 'AB02', 'AB03');
$items = array();
foreach ($fragen as $frage) {
  // Items für jede einzelne Frage
  $itemsF = getItems($frage, 'all');
  foreach ($itemsF as $itemID) {
    $items[] = array($frage, $itemID);
  }
}

Jetzt haben wir in der Variable $items eine Liste von Arrays (also Arrays in einem Array), wobei jedes Array = jeder Eintrag die Kennung der Frage auf Index 0 und die Nummer des Items auf Index 1 enthält. Das sieht dann etwa so aus:

AB01,  1
AB01,  2
AB01,  3
AB02,  1
AB02,  2
AB02,  3
u.s.w.

Das Ganze einmal kräftig mischen und in 10er-Blöcke aufteilen...

shuffle($items);
$blocks = array_chunk($items, 10);

Es bietet sich an, den Teil bisher in einen Filter if(!isset($blocks)) { zu packen und ein registerVariable($blocks)zu ergänzen.

Und dann noch abfragen:

$i = loopPage(count($blocks));
$block = $blocks[$i];

foreach ($block as $item) {
  $frage = $item[0];
  $itemID = $item[1];
  question($frage, $itemID, 'spacing=5');
}

Das Ganze nochmal in der Gesamtschau:

if (!isset($blocks)) {
  $fragen = array('AB01', 'AB02', 'AB03');
  $items = array();
  foreach ($fragen as $frage) {
    // Items für jede einzelne Frage
    $itemsF = getItems($frage, 'all');
    foreach ($itemsF as $itemID) {
      $items[] = array($frage, $itemID);
    }
  }

  shuffle($items);
  $blocks = array_chunk($items, 10);
  registerVariable($blocks);
}

$i = loopPage(count($blocks));

foreach ($blocks[$i] as $item) {
  $frage = $item[0];
  $itemID = $item[1];
  question($frage, $itemID, 'spacing=5');
}

Das 'spacing=5' kann man natürlich noch um weitere Parameter für question() ergänzen, sodass zum Beispiel kein Fragetitel angezeigt wird.

Damit die Skalenverankerung z.B. nur beim ersten Item pro Seite angezeigt wird und nur das letzte Item Abstand nach unten lässt, würden Sie im letzten Teil einen Zähler mitlaufen lassen.

$i = loopPage(count($blocks));

foreach ($blocks[$i] as $pos => $item) {
  $frage = $item[0];
  $itemID = $item[1];
  if ($pos == 0) {
    // Verankerung nicht deaktiviert beim ersten Item (=Index 0)
    question($frage, $itemID, 'spacing=5');
  } elseif ($pos == 9) {
    // Kein reduzierter Abstand beim 10-ten Item (=Index 9)
    question($frage, $itemID, 'anchor=none');
  } else {
    // Alles dazwischen ohne Verankerung und mit weniger Abstand nach unten (5 Pixel)
    question($frage, $itemID, 'spacing=5', 'anchor=none');
  }
}
by s078657 (160 points)
Danke vielmals! Vielleicht gleich noch eine kurze Frage zu den Parametern in question() :
Ist es jetzt noch möglich, etwa über 'anchor', die Skalenwerte nur über dem ersten Item anzuzeigen (wie es ja Standard wäre), und
kann ich ein 'spacing' nur für das letzte Item auf der Seite einstellen?
by SoSci Survey (328k points)
Ich habe meine Antwort oben entsprechend ergänzt.

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

...