PHP Kalenderproblem

Coach

Aktives Mitglied
Hallo,

ich hab mir ein kleines Kalenderscript geschrieben, klappt auch so weit für die den aktuellen Monat, die Tage des vorherigen Monats die angezeigt werden müssen und die letzten Tage des nächsten Monats.
Leider aber nicht der letzte Tag.
Dort wird beispielsweise in der Ansicht Dezember 2007 dann sowas dargestellt:


26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 30

Ist ja alles soweit richtig, nur der letzte Tag stimmt nicht.
Hier mein Skript (wäre froh, wenn mir jmd helfen könnte - ich find den Fehler einfach nicht)

CODE
$monat=date("n");
$jahr=date("Y");

if($monat-1 != 0){ // Januar -> Dezember
$previous_month = $monat-1;
$previous_year = $jahr;
}else{
$previous_month = 12;
$previous_year = $jahr-1;
}

if($monat+1 != 13){ // Dezember -> Januar
$next_month = $monat+1;
$next_year = $jahr;
}else{
$next_month = 1;
$next_year = $jahr+1;
}

$tpl->set_file("CalendarFileHandle","members/calendar_panel.tpl");

$tpl->set_var("previous_month",$previous_month);
$tpl->set_var("previous_year",$previous_year);

$tpl->set_var("next_month",$next_month);
$tpl->set_var("next_year",$next_year);

$monate = array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
$tpl->set_var("month",$monate[$monat-1]);
$tpl->set_var("year",$jahr);

$tpl->set_block("CalendarFileHandle","DayDisplayBlock","DDBlock");
$tpl->set_block("CalendarFileHandle","WeekDisplayBlock","WDBlock");

$wochentage=array("M","D","M","D","F","S","S");
$wochentage_num=array(1,2,3,4,5,6,0);

// Startwerte
$i=1;
$datum = mktime(0,0,0,$monat,$i,$jahr);
$tag_der_woche = getdate($datum);
$tag_der_woche = $tag_der_woche[wday];
$erstertag = $tag_der_woche;
$link = 0;
$stored_week = "";
$week_number = "";
do{
$tpl->set_var("DDBlock","");
for($j=0;$j<7;$j++){
if($tag_der_woche == $wochentage_num[$j] && checkdate($monat,$i,$jahr)){
// SQL
$tpl->set_var("day","".$i."");

$tag = "";
if($i < 10)
$tag .= "0".$i;
else
$tag = $i;
$tpl->set_var("date","".$jahr."-".$monat."-".$tag."");
$tpl->parse("DDBlock","DayDisplayBlock",true);
$i++;
$link = 0;
}else{
// Block für Vormonat, bzw. folgenden Monat
if($i==1){
$output_var = date("j",$datum-(($erstertag-$wochentage_num[$j]) * 86400));
$tpl->set_var("day",$output_var);
$last_jahr = $jahr;
if($monat != 1)
$last_monat = $monat-1;
else{
$last_monat = 12;
$last_jahr = $jahr-1;
}
$tpl->set_var("date","".$last_jahr."-".$last_monat."-".$output_var."");
}elseif(!checkdate($monat,$i,$jahr)){
$output_var = date("j",$datum + (($wochentage_num[$j] - ($tag_der_woche)) * 86400));
$tpl->set_var("day",$output_var);
$next_jahr = $jahr;
if($monat != 12)
$next_monat = $monat+1;
else{
$next_monat = 1;
$next_year = $jahr+1;
}
if($next_monat < 10) $next_monat = "0".$next_monat;
if($output_var < 10) $output_var = "0".$output_var;
$tpl->set_var("date","".$next_jahr."-".$next_monat."-".$output_var."");
}
$tpl->parse("DDBlock","DayDisplayBlock",true);
}
$tpl->set_block("CalendarFileHandle","WEEK_BLOCK","wb");
for($k=0;$k <= getNumWeeks($monat,$jahr);$k++){
$day = $i * ($k*7);
$week_number = get_week_number(date2timestamp("".$jahr."-".$monat."-".$day.""));
$tpl->set_var("week_number",$week_number);
$stored_week = $week_number;
$tpl->parse("wb","WEEK_BLOCK",true);
}
$datum = mktime(0,0,0,$monat,$i,$jahr);
$tag_der_woche = getdate($datum);
$tag_der_woche = $tag_der_woche[wday];
}
$tpl->parse("WDBlock","WeekDisplayBlock",true);
} while($i <= 31 && $endofmonth != 1);

 
Ich kann gut verstehen, dass du den Fehler nicht findest. Man kann einfache Sachen ja auch ohne Ende verkomplizieren.

Trotz zweimaligem Durchsehen konnte ich z.B. nicht finden, wo du $endofmonth setzt.
Möglicherweise
tongue.gif
stimmt das $datum nicht. Versuch mal von Mitternacht in die frühen Morgenstunden oder auf Mittag zu gehen.

Doch warum schreibst du denn soviele Schleifen für eine einzige? Ich meine, normalweise folgt doch jeder Tag auf den nächsten. Du könntest doch viel einfacher den timestamp des ersten Tages des Vormonats als Starttermin setzen und dann einmal bis zum letzten des Folgemonats durchlaufen.

Ich weiss jedenfalls, warum ich Klassen, wenn es irgend geht, meide, denn irgendwann ... rufen manche einfach nur noch Funktionen zum Aufrufen einer Funktion auf. Dein Script erinnert mich ein bisschen an die Akademie der Wissenschaften in Lagado aus Gullivers Reisen.


enjoy

 
Zurück
Oben