Danny West: Automatisch den nächsten Termin einfügen

Hallo ihr lieben Webprofis,

ich habe mal ein spezielles js-Vorhaben, hab aber bei Weitem nicht genug Kenntnisse, um das selbst lösen zu können.

Jeden Mittwoch zur gleichen Zeit findet ein kleines Fan-Treffen einer Gemeinschaft statt. Nun möchten wir eine Website erstellen. Der Großteil ist bereits fertig, aber es fehlen noch einige Details.
Nun möchte ich in einer Spalte folgendes einfügen (zumindest so in der Art):

"Nächstes Treffen:
18.07.2012
16.00 Uhr"

Das Datum soll jeden Mittwoch um 19 Uhr zur nächsten Woche weiterspringen.
Allerdings brauche ich noch diese zusätzlichen Möglichkeiten:

  • Wochen, bei denen schon im Voraus klar ist, dass kein Treffen stattfindet müssen per manueller Eintragung ausgeschlossen werden können
  • Sondertreffen an anderen Tagen sollen im Voraus eingeschrieben und vom js zur richtigen Zeit eingefügt werden
  • optionale Veränderung einzelner Zeiten, wenn es Besonderheiten gibt

Kann mir einer von euch helfen? Oder vielleicht ihr alle?
Das wäre wirklich superklassetollfantastisch.
Ich weiß, dass ich viel verlange und ich weiß auch, dass es nicht einfach sein wird. Aber manchmal hat man ja eine Idee, die man unbedingt umsetzen möchte.

