0 votes
in SoSci Survey (dt.) by s163954 (140 points)
edited by s163954

Hallo

Ich habe zwei Datumsfelder das eine soll einen Kalender bis heute (Also tag des Ausfüllens) und das zweite einen Kalender ab heute anzeigen. Bisher hatte ich das über ein JavaScript gelöst. Ich frage mich nur ob es da nicht eine einfachere Lösung gibt? Da es ja die Option für Textfelder gibt das man ein Datum mittels Kalender Pop-Up eingibt. Nur weiß ich hier nicht wie ich min/max auf das aktuelle Datum einstelle.

Vielen Dank schonmal

Hier der aktuelle Fragebogen, falls das hilft. Ist etwas umständlich aber funktioniert.
V009 und V010 sind einfache Textfelder ohne weitere Einstellungen.
Die zweite Seite ist nötig, da man das Javascript umgehen kann, in dem man einfach ein Datum per Tastatur eingibt das außerhalb des angegebenen Bereichs liegt, das soll natürlich verhindert werden.

<?xml version="1.0"?>
<questionnaire>

<!-- Seite 1 -->
<page ident="V01" intID="11">
<info>Vorraussetzungen</info>
<php intID="168"><![CDATA[
prepare_input('V009_01');
prepare_input('V010_01');
]]></php>
<html intID="173"><![CDATA[
	    <!-- Diese JavaScript Element stellt den Kalender zum anklicken zur Verfügung  -->
	    <script src="https://code.jquery.com/jquery-1.12.4.js">
	    	</script>
	    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js">
	    	</script>
	    <script>$( function() {
		    $( "#datepicker" ).datepicker({
				monthNames: ['Januar','Februar','März','April','Mai','Juni',
        		'Juli','August','September','Oktober','November','Dezember'],
        		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
        		'Jul','Aug','Sep','Okt','Nov','Dez'],
        		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
        		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
        		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
  maxDate : 0,
			dateFormat: "dd.mm.yy"});
    		$( "#datepicker2" ).datepicker({
				monthNames: ['Januar','Februar','März','April','Mai','Juni',
        		'Juli','August','September','Oktober','November','Dezember'],
        		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
        		'Jul','Aug','Sep','Okt','Nov','Dez'],
        		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
        		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
        		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
 minDate : 0,
			dateFormat: "dd.mm.yy"});
  } );
</script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">

<p><b>Wann genau waren Sie zuletzt bei Ihrem CED Arzt/Ihrer CED Ärztin in der Sprechstunde oder Klinik in Behandlung?</b></p>
<br><br>Datum: <input name="V009_01" type="text" id="datepicker">
<p><b>Wann genau ist Ihr nächster Arztbesuch wegen Ihrer CED geplant?  </b></p>
<br><br>Datum: <input name="V010_01" type="text" id="datepicker2">
]]></html>
</page>


<!-- Seite 2 -->
<page intID="6">
<php intID="7"><![CDATA[
// Prüfung des Zeitlichen Abstands in Tagen (Wird noch für was anderes benötigt)
$Diff1 = ceil((time() - strtotime(value('V009_01')))/ 86400)-1;
$Diff2 = ceil((strtotime(value('V010_01')) - time())/ 86400);

// Zeige die Variablen Seite im Debugmodus an
debug('V009_01');
debug('V010_01');
debug($Diff1);
debug($Diff2);


if (trim(value('V009_01')) != '' and $Diff1 < 0) {
  markFail('V009_01');
 repeatPage('Datumzukunft');
}
if (trim(value('V010_01')) != '' and $Diff1 > 0) {
  markFail('V010_01');
 repeatPage('Datumvergangenheit');
}
]]></php>
</page>


</questionnaire>

Datumzukunft und Datumvergangenheit sind Textbausteine die angelegt werden müssen damit eine Fehlermeldung angezeigt wird. Durch "div class="feedback"" werden Sie genauso ausgegeben wie andere Fehlermeldungen.

<div class="feedback">
 <p>Das von Ihnen eingegebene Datum für ihren <b>nächsten Termin</b> 
liegt in der Vergangenheit.<br>
Bitte geben Sie einen Termin ein der in der Zukunft liegt.</p>
</div>

1 Answer

0 votes
by SoSci Survey (306k points)

Da es ja die Option für Textfelder gibt das man ein Datum mittels Kalender Pop-Up eingibt. Nur weiß ich hier nicht wie ich min/max auf das aktuelle Datum einstelle.

Auch damit wird lediglich ein DatePicker eingebunden :)

Die zweite Seite ist nötig, da man das Javascript umgehen kann, in dem man einfach ein Datum per Tastatur eingibt das außerhalb des angegebenen Bereichs liegt

Im Prinzip können Sie auch mittels SoSciTools.questionnaire.attachCheck() ein JavaScript anhängen, welches das Datum beim Klick auf "Weiter" kontrolliert. Oder eine Funktion, welche das Datum bei jeder Änderung im Eingabefeld für das Datum kontrolliert.

Aber wenn Sie davon ausgehen, dass Ihre Befragten Ihre Erhebung im Großen und Ganzen unterstürtzen und nicht sabotieren möchten, dann würde ich für einen PHP-Filter auf der folgenden Seite plädieren (Individuelle Antwortprüfung). Das hat den großen Vorteil, dass SoSci Survey beim Einlesen des Datums unterschiedliche Formate gleich vereinheitlicht.

Mit strtotime(value(...)) bekommen Sie dann einen Unix-Zeitstempel, den Sie ganz bequem vergleichen können.

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

...