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

0 votes

Hallo,

wir haben in einem komplexen Experiment ein etwas größeres Problem.

Wir laden auf Seite 1 einen Array mit fünf Stimulus Materialien $blocks und legen die Variable $pid = 0; an. Beide werden mit registervariable() global gemacht.

    if (!isset($blocks)) {
  $blocks = array(  // Liste der Frage-Kennungen und zugehöriger Bilder
    array('Box5_alternierend.png', 'FV32', 'FV17', 'FV25', 'DV42', 'DV13', 'DV37', 'DV52', 'DV32', 'CO07'),
    array('Box5_top.png', 'FV33', 'FV12', 'FV26', 'DV43', 'DV14', 'DV38', 'DV53', 'DV33', 'CO08'),
    array('Box5_bottom.png', 'FV34', 'FV16', 'FV27', 'DV44', 'DV15', 'DV39', 'DV54', 'DV34', 'CO09'),
    array('Box9_top.png', 'FV35', 'FV13', 'FV28', 'DV45', 'DV16', 'DV40', 'DV55', 'DV35', 'CO10'),
    array('Box9_alternierend.png', 'FV36', 'FV14', 'FV29', 'DV46', 'DV17', 'DV41', 'DV56', 'DV36', 'CO11')
  );
 
  // Die Liste mischen
  shuffle($blocks);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable('blocks');

$bid=0; // wird als laufende Nummer für die erste Dimension des array blocks verwendet. Wird auf jeder Box Seite am Ende um 1 erhöht.
registerVariable($bid);

Auf den Seite 7,9,11,13,15 wird jeweils einer der Stimuli angezeigt. Der code ist identisch:

//code für PP => Kein GewinnspielText, daher für Preismech > 2 Textfeld, sonst nichts
if ($price_mechanism > 2) {
text('lottery_01');
}


//Schieberegler 0-20 für GBWYW, 0-50 für alle anderen
if ($price_mechanism > 6) {
text('schieberegler_code_0_20'); // Regler 0-20 bei GBWYW
}
if ($price_mechanism < 6) {
text('schieberegler_code_0_50'); // Regler 0-50 bei PWYW
}




html('<p><img src="'.$blocks[$bid][0].'"></p>');
//html('<p>'.$price_mechanism.'</p>');
html('<p>'.$bid.'</p>');


//angehängte Frage
question($blocks[$bid][3]);


//Fragen für Preismechanismen
if ($price_mechanism == 1 || $price_mechanism == 2) {
question($blocks[$bid][4]);
replace('%hier ersetzen%', 'Wert');
question($blocks[$bid][9]);
}
elseif ($price_mechanism == 3 || $price_mechanism == 4) {
question($blocks[$bid][5]);
question($blocks[$bid][4]);
}
elseif ($price_mechanism == 5 || $price_mechanism == 6) {
question($blocks[$bid][6]);
replace('%hier ersetzen%', 'Preis');
question($blocks[$bid][9]);
}
elseif ($price_mechanism > 6) {
question($blocks[$bid][7]);
question($blocks[$bid][8]);
replace('%hier ersetzen%', 'Geld-zurück Betrag');
question($blocks[$bid][9]);
}

if ($price_mechanism > 6) {
html('
<script type="text/javascript">
<!--
var optionA = document.getElementById("'.$blocks[$bid][7].'_01a");  // JN01_01a ist die HTML-ID der Auswahloption "Ja"
var optionB = document.getElementById("'.$blocks[$bid][7].'_02a");  // Option "Nein"
var frage1 = document.getElementById("'.$blocks[$bid][8].'_qst");  // HTML-ID der Texteingabe
var frage2 = document.getElementById("'.$blocks[$bid][9].'_qst");  // HTML-ID der Texteingabe
 
function toogle() {
  // Die zwei Pipes (||) sind ein logisches "Oder"
  // Die Bedingung prüft also: Ist Option A ausgewählt oder ist B ausgewählt?
  if ((optionA.checked)) {
    // Wurde "Ja" oder "Vielleicht" ausgewählt, dann wird die Frage angezeigt
    // Keine Angabe ("") verwendet die Standard-Einstellung (normal anzeigen)
    frage1.style.display = "";
frage2.style.display = "";
  } else {
    // Mit der Anzeigeoption "none" wird die Frage ausgeblendet
    frage1.style.display = "none";
    frage2.style.display = "none";
    //frage1.style.display = "height: 1px; overflow: hidden;";
    //frage2.style.display = "height: 1px; overflow: hidden;";
  }
}
 
// Die Funktion soll jedesmal ausgeführt werden, wenn eine der drei Optionen angeklickt wird
SoSciTools.attachEvent(optionA, "click", toogle);
SoSciTools.attachEvent(optionB, "click", toogle);
 
// Und jetzt gleich soll sie auch ausgeführt werden, damit die Anzeige zu Beginn korrekt ist
// (z.B. ausblenden der Texteingabe zu Beginn)
toogle();
// -->
</script>
');
}

Dazwischen sind jeweils Seiten die Abprüfen ob abhängig von der Experimentalgruppe alle Eingaben vorhanden sind (Code ebenfalls identisch auf Seite 8,10,12,14,16.

    html('Inhalt 7:<br>'.$blocks[$bid][7].'<br>');
html('Inhalt 7:<br>'.value($blocks[$bid][7]).'<br>');

html('Inhalt 8:<br>'.$blocks[$bid][8].'<br>');
html('Inhalt 8:<br>'.value($blocks[$bid][8].'_01').'_01<br>');

html('Inhalt 9:<br>'.$blocks[$bid][9].'<br>');
html('Inhalt 9:<br>'.value($blocks[$bid][9].'_01').'<br>');

$miss1 = getItems($blocks[$bid][8], 'missing');
$miss2 = getItems($blocks[$bid][9], 'missing');

debug($miss1);
debug($miss2);


if ($price_mechanism > 6 and value($blocks[$bid][7]) == 1)
{
//html('geht<br>');
$miss1 = getItems($blocks[$bid][8], 'missing');
$miss2 = getItems($blocks[$bid][9], 'missing');

//$miss1 = getItems($blocks[$bid][8].'_01', 'missing');
//$miss2 = getItems($blocks[$bid][9].'_01', 'missing');

// Fehler und zurück, falls nicht alle oder keines beantwortet wurden
  if (count($miss1) != 0 && count($miss2) != 0) {
  //html('geht nicht 1');
  markFail($blocks[$bid][8]);
  markFail($blocks[$bid][9].'_01');
  repeatPage('warning_answer_all');
  }
  elseif (count($miss1) != 0) {
  markFail($blocks[$bid][8]);
  repeatPage('warning_answer_all');
  }
  elseif (count($miss2) != 0) {
  markFail($blocks[$bid][9].'_01');
  repeatPage('warning_answer_all');
  }
  elseif (($price_mechanism == 9 || $price_mechanism == 10) && value($blocks[$bid][7]) == 1) 
  {
   if (value($blocks[$bid][8]) <= $gbwyw_threshold) {
   text('gbwyw_threshold_success');
   $bid=1;
   }
   elseif (value($blocks[$bid][8]) > $gbwyw_threshold) {
   text('gbwyw_threshold_fail');
   $bid=1;
   }
  } // GBWYW + Thresgold Abfrage Klammer zu  }
  else {
//  html('<p>it\'s'.$bid.'</p>');
  $bid=1;
//  html('<br><p>me'.$bid.'</p>');
  goToPage('next');
  }
  
}//
else {
//html('<p>it\'s'.$bid.'</p>');
$bid=1;
//html('<br><p>me'.$bid.'</p>');
goToPage('next');

}

Das Problem ist nun, dass wenn auf der Seite von Stimulus 3 ein Fehler in Gruppe 7 auftritt, er zurück zu der Seite von Stimulus 1 springt. Bei Stimulus 1 und 2 geht springt der code beim Fehler richtigerweise zur vorherigen Frage zurück. Ich kann mir das nicht erklären. Irgendwelche Ideen?

in SoSci Survey (dt.) by s032383 (220 points)
edited by SoSci Survey
Bitte formatieren Sie Code mit dem Knopf {} als solchen. Danke. Ich habe das oben gerade nachgeholt.

1 Answer

0 votes

Ohne die Debug-Information schwer zu sagen - zumal die Code-Teile scheinbar unvollständig sind (z.B. ist biem ersten unklar, wo die geschweifte Klammer endet).

Meine erste Vermutung wäre, dass $bid als Zählervariable Probleme macht, weil das Hoch- und Runterzählen beim Wiederholen von Seiten nicht ganz trivial ist. Selbst it getRoute() muss man ein wenig basteln...

Verwenden Sie nebst dem PHP-Code Filter, die Sie direkt in den Fragen definieren? Auch diese können manchmal noch kreativ springen, wenn sich leere Seiten im Fragebogen ergeben, die automatisch übersprungen werden.

by SoSci Survey (85k points)
Ich habe das nun damit halbwegs fixen können indem ich auf die Hauptseiten jeweils eine angepasste Form von

if ($bid == 0) {
}
elseif ($bid == 1) {
goToPage('box2');
}
elseif ($bid == 2) {
goToPage('box3');
}
elseif ($bid == 3) {
goToPage('box4');
}
else {
goToPage('afterdelivery');
}

angelegt habe. Das vermeidet, dass man durch die nachgelagerten "leeren" Seiten mit dem Prüfalgorithmus aus die falsche Seite geschickt wird. Wenn ich auf der Seite von Stimulus 3 oder 4 eine eingeblendete Frage nicht beantworte zeigt mit der Debugger oben übrigens an dass ich mich auf sehr vielen Seiten befinde...

Wenn Sie das Ganze interessant kann ich Ihnen Zugang zu unserem Account geben bzw. die Kennung per E-Mail senden und Sie schauen sich das mal an.

Siehe hier:
http://abload.de/image.php?img=test5yjpt.png
>  zeigt mit der Debugger oben übrigens an dass ich mich auf sehr vielen Seiten befinde...

Das spricht dafür, dass zu viel gesprungen wird. goToPage() ist in aller Regel ohnehin keine besonders gute Lösung, um unterscheidliche Inhalte anzuzeigen. Bessere Lösungen: setPageOrder() - wenn man bei unterschiedlichen Seiten bleiben will - oder den Stimulus direkt auf der Seite austauschen - wenn es nur um eine geringfügige Veränderung der Seiten geht (ein Bild und eine Frage z.B.).

Vor allem für die Rotation ist setPageOrder() wesentlich (!) sinnvoller als goToPage().
So, ich habe es mal mit setPageOrder  versucht

if (!isset($parts)) {
$parts = array(
  'B1' => 'box1-box1check',
  'B2' => 'box2-box2check',
  'B3' => 'box3-box3check',
  'B4' => 'box4-box4check'
);
// Die Schlüssel des obigen Arrays mischen
$keys = array_keys($parts);
shuffle($keys);
//Randomisierung
 
// Für jeden Schlüssel die Position im gemischten Array abspeichern
put('ET08_01', array_search('B1', $keys) + 1);
put('ET08_02', array_search('B2', $keys) + 1);
put('ET08_03', array_search('B3', $keys) + 1);
put('ET08_04', array_search('B4', $keys) + 1);
 
// Jetzt noch die Seitenabfolge definieren
setPageOrder(
  $parts[$keys[0]],  // $keys[0] ist z.B. 'B2' und $parts['B2'] ist 'box1-box1check'
  $parts[$keys[1]],
  $parts[$keys[2]],
  $parts[$keys[3]]
);
}

BoxX ist immer eine Seite von Stimuli X angezeigt wird
boxXcheck ist eine leere Seite danach, die diverse Eingaben überprüft und im fail Fall zurück zu BoxX geht (repeatpage()) im Erfolgsfall wird   goToPage('next') gesetzt.

Das Problem ist nun, dass die Abfrage durch boxXcheck anscheinend nicht mehr funktioniert. Bei jedem Next geht es einfach weiter zur nächsten box(X+1)
> dass die Abfrage durch boxXcheck anscheinend nicht mehr funktioniert.

Warum das so ist, sollte sich anhand der Debug-Information schnell klären lassen. Wichtig an Ihrem Code wäre noch, dass er auf der Seite direkt vor "box1" steht und dass das setPageOrder() am Ende aus dem ISSET-Filter herausgenommen wird.
...