0 votes
in SoSci Survey (dt.) by s089051 (245 points)
edited by SoSci Survey

Hallo,

nun klappt es mit der LoopFunktion und der Randomisierung der Probanden und Bilder. Ich muss allerdings noch den passenden Schieberegler einbauen. Wie kann ich denn nun das passende Item der Schieberegler-Frage zum Bild der gleichen Nummer laden?

mein bisheriger HTML-Code lautet:

<!-- 
SoSciTools.submitButtonsHide();
// Funktion zum Einblenden der Knöpfe
function showContent() {
  var content = document.getElementById("SL01_qst");
  // Den normalen Anzeigemodus wiederherstellen
  content.style.display = "";
}
 
// Nach dem Laden der Fragebogen-Seite das Script starten
SoSciTools.attachEvent(window, "load",
  function() {
    // Objekt heraussuchen
    var content = document.getElementById("SL01_qst");
    // Ausblenden
    content.style.display = "none";
    // Den Timer starten
    window.setTimeout(showContent, 5000); // Nach 5 Sek = 5.000 ms
  }
);

SoSciTools.attachEvent(window, "load", function() {
  var slider = SoSciSliders.getSlider("SL01");
  // Das "click" Event wird aufgerufen, wenn der Teilnehmer den Schieberegler setzt/bewegt
  slider.addEventListener("click", function() {
    if (slider.getValue() > -2) {
      SoSciTools.submitPage();
    }
  });
}); 
// -->
</script>

Danke!:)

by SoSci Survey (328k points)
> Wie kann ich denn nun das passende Item der Schieberegler-Frage zum Bild der gleichen Nummer laden?

Für eine qualifizierte Antwort wäre Ihre PHP-Code sehr hilfreich!

Der HTML-/JavaScript-Code kümmert sich ja nur um die Steuerung innerhalb der Seite.
by s089051 (245 points)
edited by s089051
Hier der PHP-Code. Insgesamt kann "RA01" 5 Werte annehmen. Damit es übersichtlicher ist, habe ich nur eine Experimentalbedingung gepostet. Alle Bedingungen folgen aber dem gleichen Format, 35 Bilder. Jedem Bild soll das Item (Schieberegler) mit der entsprechenden Nummer zugeordnet werden (Bild 1--> Regler 1, Bild 2 --> Regler 2 etc). Die Regler sollen jedoch erst nach 5 Sekunden erscheinen, wobei der Click auf die Skala das nächste Bild aufrufen soll.

if (!isset($bilder)) {
  if (value('RA01') == 1) { // abstrakte Gemälde
    $kuenstler = [
    'AG01' => 1, // Alexej von Jawlensky
    'AG02' => 2, // Arthur Dove
    'AG03' => 3, // Hilma af Klimt
    'AG04' => 4, // Marsden Hartley
    'AG05' => 5, // Paul Klee
    'AG06' => 6, // Theo Van Doesburg
    'AG07' => 7, // Dixon
    'AG08' => 8, // Schwitters
    'AG09' => 9, // Archile Gorky
    'AG10' => 10, // Maletwitsch
    'AG11' => 10, // Malewitsch
    'AG12' => 11, // Michail Matjuschin
    'AG13' => 12, // Ola Rosanova
    'AG14' => 5, // Paul Klee
    'AG15' => 5, // Paul Klee
    'AG16' => 5, // Paul Klee
    'AG17' => 5, // Paul Klee
    'AG18' => 5, // Paul Klee
    'AG19' => 13, // Moholy
    'AG20' => 13, // Moholy
    'AG21' => 13, // Moholy
    'AG22' => 13, // Moholy
    'AG23' => 13, // Mondrian
    'AG24' => 14, // Mondrian
    'AG25' => 14, // Mondrian
    'AG26' => 14, // Mondrian
    'AG27' => 14, // Mondrian
    'AG28' => 12, // Olga Rosanova
    'AG29' => 15, // Chashnik
    'AG30' => 15, // Chashnik
    'AG31' => 15, // Chashnik
    'AG32' => 16, // Kliun
    'AG33' => 16, // Kliun
    'AG34' => 17, // Otto Freundlich
    'AG35' => 18, // Amadeo de Souza Cardoso
    ];
  }

 // Rotation
  $bilder = array_keys($kuenstler);

  do {
    shuffle($bilder);
    $lastOne = -1;
    $double = false;
    foreach ($bilder as $bild) {
      if ($kuenstler[$bild] == $lastOne) {
        $double = true;
      }
      $lastOne = $kuenstler[$bild];
    }
  } while ($double);

  registerVariable($kuenstler);
  registerVariable($bilder);
}

