BlaiiND98: Termine in Kalender einfügen

Ich möchte gerne einen eigenen Kalender im Google Kalender Style bauen. Das Kalenderblatt und das styling habe ich bereits umgesetz. Dieses könnt ihr hier sehen.

//Timezone!!
date_default_timezone_set('Europe/Berlin');
  
// Vor und Zurück
if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // Aktueller Monat
    $ym = date('Y-m');
}
  
$timestamp = strtotime($ym."-01");
if ($timestamp === false) {
    $timestamp = time();
}
  
// Heute ermitteln
$today = date('Y-m-j', time());
  
// H3 Title
$html_title = date('Y / m', $timestamp);
  
// Prev & Next / Monat Link
$prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp)));
$next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)+1, 1, date('Y', $timestamp)));
  
// Anzahl der Tage ermitteln
$day_count = date('t', $timestamp);
  
// 0:So 1:Mo 2:Di usw...
$str = date('w', mktime(0, 0, 0, date('m', $timestamp), 0, date('Y', $timestamp)));
  
  
// Kalender zusammenbauen!!
$weeks = array();
$week = '';
  
// Leer Zeilen hinzufügen
$week .= str_repeat('<td></td>', $str);
  
for ( $day = 1; $day <= $day_count; $day++, $str++) {
     
    $date = $ym.'-'.$day;
     
    if ($today == $date) {
        $week .= '<td class="today">'.$day;
    } else {
        $week .= '<td>'.$day;
    }
    $week .= '</td>';
     
    // Ende der Woche bzw. Ende des Monats
    if ($str % 7 == 6 || $day == $day_count) {
         
        if($day == $day_count) {
            // Zelle hinzufügen
            $week .= str_repeat('<td></td>', 6 - ($str % 7));
        }
         
        $weeks[] = '<tr>'.$week.'</tr>';
         
        // Neue Woche
        $week = '';
         
    }
  
}
<table class="table table-bordered">
 <tr>
  <th>Mo</th>
  <th>Di</th>
  <th>Mi</th>
  <th>Do</th>
  <th>Fr</th>
  <th>Sa</th>
  <th>So</th>
 </tr>
<?php
foreach ($weeks as $week) {
echo $week;
}   
?>
</table>

Ergebnis aus dem oben ggezeigten Code

Vorlauge aus Google Kalender

Mein Ergebnis kommt doch sehr an den Google Kalender hin, oder? Jetzt kommt mein Problem :/ Wie bekomme ich Termin in den Kalender? Ich möchte Termine, die über mehrere Tage wie im Google Kalender über die ganze Zeit ziehen (Bezeichnung nur einmal).

Termin die nur ein Tag, oder ein paar Stunde sind, sollen als eine Zeile dargestellt werden.

Meine Tabelle

