0 votes
in SoSci Survey (dt.) by s090396 (130 points)
edited by SoSci Survey

Liebes SoSci Support Team,

für meinen Fragebogen möchte ich gerne eine Zeitbeschränkung für einen Aufgabenblock meines Fragebogens über mehrere Seiten einbauen.
Insgesamt sind 5 Seiten meines Fragebogens von der gewollten Zeitbeschränkung betroffen.
Nach Ablauf der Zeit hätte ich gerne, dass die Teilnehmer die Aufgaben nicht mehr weiterbearbeiten können, sondern automatisch auf eine andere Seite weitergeleitet werden, um den nächsten Aufgabenblock zu bearbeiten.
Dabei sollten sie allerdings die Möglichkeit haben auch schon vor Ablauf der Zeit zu dem besagten Aufgabenblock springen zu können, da ich die Zeitbeschränkung relativ großzügig angesetzt habe (der weiter Knopf sollte also nicht versteckt werden).

Orientiert habe ich mich dabei an folgendem Link:
https://www.soscisurvey.de/help/doku.php/de:create:timer-countdown

Deswegen habe ich zunächst wie dort beschrieben folgenden PHP Code auf die Seite eingefügt, auf der die Zeitbeschränkung starten soll:

// Ablauf der Zeit als Variable $timeout speichern
if (!isset($timeout)) {
  $timeout = strtotime('+720 seconds');
  registerVariable($timeout);
}

Abgeändert habe ich hier die Zeile von $timeout = strtotime('+30 seconds'); auf
$timeout = strtotime('+720 seconds');
da die Teilnehmer 12 Minuten haben sollen, um die Aufgaben zu bearbeiten.

Als nächstes habe ich wie auf der verlinkten Seite beschrieben folgenden PHP Code auf jeder Seite, auf der die Zeitbeschränkung ablaufen soll, eingefügt (auf der 1. Seite direkt unter den ersten PHP Code danach immer ganz oben):

// Filter: Zeit abgelaufen?
if (time() > $timeout) {
  goToPage('partNext');
}

dabei habe ich die Seite, auf die die Teilnehmer nach Ablauf der Zeit weitergeleitet werden sollen, mit der Kennung partNext versehen.
Da ich mir noch nicht sicher bin, inwiefern die Zeitanzeige des ablaufenden Countdowns wirklich nötig ist, habe ich jetzt schon einmal versucht, ob sich in der Preview etwas tut, also ob die Teilnehmer nach Ablauf der Zeit schon auf die mit partNext versehene Seite weitergeleitet werden.
Das werden sie allerdings nicht. Ist das normal?

Danach habe ich wie auf dem obigen Link beschrieben unter Fragenkatalog → Rubrik erstellen eine Rubrik erstellt und unter → Text hinzufügen folgendes JavaSkript eingefügt:

<!-- HTML-Element zur Anzeige der Zeit -->
<div id="timeDisplay" style="font-size: 200%; margin: 16px 0; text-align: center">–</div>
 
<script type="text/javascript">
<!--
 
// Verbleibende Zeit initialisieren
var timeLeft = %timeLeft%;
var timeStart = new Date();
 
// Funkton zur Aktualisierung der Anzeige und Prüfung der Zeit
function updateCountdown() {
  // Zeit berechnen
  var now = new Date();
  var timePage = Math.floor((now.getTime() - timeStart.getTime()) / 1000);  // Vergangene Zeit [Sek.]
  var remain = timeLeft - timePage;
 
  // Zeit abgelaufen?
  if (remain <= 0) {
    remain = 0;
    // Timer stoppen
    window.clearInterval(timerInterval);
    // Eine Meldung anzeigen (optional)
    alert("Die Zeit ist vorbei.");
    // Den Teilnehmer zur nächsten Seite weiterleiten (optional)
   // SoSciTools.submitPage();
  }
 
  // Zeit anzeigen
  var display = document.getElementById("timeDisplay");
  if (!display) {
    return;
  }
  while (display.lastChild) {
    display.removeChild(display.lastChild);
  }
  var minutes = Math.floor(remain / 60);
  var seconds = String(remain - 60 * minutes);
  if (seconds.length < 2) {
    seconds = "0" + seconds;
  }
  var displayText = String(minutes) + ":" + seconds;
  var displayNode = document.createTextNode(displayText);
  display.appendChild(displayNode);
}
 
// Initialisierung
var timerInterval = window.setInterval(updateCountdown, 250);
updateCountdown();
 
// -->
</script>

