Mathiis: Navigation in einem Kalender

Hallo Allerseits.

Ich habe in PHP einen Kalender programmiert, der eine Woche von Montag bis Sonntag von 08.00 - 20.00 Uhr abbildet, in dem Termine eingetragen werden können. In diesen Terminen können sich Leute über einen Button anmelden.
Das klappt alles auch schon wunderbar.

Nun möchte ich diesen Kalender so erweitern, dass ich über zwei Buttons zur nächsten/vorherigen Woche springen kann. Dazu habe ich in meiner DB Tabelle schon ein Datumsfeld und ein Wochennr.-feld eingefügt. Wenn jetzt ein Termin angelegt wird, speichert er also auch Wochennummer und Datum.

Gibt es irgendwo ein Tutorial, wie ich die Navigations programmieren kann?
Ich komme im Moment überhaupt nicht drauf, wie ich anfangen soll.

Gruß

Mathiis

  1. Nun möchte ich diesen Kalender so erweitern, dass ich über zwei Buttons zur nächsten/vorherigen Woche springen kann. Dazu habe ich in meiner DB Tabelle schon ein Datumsfeld und ein Wochennr.-feld eingefügt. Wenn jetzt ein Termin angelegt wird, speichert er also auch Wochennummer und Datum.

    wenns dir möglich ist, ändere dein datenbankmodell und speichere die termine als zeitstempel in der datenbank - anfangszeitpunkg und endzeitpunkt - das sind die einzigen beiden relevanten informationen die du dafür brauchst

    anfangszeitpunkt, endzeitpunkt, wochennummer, datum usw ist völlig absurd

    1. Nun möchte ich diesen Kalender so erweitern, dass ich über zwei Buttons zur nächsten/vorherigen Woche springen kann. Dazu habe ich in meiner DB Tabelle schon ein Datumsfeld und ein Wochennr.-feld eingefügt. Wenn jetzt ein Termin angelegt wird, speichert er also auch Wochennummer und Datum.

      wenns dir möglich ist, ändere dein datenbankmodell und speichere die termine als zeitstempel in der datenbank - anfangszeitpunkg und endzeitpunkt - das sind die einzigen beiden relevanten informationen die du dafür brauchst

      anfangszeitpunkt, endzeitpunkt, wochennummer, datum usw ist völlig absurd

      ich habe das projekt leider von anderen übernommen und der Datenbankaufbau ist völlig murks. Die haben ein int Feld für den Tag, also 1-7, charfelder!!!!! für die anfangsstunden/-minuten und endstunden/-minuten.
      Datum war vorher halt nie vorhanden.
      Das Problem ist, dass ich da nicht groß was dran ändern kann, da sich die Abbildung des Termins, quasi die Breite, durch die Werte berechnet.
      Es wird also ein Block erstellt (Termin), der in dem Wochenplangerüst abgebildet wird.

      Ich hoffe ich hab es verständlich ausgedrückt, ist irgendwie nicht so einfach zu erklären. :-)

      1. Hallo

        ich habe das projekt leider von anderen übernommen und der Datenbankaufbau ist völlig murks. Die haben ein int Feld für den Tag, also 1-7, charfelder!!!!! für die anfangsstunden/-minuten und endstunden/-minuten.
        Datum war vorher halt nie vorhanden.
        Das Problem ist, dass ich da nicht groß was dran ändern kann, da sich die Abbildung des Termins, quasi die Breite, durch die Werte berechnet.

        Du wirst doch hoffentlich am Tabellenaufbau etwas ändern können/dürfen? Ein Feld für Anfang (und Ende?) eines Eintrags im DATETIME-Format reicht für deinen Zweck völlig aus. Du müsstest nur noch pro Datensatz die vorhandenen Daten in das DATETIME-Format umrechnen (Y-m-d H:i:s (siehe PHP: date)) und in den Datensatz einfügen.

        Logischerweise wird dann beim Eintrag und bei der Ausgabe zukünftig auf die neuen Felder zugegriffen.

        Es wird also ein Block erstellt (Termin), der in dem Wochenplangerüst abgebildet wird.

        Das ist nur eine Frage der folgenden Ausgabe der Einträge.

        Tschö, Auge

        --
        Die deutschen Interessen werden am Liechtenstein verteidigt.
        Veranstaltungsdatenbank Vdb 0.2
        1. Du wirst doch hoffentlich am Tabellenaufbau etwas ändern können/dürfen? Ein Feld für Anfang (und Ende?) eines Eintrags im DATETIME-Format reicht für deinen Zweck völlig aus. Du müsstest nur noch pro Datensatz die vorhandenen Daten in das DATETIME-Format umrechnen (Y-m-d H:i:s (siehe PHP: date)) und in den Datensatz einfügen.

          Logischerweise wird dann beim Eintrag und bei der Ausgabe zukünftig auf die neuen Felder zugegriffen.

          hmm, also könnte ich ein datetime feld einfügen und dann den Inhalt, den ich reinschreiben will aus mehreren Feldern zusammensetzen. Schon hab ich ne kleinere DB. Hmm, das ist natürlich gut.

          Es wird also ein Block erstellt (Termin), der in dem Wochenplangerüst abgebildet wird.

          Das ist nur eine Frage der folgenden Ausgabe der Einträge.

          Tschö, Auge

          Und dann muss ich diese Felder wieder auseinander pflücken, damit die Darstellung passt.

          ich hole mir über eine Anfrage an die DB die Termine, die in einer Woche liegen und pflücke mir die Zeiten so raus, dass ich damit weiterrechnen kann.

          Füge mal die Breitenberechnung ein, damit man mal sieht, was mir vorgesetzt wurde...

          function termine_raum(){
           global $site_config, $session;
           $min = 480;
           $max = 1200;
           $boardwidth=600;
           $datewidth=60;
           $calendarwidth=720;
           for($i = 1; $i <= 6; $i++) {
                    $tmp[$i] = $this->get_day_termin_raum($i);
             if(!empty($tag_termin)) {
            $tmp[$i] = $tag_termin;
             }

          }

          if(!empty($tmp)) {
              foreach ($tmp as $key => $val) {
              $summe = 0;
              $y = 0;
              $min = 480;
              $width[$key]["tag"] = $this->wochentage[$key];
              if(!empty($val)) {
                      foreach ($val as $k => $v) {
                            $width[$key]["daten"][$y]["width"] = (($v["termin_anf_std"]*$datewidth + $v["termin_anf_min"]) - $min)*($boardwidth/$calendarwidth);
              $summe += $width[$key]["daten"][$y]["width"];
              $width[$key]["daten"][$y]["class"] = "eintrag_lost";
              $y++;
              $width[$key]["daten"][$y]["width"] = (($v["termin_end_std"]*$datewidth + $v["termin_end_min"]) - ($v["termin_anf_std"]*$datewidth + $v["termin_anf_min"]))*($boardwidth/$calendarwidth);
                            $width[$key]["daten"][$y]["von"] = $v["termin_anf_std"].":".$v["termin_anf_min"];;
              $width[$key]["daten"][$y]["studenten"] = $this->get_user_termin($v["termin_id"]);
              $width[$key]["daten"][$y]["bis"] = $v["termin_end_std"].":".$v["termin_end_min"];
              $width[$key]["daten"][$y]["termin_id"] = $v["termin_id"];
              if($v["termin_kind"] == 3) {
                $width[$key]["daten"][$y]["class"] = "eintrag_free";
              }
              elseif($v["termin_kind"] == 1){
                $width[$key]["daten"][$y]["class"] = "eintrag";
              } else {
                $width[$key]["daten"][$y]["class"] = "eintrag_sperr";
              }

          $summe += $width[$key]["daten"][$y]["width"];
              $y++;
                            $min = $v["termin_end_std"]*$datewidth + $v["termin_end_min"];
               }
           }
           $width[$key]["daten"][$y]["width"] = $boardwidth - $summe;
          }
          }
          return $width;
          }

          1. Hallo

            Ein Feld für Anfang (und Ende?) eines Eintrags im DATETIME-Format reicht für deinen Zweck völlig aus. Du müsstest nur noch pro Datensatz die vorhandenen Daten in das DATETIME-Format umrechnen (Y-m-d H:i:s (siehe PHP: date)) und in den Datensatz einfügen.

            Logischerweise wird dann beim Eintrag und bei der Ausgabe zukünftig auf die neuen Felder zugegriffen.

            hmm, also könnte ich ein datetime feld einfügen und dann den Inhalt, den ich reinschreiben will aus mehreren Feldern zusammensetzen. Schon hab ich ne kleinere DB. Hmm, das ist natürlich gut.

            Ich dachte, die DB hättest du schon, nur dass die Daten für das Datum eines Eintrags in einem ungünstigen Format vorliegen.

            Es wird also ein Block erstellt (Termin), der in dem Wochenplangerüst abgebildet wird.

            Das ist nur eine Frage der folgenden Ausgabe der Einträge.

            Und dann muss ich diese Felder wieder auseinander pflücken, damit die Darstellung passt.

            Nehmen wir an, in der Datenbank liegt ein Eintrag für heute 12 Uhr mittags vor. Im Datumsfeld (Typ: DATETIME) steht 2008-09-23 12:00:00. Nehmen wir weiter an, das Ergebnis _eines_ Eintrags steht in der Variable $row und das DB-Feld hat den Namen "datum". Datum und Uhrzeit kannst du per PHP mit $array = explode(" ",$row["datum"]); trennen. Die Daten liegen jetzt als Array vor, $array[0] enthält das Datum, $array[1] die Uhrzeit.

            Welche Breite du mit deinem geposteten Code ermitteln willst, ist mir nicht ganz klar. Wahrscheinlich ist es noch zu früh für mich. :-) Wenn es, wie ich vermute, um ein Balkendiagramm für die Termine gehen sollte, ist wieder die Endzeit eines Termins im Spiel.

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.2
            1. Ich dachte, die DB hättest du schon, nur dass die Daten für das Datum eines Eintrags in einem ungünstigen Format vorliegen.

              ja, die ist schon vorhanden, nur ohne Datumsfeld, weil der Kalender bis jetzt nur mit einer Woche benutzt wurde.

              Nehmen wir an, in der Datenbank liegt ein Eintrag für heute 12 Uhr mittags vor. Im Datumsfeld (Typ: DATETIME) steht 2008-09-23 12:00:00. Nehmen wir weiter an, das Ergebnis _eines_ Eintrags steht in der Variable $row und das DB-Feld hat den Namen "datum". Datum und Uhrzeit kannst du per PHP mit $array = explode(" ",$row["datum"]); trennen. Die Daten liegen jetzt als Array vor, $array[0] enthält das Datum, $array[1] die Uhrzeit.

              Jo, das hab ich nu verstanden. :-)

              Welche Breite du mit deinem geposteten Code ermitteln willst, ist mir nicht ganz klar. Wahrscheinlich ist es noch zu früh für mich. :-) Wenn es, wie ich vermute, um ein Balkendiagramm für die Termine gehen sollte, ist wieder die Endzeit eines Termins im Spiel.

              Tschö, Auge

              Die Endzeit benötige ich auf jeden Fall, also die Uhrzeit, denn daraus errechnet sich ja die breite des Termins. Es ist wirklich wie ein Balken.
              Der Termin wird quasi horizontal angezeigt. Ich hätte es zwar, wen ich es von Grund auf selbst gemacht hätte anders gemacht, aber das nützt mir leider jetzt nix mehr, dafür ist das Projekt schon zu weit. :-(

  2. Hallo

    Hallo Allerseits.

    Ich habe in PHP einen Kalender programmiert, der eine Woche von Montag bis Sonntag von 08.00 - 20.00 Uhr abbildet, ...

    Nun möchte ich diesen Kalender so erweitern, dass ich über zwei Buttons zur nächsten/vorherigen Woche springen kann.

    Der Kalender wird in ein HTML-Dokument eingefügt (davon gehe ich aus), die Navigation ist also hier anzusetzen. Du brauchst also nur Links zur vorherigen Woche, vielleicht auch Monat und Jahr, die z.B. als GET-Parameter an den link angehängt werden. Mit diesen Informationen baust du den Kalender mit den sich daraus ergebenden Daten neu auf.

    Dazu habe ich in meiner DB Tabelle schon ein Datumsfeld und ein Wochennr.-feld eingefügt. Wenn jetzt ein Termin angelegt wird, speichert er also auch Wochennummer und Datum.

    Die Wochennummer brauchst du nicht in der Tabelle. Das Datum, bzw., wie von suit schon gesagt, das Start- und Enddatum- reichen, um alle anderen Informationen zu ermitteln respektive den Eintrag in der Ausgabe zu positionieren.

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.2
    1. Der Kalender wird in ein HTML-Dokument eingefügt (davon gehe ich aus), die Navigation ist also hier anzusetzen. Du brauchst also nur Links zur vorherigen Woche, vielleicht auch Monat und Jahr, die z.B. als GET-Parameter an den link angehängt werden. Mit diesen Informationen baust du den Kalender mit den sich daraus ergebenden Daten neu auf.

      Ah, ok, danke für die Infos soweit.
      Also ich benutze die Templateengine Smarty, das macht es für mich alles noch ein wenig komplizierter, da ich nicht so der PHP Meister bin.

      Ich brauche aber eigentlich nur ein Datum, da ein Termin nie über 2 Tage gehen wird (sind halt Vorlesungstermine). Anhand des Datums kann ich ja auf jeden Fall die Wochennummer und co herausfinden. :-)

      Hmm, mal schauen, ob ich das hinbekomme.

      1. Hallo

        Der Kalender wird in ein HTML-Dokument eingefügt (davon gehe ich aus), die Navigation ist also hier anzusetzen. Du brauchst also nur Links zur vorherigen Woche, vielleicht auch Monat und Jahr, die z.B. als GET-Parameter an den link angehängt werden. Mit diesen Informationen baust du den Kalender mit den sich daraus ergebenden Daten neu auf.

        Ah, ok, danke für die Infos soweit.
        Also ich benutze die Templateengine Smarty, das macht es für mich alles noch ein wenig komplizierter, da ich nicht so der PHP Meister bin.

        Smarty ist erstmal etwas verwirrend. Macht aber nix, da, wo die Strings für die Links zusammengesetzt werden, musst du ansetzen.

        Ich brauche aber eigentlich nur ein Datum, da ein Termin nie über 2 Tage gehen wird (sind halt Vorlesungstermine). Anhand des Datums kann ich ja auf jeden Fall die Wochennummer und co herausfinden. :-)

        Dann brauchst du schonmal kein Enddatum, vorausgesetzt, Vorlesungen gehen nicht über mehrere Tage (also nicht am Stück sondern in mehreren Teilen :-)).

        Tschö, Auge

        --
        Die deutschen Interessen werden am Liechtenstein verteidigt.
        Veranstaltungsdatenbank Vdb 0.2
        1. Dann brauchst du schonmal kein Enddatum, vorausgesetzt, Vorlesungen gehen nicht über mehrere Tage (also nicht am Stück sondern in mehreren Teilen :-)).

          Tschö, Auge

          Ah, du hast recht, ich brauche doch ein Enddatum, da sich die Vorlesungen ja bis zu einem gewissen Datum wöchtenlich wiederholen. Mööp, doofer Denkfehler meinerseits....

          1. Hallo

            Dann brauchst du schonmal kein Enddatum, vorausgesetzt, Vorlesungen gehen nicht über mehrere Tage (also nicht am Stück sondern in mehreren Teilen :-)).

            Ah, du hast recht, ich brauche doch ein Enddatum, da sich die Vorlesungen ja bis zu einem gewissen Datum wöchtenlich wiederholen. Mööp, doofer Denkfehler meinerseits....

            Dann bräuchtest du aber ein Feld für den Wiederholungsrythmus oder du trägst die Vorlesung mehrfach mit der Erweiterung "Teil x" ein.

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.2
            1. Dann bräuchtest du aber ein Feld für den Wiederholungsrythmus oder du trägst die Vorlesung mehrfach mit der Erweiterung "Teil x" ein.

              Tschö, Auge

              Ich würde das mit einer Schleife regeln, die immer 7 Tage addiert und den Termin dann einträgt.

              1. Hallo

                Dann bräuchtest du aber ein Feld für den Wiederholungsrythmus oder du trägst die Vorlesung mehrfach mit der Erweiterung "Teil x" ein.

                Tschö, Auge

                Ich würde das mit einer Schleife regeln, die immer 7 Tage addiert und den Termin dann einträgt.

                Das ginge auch. Dann brauchst du entsprechende Formularelemente, die dich eintragen lassen, in welchem Rythmus eine Vorlesung stattfindet und wie oft diese wiederholt wird (z.B. wöchentlich, 5 mal). Alternativ hast du einen weiteren Kalender auf der Eingabeseite, dessen Felder für die Tage aus Checkboxen besteht, so dass du die Wiederholungen per Aktivierung der Chekboxen anweist.

                Daraus kann -bei beiden Methoden- das auswertende Skript ermitteln, wie oft und an welchen Tagen ein Eintrag erfolgen soll. Mit den ermittelten Daten wird der SQL-Querystring zusammengebaut, der alle Termine mit einem Rutsch einträgt.

                Tschö, Auge

                --
                Die deutschen Interessen werden am Liechtenstein verteidigt.
                Veranstaltungsdatenbank Vdb 0.2
                1. Das ginge auch. Dann brauchst du entsprechende Formularelemente, die dich eintragen lassen, in welchem Rythmus eine Vorlesung stattfindet und wie oft diese wiederholt wird (z.B. wöchentlich, 5 mal). Alternativ hast du einen weiteren Kalender auf der Eingabeseite, dessen Felder für die Tage aus Checkboxen besteht, so dass du die Wiederholungen per Aktivierung der Chekboxen anweist.

                  Daraus kann -bei beiden Methoden- das auswertende Skript ermitteln, wie oft und an welchen Tagen ein Eintrag erfolgen soll. Mit den ermittelten Daten wird der SQL-Querystring zusammengebaut, der alle Termine mit einem Rutsch einträgt.

                  Tschö, Auge

                  jo, an Checkboxen hatte ich auch gedacht.
                  Vielen Dank für deine guten Hinweise.
                  Werde berichten ob es geklappt hat.

                  Viele Grüße Mathiis

  3. Lieber Mathiis,

    ich habe das so gelöst: Termine-Script

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)