Ich freue mich auf eure Antworten.
Liebe Grüße
Euer Danny

  1. Hallo Danny,

    versuche dein Problem zu strukturieren und Stück für Stück dann Lösungen zu finden.

    Das Datum soll jeden Mittwoch um 19 Uhr zur nächsten Woche weiterspringen.

    Also muss das Script schon mal wissen

    • welcher Wochentag heute ist
    • wieviel Uhr es ist
    • welcher Wochentag relevant ist

    Wochen, bei denen schon im Voraus klar ist, dass kein Treffen stattfindet müssen per manueller Eintragung ausgeschlossen werden können

    Sondertreffen an anderen Tagen sollen im Voraus eingeschrieben und vom js zur richtigen Zeit eingefügt werden

    optionale Veränderung einzelner Zeiten, wenn es Besonderheiten gibt

    • Es wird also eine "Datenbank" benötigt. Am einfachsten wäre eine Javascript Liste oder ein Array in welchem die Daten stehen

    • Diese Daten müssen ein Format haben das vom Javascript mit anderen Daten vergleichen kann

    Dann muss das Javascript also

    • das nächste Datum mit denen in den Listen/Arrays auf Änderungen abgleichen
    • Daten aus den Listen/Arrays ersetzen die errechneten Standardwerte

    Fertig ;)

    Je granularer du das Problem aufschlüsselst, desto einfacher ist es eine Lösung zu finden.

    Gruß
    Ole

    1. Hey Ole,

      danke für deine Antwort. Wenn du das alles so sagst, klingt es so einfach und nach einer Arbeit von maximal 10 Minuten ... WENN man sich damit auskennt. (^.^)

      Deine Tipps sind in soweit hilfreich, dass ich ganz grob abschätzen kann, wonach ich suchen muss und was ich beachten muss.
      Aber vom Schreiben bin ich weit entfernt. Ganz ehrlich: Vom js-Schreiben hab ich in etwa so viel Ahnung, wie die Kuh Elsa vom Fliegen.
      Ich kann es lesen, interpretieren und erklären, aber so sehr ich mich auch damit beschäftige, ich könnte es nie selbst schreiben.

      Kennst du Seiten, bei denen die einzelnen Punkte schon als Muster existieren? Wenn ja, wäre ein Link sehr cool.

      Besten Gruß

      Danny

      1. Coden macht Spass :)

        Falls Du die Möglichkeit hast, php zu benutzen, würde ich darauf zurückgreifen. Der Vorteil: Du bist unabhängig von der Zeit, die der Nutzer in seinem Betriebssystem eingestellt hat. Das heisst, auch wenn der Nutzer ein falsches Datum eingestellt hat, funktioniert Deine Anzeige korrekt (wenn Du die Serverzeit richtig bekommst. Ansonsten musst du den code übersetzen.

        Mit time(), date() und strtotime() von php könnte man das dann so machen:

        Hier kannst du den code schonmal testen!

          
        // Test der Serverzeit  
        echo "<pre>Server Zeit: ". date("d.m.y H:i:s")."</pre>";  // checken, ob server richtig eingestellt ist  
          
        // Einstellungen  
        $EventWochentag      = "Wednesday"; // muss auf Englisch angegeben werden  
        $EventStunde         = 16;          // Angabe der Stunde des Events als Integer, z.B. 16h  
        $EventDauer          = 3;           // soviele Stunden soll nicht auf das nächste Meeting hingewiesen werden  
        $EventCanceled       = array("18.07.2012", "15.08.2012");  // Ausschlussdaten mit vierstelliger Jahreszahl!  
        $EventNextTemp       = null;        // das Datum des potenziellen kommenden Events (vor der Prüfung)  
        $EventNext           = null;        // das Datum des kommenden Events  
          
          
        // Ein bisschen Algebra /////////////////////////////////////////////////////////  
          
        // 1. Finde Datum für nächstes potenzielles Event  
        if((date("l") == $EventWochentag) and (time() < (($EventStunde+$EventDauer)*60*60)+strtotime("today"))){  
          
          // Wenn heute ein Event ist, welches aktuell noch läuft (innerhalb $EventDauer), verweise auf dieses.  
          $EventNextTemp = strtotime("today");  // siehe http://de.php.net/manual/de/function.strtotime.php  
          
        } else {  
          
          // Andernfalls verweise auf das nächste Event.  
          $EventNextTemp = strtotime("next $EventWochentag");  
          
        }  
          
        // 2. Prüfung auf nicht stattfindende Events  
        while (is_null($EventNext)){  
          
          // Wenn das Event nicht stattfindet (angegeben in $EventCanceled), verweise auf das Nächste.  
          if(in_array(date("d.m.Y",$EventNextTemp), $EventCanceled)) {  
          
            $EventNextTemp = strtotime("+1 week", $EventNextTemp);  
            continue; // weiter in der Schleife ohne $EventNextTemp zu übernehmen  
          
          }  
          
          // temporäres Event übernehmen  
          $EventNext = $EventNextTemp;  
          
        }  
          
        // Formatieren des Events  
        $EventNext = "am ".date("d.m.y", $EventNext)." um ".$EventStunde." Uhr";  
          
        ?>  
        <h1>Liebe Freunde,</h1>  
        <p>das nächste mal Treffen wir uns alle <b><?php echo $EventNext ?></b>. Ich hoffe ihr erscheint zahlreich.</p>
        

        Cheers,
        Baba

        1. Hallöchen Baba,

          mal ganz ehrlich: Du bist ein Künstler. Also gleich einen kompletten Quelltext zu bekommen ist ja echt gar nicht mehr zu überbieten. Vielen, vielen Dank.

          Die Möglichkeit von php haben wir tatsächlich. Nur hab ich davon noch viel weniger Ahnung, alles, was wir mit php machen, musste ich abschreiben oder mir helfen lassen.
          Ich habe auf unserem Server gleich die Seite angelegt und die Serverzeit stimmt. Und damit auch das nächste Datum. =)

          Jetz möchte ich noch drei Fagen fragen, um es zu perfektionieren und sogar auf unsere Seite schonmal im Voraus einzubauen:

          1. Kann ich die Ausgabe der Serverzeit für den User verstecken? oder muss die immer mit ausgegeben werden?
          2. Wie kann ich auch ungerade Zeiten (z.B. 16.30 Uhr) einfügen?
          3. In welche der Spalten und mit welchem Text schreibe ich zusätzliche Daten ein, die von den regulären Treffen abweichen? Also wenn wir uns beispielsweise an einem Samstag im Oktober um 14 Uhr treffen möchten, wo schreibe ich das ein?

          Ganz liebe Grüße. Du hast meinen tiefsten Respekt.

          Danny

          1. Vielen, vielen Dank.

            Gerne. Coden macht eben Spass :)

            1. Kann ich die Ausgabe der Serverzeit für den User verstecken? oder muss die immer mit ausgegeben werden?

            Die Ausgabe kannst Du getrost löschen. Sie war nur für dich, damit Du das mal prüfst. Einfach die Zeilen // Test der Serverzeit und die danach löschen.

            1. Wie kann ich auch ungerade Zeiten (z.B. 16.30 Uhr) einfügen?

            Ist es dauerhaft 16:30? Wenn ja: Die Zeile nach // Formatieren des Events ändern:
            $EventNext = "am ".date("d.m.y", $EventNext)." um ".$EventStunde.":30 Uhr";

            1. In welche der Spalten und mit welchem Text schreibe ich zusätzliche Daten ein, die von den regulären Treffen abweichen? Also wenn wir uns beispielsweise an einem Samstag im Oktober um 14 Uhr treffen möchten, wo schreibe ich das ein?

            Meinst Du, das Samstag einmal abweichend von der Mittwochsserie vorkommt?

            Cheers,
            Baba

            1. Huhu Baba,

              also ich hab schon viel dran rumgespielt, dank deinen Erläuterungen im Quelltext habe ich das Prinzip und den Aufbau dann nach einer ganzen Weile verstanden und auch schon so weit umgesetzt, wie ich es haben möchte. Trotzdem natürlich noch einmal danke für die Ratschläge.

              Meinst Du, das Samstag einmal abweichend von der Mittwochsserie vorkommt?

              Ich habe diesbezüglich einiges Probiert, aber nichts herausbekommen.
              Ab und zu treffen wir uns auch Samstags oder Sonntags, aber immer zu abweichenden Zeiten. Also ist das nicht immer um 16 Uhr, daher auch die Anfrage mit den halben Stunden.
              Die einzige Lösung, die ich gefunden habe, war, den Samstag und Sonntag komplett mit einzubinden und vom Grund her erstmal alles auszuschließen und nur die Daten zu löschen, an denen wir uns treffen. Das ist allerdings so umständlich gedacht, dass es einfacher ist, an den entsprechenden Tagen das script zu ändern.

              Gibt es einen einfachen Weg, einzelne, abweichende Daten mit einzubeziehen?

              Beste Hauptstadtgrüße
              Danny

              1. So, die Angabe muss in $EventsExtraordinary gemacht werden. Es beinhaltet ein Array mit Daten inkl. Uhrzeit. Hinzugefügt habe ich die dritte Prüfung.

                Auch Änderungen an der ersten Prüfung und Änderungen bei der Formatierung des Events habe ich vorgenommen.

                Viel Spass beim php-Lernen :)

                <?php  
                  
                // Test der Serverzeit  
                echo "<pre>Server Zeit: ". date("d.m.y H:i:s")."</pre>";  // checken, ob server richtig eingestellt ist  
                  
                // Einstellungen  
                $EventWochentag      = "Thursday"; // muss auf Englisch angegeben werden  
                $EventStunde         = 16;          // Angabe der Stunde des Events als Integer, z.B. 16h  
                $EventDauer          = 3;           // soviele Stunden soll nicht auf das nächste Meeting hingewiesen werden  
                $EventsCanceled      = array("26.07.2012", "15.08.2012");  // Ausschlusstermin mit vierstelliger Jahreszahl!  
                $EventsExtraordinary = array("27.07.2012 15:25", "15.08.2012 16:30", "26.08.2012 17:00");  // Zusatztermine mit vierstelliger Jahreszahl und Uhrzeit!  
                $EventNextTemp       = null;        // das Datum des potenziellen kommenden Events (vor der Prüfung)  
                $EventNext           = null;        // das Datum des kommenden Events  
                  
                  
                // Ein bisschen Algebra /////////////////////////////////////////////////////////  
                  
                // 1. Finde Datum für nächstes potenzielles Event  
                if((date("l") == $EventWochentag) and (time() < (($EventStunde+$EventDauer)*60*60)+strtotime("today"))){  
                  
                  // Wenn heute ein Event ist, welches aktuell noch läuft (innerhalb $EventDauer), verweise auf dieses.  
                  $EventNextTemp = strtotime("today")+($EventStunde*60*60);  // siehe http://de.php.net/manual/de/function.strtotime.php  
                  
                } else {  
                  
                  // Andernfalls verweise auf das nächste Event.  
                  $EventNextTemp = strtotime("next $EventWochentag")+($EventStunde*60*60);  
                  
                }  
                  
                // 2. Prüfung auf nicht stattfindende Events  
                while (is_null($EventNext)){  
                  
                  // Wenn das Event nicht stattfindet (angegeben in $EventCanceled), verweise auf das Nächste.  
                  if(in_array(date("d.m.Y",$EventNextTemp), $EventsCanceled)) {  
                  
                    $EventNextTemp = strtotime("+1 week", $EventNextTemp);  
                    continue; // weiter in der Schleife ohne $EventNextTemp zu übernehmen  
                  
                  }  
                  
                  // temporäres Event übernehmen  
                  $EventNext = $EventNextTemp;  
                  
                }  
                  
                // 3. Gibt es ein außerplanmäßiges Treffen, was vor dem nächsten planmäßigen liegt?  
                foreach ($EventsExtraordinary as $EventExtraordinary){  
                  if((strtotime($EventExtraordinary) > time()) and (strtotime($EventExtraordinary) < $EventNext))  
                    $EventNext = strtotime($EventExtraordinary);  
                }  
                  
                // Formatieren des Events  
                $EventNext = "am ".date("d.m.y", $EventNext)." um ".date("H:i", $EventNext)." Uhr";  
                  
                ?>  
                <h1>Liebe Freunde,</h1>  
                <p>das nächste mal Treffen wir uns alle <b><?php echo $EventNext ?></b>. Ich hoffe ihr erscheint zahlreich.</p>  
                  
                <?php
                

                Beste Hauptstadtgrüße

                Beste Hauptstadtgrüße zurück :)

                Cheers,
                Baba
                (aus Neukölln)