CREATE TABLE `kalender` (
  `id` int(11) NOT NULL,
  `code` varchar(200) NOT NULL,
  `bezeichnung` varchar(200) NOT NULL,
  `auto` varchar(200) NOT NULL,
  `grund` text NOT NULL,
  `datum` date NOT NULL,
  `ganztags` varchar(50) NOT NULL,
  `von` varchar(10) NOT NULL,
  `bis` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Ich habe das Gefühl die muss optimiert werden? Wenn ein Termin über mehrere Tage geht, dann sollte vielleicht das datum in eine weitere Tabelle ausgelagert werden? In der erten Tabelle die Grunddaten wie Bezeichnung, die Uhrzeit und das Datum in eine extra Tabelle. Habe ich ein Termin, welcher über drei Tage geht, wird dieser in dier Datums-Tabelle dreimal eingetragen mit einer RefID zur den Grunddaten?

Nur es bleibht noch immer die Frage, wie bekomme ich die Termin in meinen Kalender?

  1. Wenn ich folgendes ergänze

    $week .= '<br><br>';
    $week .= 'Ich bin ein Test';
    $week .= '<br>';
    $week .= 'Ich bin ein Test';
     $week .= '</td>';
    

    Werden die Einträge in alle Felder ergänz. Im gesamten sieht dieses dann so aus

    for ( $day = 1; $day <= $day_count; $day++, $str++) {
         
        $date = $ym.'-'.$day;
         
        if ($today == $date) {
            $week .= '<td class="today">'.$day;
    
        } else {
            $week .= '<td>'.$day;
        }
    
        $week .= '<br><br>';
        $week .= 'Ich bin ein Test';
        $week .= '<br>';
        $week .= 'Ich bin ein Test';
        $week .= '</td>';
         
        // Ende der Woche bzw. Ende des Monats
        if ($str % 7 == 6 || $day == $day_count) {
             
            if($day == $day_count) {
                // Zelle hinzufügen
                $week .= str_repeat('<td></td>', 6 - ($str % 7));
            }
             
            $weeks[] = '<tr>'.$week.'</tr>';
             
            // Neue Woche
            $week = '';
             
        }
      
    }
    

    Jetzt stellt sich mir nur noch die Frage, wie kann ich sagen, zeig mir nur etwas bei einem bestimmten Datum an. Das Datum wird in der Tabelle in folgenden Form gespeichert 2017-08-09

    1. Ok, ich denke ich habe es hinbekommen.

      $datumTermine = array("2017-08-17", "2017-08-18", "2017-08-20", "2017-08-25");
        
      for ( $day = 1; $day <= $day_count; $day++, $str++) {
           
          $date = $ym.'-'.$day;
           
          if ($today == $date) {
              $week .= '<td class="today">'.$day;
      
          } else {
              $week .= '<td>'.$day;
          }
      
          if (in_array($date, $datumTermine)) {
              $week .= '<br><br>';
              $week .= 'Ich bin ein Test';
          }
      
          $week .= '</td>';
           
          // Ende der Woche bzw. Ende des Monats
          if ($str % 7 == 6 || $day == $day_count) {
               
              if($day == $day_count) {
                  // Zelle hinzufügen
                  $week .= str_repeat('<td></td>', 6 - ($str % 7));
              }
               
              $weeks[] = '<tr>'.$week.'</tr>';
               
              // Neue Woche
              $week = '';
               
          }
        
      }
      

      Jetzt bleibt noch die Frage wie ich es umsetzte wenn die Termine aus der Tabelle kommen und es an einem Tag auch mal mehrere sein könnten.

      1. Nächste Version

        //Timezone!!
        date_default_timezone_set('Europe/Berlin');
        
        function Kalender_Termine($mysqli, $datum) {
            
            $stmt = $mysqli->prepare("SELECT id, kalenderID, datum 
                                       FROM kalender_termine WHERE datum=?");
            $stmt->bind_param("s", $datum);
            $stmt->execute();
            $stmt->bind_result($id, $kalenderID, $datum);
            $stmt->store_result();
                
            if($stmt->num_rows() >  0) {     
                while ($stmt->fetch()){
                    
                    $Kalender_Termine[] = array( 
                        
                        'id'          => $id,
                        'kalenderID'  => $kalenderID,
                        'datum'       => $datum 
                     );
                }
                
                return $Kalender_Termine;
            }
        }
        
        // Vor und Zurück
        if (isset($_GET['ym'])) {
            $ym = $_GET['ym'];
        } else {
            // Aktueller Monat
            $ym = date('Y-m');
        }
          
        $timestamp = strtotime($ym."-01");
        if ($timestamp === false) {
            $timestamp = time();
        }
          
        // Heute ermitteln
        $today = date('Y-m-j', time());
          
        // H3 Title
        $html_title = date('Y / m', $timestamp);
          
        // Prev & Next / Monat Link
        $prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp)));
        $next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)+1, 1, date('Y', $timestamp)));
          
        // Anzahl der Tage ermitteln
        $day_count = date('t', $timestamp);
          
        // 0:So 1:Mo 2:Di usw...
        $str = date('w', mktime(0, 0, 0, date('m', $timestamp), 0, date('Y', $timestamp)));
          
          
        // Kalender zusammenbauen!!
        $weeks = array();
        $week = '';
          
        // Leer Zeilen hinzufügen
        $week .= str_repeat('<td></td>', $str);
         
        for ( $day = 1; $day <= $day_count; $day++, $str++) {
             
            $date = $ym.'-'.$day;
             
            if ($today == $date) {
                $week .= '<td class="today">'.$day;
        
            } else {
                $week .= '<td>'.$day;
            }
        
            $datumTermine = Kalender_Termine($mysqli, $date);
        
            if($datumTermine > 0) {
                foreach($datumTermine as $array){
                    $week .= '<br><br>';
                    $week .= $array['kalenderID'];
                }
            }
        
            $week .= '</td>';
             
            // Ende der Woche bzw. Ende des Monats
            if ($str % 7 == 6 || $day == $day_count) {
                 
                if($day == $day_count) {
                    // Zelle hinzufügen
                    $week .= str_repeat('<td></td>', 6 - ($str % 7));
                }
                 
                $weeks[] = '<tr>'.$week.'</tr>';
                 
                // Neue Woche
                $week = '';
                 
            }
          
        }
        

        Was sagt ihr zu meinem Aufbau? Ich muss dazu sage es ist das erste mal, dass ich so etwas umsetze.

        Eine letzte Frage, wenn ein Termin über mehrere Tage geht, wie schaffe ich es dann wie auf dem Google Kalender zu sehen durchgehend etwas zu markieren und nur auf dem erten Feld die Bezeichnung zu schreiben oder ist dieses vielleicht gar nicht so vorteilhaft?

        1. Ich muss nochmals nachfragen. Habt ihr eine Idee wie ich es erreichen kann wenn ein Termin über mehere Tage geht, dass die Bezeichnung nur auf dem ersten Feld angezeigt wird?

          1. Hallihallo!

            Nur so als eventuelle Anregung, kann ich Dir erzählen, wie ich es in meinem Kalender mal gemacht habe, hier mal beispielhaft ausgehend von einer Monatsanzeige mit allen Terminen des Monats:

            1. lege ein Array von Arrays an, für jeden Tag des Monats ein Element:
            $tage = array();
            for ($i=1; $i<=$anzahl_der_tage_im_monat; $i++) {
               $tage[$i] = array();
            }
            

            Das ist ist erstmal die ganz grobe Struktur, in die hinterher die Termindaten reingeschaufelt werden. Ich fange übrigens mit Absicht mit dem Index 1 an, das macht es für mich etwas einfacher in der späteren Verwendung.

            1. Lies alle Termine aus der Datenbank (oder woher auch immer, das kann z.B. auch eine iCal-Datei sein), die in den entsprechenden Monat fallen.

            2. Iteriere per foreach durch alle gefundenen Termine und lege sie in dem Array von eben ab. Beim Ablegen in dem Array kann man Alles ablegen, was man möchte. Ist zwar vielleicht nicht die eleganteste Option, aber sie ist übersichtlich.

            foreach ($gelesene_termine as $gt) {
               // Lege Start und Ende des Termins fest. 
               // Das Folgende war bei meinem Kalender passend, 
               // weil ich Start und Ende als Timestamp 
               // in der Datenbank stehen hatte. 
               // Bei anderen Formaten müsste man das noch anpassen, etwa per strtotime()
            
               $start = date("j",$gt['start']);    // "j" = Tag des Monats, ohne führende 0
               $end = date("j",$gt['ende']);
               for($betroffener_tag = $start; $betroffener_tag <= $end; $betroffener_tag++) {
                  $tage[$betroffener_tag][] = array(
                                                  'id' => $gt['id'],
                                                  'titel' => $gt['titel'],
                                                  'ort' => $gt['ort'],
                                                  // ... alles, was man sonst noch so braucht, 
                                                  // etwa in meinem Fall:
                                                  'onclick' => 'zeigetermin('.$gt['id'].')',
                                                  'label' => $gt['label']
                                              );
               }
            }
            

            An diesem Punkt könnte man schon, wenn man das möchte, dafür sorgen, dass nur am ersten Tag des Termins alle Infos dazu in das Array kommen. Das habe ich damals so gemacht. Heute würde ich aber eher in der Ausgabe des Arrays als HTML diese Sortierung vornehmen. Das macht das Ganze variabler und wiederverwendbarer.

            1. Gehe jetzt den "maschinenlesbaren Monat" (also das Array $tage) durch, und baue daraus das gewünschte HTML zusammen. Das hast Du aber ja schon geschafft gehabt. Um jetzt zu erreichen, dass die Termindetails nur am ersten Tag des jeweiligen Termins angezeigt werden, könnte man ein zusätzliches Hilfs-Array benutzen, z.B. $done = array(); Bei jedem Termin, der in das HTML eingesetzt werden soll, kann man nun überprüfen, ob $done[Termin_ID] existiert und true ist. Falls nicht, wurde der Termin offenbar noch nicht abgearbeitet, man bearbeitet also gerade seinen ersten Tag. Also alle Details ins HTML schreiben, dann $done[Termin_ID] = true setzen, und weiter. Am nächsten Tag des Termins existiert dann $done[Termin_ID], und es ist true. Also macht man z.B. nur eine farbliche Markierung und (z.B.) den onclick-handler (ich weiss, ekelhaft, aber man kann das ja auch über das Setzen einer Klasse im HTML regeln 😉 ).

            Wie gesagt, in einigen Details würde ich meinen Kalender nach heutigem Wissen anders programmieren, vor Allem würde ich die Dinge wie das Auslesen der Termine, das Aufbereiten der Datenstruktur für die Anzeige und die Anzeige selber voneinander in Funktionen voneinander kapseln.

            Aber ich denke, der grobe Programmablauf wäre immer noch derselbe.

            Vielleicht konnte ich Dir ja ein Wenig helfen :-)

            Beste Grüsse, Tobias Hahner

            1. Hallöchen,

              Vielleicht konnte ich Dir ja ein Wenig helfen :-)

              vielen Dank für deine sehr Ausführliche Antwort. Ehrlich gesagt habe ich das mit den Array() nict so ganz verstanden. Allerdings als ich das Start- und Enddatum gesehen habe bin ich auf eine Idee gekommen die geklappt hat.

              $datumTermine = Kalender_Termine($mysqli, $date);
              
                  if($datumTermine > 0) {
              
                      //$week .= '<br><br>';
              
                      foreach($datumTermine as $array){
              
                          
                          if ($array["datum"] == $array["datum_von"]) {
                              
                              $week .= '<div style="background:'.$array["farbe"].'; 
                                                    margin-bottom:5px; 
                                                    padding-left:8px;">
                                      <a href="/kalender-datenblatt.php?code='.$array["id"].'"
                                         target="_blank" 
                                         style="color:#ffffff">'.$array["bezeichnung"]. "</a>
                                      
                                      <span style='color:#ffffff; 
                                                   font-size:10px; 
                                                   display: block; 
                                                   padding-bottom: 2px;'>". $array["wer"]. '</span>
                                         </div>';
              
                          } else {
              
                              $week .= '<div style="background:'.$array["k_farbe"].'; 
                                                    margin-bottom:5px; 
                                                    padding-left:8px; 
                                                    height: 36px;">
                                         </div>';
              
                          }
              
                  }
              

              Ich prüfe ob den Eintrag den ich aus der Tabelle Termine holfe gleich dem Startdatum ist. Wenn ja, zeig mir alle Infos an die ich benötige, wenn nicht lass alles leer und mach nur ein DIV mit der Hintergrundfarbe.

              1. Hallihallo!

                vielen Dank für deine sehr Ausführliche Antwort. Ehrlich gesagt habe ich das mit den Array() nict so ganz verstanden.

                Welches Array meinst Du? Das Array $tage ist einfach nur ein Datencontainer, in dem ich alle Termine ablege. So kann man sich übersichtlicher durchhangeln.. Das Array $done ist nur eine kleine Hilfe. Die brauchst Du aber ja nicht, Deine Lösung ist genauso zielführend.

                Allerdings als ich das Start- und Enddatum gesehen habe bin ich auf eine Idee gekommen die geklappt hat.

                Sehr gut, mehr wollte ja Keiner 😉

                Ich prüfe ob den Eintrag den ich aus der Tabelle Termine holfe gleich dem Startdatum ist. Wenn ja, zeig mir alle Infos an die ich benötige, wenn nicht lass alles leer und mach nur ein DIV mit der Hintergrundfarbe.

                Im Prinzip also genau das Gleiche wie in meinem Vorschlag, nur viel direkter. Freut mich, wenn ich helfen konnte.

                Beste Grüsse, Tobias Hahner

                1. Hallöchen,

                  könntest du mir vielleicht noch ein Tipp geben nach was ich suchen muss um eine Funktion bereit zu stellen zu können dass ein User den Termin in seinen Outlook Kalender importieren kann?

                  1. Hallihallo!

                    könntest du mir vielleicht noch ein Tipp geben nach was ich suchen muss um eine Funktion bereit zu stellen zu können dass ein User den Termin in seinen Outlook Kalender importieren kann?

                    Es gibt da ein ganz klar definiertes Datei-Format namens ics. Das sind Dateien, in denen Termine zum Import in verschiedensten Kalenderprogrammen angeboten werden. Die Syntax dahinter ist relativ einfach, google einfach mal nach "ics Format". Parallel dazu gibt es auch noch das VCal- Format, das z.B. von Android- Kalendern bevorzugt wird.

                    Die beiden Formate sind sich im grossen und Ganzen sehr ähnlich. Solch eine Datei per PHP zusammenzubauen ist nicht schwerer als eine HTML-Ausgabe zu generieren. Kleiner Tipp nebenbei: mich hat es eine Menge Nerven gekostet, dass die Datei zwar korrekt war, aber vom Google-Kalender nicht importiert werden wollte. Achte auf den Content-Type- Header 😉

                    Welches der beiden Formate jetzt für Outlook besser geeignet ist, weiss ich jetzt nicht aus dem Kopf. Aber das Beste ist sowieso, einfach BEIDE Dateien anzubieten 😉

                    Beste Grüsse, Tobias Hahner

                    1. Es gibt da ein ganz klar definiertes Datei-Format namens ics. Das sind Dateien, in denen Termine zum Import in verschiedensten Kalenderprogrammen angeboten werden.

                      Das ist richtig,und die sollte man primär nutzen.

                      Allerdings können die (ics/ical) etwas (noch) nicht:

                      Feiertage und andere wichtige Termine (Fasching!) die

                      • von Ostern oder auch nur etwas simplen wie
                      • dem 4. Advent abhängen,
              2. Moin,

                gestatte mir ein paar Fragen und Anmerkungen:

                $datumTermine = Kalender_Termine($mysqli, $date);
                
                    if($datumTermine > 0) {
                        foreach($datumTermine as $array){
                

                Was gibt denn deine Funktion Kalender_Termine für einen Datentyp zurück? Ich sehe hier einmal einen numerischen Vergleich und dann eine Array-Iteration. Damit das wie gewünscht funktioniert, darf im Fall keiner Daten in $datumTermine kein Array stehen, sondern z.B. NULL, denn

                $datumTermine = array();
                $datumTermine > 0 == TRUE;
                

                Das heißt du kannst explizit auf NULL testen.

                Im folgenden Code fallen verschiedene Dinge auf:

                • Du benutzt sehr viele Inline-Styles für mehrere Elemente. Benutze besser CSS-Klassen.
                • Werte aus PHP werden direkt in den HTML-Code eingefügt. Hast du den Kontextwechsel nach HTML berücksichtigt?
                • target=_blank ist nicht die feine englische Art, denn der Nutzer möchte vielleicht gerne entscheiden, wie viele Browserfenster sich öffnen. Außerdem funktioniert in einem neuen Fenster das Zurück nicht mehr.
                • Du benutzt recht viele div und span. Aber im Ausgangsposting sieht man doch eine Tabelle. Warum also nicht td?
                                $week .= '<div style="background:'.$array["farbe"].'; 
                                                      margin-bottom:5px; 
                                                      padding-left:8px;">
                                        <a href="/kalender-datenblatt.php?code='.$array["id"].'"
                                           target="_blank" 
                                           style="color:#ffffff">'.$array["bezeichnung"]. "</a>
                                        
                                        <span style='color:#ffffff; 
                                                     font-size:10px; 
                                                     display: block; 
                                                     padding-bottom: 2px;'>". $array["wer"]. '</span>
                                           </div>';
                

                Viele Grüße
                Robert

                1. Hallo Robert B.,

                  Benutze besser CSS-Klassen.

                  Es gibt keine CSS-Klassen. 😝

                  Bis demnächst
                  Matthias

                  --
                  Rosen sind rot.
    2. Moin,

      Jetzt stellt sich mir nur noch die Frage, wie kann ich sagen, zeig mir nur etwas bei einem bestimmten Datum an. Das Datum wird in der Tabelle in folgenden Form gespeichert 2017-08-09

      Wenn du wie vorgeschlagen datetime-Felder nimmst, kannst du in SQL vergleichen:

      select * from kalender where von <= $zeitpunkt and bis >= $zeitpunkt;
      

      Viele Grüße
      Robert

  2. Hallo BlaiiND98,

    Jetzt kommt mein Problem :/ Wie bekomme ich Termin in den Kalender?

    Was heißt denn „in den Kalender bekommen“? Meinst du eine Eingabe per Web-Oberfläche oder auch so etwas wie einen iCal-Import?

    Meine Tabelle

    CREATE TABLE `kalender` (
      `id` int(11) NOT NULL,
      `code` varchar(200) NOT NULL,
      `bezeichnung` varchar(200) NOT NULL,
      `auto` varchar(200) NOT NULL,
      `grund` text NOT NULL,
      `datum` date NOT NULL,
      `ganztags` varchar(50) NOT NULL,
      `von` varchar(10) NOT NULL,
      `bis` varchar(10) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    

    Ich habe das Gefühl die muss optimiert werden?

    Auf jeden Fall! Nimm erst einmal die richtigen Datentypen (und einen guten Zeichensatz):

    CREATE TABLE `kalender` (
      `id` bigint(20) unsigned NOT NULL auto_increment,
      `code` varchar(200) NOT NULL,
      `bezeichnung` varchar(200) NOT NULL,
      `auto` varchar(200) NOT NULL,
      `grund` text NOT NULL,
      `datum` date NOT NULL,
      `ganztags` varchar(50) NOT NULL,
      `von` datetime NOT NULL,
      `bis` datetime NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    

    Die Bedeuting von datum und ganztags ist mir noch nicht klar.

    Wenn ein Termin über mehrere Tage geht, dann sollte vielleicht das datum in eine weitere Tabelle ausgelagert werden?

    Wieso, du hast doch von und bis − jetzt sogar als datetime.

    Nur es bleibht noch immer die Frage, wie bekomme ich die Termin in meinen Kalender?

    Am ehesten wohl per HTML-Formular.

    Viele Grüße
    Robert

    1. Hallo,

      Was heißt denn „in den Kalender bekommen“? Meinst du eine Eingabe per Web-Oberfläche oder auch so etwas wie einen iCal-Import?

      das hast du falsch verstanden ;) Ich meinte damit wie bekomme ich die Termin, die ich in der Datenbank habe, in den Kaleder. Hat jetzt geklappt:

      https://forum.selfhtml.org/self/2017/aug/24/termine-in-kalender-einfuegen/1702313#m1702313

      Die Bedeuting von datum und ganztags ist mir noch nicht klar.

      Datum z.B. 2017-08-09 ganztags, dann wird der Termin über den ganzen Tag verteilt, wenn dieses nicht angeklickt wird, muss ein Zeitraum eingegeben werden, deshalb auch die Felder von - bis die dann nicht datetime sondern nur time bekommen sollten?

      Wenn ein Termin über mehrere Tage geht, dann sollte vielleicht das datum in eine weitere Tabelle ausgelagert werden? Wieso, du hast doch von und bis − jetzt sogar als datetime.

      Nein, ich meine wie auf dem zweiten Bild im ersten Posting zu sehen ist.

      iCal-Import?

      Wäre natürlich der Hammer. Genauso wie ein Import aus Google. Dazu Google habe ich eine Anleitung gefunden, die doch sehr kompiliziert ist, für iCal noch nichts.

      1. Moin,

        Mir scheint, dass Du beim Datenbankdesign zu sehr ans visuelle Design denkst und zu wenig ans logische Design.

        Die Bedeuting von datum und ganztags ist mir noch nicht klar.

        Datum z.B. 2017-08-09 ganztags, dann wird der Termin über den ganzen Tag verteilt, wenn dieses nicht angeklickt wird, muss ein Zeitraum eingegeben werden, deshalb auch die Felder von - bis die dann nicht datetime sondern nur time bekommen sollten?

        Für diese Bedeutung wäre ganztags mit maximal 50 Zeichen aber ganz schön großzügig bemessen, denn es täte ja eigentlich auch ein Boolescher Wert (Ja/Nein). Aber …

        Wenn ein Termin über mehrere Tage geht, dann sollte vielleicht das datum in eine weitere Tabelle ausgelagert werden? Wieso, du hast doch von und bis − jetzt sogar als datetime.

        Nein, ich meine wie auf dem zweiten Bild im ersten Posting zu sehen ist.

        … wenn du von und bis als Datetime deklarierst, brauchst du weder datum noch ganztags:

        • Das Datum ist einfach DATE(von) bzw. DATE(bis),
        • und ganztags heißt, dass TIME(von) == '0:00:00' AND TIME(bis) == '23:59:59.

        iCal-Import? Wäre natürlich der Hammer. Genauso wie ein Import aus Google. Dazu Google habe ich eine Anleitung gefunden, die doch sehr kompiliziert ist, für iCal noch nichts.

        Bei PEAR und PECL habe ich auf die schnelle nichts gefunden, aber es würde mich doch arg wundern, wenn es dafür keine Bibliothek gibt. Wobei andererseits das iCal-Format auch nicht sonderlich kompliziert aufgebaut ist.

        Viele Grüße
        Robert

        1. Hallo,

          Für diese Bedeutung wäre ganztags mit maximal 50 Zeichen aber ganz schön großzügig bemessen, denn es täte ja eigentlich auch ein Boolescher Wert (Ja/Nein). Aber …

          Ok, dann ändere ich noch das Feld in ENUM?

          … wenn du von und bis als Datetime deklarierst, brauchst du weder datum noch ganztags:

          • Das Datum ist einfach DATE(von) bzw. DATE(bis),
          • und ganztags heißt, dass TIME(von) == '0:00:00' AND TIME(bis) == '23:59:59.

          Die Vorgabe ist, ein Kalender in Form von Google nachzubauen und da gibt es auch die Felder. Also nehme ich diese auch. Tut ja auch nichts zu sache? Außerdem kann ein Tag auch ein Arbeitstag lauten? Das ist mir einfach zu unsicher.

          Bei PEAR und PECL habe ich auf die schnelle nichts gefunden, aber es würde mich doch arg wundern, wenn es dafür keine Bibliothek gibt. Wobei andererseits das iCal-Format auch nicht sonderlich kompliziert aufgebaut ist.

          Für einen Import aus dem Google Kalender habe ich hier etwas gefunden: http://www.codefreaks.net/google-calendar-api-mit-php-nuetzen/

          1. Moin,

            Für diese Bedeutung wäre ganztags mit maximal 50 Zeichen aber ganz schön großzügig bemessen, denn es täte ja eigentlich auch ein Boolescher Wert (Ja/Nein). Aber …

            Ok, dann ändere ich noch das Feld in ENUM?

            Oder INT(1), CHAR(1), … irgend etwas Passendes wird es da schon geben.

            … wenn du von und bis als Datetime deklarierst, brauchst du weder datum noch ganztags:

            • Das Datum ist einfach DATE(von) bzw. DATE(bis),
            • und ganztags heißt, dass TIME(von) == '0:00:00' AND TIME(bis) == '23:59:59.

            Die Vorgabe ist, ein Kalender in Form von Google nachzubauen und da gibt es auch die Felder.

            Das Datenmodell ist allerdings etwas Anderes als die Benutzeroberfläche. Ich kann mir kaum vorstellen, dass Google dein vorgeschlagenes Datenmodell verwendet. Außerdem kannst du aus aus den beiden Datetimes zur gewünschten Darstellung kommen – und umgekehrt auch.

            Tut ja auch nichts zu sache? Außerdem kann ein Tag auch ein Arbeitstag lauten? Das ist mir einfach zu unsicher.

            Und dann hat der eine Kalender einen ganzen Tag von 9 bis 17 Uhr, der andere aber von 0 Uhr bis Mitternacht. Wie willst du diese Fälle mit einem Flag ganztags „erschlagen“?

            Viele Grüße
            Robert

  3. Wie bekomme ich Checkboxen mit einer Hintergrundfarbe versehen? Das Ergebnis sollte so aussehen

    1. Hallo BlaiiND98,

      so vielleicht? Auch wenn sie wie Checkboxen sie aussehen, so sind sie doch Radio-Buttons, weil man ja nur eine Farbe auswählen kann.

      Gruß
      Julius

      1. Hallo Julius,

        genau so etwas habe ich gesucht. Dieses schaut sehr gut aus. Hab bisschen rumgespielt und versucht die Radio-Buttons gleich groß zu lassen auch wenn man reingeklickt hat, wie hier: https://codepen.io/stacy/pen/GpZvzN irgendwie will mir dieses leider nicht gelingen. Könntest du mir vielleicht sagen, wo ich etwas drehen muss?

        1. Hab bisschen herumgespielt: https://codepen.io/anon/pen/dzqywK

          Die Frage ist, benötige ich die &nbsp; kann das <label> nicht auch leer bleiben?

          1. @@BlaiiND98

            Die Frage ist, benötige ich die &nbsp;

            Nein.

            kann das <label> nicht auch leer bleiben?

            Nein!

            LLAP 🖖

            --
            “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      2. @@Julius

        so vielleicht?

        Nein, so nicht!

        1. Es gibt gar keine Radiobuttons.

          Merke: interaktive Elemente niemals per display: none o.ä. verstecken, sondern visuell verstecken.

        2. Wenn es sie gäbe: die Radiobuttons haben keine Beschriftung.

          Die Beschriftung sollte im label-Elementinhalt stehen, nicht nur als title-Attribut. Visuell verstecken.

        3. Bei Tastaturnavigation ist nicht erkennbar, wo der Fokus ist.

          Also irgendwas Erkennbares für input[type="radio"]:focus + label angeben.

        So in etwa: Berichtigung

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        1. So in etwa: Berichtigung

          Es sieht scheiße aus was du hier zusammengebastelt hast (schwarzer Rand & Die Hacken sind nicht in der Mitte). Außerdem bleibe ich bei der Version von Julius

          1. @@Sophie

            So in etwa: Berichtigung

            Es sieht scheiße aus was du hier zusammengebastelt hast

            Es ging nicht ums Aussehen, sondern um die Bedienbarkeit.

            Du kannst es gern hübscher machen, aber bedienbar sollte es sein – für alle.

            Außerdem bleibe ich

            ?? Mal wieder als Sockenpuppe unterwegs?

            LLAP 🖖

            --
            “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
            1. Hallo Gunnar Bittersmann,

              ?? Mal wieder als Sockenpuppe unterwegs?

              Das ist auch meine Vermutung.

              Bis demnächst
              Matthias

              --
              Rosen sind rot.
          2. Hallo Sophie,

            mein - hast du hierfür bekommen:

            Es sieht scheiße aus was du hier zusammengebastelt hast

            Konstruktive Kritik braucht keine Kraftausdrücke.

            Viele Grüße
            Robert

            P.S.:

            Die Hacken sind nicht in der Mitte).

            Die Hacken sind an den Füßen.

            1. @@Robert B.

              Es sieht scheiße aus was du hier zusammengebastelt hast

              Konstruktive Kritik braucht keine Kraftausdrücke.

              Das wäre mir – ehrlich gesagt – scheißegal (Pun intended.)

              Interessant an der Sache ist aber: bei „Rotz“ kotzen, aber „Scheiße“ in den Mund nehmen. Ein Schelm, wer ‚Troll‘ dabei denkt.

              LLAP 🖖

              --
              “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
              1. Hi Gunnar,

                Interessant an der Sache ist aber: bei „Rotz“ kotzen, aber „Scheiße“ in den Mund nehmen.

                was glaubst du, wie viele Leute sich vor der Erkältungswelle ekeln, aber Fast Food essen 😉

                Viele Grüße
                Robert

        2. Hallo Gunnar,

          vielen Dank für deine Korrekturen. Ich habe deinen Beitrag dort verlinkt.

          Gruß
          Julius