Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Abstimmung einmal täglich erlauben

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 months 1 week ago #256137 by Joffm
Replied by Joffm on topic Abstimmung einmal täglich erlauben
So, es funktioniert tatsächlich.

Hier ist das Cookie und dessen Inhalt
 

Es ist also bis morgen um 0:00 Uhr gültig.

Also einfach in die oben erwähnte Datei statt des numerischen Wertes für "1 Jahr" den neu berechneten Wert einfügen.
Schnellste Berechnung:
$newtime = mktime (23,59,59) + 1 - time();
Als kleine Feinheit kann man die eine Sekunde nicht addieren; dann geht es bis 23:59:59



 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

  • mv_alex
  • mv_alex's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
2 months 1 week ago #256159 by mv_alex
Replied by mv_alex on topic Abstimmung einmal täglich erlauben
Vielen Dank für Deine Mühen!

So könnte es tatsächlich funktionieren. Ich habe bloß einen Versatz von einer Stunde - das Cookie läuft um 23 Uhr ab statt um Mitternacht.

Vielleicht ein Problem mit einer abweichenden Serverzeit oder mit der Winterzeit? Kann man das bei der Ermittlung der Sekunden bis Mitternacht irgendwie abfangen?

Gruß Alex

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 months 1 week ago #256176 by Joffm
Replied by Joffm on topic Abstimmung einmal täglich erlauben
Da musst Du natürlich gucken, welche Ideen Euer Server bezüglich der Uhrzeit hat. Einfach mit einem kleinen php script auslesen.
Aber was soll's? Dann addierst Du die fehlenden Sekunden einfach.
Du bist hier ja völlig frei.

Wenn Du allerdings versuchen wolltest, mit "mktime" die Uhrzeit eines anderen Tages zu generieren (z.B. 4:0 morgens des nächsten Tages), musst Du diesen als Parameter hinzufügen.
Etwa so:

Code:
// Zunächst aktuelle Werte bestimmen
$day = date("j");
$month = date("m");
$year = date("Y");
 
// Neuen EWert generieren mit gewünschter Zeit und um 1 erhöhtem Tag
$newtime = mktime(4, 0, 0, $month, $day+1, $year);

Das funktioniert auch beim Monats- und Jahreswechsel.
Kannst Du ja einmal bei "W3Schools" ausprobieren.
[url] www.w3schools.com/php/func_date_mktime.asp [/url]

Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

  • mv_alex
  • mv_alex's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
2 months 1 week ago - 2 months 1 week ago #256196 by mv_alex
Replied by mv_alex on topic Abstimmung einmal täglich erlauben
Tja, das ist ein bisschen seltsam...

Es ist natürlich kein Problem, die 3600 Sekunden aufzuaddieren. Ich hab bloß Sorge, dass mir das dann bei der Umstellung auf Sommerzeit wieder verloren geht.

Wenn ich aber die Serverzeit ausgeben lasse über
Code:
// Aktuelle Zeit des Servers
$aktuelleZeit = date("Y-m-d H:i:s");
// Zeitzone des Servers
$serverZeitzone = date_default_timezone_get();
wird mir die Zeitzone Europe/Berlin angezeigt und die gleiche Uhrzeit wie auf meinem Client.

Trotzdem wirft mir Dein Beispiel als Ablaufzeit den Folgetag um 3 Uhr aus, nicht 4 Uhr. Und das versteh ich ehrlicherweise nicht.

Gruß Alex
Last edit: 2 months 1 week ago by mv_alex.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 months 1 week ago - 2 months 1 week ago #256198 by Joffm
Replied by Joffm on topic Abstimmung einmal täglich erlauben
Ich habe einmal dieses script 
Code:
<?php
$aktuelleZeit = date("d.m.Y H:i:s");
$serverZeitzone = date_default_timezone_get();
echo "Aktuelle Zeit des Servers: ".$aktuelleZeit."<br/>";
echo "Zeitzone des Servers: ".$serverZeitzone."<br/>";
 
echo date("d.m.Y H:i",mktime(0,0,0,2,22,2024)) . "<br>";
echo date("d.m.Y H:i",mktime(4,0,0,5,16,2024)) . "<br>";
 
$day = date("j");
$month = date("m");
$year = date("Y");
$newtime = mktime(4, 0, 0, $month, $day+1, $year);
echo "Soll 4:00 Uhr morgen früh sein: ".date("d.m.Y H:i",$newtime);
?>


bei W3Schools
 
und auf meinem Server 
 
laufen lassen.

Ergebnis:
Zwei verschiedene Zeitzonen, zwei verschiedene aktuelle Uhrzeiten.
Aber mktime ist dies natürlich völlig wurscht. Dort werden die Parameter ja unabhängig davon eingegeben.

Jetzt gäbe es noch die Möglichkeit, dass es bei Eurem Server eine Zeitkorrektur gibt, ähnlich der, die man in den "Globalen Einstellungen" in LimeSurvey einstellen kann.
Dies ist dann ganz praktisch, wenn der Server in Deutschland steht, Du aber eine Umfrage in Uruguay durchführen willst. Ansonsten würde ein Datepicker anfänglich immer die deutsche Zeit anzeigen.

Soll heißen, diese Geschichte musst Du bei Euch suchen.
Ehrlich gesagt, ist es doch in der Praxis schnurzpiepegal, ob das Cookie um 0:00 Uhr oder um 1:00 Uhr endet. Es bleibt ja bei der Bedingung: Einmal in 24 Stunden.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 2 months 1 week ago by Joffm.

Please Log in to join the conversation.

  • mv_alex
  • mv_alex's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
2 months 1 week ago #256753 by mv_alex
Replied by mv_alex on topic Abstimmung einmal täglich erlauben
Auf meinem Server bekomme ich die gleiche Ausgabe wie Du (mal von den Umlauten abgesehen  ):
 

Aber Du hast Recht - praktisch ist es eigentlich völlig egal, ob das Cookie um 23 Uhr, Mitternacht oder 01:00 abläuft. Hauptsache, es kann nur einmal in 24 Stunden abgestimmt werden.

Ich poste das Snippet zum Einfügen in application/helpers/SurveyRuntimeHelper.php ab Zeile 1295 hier noch einmal vollständig, falls noch jemand nach dieser Lösung sucht: 
Code:
            // Cookies
            // Determine current date
            $currentday = date("j");
            $currentmonth = date("m");
            $currentyear = date("Y");
           
            // Generate new value with desired time and day increased by 1
            $midnight = mktime(1, 0, 0, $currentmonth, $currentday+1, $currentyear);
            if ($surveyActive &amp;&amp; $this->aSurveyInfo['usecookie'] == "Y") {
                if (!$oSurvey->getHasTokensTable()) {
                    setcookie("LS_" . $this->iSurveyid . "_STATUS", "COMPLETE", $midnight); //Cookie will expire at midnight
                }
            }

Jetzt muss ich nur noch dran denken, das beim nächsten Update nicht gleich wieder zu überschreiben ... 

Vielen Dank für Deine Unterstützung!

Gruß Alex

Please Log in to join the conversation.

Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose