Brauche eure Hilfe bei einem Buchungskalender.



  • Hallo zusammen,
    bin gerade so halb am verzweifeln, da ich es nicht schaffe, einen Buchungskalender zu programmieren (Sprache: PHP). Ein normaler Kalender bereitet noch keine großen Probleme, aber bei so 'nem Buchungskalender is des scho was anderes. Also ich lese die Daten, wann einen Wohnung gebucht ist aus einer Datenbank aus. So jetzt soll der Bereich zwischen Ankunfts- und Abfahrtsdaten liegt, in einer anderen Farbe ausgegeben werden, als die noch freien Tage. Doch ich scheitere schon ganz am Anfang. Könnt ihr mir vielleicht ein paar Ansäzte, keine fertigen Lösungen, geben?
    z.B. Ob es sinnvoll ist hier eine Klasse anzulegen, wenn ja, welche Eigenschaften bzw. Memberfunktionen könnte sie besitzen. Bitte helft mir!
    MfG

    .....euer Tobsen



  • Eine fertige Lösung kenne ich leider nicht, müsstest du halt danach suchen!
    Falls du es selber machen willst, wo genau scheiterst du denn?



  • <DIV style="position:absolute; left:400px; top:400px; background-color:blue; padding:10px; border-color:black; border-width:1px; border-style:solid; text-align:center; width:350px;">
       <table class="booking">
        <tr>
          <td colspan=12>Buchungskalender     <?php echo "<a href='".$PHP_SELF."?year=".date('Y')."&month=".$_GET['month']."&apartment=".$_GET['apartment']."' class='clink'>".date('Y')."</a>";
              echo "/<a href='".$PHP_SELF."?year=".(date('Y')+1)."&month=".$_GET['month']."&apartment=".$_GET['apartment']."' class='clink'>".(date('Y')+1)."</a>";
        ?>
    </td>
         </tr>
        <tr>
         <td colspan=12><hr></td>
        </tr>
    
        <tr>
          <td colspan=12>
            <?php
    
               if(empty($_GET['month']) || !isset($_GET['month'])) 
               {
                $_GET['month'] = 1;
               }     
    
               if(empty($_GET['year']) || !isset($_GET['year'])) 
               {
                $_GET['year'] = date("Y");
               }
    
               $days = date("t",mktime(0,0,0,$_GET['month'],1,$_GET['year']));
               $ar_days = date::GetAmountofDays($days);
               $ar_months = date::GetMonths();
    
               foreach($ar_months as $c_month)
               {
                echo "<a href='".$PHP_SELF."?month=".$c_month."&apartment=".$_GET['apartment']."&year=".$_GET['year']."' class='clink'> ".date('M',mktime(0,0,0,($c_month+1),0,0))."</a>";
               }   
    
               echo "</td></tr><tr>";
    
              foreach($ar_days as $c_day)
              {
    
               echo "<td class='calender'>".$c_day."</td>";
               $i++;
               if((7 % $i) == 0 && $i !=1)
               {   
                echo "</tr><tr>";
                $i = 0;
               }
              }
            ?>
    
        </tr>
       </table>
      </DIV>
    

    Das ist der Code, mit dem ich den normalen Kalender erzeuge und der ist schon total unschön. Vielleicht könnmer ja den erstmal en wenig einfacher gestalten. Aber das Hauptproblem ist eben das Kennzeichnen der gebuchten Tage.
    MfG

    Tobsen

    [ Dieser Beitrag wurde am 03.02.2003 um 19:12 Uhr von Tobsen editiert. ]



  • Habt ihr genug Informationen oder soll ich's nochmal genauer beschreiben?
    Das ist nämlich wirklich wichtig.



  • Wo genau liegt denn dein Problem beim markieren?



  • Ich weiß überhaupt nicht, wie ich es anstellen soll. Ich habe das Ankunftsdatum und das Abfahrtsdatum. Ich weiß gar nicht, wie ich das jetzt da reinbringen soll!? 😕 Ich muss das ja im Kalender sichtbar machen aber wie??? Was für Funktionen muss ich schreiben. Durch Übergabe per Url weiß ich ja welche Wohnung ausgewählt wurde, welcher Monat, welches Jahr. So und jetzt muss ich das irgendwie mit den Daten aus der Datenbank vergleichen und die Tage des Monats, die laut Datenbank ausgebucht sind, z.B. durch 'ne andere Farbe sichtbar machen. Hab aber net so den Plan wie ich des anstellen soll!!??



  • Musst du das auch für mehrere Zeiträume checken?
    Tip: mit mktime den Zeitstempel für An- und Abreisetag erstellen, sowie für jeden Tag des Monats (in der Schleife) und dann überprüfen, ob der aktuelle Tag größer als Anreisetag und kleiner als Abreisetag ist -> belegt



  • Hallo zusammen,
    habe es nun soweit geschafft, habe nun aber ein großes Problem! Sobald man zwischen 2 Monaten bucht, funktioniert das ganze nicht mehr!
    Also wenn man z.B. vom 25.05.2003 bis zum 05.06.2003 bucht, werden nur die Tage des Monats Mai als gebucht markiert. Ich habe k.A. wie ich das anders machen soll. Hier mal ein bisschen Code. Ich hoffe ihr könnt mir helfen!!

    $num = mysql_num_rows($dates);  //Zählt Anzahl der Buchungen
             for($h = 1, $g=0; $h <= count($ar_days); $h++) //Zählt solange bis h der Anzahl der Tage des Monats entspricht
              {
    
               $date = mktime(0,0,0, $_GET['month'], $h, $_GET['year']); //erzeugt Zeitstempel für jeden Tag des Monats
    
                for($a = 0; $a < $num; $a++)
                {
                 if($date == $periode[$a]->arrival_date) //Vergleicht alle Zeitstempel der Buchungen mit dem des aktuellen Zeitstempels
                  {
                    $differenz = ($periode[$a]->departure_date) - ($periode[$a]->arrival_date); //rechnet die Differenz zwischen dem Ankunfts und dem Abfahrtsdatum aus
                    $days= $differenz/(60*60*24);
    
                    for($x = $days; $x >= 0; $x--) //Gibt die gebuchten Tage als gebucht markiert aus
                    {
                     if((7 % $g) == 0 && $g !=1) //Wenn 7 Daten ausgegeben wurden, Zeilenumbruch einfügen
                       {   
                        echo "</tr><tr>";
                        $g = 0;
                       }
    
                     $g++;  //Die Variable g dient nur der Feststellung wann ein neuer Zeilenumbruch eingefügt werden muss                
                     echo "<td class='booked'>".$h."</td>"; //Ausgabe des Tages als gebucht
                     $h++;
    
                     if($h > count($ar_days))
                     {
                      $x = 0;
                     } 
                   }
                  }
                }
    
                if((7 % $g) == 0 && $g !=1)
                 {   
                  echo "</tr><tr>";
                  $g = 0;
                 }
    
               if($h < count($ar_days))
                {
                 $g++;           
                 echo "<td class='calender'>".$h."</td>"; //Ausgabe des Datums als nicht gebucht
                }
           }
    

    MfG

    Tobsen

    [ Dieser Beitrag wurde am 06.02.2003 um 09:42 Uhr von Tobsen editiert. ]



  • Ich hätte das ganze so gemacht:

    $monat_anfang = $_GET['year']."-".$_GET['month']."-01";
    $monat_ende   = $_GET['year']."-".$_GET['month']."-".date("t",mktime(0,0,0,$_GET['month'],1,$_GET['year']);
    

    Du machst in deiner SQL Abfrage ein SELECT mit WHERE abreise >= 'monat_anfangANDanreise<=monat\_anfang' AND anreise <= 'monat_ende' ORDER BY anreise ASC
    Jetzt machst du vor deiner for-Schleife durch die Tage:

    $timestamp = mktime(0,0,0, $_GET['month'], 1, $_GET['year']);
    $buchung = mysql_fetch_row($result);
    

    In deiner for schleife kommt dann folgendes:

    if ($buchung && ($timestamp >= $buchung['arrival_date']) && ($timestamp <= $buchung['departure_date'))
    {
      // markiert
      if ($timestamp == $buchung['departure_date')) {
        // nächsten Datensatz
        $buchung = mysql_fetch_row($result);
      } 
    }
    else {
     // unmarkiert
    }
    
    // timestamp auf nächsten Tag setzen
    $timestamp += 86400;
    

    Der Code ist nich getestet, aber so in der Art würde ich es machen

    [ Dieser Beitrag wurde am 06.02.2003 um 10:35 Uhr von flenders editiert. ]



  • @flenders Vielen Dank! Werde es mir es gleich anschauen. Finde ich auf jeden Fall schon nett, dass du dich mit dem Problem befasst hast! Da du mir ja schon öfters geholfen hast, würde mich mal interessieren, wie lange du schon mit PHP arbeitest und ob du das beruflich machst!?
    MfG

    Tobsen



  • Beruflich nicht direkt, da ich bin noch Schüler bin! Ich programmiere aber für eine Werbeagentur.
    Angefangen hab ich vor ein paar Jahren (weiß es nicht mehr so genau)



  • Danke flenders! Du bist ein Genie, funzt wunderbar. Habe aber das mit dem Datum geändert. Speicher das Datum als int. Finde es so leichter intern damit zu arbeiten, oder was denkst du? In welche Klasse gehst du und an welche Schule?
    MfG

    Tobsen



  • In meinem Beispiel wird doch das Datum als Unix-Timestamp aus der DB gelesen, oder was genau meintest du?

    Ich geh in ein TG (Technisches Gymnasium) in die 12. Klasse



  • $monat_anfang = \_GET['year']."-"._GET['month']."-01";
    $monat_ende = \_GET['year']."-"._GET['month']."-".date("t",mktime(0,0,0,\_GET['month'],1,_GET['year']);

    Diese Zeile habe ich folgendermaßen gemacht:

    $monat_anfang = mktime(0,0,0, $_GET['month'], 1, _GET['year']); monat_ende = mktime(0,0,0, $_GET['month']+1, 0 , $_GET['year']);

    Das meinte ich damit.



  • Achso, klar hast recht! Ich hatte das erst in MySQL-Art, hab dann aber doch umgestellt auf Timestamp (und vergessen das mit abzuändern 🙄 )


Anmelden zum Antworten