$i = loopPage(count($bilder));
html('<div style="text-align: center"><img src="'.$bilder[$i].'.jpg"></div>');
// Frage
$bildNr = (int)ltrim(substr($bild, 3), '0');
question('SL01', $bildNr);
by SoSci Survey (328k points)
> Jedem Bild soll das Item (Schieberegler) mit der entsprechenden Nummer zugeordnet werden (Bild 1--> Regler 1, Bild 2 --> Regler 2 etc).

Okay, das ist ja in dem Code unten schon vorgesehen:

// Frage
$bildNr = (int)ltrim(substr($bild, 3), '0');
question('SL01', $bildNr);

Insofern meine Frage: Was ist Ihre Frage?
by s089051 (245 points)
edited by s089051
die erste Frage: Welchen Code brauche ich, damit durch den Click auf den Regler die nächste Seite im loop angezeigt wird. Der "Click" als "weiter"-Button. Ich habe bereits einen HTML Code dafür (siehe oben), der den Regler nach 5 Sekunden einblendet, die Click-funktion funktioniert aber nicht.

die zweite Frage: Manchmal erscheint im Testlauf, dass die Reglerfrage SL01 kein Item mit der ID 0 besitzt. Hier weiß ich nicht, was ich am PHP Code ändern muss. Die Items der Frage sind von 01-35 durchnummeriert.

1 Answer

0 votes
by SoSci Survey (328k points)

Welchen Code brauche ich, damit durch den Click auf den Regler die nächste Seite im loop angezeigt wird.

Dafür haben Sie ja den folgenden JavaScript-Code:

SoSciTools.attachEvent(window, "load", function() {
  var slider = SoSciSliders.getSlider("SL01");
  // Das "click" Event wird aufgerufen, wenn der Teilnehmer den Schieberegler setzt/bewegt
  slider.addEventListener("click", function() {
    if (slider.getValue() > -2) {
      SoSciTools.submitPage();
    }
  });
});

Ersetzen Sie das "SL01" in der zweiten Zeile bitte durch die komplette Item-Kennung SL01_01. Sonst wird der Schieberegler (eine Schieberegler-Frage erlaubt ja mehr als ein Regler-Item) nicht erkannt.

Wenn das noch nicht reicht, werfen SIe bitte einen Blick in die JavaScript-Fehlerkonsole. Womöglich kommt Ihr Code gar nicht bis zu diesem Punkt, weil es weiter oben noch ein Problemche gibt.

Manchmal erscheint im Testlauf, dass die Reglerfrage SL01 kein Item mit der ID 0 besitzt.

Ich gehe davon aus, dass es sich dabei um denselben Fehler handelt. Wenn diese Meldung nur "manchmal" erscheint, tritt in den anderen Fällen womöglich ein Fehler auf, sodass der Code vorher abbricht. Das müssen wir uns dann nochmal separat ansehen.

by s089051 (245 points)
edited by s089051
Ohje, nun funktioniert der Click. Aber nur bei manchen Testläufen (komme ja immer nur bis zum 2. Bild).

1) Bei der ersten Variante kommt beim nächsten Bild folgendes:
Einmal die Fehlermeldung, dass das Item SL01 kein Item mit der ID gleich 0 besitzt und:

Questionnaire Error: The PHP variable $bild has been used but the variable is yet undefined (the variable has no value). --> Zeile 224 ist rot markiert!

PHP code

221 $i = loopPage(count($bilder));
222 html('<div style="text-align: center"><img src="'.$bilder[$i].'.jpg"></div>');
223
224 $bildNr = (int)ltrim(substr($bild, 3), '0');
225 question('SL01', $bildNr);
226 return 'ok';

2) Bei der zweiten Variante passiert gar nichts. Als der Click funktioniert nicht
3) Bei der dritten Variante erscheint schon beim ersten Bild wieder die Fehlermeldung, dass Frage SL01 kein Item mit der ID 0 besitzt.

4) > Ersetzen Sie das "SL01" in der zweiten Zeile bitte durch die komplette Item-Kennung SL01_01. Sonst wird der Schieberegler (eine Schieberegler-Frage erlaubt ja mehr als ein Regler-Item) nicht erkannt.

