0 votes
in SoSci Survey (dt.) by s179474 (205 points)
edited by SoSci Survey

Hey,

nach Programmierung eines Timers, Countdowns und bei Ablauf des Countdowns Weiterleitung auf die nächste Seite geht nichts mehr. Anstatt nach dem Countdown auf die nächste Seite weiterzuleiten werden die nächsten 5 Seiten angezeigt. Ein Fehler in der Programmierung konnte ich bisher nicht ausmachen.
Nimmt man die php-Codes und html-Codes raus, leitet er über den Weiter-Button ganz normal auf die nächste Seite über - das scheint also eigentlich richtig eingestellt zu sein.
Hoffentlich weiß da jemand was und/oder kann sich das über TeamViewer mal ansehen.
Danke vorab!
LG,

by SoSci Survey (331k points)
> Ein Fehler in der Programmierung konnte ich bisher nicht ausmachen.

Nun, ihr nächster Satz spricht sehr dafür, dass es einen Fehler in der Programmierung gibt :)

Posten Sie doch bitte mal Ihren PHP- und HTML-Code.

Meine Vermutung wäre, dass sie isset() mehrfach mit demselben Variablennamen verwendet haben, sodass der Timer nur ein einziges Mal laufen kann.
by s179474 (205 points)
Ja, einen Fehler in der Programmierung gibt es wohl, ich konnte ihn eben nur noch nicht selbst ausmachen ;-)
Hier:
HTM-CODE 1:
<p id="remainWrapper">Verbleibende Zeit: <span id="remain"></span></p>

PHP-CODE 1:
if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}
// Prüfung, ob die Zeit schon abgelaufen ist
// (z.B. weil der Teilnehmer die Seite neu geladen hat)
$timer = 45;  // Der Teilnehmer hat 1 Minute (60 Sekunden) Zeit zur Bearbeitung
if (time() >= $time0 + $timer) {
  goToPage('next');
}
// Die verbleibende Zeit muss auch dem JavaScript-Code bekannt gemacht werden
$remain = $time0 + $timer - time();
replace('%remain%', $remain);

HTML-CODE 2:
<script type="text/javascript">
<!--
 
// Funktion zur Weiterleitung
function weiter() {
  // Eine Meldung anzeigen (optional)
  alert("Die Zeit ist vorbei.");
  // Den Teilnehmer zur nächsten Seite weiterleiten
  SoSciTools.submitPage();
}
 
// Countdown anzeigen
var date0 = new Date();
var timeout = date0.getTime() + %remain% * 1000;
function updateCountdown() {
  // Zeit berechnen
  var date = new Date();
  var time = Math.ceil((timeout - date.getTime() - 50) / 1000);  // Verbleibende Zeit in Sekunden
  // Zeit anzeigen
  var out = document.getElementById("remain");
  if (!out) {
    return;
  }
  while (out.lastChild) {
    out.removeChild(out.lastChild);
  }
  var minutes = Math.floor(time / 60);
  var seconds = String(time - 60 * minutes);
  if (seconds.length < 2) seconds = "0" + seconds;
  var display = String(minutes) + ":" + seconds;
  var displayNode = document.createTextNode(display);
  out.appendChild(displayNode);
var remainWrapper = document.getElementById("remainWrapper");
if (time < 6) {
remainWrapper.style.display = "block";
}
}
 
// Weiter-Knopf ausblenden (optional)
SoSciTools.submitButtonsHide();
 
// Initialisierung der Weiterleitung
SoSciTools.attachEvent(window, "load", function(evt) {
  // Zusätzlicher Timer für die Aktualisierung des Countdowns
  var remainWrapper = document.getElementById("remainWrapper");
 if (!remainWrapper) {
    return;
  }
remainWrapper.style.display = "none";
window.setInterval(updateCountdown, 1000);
  updateCountdown();
  // Timer für automatische Weiterleitung starten
  window.setTimeout(weiter, %remain% * 1000);
});
 
// -->
</script>
by s179474 (205 points)
Intendierter Ablauf ist folgender: Seite 11 mit der Textaufgabe CT01 wird angezeigt, 45-Sekunden-Countdown läuft unsichtbar im Hintergrund mit. Abden letzten 5 Sekunden wird er angezeigt. Bei Ablauf der Zeit soll automatisch auf Seite 12 mit Item CT02 weitergeleitet werden.
by SoSci Survey (331k points)
Sie haben oben geschrieben, dass alle Seiten auf einer Seite gemeinsam angezeigt werden. Habe ich das korrekt verstanden?

Sie haben da folgenden Abschnitt in Ihrem PHP-Code:

if (time() >= $time0 + $timer) {
  goToPage('next');
}

Wo steht der PHP-Code denn auf der Seite? Ganz zu Beginn oder erst unter den Fragen/Inhalten? Welcher PHP-Code steht ggf. auf der nächsten Seite? Ist dort auch ein Timer?

Und was funktioniert denn (klappt das mit den letzten 5 Sekunden und dem Weiter nach 45 Sek.) und was noch nicht?
by s179474 (205 points)
Der Timer und der Countdown funktionieren, die Weiterleitung auch. Dann sollte nach der Weiterleitung aber eigentlich die Seite 12 mit der nächsten Textaufgabe angezeigt (dort dann auch wieder mit Timer + Weiterleitung) werden, stattdessen werden aber die Items der Seiten 12,13,14,15 und 16 auf der folgenden Seite angezeigt.

