Kalender mit Terminüberschneidungen

dwex

Erfahrenes Mitglied
Hallo Leute,

ich entwickle gerade ein Reservierungssystem.
Den Monatskalender habe ich schon fertig der funktioniert bestens.

Beim Wochenkalender scheitere ich schon an der Idee wie ich es machen könnte.
Wichtig dabei ist mir, dass man Terminüberschneidungen nebeneinander darstellen kann.

Ich würde gerne sowas wie auf dem Bild haben - habe aber keinen blassen schimmer wie ich das realisieren könnte. Vielleicht gibt es da auch eine Klasse dafür - wer weis was?

Wäre für eure Anregungen sehr dankbar denn langsam zweifle ich an mir selbst - ich überleg hier schon seit Tagen.

Vielen Dank im voraus!
 

Anhänge

  • kalendertest.jpg
    kalendertest.jpg
    28,4 KB · Aufrufe: 78
1. Alle Daten in ein oder mehrer Arrays einlesen.
2. Maximale Anzahl gleichzeitig stattfindender Termine ermitteln.
3. Die Termine chronologisch einfügen (jeweils die erste freie Spalte von links ermitteln).

Darstellen kannst Du das Ganze entweder mit DIVs oder Du erstellst dynamisch ein Bild (http://ch2.php.net/manual/de/book.image.php).
 
Zuletzt bearbeitet:
Gegenfrage: Wie realisierst du die einfache Darstellung ohne Überschneidungen zurzeit?

Wie gesagt eben noch garnicht (die Wochenansicht gibt es noch nicht).
In der Monatsansicht stehen die Termine einfach untereinander.

1. Alle Daten in ein oder mehrer Arrays einlesen.
2. Maximale Anzahl gleichzeitig stattfindender Termine ermitteln.
3. Die Termine chronologisch einfügen (jeweils die erste freie Spalte von links ermitteln).

Darstellen kannst Du das Ganze entweder mit DIVs oder Du erstellst dynamisch ein Bild (http://ch2.php.net/manual/de/book.image.php).

Mit Punkt 1 habe ich keine Probleme - bei Punkt 2 und 3 bräuchte ich noch Denkanstösse WIE ich das am besten bewerkstelligen kann. Vorallem interessiert mich momentan die Vorgehensweise bei Punkt 2
 
Sind die Termine in einer Datenbank?

Wenn ja, dann ermittelst du die sich überschneidenden Termine per SQL und weißt, wie viele nebeneinander stehen. Anhand dessen kann das Design entworfen werden.

Hier mal ein Beispiel:
Code:
CREATE TABLE IF NOT EXISTS `termine` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `bezeichnung` varchar(16) NOT NULL,
  `start` datetime NOT NULL,
  `end` datetime NOT NULL,
  PRIMARY KEY (`ID`)
) AUTO_INCREMENT=4 ;

INSERT INTO `termine` (`ID`, `bez`, `start`, `end`) VALUES
(1, 'Stargate', '2009-08-27 17:00:00', '2009-08-27 18:15:00'),
(2, 'Simpsons', '2009-08-27 18:10:00', '2009-08-27 19:15:00'),
(3, 'Stargate', '2009-08-27 19:00:00', '2009-08-27 20:00:00');

Trick mit Self-Join:
Code:
SELECT
  A.ID,
  COUNT(*) AS `Ueberschneidung`
FROM
  `termine` AS A,
  `termine` AS B
WHERE
     B.end > A.start
  && A.end > B.start
  && A.ID != B.ID
GROUP BY A.ID

Liefert eine Überschneidung für Termin 1, zwei Überschneidungen für Termin 2 und eine Überschneidung für Termin 3.

(Edit: SQL-Abweisung verändert)
 
Zuletzt bearbeitet:
Wahrscheinlich nicht so schnell, wie mit MySQL, doch wenn die Daten alle schon in ein Array geschrieben wurden, geht's auch so:

PHP:
$_array = array(array('1','3'),array('2','4'),array('1','5'),array('3','6'),array('5','8'));

  function get_similar($_array,$_start,$_end,$_limit = ''){
  
    $_counter = 0;
    foreach($_array as $_key => $_value){
    
      if($_limit != '' && $_key >= $_limit) break;
      if(($_value[0] > $_start && $_value[0] < $_end) || ($_value[1] > $_start && $_value[1] < $_end)) $_counter++;
      
    }
      
    return $_counter;
  
  }

  $_max_rows = 0;
  foreach($_array as $_value){

    $_counter = get_similar($_array,$_value[0],$_value[1]);
    if($_counter > $_max_rows) $_max_rows = $_counter;
    
  }
  
  echo $_max_rows;

Mit der Funktion get_similar() findest Du heraus, wie viele Termine jeweils gleichzeitig stattfinden. Für Punkt 3 führst Du ebenfalls get_similar() aus und gibst als Limit den aktuellen Schlüssel + 1 an (das Array muss dazu allerding chronologisch sortiert sein).
 
Zurück