Dabei habe ich die Darstellung auf HTML Code gewählt.
Diesen Text habe ich dann auf die Seite eingefügt, auf der die Zeitbeschränkung beginnen soll.
Außerdem habe ich noch den PHP Code

// JavaScript zur Anzeige der verbleibenden Zeit
$timeLeft = $timeout - time();
// Statt JS01 muss hier die Kennung des Textes eingetragen werden
show('ZB01', array(
  '%timeLeft%' => $timeLeft
));

hinzugefügt. JS01 habe ich hierfür abgeändert in ZB01, weil so die Beschreibung meines JavaSkripts lautet.
Den Php Code habe ich dann, anders als das JavaSkript, das ich nur auf die Startseite der Zeitbeschränkung eingefügt habe, auf allen, die Zeitbeschränkung betreffenden Seiten, eingefügt.

Danach wollte ich versuchen, ob die Zeitbeschränkung funktioniert und habe per Preview auf der Seite angefangen, die direkt vor der Seite ist, auf der die Zeitbeschränkung/ der Countdown losgeht.

Dabei ergibt sich folgendes Problem:
Sobald ich auf Weiter klicke startet zwar der Countdown, allerdings erscheint parallel folgende Fehlermeldung:

Warnung (Seite 2)
Für den Platzhalter %timeLeft% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.

Außerdem ist direkt unter dem ablaufenden Countdown noch ein „-“ zu sehen, als ob ich hier im JavaSkript noch ein weiteres Feld für einen 2.? Countdown nicht ausgefüllt hätte.

Wenn ich mich dann durch die von der Zeitbeschränkung betroffenen Seite durchklicke, läuft der Countdown auf den betroffenen Seite korrekt weiter und die Fehlermeldung beschränkt sich auf die Countdownstartseite.
Allerdings wird man, anders als von mir gewünscht, nach Ablauf der Zeit nicht direkt auf die mit der Kennung partNext versehene Seite weitergeleitet, sondern kann theoretisch noch die Seite fertig bearbeiten, auf der man sich aktuell befindet. Erst das Klicken auf Weiter leitet auf die Seite mit partNext (Der Text „Die Zeit ist vorbei.“ bloppt allerdings korrekt auf.).

Wie kann ich deswegen
1. die Fehlerbehebung beheben (im pretest wird diese nicht angezeigt, nur bei der Preview)
2. das „-“ unter dem Countdown verschwinden lassen und
3. einstellen, dass die Teilnehmer nach Ablauf der Zeit automatisch zum nächsten Aufgabenblock weitergeleitet werden ohne die Möglichkeit zu haben, die Aufgaben auf der Seite zu Ende zu bearbeiten.

Ich hoffe das von mir beschriebene Problem und die Vorgehensweise ist einigermaßen verständlich und nachvollziehbar.

Vielen, vielen Dank schon einmal im Voraus
Tessa Freund

by s090396 (130 points)
Punkt 2 habe ich mittlerweile lösen können, in dem &ndash; aus dem JavaSkript entfernt habe.
by SoSci Survey (302k points)
Tipp: Mit dem Button {} kann man Code als solchen formatieren.
by SoSci Survey (302k points)
Hat Ihr Text mit dem JavaScript-Code die Kennung ZB01?
Haben Sie diesen Text noch anderweitig eingefügt mit mit show(), z.B. direkt in die Seite hineingezogen?
by s090396 (130 points)
Ja mein JavaScript Code hat die Kennung ZB01.
Ich habe den Text über cmd + C (apple) aus dem Link kopiert und bei der erstellten Rubrik als Text (html Code) hinzugefügt.
Dann habe ich ihn anschließend unter --> Fragebogen zusammenstellen auf die entsprechende Seite gezogen.
by SoSci Survey (302k points)
> Dann habe ich ihn anschließend unter --> Fragebogen zusammenstellen auf die entsprechende Seite gezogen.

Nehmen Sie ihn dort bitte wieder heraus. Das show() ist mit dem Hineinziehen äquivalent - außer, dass es gleich noch den Platzhalter setzt.
by s090396 (130 points)
Entschuldigung, das habe ich nicht ganz verstanden.
Soll ich den JavaScript Text unter Fragebogen zusammenstellen wieder aus der Seite ziehen?
Dann verschwindet doch seine Funktion, weil er nicht im Fragebogen aufgenommen ist oder?
Bzw. wo ist show() hinzuzufügen?
by s090396 (130 points)
ah, jetzt habe ich es verstanden!
Damit verschwindet die Fehlermeldung! Allerdings erscheint der Befehl show(ZB01) oben links bei der Preview.
by s090396 (130 points)
Allerdings wird man nach Ablauf der Zeit immer noch automatisch zum nächsten Aufgabenblock weitergeleitet werden ohne die Möglichkeit zu haben, die Aufgaben auf der Seite zu Ende zu bearbeiten.
Wie kann ich das lösen oder brauche ich dafür einen komplett anderen Code?

1 Answer

0 votes
by SoSci Survey (302k points)

Allerdings wird man nach Ablauf der Zeit immer noch automatisch zum nächsten Aufgabenblock weitergeleitet werden ohne die Möglichkeit zu haben, die Aufgaben auf der Seite zu Ende zu bearbeiten.

Dieses Detail hatte ich überlegen. Der Text ZB01 sort dafür, dass der Timer auch während des Bearbeitens einer Seite aktiv bleibt. Denn normalerweise will man exakt nach der Zeit abbrechen und die Aufgabe nicht mehr fertig bearbeiten lassen. Also funktioniert alles korrekt.

Wenn Sie möchten, dass nur beim Seitenwechsel geprüft wird, reicht der PHP-Code, dann ist kein JavaScript erforderlich. Lassen Sie dann einfach das show() weg, weöches das JavaScirpt einbindet und behalten Sie nur den PHP-Filter, der beim "Weiter" prüft.

by s090396 (130 points)
oh ich habe ausversehen meinen Wunsch statt mein Problem kommentiert.
Eigentlich hätte ich gerne, dass die Aufgabe NICHT mehr weiterbearbeitet werden kann nach Ablauf der Zeit und man direkt auf die PartNext Seite weitergeleitet wird. Bei mir ist das allerdings nicht der Fall und man wird erst auf die partNext Seite weitergeleitet, wenn man auf Weiter klickt und nicht automatisch wie eigentlich gewünscht. Was muss ich verändern, damit ein Bearbeiten nach Ablauf der Zeit nicht mehr möglich ist und die Weiterleitung automatisch erfolgt?
Liebe Grüße
by SoSci Survey (302k points)
Vermutlich eine Kleinigkeit im JavaScript-Code. Um das einzugrenzen wäre ein Pretest-Link direkt (!) zur betroffenen Seite hilfreich. Alternativ können Sie einmal die JavaScript-Konsole Ihres Browsers suchen und dort nach Fehlermeldungen Ausschau halten.
by SoSci Survey (302k points)
PS: Falls die Meldung "die Zeit ist vorbei" korrekt erscheint, müssen Sie hier noch noch die Schrägsrtriche entfernen:

// SoSciTools.submitPage();

Die beiden Schrägstriche sorgen im Moment dafür, dass der Befehl (automatisches Weiter) nicht ausgeführt wird.
by s090396 (130 points)
oh super, vielen, vielen Dank, jetzt funktioniert es!

Lediglich show(ZB01) wird noch oben rechts bei der Vorschau angezeigt, kann ich das noch irgendwie verstecken?
by SoSci Survey (302k points)
Als Text oder als gelber Marker (und auch dann nur im Debug-Modus)? Zweiteres würden die Teilnehmer nicht sehen.
by s090396 (130 points)
als Text. Ich habe das ganze jetzt so gelöst, dass ich ihn mit <p hidden>show(ZB01)</p> versteckt habe und das funktioniert, aber vielen, vielen Dank für die riesen Hilfe, das ist echt goldwert auf SoSci :-)
by SoSci Survey (302k points)
Ich bin nicht sicher, ob das <p hidden> in allen Browsern funktioniert. Ich denke, Sie können das show(ZB01), wenn Sie es einfach nur als Text oder in einem Textbaustein eingebunden haben, einfach weglassen. Sie benötigen nur ein show('ZB01', ...) im PHP-Code, aber sonst nirgends.
by s090396 (130 points)
Oh okay, das habe ich jetzt gerade versucht, mit dem Php Code kommt aber wieder eine Fehlermeldung.
Fehlermeldung: Warnung (Seite 26)
Für den Platzhalter %timeLeft% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt.
Bisher hatte ich das show(ZB01) als Html code und damit hat es funktioniert..
by SoSci Survey (302k points)
> Bisher hatte ich das show(ZB01) als Html code und damit hat es funktioniert..

Am PHP-Code nehmen Sie bitte keine Änderungen vor, der passt ja. Nur der HTML-Code "show(ZB01)" kann raus.

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

...