Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme beim erstellen eines einfachen Monatskalenders

Einklappen

Neue Werbung 2019

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

  • Probleme beim erstellen eines einfachen Monatskalenders

    Hallo,

    ich lerne PHP und habe die Schleifen und die Datumsfunktionen hinter mir. Um das Ganze besser zu verstehen, stelle ich mir selber Aufgaben und versuch sie dann zu lösen.
    Nun möchte ich einen einfachen Monatskalender wie den von Schattenbaum selber erstellen.

    https://www.schattenbaum.net/php/kalender.php

    Dazu habe ich eine Tabelle mit 7 Zellen (Mo – So) erstellt und in den einzelnen Zellen soll der fortlaufende Tag angezeigt werden bis zum Monatsende. (Das Problem, dass im Moment noch jeder Monat an einem Montag beginnt, muss ich später lösen)
    Leider habe ich bei meinem Code irgendwo einen Fehler gemacht.
    Die Tage werden bis zum 29. angezeigt. Dann springt das Datum in eine neue Tabellenreihe und zählt weiter. Außerdem wird die Schleife am Monatsende nicht abgebrochen, sondern zählt bis zum Ende der Tabelle.

    Hier ist meine Code:

    HTML-Code:
    <tableborder="1">
    <tr>
    <th>Mo</th>
    <th>Di</th>
    <th>Mi</th>
    <th>Do</th>
    <th>Fr</th>
    <th>Sa</th>
    <th>So</th>
    </tr>
    <?php
    
    
    $tage_im_monat = date("t");
    $reihen = 6;
    $zellen = 7;
    $startwert = 1;
    for($tr = 1; $tr <= $reihen; $tr++) {
    echo"<tr>"; 
    for($td = 1; $td <= $zellen; $td++) {
    echo"<td>".$startwert++ ."</td>";
    if($startwert == $tage_im_monat) {
    break;
    }
    }
    echo"</tr>";
    }
    
    ?>
    </table>

    Es wäre nett wenn mir jemand genau erklärt, was ich falsch gemacht habe, damit ich das Ganze auch verstehe.

  • #2
    Visierherunter klappen, da gibt es doch schon eine Anleitung bei Schattenbaum, warum diese nicht durcharbeiten?

    Kommentar


    • #3
      @Werner123

      Hallo und danke für die Antwort,

      es gibt mehrere Gründe warum ich nicht den Code von Schattenbaum verwende.

      Selbstverständlich habe ich mir zuerst durchgelesen wie Schattenbaum das gemacht hat. Aber spätesten in der Programmzeile 25, wo Schattenbaum die Schleife erklärt, versteh ich die Logik nicht mehr. In meinem PHP – Büchern wird eine Schleife so erklärt, das von 1 – 10 gezählt wird und das war's.

      Schattenbaum ist seit 2014 schwer erkrankt und macht seitdem nichts mehr in Sachen PHP. 12 Jahre sind eine lange Zeit und ich weiß nicht ob der Kalender von Schattenbaum noch zeitgemäß ist.

      Ich lerne am meisten wenn ich mir selber Gedanken um die Probleme machen muss. Das also alle Tage des Monats ausgegeben werden, dass der 1. des Monats auf den korrekten Wochentag fällt und das die leeren Zellen am Monatsanfang und Monatsende aufgefüllt werden.

      Kommentar


      • #4
        ganz ehrlich Visierhoch , kannst du den Code oben lesen ?
        wir haben tags für sowas im forum [noparse][PHP][/PHP][CODE][/CODE][HTML][/HTML][/noprase]
        was gerad epasst

        Kommentar


        • #5
          PHP-Code:
          echo"<td>".$startwert++ ."</td>"
          muss drei Zeilen nach unten.

          Kommentar


          • #6
            Dank Werner123 klappt das jetzt auch mit dem korrekten Abbruch.

            Aber dann hat sich mir gleich die nächste Frage gestellt.
            Warum wird ein Tag weniger angezeigt als der Monat tatsächlich hat?
            Bei Juni werden z.B. nur 29 Tage angezeigt und bei Juli nur 30 Tage.

            Es ist zwar ganz einfach das Problem zu lösen indem ich bei date("t") einfach 1 hinzu addiere.

            HTML-Code:
            $tage_im_monat = date("t") + 1;
            Um das Ganze aber besser zu verstehen, wäre es interessant für mich zu erfahren, warum ein Tag weniger angezeigt wird.

            Kommentar


            • #7
              Setze den: $startwert = 0;
              PHP-Code:
              <table border="1">
                  <tr>
                      <th>Mo</th>
                      <th>Di</th>
                      <th>Mi</th>
                      <th>Do</th>
                      <th>Fr</th>
                      <th>Sa</th>
                      <th>So</th>
                  </tr>
                  <?php
                  date_default_timezone_set
              ("Europe/Berlin");
                  
              $tage_im_monat date("t");
                  
              $reihen 6;
                  
              $zellen 7;
                  
              $startwert 0;
                  for (
              $tr 1$tr <= $reihen$tr++) {
                      echo 
              "<tr>";
                      for (
              $td 1$td <= $zellen$td++) {
                          if (
              $startwert == $tage_im_monat) {
                              break;
                          }
                          
              $startwert++;
                          echo 
              "<td>" $startwert "</td>";
                      }
                      echo 
              "</tr>";
                  }
                  
              ?>
              </table>

              Kommentar


              • #8
                Vielen dank für die ganze Hilfe bisher.

                Jetzt stehe ich vor dem nächsten Problem. Ein Monat fängt ja nicht immer an einem Montag an und hört an einem Sonntag auf. Nehmen wir mal den Mittwoch für den Monatsanfang. Dann haben wir vor dem Mittwoch noch den Montag und den Dienstag aus dem Monat davor. Diese leeren Zellen für den Vormonat und den Folgemonat möchte ich gerne mit dem Sonderzeichen "&nbsp;" befüllen.

                Um die leeren Zellen zu berechnen habe ich folgendes gemacht.

                Den Starttag des Monats mit mktime() ermittelt. (Der Erste im Juni ist ein Mittwoch)
                Mit date("N") erhalte ich die Zahl des Wochentages (Mittwoch = 3)
                Dann ziehe ich von der Zahl des Wochentages den Wert 1 ab und erhalte die Leerzellen die durch den Vormonat erzeugt werden (Mittwoch hat die Zahl 3, 3 – 1 = 2, Der Vormonat erzeugt 2 leere Zellen nämlich Montag und Dienstag)
                Für die Leerzellen am Monatsende funktioniert das ähnlich nur habe ich hier von dem Wert 7 die Zahl des Wochentages abgezogen.

                Das eigentliche Problem ist jetzt, das ich mit einer Schleife 7 Zellen für Montag bis Sonntag erzeuge und ich den halben Tag probiere, wie ich die Leerzellen mit "&nbsp;" auffülle und den Rest des Kalenders mit den Kalendertagen.

                So sieht das bei mir aus. Hinter den Zeilen die garantiert falsch sind steht der Kommentar: //verkehrt



                HTML-Code:
                     <?php
                    date_default_timezone_set("Europe/Berlin");
                    setlocale(LC_TIME, "de_DE@euro", "de_DE", "deu_deu");
                
                    $reihen = 6;
                    $zellen = 7;
                    $startwert = 0;
                
                    $tag = date("d");
                    $monat = date("m");
                    $jahr = date("Y");
                    $tage_im_monat = date("t");
                
                    $erster_tag = mktime(0, 0, 0, $monat, 1, $jahr); // Ermittelt den Wochentag an dem der Monat anfängt
                    $erster_tag_zahl = date("N", $erster_tag); // Gibt diesen Wochentag als Zahl aus
                    $leerzellen_vormonat = $erster_tag_zahl - 1; // Berechnet die Leerzellen durch Vormonat
                
                    $letzter_tag = mktime(0, 0, 0, $monat, $tage_im_monat, $jahr); //Berechnung Leerzellen Monatsende
                    $letzter_tag_zahl = date("w", $letzter_tag);
                    $leerzellen_folgemonat = 7 - $letzter_tag_zahl;
                
                    $sonderzeichen = "&nbsp;";
                    ?>
                    <table border="1">
                    <caption><?php echo strftime("%B ");  ?></caption>
                    <tr>
                        <th>Mo</th>
                        <th>Di</th>
                        <th>Mi</th>
                        <th>Do</th>
                        <th>Fr</th>
                        <th>Sa</th>
                        <th>So</th>
                    </tr>
                   <?php
                    for ($tr = 1; $tr <= $reihen; $tr++) {
                        echo "<tr>\n";
                        for($leerzellen_anfang = 1; $leerzellen_anfang <= $leerzellen_vormonat; $leerzellen_anfang++) { //verkehrt
                                $sonderzeichen++; //verkehrt
                                echo "<td>\n" . $sonderzeichen . "</td>\n"; //verkehrt
                            }
                        for ($td = 1; $td <= $zellen; $td++) {
                            if ($startwert == $tage_im_monat) {
                                break;
                            }
                
                            $startwert++;
                            echo "<td>\n" . $startwert . "</td>\n";
                        }
                        echo "</tr>\n";
                    }
                    ?>
                </table>


                Langsam verweifel ich an den Schleifen aber vielleicht hat ja jemand einen Tipp für mich.

                Nur mal so 'ne Frage nebenbei: Bin ich eigentlich der Einzige, der sogar schon mit vermeintlich "einfachen" Sachen wie Schleifen Probleme hat oder geht es anderen ab und zu auch so. Manchmal denke ich nämlich, dass ich zu doof für PHP bin und das Ganze lieber bleiben lasse, um nicht umsonst Zeit zu verschwenden.


                Kommentar

                Lädt...
                X