Die Aufbau der Seite 11 ist folgener:
Item
HTML-CODE 1 (Inhalt siehe meine erste Antwortnachricht)
PHP-CODE 1 (s.o.)
HTML-CODE 2 (s.o.)
dann noch eine interne Variable zum Aufzeichnen der Anzahl der Fensterwechsel und darunter der HTML-Code für das Aufzeichnen der Fensterwechsel

Auf den Seiten 12,13,14 und 15 sind die gleichen Codes wie auf Seite 11, nur das  Frage-Item ist ein anderes. Seite 16 enthält nur einen Fragebogen, keine weiteren Codes o.ä.

1 Answer

0 votes
by SoSci Survey (331k points)
Die Aufbau der Seite 11 ist folgener:
Item
HTML-CODE 1 (Inhalt siehe meine erste Antwortnachricht)
PHP-CODE 1 (s.o.)
HTML-CODE 2 (s.o.)

Nehmen sie bitte als erstes den PHP-Code nach oben. Das goToPage() muss im ersten Element kommen, damit es ohne gedoppelte Seiteninhalte funktioniert.

Auf den Seiten 12,13,14 und 15 sind die gleichen Codes wie auf Seite 11

Das wird nicht funktionieren, und zwar aufgrund dieser Zeilen:

if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}

In Worten formuliert steht da: Liebes SoSci, wenn dir bisher keine Variable mit dem Namen $time0 untergekommen ist, dann erstell eine solche Variable, schreib den aktuellen Zeitstempel hinein und merk sie dir für den Rest des Fragebogens.

Wenn Sie dieselben Code auf der folgenden Seite verwenden, dann ... genau, dann kenn SoSci Survey die Variable schon und überspringt das. Im nächsten Filter bemerkt SoSci Survey dann, dass der Timer schon abgelaufen ist:

if (time() >= $time0 + $timer) {
  goToPage('next');
}

Also springt es Ihrer Anweisung folgend direkt weiter zur nächsten Seite. Dort haben wir nochmal dasselbe.

Die Lösung ist einfach: Tauschen Sie auf Seite 2 die Variable $time0 gegen $time1 aus.

by s179474 (205 points)
Danke!
Gute Nachricht: Von Seite 11 auf 12 wird jetzt korrekt weitergeleitet und es erscheint wie intendiert nur das Item von Seite 12 - super!
Ich habe auf Seite 12 dann $time0 gegen $time1, auf Seite 13 gegen $timte2, auf Seite 14 gegen $time3 und auf Seite 15 gegen $time4 getauscht, war das richtig?

Schlechte Nachricht: Es erscheint folgende Fehlermeldung:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Die PHP-Variable $time1 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

007
008
009 $timer = 45;  
010 if (time() >= $time1 + $timer) {
011   return 'go:next';
012 }
013
by SoSci Survey (331k points)
> war das richtig?

Ja.

> Die PHP-Variable $time1 wurde verwendet

Meine Vermutung wäre, dass Sie die Namen nicht konsistent im kompletten PHP-Code ausgetauscht haben. Möchten Sie bitte den PHP-Code-Block von der Seite nochmal posten?
by s179474 (205 points)
PHP-CODE Seite 11


if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}
// Prüfung, ob die Zeit schon abgelaufen ist
// (z.B. weil der Teilnehmer die Seite neu geladen hat)
$timer = 45;  // Der Teilnehmer hat 1 Minute (60 Sekunden) Zeit zur Bearbeitung
if (time() >= $time0 + $timer) {
  goToPage('next');
}
// Die verbleibende Zeit muss auch dem JavaScript-Code bekannt gemacht werden
$remain = $time0 + $timer - time();
replace('%remain%', $remain);
by SoSci Survey (331k points)
Das ist aber nicht der PHP-Code, wo der Fehler geworfen wird. Dort steht überall $time0, nicht $time1, wie in der Fehlermeldung.
by s179474 (205 points)
Ah stimmt, der Fehler bezieht sich auf Seite 12.
PHP-CODE von Seite 12:

if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}
// Prüfung, ob die Zeit schon abgelaufen ist
// (z.B. weil der Teilnehmer die Seite neu geladen hat)
$timer = 45;  // Der Teilnehmer hat 1 Minute (60 Sekunden) Zeit zur Bearbeitung
if (time() >= $time1 + $timer) {
  goToPage('next');
}
// Die verbleibende Zeit muss auch dem JavaScript-Code bekannt gemacht werden
$remain = $time1 + $timer - time();
replace('%remain%', $remain);
by SoSci Survey (331k points)
Da steht oben noch $time0, unten $time1 - passen Sie es oben bitte noch an, dann verschwindet der Fehler. Was es mit der Kombination aus isset() und registerVariable() auf sich hat, wird hier beschrieben: https://www.soscisurvey.de/help/doku.php/de:create:functions:registervariable und auch hier. https://www.soscisurvey.de/help/doku.php/de:create:rotation-complicated

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

...