Ich glaube hier liegt das Problem, da ich mich im HTML Code nur auf ein Item beziehe. Ich möchte ja aber, dass jedes der 35 Bilder sein eigenes einem erhält. Wenn ich nun die Item-Kennung SL01_01 nutze, wird ja nur das erste Item geladen. Tatsächlich brauche ich ja aber das Item_01 nur für Bild01, das Item_02 nur für Bild02 etc..... Und das natürlich in der Reihenfolge, die vom PHP Code vorgegeben wird.
by SoSci Survey (328k points)
Okay, mit dem PHP-Code-Fehler kann ich etwas anfangen. Bitte ändern Sie die folgende Zeile

 $bildNr = (int)ltrim(substr($bild, 3), '0');

wie folgt:

 $bildNr = (int)ltrim(substr($bilder[$i], 3), '0');

> Wenn ich nun die Item-Kennung SL01_01 nutze, wird ja nur das erste Item geladen

Guter Punkt. Verwenden Sie für die Kennung einen Platzhalter:

 replace('%itemID%', 'SL01_'.sprintf('%02d', $bildNr));

Diese platzieren Sie am Ende Ihres bisherigen PHP-Codes, dort wo $bildNr definiert wurde. Und im HTML-Code (welcher darunter kommt) ändern Sie dann

 var slider = SoSciSliders.getSlider("SL01");

wie folgt:

 var slider = SoSciSliders.getSlider("%itemID%");

Damit sollten wir einen Schritt weiter sein. Vermutlich noch nicht alles, aber wir kommen dem Ziel näher.
by s089051 (245 points)
Das kommt der Perfektion sehr nahe :)!

1)jetzt laufen alle Funktionen wie gedacht. Beim Laden der nächsten Seite glitchen die Inhalte manchmal noch herum (man sieht ganz kurz den Slider dann verschwindet er wieder), aber prinzipiell funktioniert es.

 2)ABER: bei jedem Testlauf kommt nach einer bestimmten Zeit trotzdem noch die Fehlermeldung:

For Question SL01 no Item with the ID 0 has been found.

Die Fehlerkonsole sagt:
--> für die Zeile 56: null is not an object (evaluating 'content.style')
--> für die Zeile 65: steht folgender Kommentar: undefined is not an object (evaluating 'slider.addEventListener')

50 // Nach dem Laden der Fragebogen-Seite das Script starten
51 SoSciTools.attachEvent(window, "load",
52  function() {
53    // Objekt heraussuchen
54    var content = document.getElementById("SL01_qst");
55    // Ausblenden
56    content.style.display = "none";
57    // Den Timer starten
58    window.setTimeout(showContent, 2000); // Nach 5 Sek = 5.000 ms
59  }
60 );
61
62 SoSciTools.attachEvent(window, "load", function() {
63    var slider = SoSciSliders.getSlider("SL01_00");
64  // Das "click" Event wird aufgerufen, wenn der Teilnehmer den Schieberegler... 65 slider.addEventListener("click", function() {
66  if (slider.getValue() > -2) {
67  SoSciTools.submitPage();
68   }  
69   });
70   });
71 // -->
by SoSci Survey (328k points)
Was das Aufblitzen angeht: Vieleicht reicht es schon, wenn Sie den Code zum Ausblenden des Reglers einfach ohne window/load verwenden:

var content = document.getElementById("SL01_qst");
content.style.display = "none";
window.setTimeout(showContent, 2000);

Also ohne das  SoSciTools.attachEvent() u.s.w. außenherum.

> getSlider("SL01_00");

Das steht da nicht wirklich, sondern ein Platzhalter, korrekt?

> For Question SL01 no Item with the ID 0 has been found.

Diese Meldung könnte aus dieser Zeile stammen:

question('SL01', $bildNr);

Und zwar dann, wenn $bildNr keine gültige Zahl ist. Möchten sie mal folgende Zeilen ergänzen:

$bildNr = (int)ltrim(substr($bilder[$i], 3), '0');
debug($bilder[$i]);
debug($bildNr);

Nur zum Verständnis: Dieser Code geht davon aus, dass der Bildname immer (!) zwei Buchstaben plus die Nummer (und dann nichts mehr) sind. Wenn Sie auch andere Bildnamen verwenden, müssen wir den Code anpassen.
by s089051 (245 points)
> getSlider("SL01_00"); Das steht da nicht wirklich, sondern ein Platzhalter, korrekt?

doch: Das ist genau so aus der Fehlerkonsole kopiert.

Die Fehlermeldung des Items erscheint jetzt nur noch für die Zeile:
content.style.display = "none"; --> null is not an object (evaluating 'content.style'

> Aufblitzen: ist eher schlimmer dadurch, weil man
1) jetzt kurz den Weiterbutton sieht, der dann wieder verschwindet
2) der Regler wahllos an Positionen ein paar Pixel unterhalb der Skala als Grundposition erscheint

>Bildnamen: Alle Bilder die hochgeladen und verwendet werden sind nach dem Schema zwei Großbuchstaben dahinter zwei Ziffern benannt (Zahlen unter 10 beginnen mit 0, also 01, 02, 03 etc; ich gehe davon aus, dass die Endung .jpg nicht als Teil der Kennung gesehen wird)
by SoSci Survey (328k points)
>> getSlider("SL01_00"); Das steht da nicht wirklich, sondern ein Platzhalter, korrekt?

> doch: Das ist genau so aus der Fehlerkonsole kopiert.

Da wurde also schon der dynamische Platzhalter eingesetzt, korrekt? Dann ist das vermutlich nicht korrekt. Das passt aber zur Fehlermeldung mit dem "Item 0". Was zeigt denn die Debug-Information mit den beiden zusätzlichen Zeilen?

Das "null" dürfte auch mit dem Problem zusammenhängen. Meine Vermutung wäre, dass die Frage auf der Seite komplett fehlt.
by s089051 (245 points)
edited by s089051
>Da wurde also schon der dynamische Platzhalter eingesetzt, korrekt? Dann ist das vermutlich nicht korrekt. Das passt aber zur Fehlermeldung mit dem "Item 0". Was zeigt denn die Debug-Information mit den beiden zusätzlichen Zeilen?

Hier zeigt die Konsole bei der folgenden Zeile eine Fehlermeldung:
content.style.display = "none"; --> null is not an object (evaluating 'content.style')

Oder meinen Sie etwas anderes mit Debugger-Information?

Also diese Fehlermeldung kam jetzt, nachdem ich alle von Ihnen vorgeschlagene Änderungen am Code vorgenommen habe. Was den Code angeht, sind wir nun an einem Level angelangt, bei welchem ich nicht mehr wirklich nachvollziehen kann, wo ein Fehler liegen könnte :D

Wie kann es sein, dass die Frage bei manchen Seiten geladen wird und bei anderen komplett fehlt?
by SoSci Survey (328k points)
> Oder meinen Sie etwas anderes mit Debugger-Information?

Ja, ich meinte die Debug-Information von Sosci Survey:
https://www.soscisurvey.de/help/doku.php/de:create:debugging

Dann wird es auch mit dem Nachvollziehen wieder besser :)

> Wie kann es sein, dass die Frage bei manchen Seiten geladen wird und bei anderen komplett fehlt?

Ich denke der Bildname ist schuld. Daher die debug()-Zeilen.
by s089051 (245 points)
Eine Debug-Information erscheint bei so ziemlich jedem Bild:

Beispiel 1)
Debug information for $bilder[$i]:
$bilder[$i] = SG12 (string)

Debug information for $bildNr:
$bildNr = 2 (integer)

Beispiel 2)
Debug information for $bilder[$i]:
$bilder[$i] = SG06 (string)

Debug information for $bildNr:
$bildNr = 6 (integer)  

Beispiel 3)
Debug information for $bilder[$i]:
$bilder[$i] = SG20 (string)

Debug information for $bildNr:
$bildNr = 0 (integer)

warning: For the question SL01 no item with the ID 0 has been found.

--> Ich denke Beispiel drei erklärt die Fehlermeldung, dass es kein Item mit ID = 0 gibt

--> Der Code scheint die die Items nicht korrekt den Bildern zuzuordnen (oder umgekehrt?), da immer nur die zweite Stelle verwendet wird. Also bei Bild 18 wird nur die 8 angenommen.
--> aber hier endet aber mein Verständnis auch schon :)
by SoSci Survey (328k points)
Okay, das hilft weiter. Bei SG20 klappt es nicht. Dann weiß ich, wo ich suchen muss. Hier:

$bildNr = (int)ltrim(substr($bilder[$i], 3), '0');

Und zwar ist die 3 falsch. Es müsste 2 heißen:

$bildNr = (int)ltrim(substr($bilder[$i], 2), '0');

Arg ... immer diese lästigen Details beim Programmieren.
by s089051 (245 points)
Vielen vielen Dank! Wirklich :)

jetzt müsste alles sitzen. Hab das bei jeder Bedingung mehrmals geprüft. Es erscheinen immer die richtigen Item-IDs zu den Bildnummern und die Versuche laufen ohne weitere Fehlermeldungen durch. Jetzt muss ich nur noch mit einem Pretest überprüfen, ob auch alle Variablen korrekt abgespeichert werden.

Eine schwere aber nun eine schöne Geburt! :D

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

...