Kalender-Script funktioniert bei Schaltjahren nicht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kalender-Script funktioniert bei Schaltjahren nicht

    Guten Abend/Morgen!

    Heute habe ich ein Problem, bei dem ich nicht ganz weiß, ob ich einfach nur schusselig bin oder ob es tatsächlich an einer Lücke in meinem Wissen über die Datumsfunktionen von PHP geht.

    Ich habe mir ein Script für eine Kalenderfunktion geschrieben. Diese ist vielleicht nicht perfekt, aber sie ist vollständig auf meinem Mist gewachsen und deshalb bin ich an sich sehr zufrieden damit, zumal das Script, bis auf eine Sache super funktioniert.

    Bei einem Schaltjahr funktioniert das Script nämlich nicht und ich kann einfach nicht den Grund dafür herausfinden.

    Es wäre klasse, wenn mir jemand mit meinem Problem helfen könnte.

    Das Script sieht wie folgt aus:
    PHP-Code:
    <?php

    // The current month
    $month date("n");
    // The current year
    $year date("Y");
    // The current day
    $day date("j");

    if(isset(
    $_SESSION['posted'])) {
        
    $date $_SESSION['posted'];
        
    $set "yes";
        
    $year substr($date04);
        
    $month substr($date52);
        
    $day substr($date82);
    }

    function 
    displayCalendar($month$year$day$date$set) {

        
    $cal "<table cellspacing=\"0\" id=\"calendar\" summary=\"Calendar table\">\n";
        
    $cal .= "\t<caption>" strftime("%B %Y"strtotime($date)) . "</caption>\n";
        
    $cal .= "\t<thead>\n";
        
    $cal .= "\t\t<tr>\n";
        
    $cal .= "\t\t\t<th id=\"calendarHead\" scope=\"col\" title=\"Monday\">Mon</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Tuesday\">Tue</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Wednesday\">Wed</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Thursday\">Thu</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Friday\">Fri</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Saturday\">Sat</th>\n";
        
    $cal .= "\t\t\t<th scope=\"col\" title=\"Sunday\">Sun</th>\n";
        
    $cal .= "\t\t</tr>\n";
        
    $cal .= "\t</thead>\n";
        
    $cal .= "\t<tbody>\n";

        
    // The first day of the current month
        
    $first_day_in_month date("D"mktime(000$month1$year));

        
    // How many days does the current month have?
        
    $month_has_days cal_days_in_month(CAL_GREGORIAN$month$year);

        
    // An array containing the days of the week in sequence
        
    $day_nr = array("Mon" => 1,
                        
    "Tue" => 2,
                        
    "Wed" => 3,
                        
    "Thu" => 4,
                        
    "Fri" => 5,
                        
    "Sat" => 6,
                        
    "Sun" => 7);

        
    // The number of the first table data element containing a date
        
    $begin_at_day_nr $day_nr[$first_day_in_month];

        
    // The total number of tr tags
        
    $trs ceil(($begin_at_day_nr $month_has_days)/7);

        
    // The total number of td tags
        
    $total_tds $trs 7;

        for(
    $i=1$i<=$total_tds$i++) {

            
    // Begin with a tr tag
            
    if($i == 1) {
                
    $cal .= "\t\t<tr class=\"odd\">\n";
            }

            
    // Seven table data tags per row are needed, so put
            // a </tr> after every seventh td tag
            
    if($i == AND $i != 1) {
                if(
    $i-$month_has_days != 0) {
                    
    $cal .= "\t\t</tr>\n";
                    
    // Assign a class to every second tr tag
                    
    if($i == 1) {
                        
    $cal .= "\t\t<tr class=\"odd\">\n";
                    } else {
                        
    $cal .= "\t\t<tr>\n";
                    }
                }
            }

            
    // Since not every month starts with the same week day there will
            // have to be some td tags without a calendar day. Fill them with
            // the word "empty" and use CSS with a high negative text-indent
            // value to make them appear empty, in order to keep the Markup valid
            
    if($i<$begin_at_day_nr OR $i-$begin_at_day_nr+1>$month_has_days) {
                
    $cal .= "\t\t\t<td class=\"empty\">empty</td>\n";
            } else {
            
    // Substract the number of empty tds from the actual number of tds
            // in order to display the correct calendar day
                
    $cal_day $i-$begin_at_day_nr+1;
                if(
    $cal_day 10) {
                    
    $cal_day "0". (string)$cal_day;
                }
                if(
    $cal_day == $day) {
                    if(
    $set == "yes") {
                        
    $cal .= "\t\t\t<td class=\"marked\" title=\"Current blog\">" $cal_day "</td>\n";
                    } else {
                        
    $cal .= "\t\t\t<td class=\"marked\" title=\"Today's date\">" $cal_day "</td>\n";
                    }
                } else {
                    
    $cal .= "\t\t\t<td>" $cal_day "</td>\n";
                }
            }
        }

        
    $earlier date("F"mktime(000$month-10$year));
        
    $later date("F"mktime(000$month+20$year));

        
    $cal .= "\t\t</tr>\n";
        
    $cal .= "\t</tbody>\n";
        
    $cal .= "</table>\n";

        return 
    $cal;

    }

    echo 
    displayCalendar($month$year$day$date$set);

    unset(
    $date$_SESSION['posted'], $set);

    ?>
    Beachtet einfach den obersten Block nicht, und gebt einmal die Daten eines Schaltjahres ein, bspw.:
    PHP-Code:
     echo displayCalendar(022004$day$date$set); 
    Dann werdet Ihr sehen, dass die letzte Reihe von table data tags nicht mehr von table row tags umschlossen wird. Und es scheint tatsächlich nur bei Schaltjahren nicht zu funktionieren.

    Ich komme einfach nicht auf den Fehler und bin für jede Hilfe dankbar!

    EDIT: Ich hoffe, der Code ist nicht zu unübersichtlich.
    Zuletzt geändert von Jester_Prince; 16.08.2009, 02:59.

    1. Ja, ich habe die entsprechenden Einträge im Manual gelesen. Google habe ich auch benutzt. Das mache ich immer zuerst, wenn ich eine Frage habe, denn ich habe zu Glück das selbstständige Denken gelernt, sonst würde ich nicht fragen
    2. Ja, ich besitze den erstzunehmenden Ehrgeiz, die Dinge, nach denen ich frage, auch zu begreifen und/oder begreifen zu lernen, sonst würde ich nicht fragen


  • #2
    Ich habe den Fehler selbst gefunden.

    [COLOR=#000000][COLOR=#ff9900]
    [/COLOR][/COLOR]
    PHP-Code:
    if($i == AND $i != 1) {
        if(
    $i-$month_has_days != 0) {    /* In dieser überflüssigen Abfrage liegt der Fehler */
            
    $cal .= "\t\t</tr>\n";
             if(
    $i == 1) {
                
    $cal .= "\t\t<tr class=\"odd\">\n";
            } else {
                
    $cal .= "\t\t<tr>\n";
            }
        }

    Ich muss vergessen haben, diese Zeile nach einem Test aus dem Script zu löschen. Wenn man zu lange an etwas arbeitet, geht die Konzentration eben verloren.
    Zuletzt geändert von Jester_Prince; 16.08.2009, 02:54.

    1. Ja, ich habe die entsprechenden Einträge im Manual gelesen. Google habe ich auch benutzt. Das mache ich immer zuerst, wenn ich eine Frage habe, denn ich habe zu Glück das selbstständige Denken gelernt, sonst würde ich nicht fragen
    2. Ja, ich besitze den erstzunehmenden Ehrgeiz, die Dinge, nach denen ich frage, auch zu begreifen und/oder begreifen zu lernen, sonst würde ich nicht fragen

    Kommentar


    • #3
      PHP-Code:
      <?php

      $date 
      date("Y-m-H");
      $set "no";
      $month date("n");
      $year date("Y");
      $day date("j");

      function 
      displayCalendar($month$year$day$date$set) {

          
      $cal "<table cellspacing=\"0\" id=\"calendar\" summary=\"Calendar table\">\n";
          
      $cal .= "\t<caption>" strftime("%B %Y"strtotime($date)) . "</caption>\n";
          
      $cal .= "\t<thead>\n";
          
      $cal .= "\t\t<tr>\n";
          
      $cal .= "\t\t\t<th id=\"calendarHead\" scope=\"col\" title=\"Monday\">Mon</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Tuesday\">Tue</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Wednesday\">Wed</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Thursday\">Thu</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Friday\">Fri</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Saturday\">Sat</th>\n";
          
      $cal .= "\t\t\t<th scope=\"col\" title=\"Sunday\">Sun</th>\n";
          
      $cal .= "\t\t</tr>\n";
          
      $cal .= "\t</thead>\n";
          
      $cal .= "\t<tbody>\n";

          
      // The first day of the current month
          
      $first_day_in_month date("D"mktime(000$month1$year));

          
      // How many days does the current month have?
          
      $month_has_days cal_days_in_month(CAL_GREGORIAN$month$year);

          
      // An array containing the days of the week in sequence
          
      $day_nr = array("Mon" => 1,
                          
      "Tue" => 2,
                          
      "Wed" => 3,
                          
      "Thu" => 4,
                          
      "Fri" => 5,
                          
      "Sat" => 6,
                          
      "Sun" => 7);

          
      // The number of the first table data element containing a date
          
      $begin_at_day_nr $day_nr[$first_day_in_month];

          
      // The total number of tr tags
          
      $trs ceil(($begin_at_day_nr $month_has_days-1)/7);

          
      // The total number of td tags
          
      $total_tds $trs 7;

          for(
      $i=1$i<=$total_tds$i++) {

              
      // Begin with a tr tag
              
      if($i == 1) {
                  
      $cal .= "\t\t<tr class=\"odd\">\n";
              }

              
      // Seven table data tags per row are needed, so put
              // a </tr> after every seventh td tag
              
      if($i == AND $i != 1) {
              if(
      $i-$first_day_in_month-!= 0) {
                  
      $cal .= "\t\t</tr>\n";
                  
      // Assign a class to every second tr tag
                  
      if($i == 1) {
                      
      $cal .= "\t\t<tr class=\"odd\">\n";
                  } else {
                      
      $cal .= "\t\t<tr>\n";
                  }
              }
              }

              
      // Since not every month starts with the same week day there will
              // have to be some td tags without a calendar day. Fill them with
              // the word "empty" and use CSS with a high negative text-indent
              // value to make them appear empty, in order to keep the Markup valid
              
      if($i<$begin_at_day_nr OR $i-$begin_at_day_nr+1>$month_has_days) {
                  
      $cal .= "\t\t\t<td class=\"empty\">empty</td>\n";
              } else {
              
      // Substract the number of empty tds from the actual number of tds
              // in order to display the correct calendar day
                  
      $cal_day $i-$begin_at_day_nr+1;
                  if(
      $cal_day 10) {
                      
      $cal_day "0". (string)$cal_day;
                  }
                  if(
      $cal_day == $day) {
                      if(
      $set == "yes") {
                          
      $cal .= "\t\t\t<td class=\"marked\" title=\"Current blog\">" $cal_day "</td>\n";
                      } else {
                          
      $cal .= "\t\t\t<td class=\"marked\" title=\"Today's date\">" $cal_day "</td>\n";
                      }
                  } else {
                      
      $cal .= "\t\t\t<td>" $cal_day "</td>\n";
                  }
              }
          }

          
      $earlier date("F"mktime(000$month-10$year));
          
      $later date("F"mktime(000$month+20$year));

          
      $cal .= "\t\t</tr>\n";
          
      /*
          $cal .= "\t\t<tr>\n";
          $cal .= "\t\t\t<td colspan=\"3\" class=\"monthLink\">&lt;&lt; " . $earlier . "</td>\n";
          $cal .= "\t\t\t<td class=\"empty noHover\">empty</td>\n";
          $cal .= "\t\t\t<td colspan=\"3\" class=\"monthLink\">" . $later . " &gt;&gt;</td>\n";
          $cal .= "\t\t</tr>\n";
          */
          
      $cal .= "\t</tbody>\n";
          
      $cal .= "</table>\n";

          return 
      $cal;

      }

      echo 
      displayCalendar($month$year$day$date$set);

      unset(
      $date$_SESSION['posted'], $set);
      So! Nun arbeitet das Script genau so, wie es soll. Es geht vielleicht einfacher, effektiver und vielleicht auch schöner, aber es geht doch nichts über eigenen Code.

      Wer die Funktion benutzen/erweitern/verbessern möchte, kann dies gerne tun. Es wäre aber schön, wenn Ihr Eure Version dann auch hier postet, damit jeder was davon hat.

      Und hier noch einmal ein Bild von der CSS formatierten Version meines Kalenders ;-)


      1. Ja, ich habe die entsprechenden Einträge im Manual gelesen. Google habe ich auch benutzt. Das mache ich immer zuerst, wenn ich eine Frage habe, denn ich habe zu Glück das selbstständige Denken gelernt, sonst würde ich nicht fragen
      2. Ja, ich besitze den erstzunehmenden Ehrgeiz, die Dinge, nach denen ich frage, auch zu begreifen und/oder begreifen zu lernen, sonst würde ich nicht fragen

      Kommentar


      • #4
        danke für deine die Lösung!
        Viele werden vor ähnlichen Problemen stehen

        php-Entwicklung | ebiz-consult.de
        PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
        die PHP Marktplatz-Software | ebiz-trader.de

        Kommentar

        Lädt...
        X