Calendar-View zeigt falsche Woche an

Ich dachte mich tritt ein Pferd! Ende Dezember hatte ich eine Kundenwebsite mit Drupal 6 entwickelt, die unter anderem verschiedene Kalenderansichten enthält: Monats- und Wochenkalender - bereitgestellt vom Views-Modul -, die verschiedene Inhaltstypen anzeigen. Alles funktionierte einwandfrei. Nun war also der Kunde am Zuge, sich alles anzuschauen, ggf. letzte Änderungswünsche zu äußern und dann die Seite freizugeben. Dies ist mittlerweile passiert und heute wollte ich die letzten Änderungen einarbeiten. Aber was war das? Die Wochenkalender zeigten plötzlich nicht mehr die aktuelle, sondern die vergangene Woche an! Und das, ohne dass irgendetwas an der Seite geändert worden wäre, kein Update, keine neun Module, nur ein paar neue Inhalte.

Nach einer kurzen Recherche war das Problem dann gefunden. Die Ursache liegt darin, dass es in Europa und USA unterschiedlichen Verfahren zur Bestimmung der 1. Kalenderwoche (KW) eines Jahres gibt.

  • USA: jene Woche, in die der 1. Januar fällt
  • Deutschland/EU: die erste Woche, in die mindestens vier Tage des neuen Jahres fallen (DIN 1355-1 / ISO 8601)

Außerdem beginnt hierzulande eine Woche am Montag in den USA dagegen am Sonntag. Schaut man auf den Kalender, so sieht man, dass nach US-Zählung die erste KW schon am 27. Dezember 2009 begonnen hatte, hierzulande aber erst am Montag, den 4. Januar 2010. Damit sind wir heute in der KW 6, nach US-Zählung aber schon in der KW 7. Nun wäre das an sich noch kein Problem, denn der verwendete Kalenderview soll nicht die Nummer der KW ausgeben, sondern nur die 7 Tage dieser Woche auflisten. Dummerweise verwenden die beiden Module, die hier zusammenarbeiten sollen (Date und Calendar) unterschiedliche Zählweisen und so gibt der Kalender-View nicht die laufende Woch sondern die Vorwoche aus.

Der folgende Patch behebt den Fehler und es wird wieder die laufende Woche angezeigt. Die Funktion get_default_argument befindet sich in der Datei (../sites/all/modules/date/includes/date_api_argument_handler.inc ab Zeile 144 (Version 2.4 des Date-Moduls)

/
   function get_default_argument($raw = FALSE) {
     if (!$raw && $this->options['default_argument_type'] == 'date') {
-      return date($this->format(), time());
+      $arg = date($this->format(), time());
+
+      $parts = $this->date_handler->arg_parts($arg);
+
+      if($parts[0]['date']['week']){
+        $year = date("Y");
+        $last_week_of_year = date("W",strtotime(($year-1)."-"."12-31"));
+        $last_day_of_year  = date("w",strtotime(($year-1)."-"."12-31"));
+        if ($last_day_of_year > 3 and $week != $last_week_of_year) {
+          $arg = date($this->format(),time()+7*24*60*60);
+        }
+      }
+      return $arg;
     }
     else {
       return parent::get_default_argument($raw);

Quelle: http://drupal.org/node/686394

Trackback URL for this post:

http://tederion.de/trackback/84