Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] wyświetlenie kalendarza z eventami
Forum PHP.pl > Forum > PHP
pentel
Witam,
Kalendarz potrafię zrobić sam, problem powstaje, gdy chce rozszerzyć jego możliwości o eventy - dokładniej rzecz biorąc o samo wyświetlenie go. Sciągnąłem pare darmowych kalendarzy, żeby zobaczyć o co tam biega, ale sa one jakoś dziwnie rozbudowane. Myślę, że problem jest prosty.

Chodzi o to, że przed generowaniem komorek tabeli z dniami miesiąca sprawdzam bazę danych (mysql) w poszukiwaniu eventów z tego miesiąca tego roku. Pobieram je i teraz zaczynam generować komórki. Jeśli pole 'day' z mysql jest równe aktualnie generowanej komórce z dniem miesiąca to w komórce tej będzie link do tego dnia, gdzie będzie więcej szczegółów na temat wydarzenia.
  1. <?php
  2. $date_month = date('m');
  3. $date_year = date('Y');
  4. $theday = date(w, mktime(0, 0, 0, $date_month, 1, $date_year));
  5. $daysinmonth = date('t', mktime(0, 0, 0, $date_month, 1, $date_year));
  6. $month = date('F');
  7. $today = date('j');
  8.  
  9. echo '<table>'."\n";
  10. echo ' <tr class="week">';
  11. echo '<td class="sunday">Su</td>';
  12. echo '<td>Mo</td>';
  13. echo '<td>Tu</td>';
  14. echo '<td>We</td>';
  15. echo '<td>Th</td>';
  16. echo '<td>Fr</td>';
  17. echo '<td>Sa</td>';
  18. echo '</tr>'."\n";
  19. echo ' <tr class="days">';
  20.  
  21. for ($i=0; $i<$theday; $i++){
  22.  echo '<td></td>';
  23. }
  24.  
  25. $sql = "SELECT `id`, `year`, `month`, `day`, `time`, `title` FROM `calendar` WHERE 
    `year
  26.  = '" . date('Y') . "' AND `month` = '" . date('n') . "'";
  27. $event = mysql_query($sql);
  28. $event = mysql_fetch_assoc($event);
  29.  
  30. for ($list_day=1; $list_day <= $daysinmonth; $list_day++){
  31.  if ($list_day == date('j')){
  32. if ( $list_day == $event['day'] ){
  33.  echo '<td class="today"><a href="?x=calendar&amp;m=item&amp;year='.$event['year'].'&amp;month='.$event['month'].'&amp;day='.$event['day'].'" title="'.$event['time'].' - '.$event['title'].'">'. $today .'</a></td>';
  34. } else {
  35.  echo '<td class="today">'. $today .'</td>';
  36. }
  37.  } elseif ($theday == 0){
  38. if ( $list_day == $event['day'] ){
  39.  echo '<td class="sunday"><a href="?x=calendar&amp;m=item&amp;year='.$event['year'].'&amp;month='.$event['month'].'&amp;day='.$event['day'].'" title="'.$event['time'].' - '.$event['title'].'">'. $list_day .'</a></td>';
  40. } else {
  41.  echo '<td class="sunday">'. $list_day .'</td>';
  42. }
  43.  } else {
  44. if ( $list_day == $event['day'] ){
  45.  echo '<td><a href="?x=calendar&amp;m=item&amp;year='.$event['year'].'&amp;month='.$event['month'].'&amp;day='.$event['day'].'" title="'.$event['time'].' - '.$event['title'].'">'. $list_day .'</a></td>';
  46. } else {
  47.  echo '<td>'. $list_day .'</td>';
  48. }
  49.  }
  50.  if ($theday == 6){
  51. echo '</tr>'."\n";
  52. echo ' <tr class="days">';
  53. $theday = -1;
  54.  }//end of if $theday == 6
  55.  $theday++;
  56. }//end of for
  57.  
  58. $last = 7 - $theday;
  59. for ($i=0; $i<$last; $i++){
  60.  if ($last == 6){
  61. echo '';
  62.  } else {
  63. echo '<td></td>';
  64.  }
  65. }//end of for
  66.  
  67. echo '</tr>'."\n";
  68. echo ' </table>'."\n";
  69. ?>

I to działa, ale tylko dla pierwszego rekordu. Kolejne sa ignorowane. Pokazany jest event tylko z ID 1, czyli ten który jest pierwszy.
Jak całą część z komórkami wsadziłem z while dla rekordów z bazy to dostałem 3 razy kalendarz (3 rekordy w bazie, wiec 3 petle) =)
Nie bardzo mam pomysł jak to zrobić.
Mam nadzieję, że jasno się wysłowiłem.

Pozdrawiam

PS. Wiem, że mogę sprawdzać bazę danych w poszukiwaniu odpowiedniego eventu przy generowaniu każdej komórki, ale to by dało 30/31 zapytań przy każdym odswieżaniu strony (kalendarz jest w panelu bocznym, więc jest zawsze widoczny). To troche dużo, więc sam uznałem, że to kiepskie rozwiązanie.
_bezimienny
Ja to mam rozwiązane w taki sposób, że wszystkie wydarzenia są czytane z bazy danych i zapisywane do tablicy. Potem wystarczy tylko operować na tablicy. Jak chcę wyświetlić wszystkie wydarzenia to wystarczy w pętli. Jak chcesz przechodzić pomiędzy wydarzeniami, to w linku dajesz index+1. Może na przykładzie:
  1. <?php
  2. $tab; // tablica z wpisami z bazy
  3. for($i=0; $i<count($tab);$i++)
  4. {
  5. print($tab[$i]);
  6. print("<href='index.php?event=".$tab[$i-1]."'>Poprzednie wydarzenie</a><a href='index.php?event=".$tab[$i+1]."'>Następne wydarzenie</a>")
  7. }
  8. ?>

Musisz zrobić funkcję do szukania wydarzeń w bazie danych:
Potem dajesz tylko:
  1. <?php
  2. if($_GET['event'])
  3. {
  4. //jeśli masz na klasie
  5. $klasa = new Baza();
  6. $klasa->szukaj_wydarzenia($wydarzenie);
  7. // lub funkja
  8. szukaj_wydarzenia($wydarzenie);
  9. }
  10. ?>


Nie chciało mi się przeglądać całego kodu, ale chciałeś koncepcje, to masz (jeśli zrozumiałem, że o to chodzi).
Spykaj
Ściągnij z bazy tylko te potencjalne, czyli np. jeśli mamy miesiąc sierpień to wystarczy tylko:

wydarzenia_start <= sierpień && wydarzenia_koniec >= sierpień

Potem możesz zrobić tak smile.gif
Kod
dla każdego wydarzenia:
  dla każdego dnia kiedy to wydarzenie trwa:
    zapisz w tym dniu link do tego wydarzenia
JoShiMa
Może ten tutorial Ci pomoże?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.