Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Terminarz PHP - problem z przewijaniem miesięcy
Forum PHP.pl > Forum > PHP
kozak1987
Z pomocą forum oraz wujka google "napisałem" terminarz w PHP. Wszystko pięknie śmiga - miał zczytywać z bazy dni które mają się podświetlać innym kolorem. Podświetlać aktualny dzień itp.
Napotkałem jednak problem przy tworzeniu przycisków do przełączania miesięcy. Z pomocą znajomego coś tam napisałem, ale ni jak to sie ma do działania.

Tak oto wygląda kod, przyciski od 31 do 44 linijki:
  1. <?php
  2. require("kal/connection.php");
  3. connection();
  4. // Funkcja rysująca kalendarz
  5. function rysujKalendarz($miesiac, $rok)
  6. {
  7. global $link;
  8.  
  9. // skonstruowanie zapytania do bazy danych w celu wyciągnięcia dni które mają być zaznaczone i wpisanie tych dni do tablicy $dni_zaznaczone
  10. $sql = "SELECT dzien FROM formularz WHERE miesiac = ".(int)$miesiac." AND rok = $rok ORDER BY dzien ASC";
  11. $res = mysql_query($sql);
  12. $dni_zaznaczone = array();
  13.  
  14.  
  15. while($row = mysql_fetch_array($res))
  16. {
  17. $dni_zaznaczone[] = $row['dzien'];
  18. }
  19.  
  20. // Ustawienie głównych zmiennych
  21. $znacznik = mktime(0, 0, 0, $miesiac, 1, $rok);
  22. $iledni = date("t", $znacznik);
  23. $start = date("w", $znacznik);
  24. $miesiace = array(
  25. "Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec",
  26. "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"
  27. );
  28.  
  29. // Rysowanie tabeli
  30.  
  31. $poprzedni = $miesiac - 1;
  32. $nastepny = $miesiac + 1;
  33.  
  34. if($poprzedni < 1)
  35. {$poprzedni = 12 ; $rok-- ;}
  36.  
  37. if($nastepny > 12)
  38. {$nastepny = 1; $rok++ ;}
  39.  
  40.  
  41. echo '<table width="400px" border="1" bordercolor="#ffb4ee" cellspacing="0" cellpadding="6"><tr>';
  42. echo '<td colspan="20" style="text-align:center; background:#252525;">';
  43. echo '<a href="terminarz.php?rok='.$poprzedni_rok.'&amp;miesiac='.$poprzedni_miesiac.'">poprzedni </a>' ;
  44. echo '<a href="terminarz.php?rok='.$nastepny_rok.'&amp;miesiac='.$nastepny_miesiac.'"> następny</a>';
  45. echo $miesiace[$miesiac-1].' '.$rok.'</td></tr>';
  46. echo '<tr style="background:#252525;"><td>Nd</td><td>Pn</td>
  47. <td>Wt</td><td>Śr</td><td>Cz</td><td>Pt</td><td>So</td></tr>';
  48. echo '<tr align="right">';
  49. if ($start>0)
  50. echo '<td colspan="'.$start.'" style="background:#252525;"> </td>';
  51. else $pierwszy=true;
  52.  
  53. // Wypisanie wszystkich dni
  54. for ($i=1;$i<=$iledni;$i++)
  55. {
  56. $dzien = date("w", mktime(0, 0, 0, $miesiac, $i, $rok));
  57. if ($dzien==0 and !$pierwszy) echo '</tr><tr align="right">';
  58.  
  59. // Jeśli jest to dzień zaznaczony, to ustawienie koloru tła na podany kolor
  60. if (in_array($i, $dni_zaznaczone)) $bg = "background:#de00ac;";
  61. // W przeciwnym razie, gdy dzień jest niedzielą, ustawienie specjalnego koloru
  62. else if ($dzien==0) $bg = "background:#1d1d1d;";
  63. // W przeciwnym razie, wiemy że to zwykły dzień i ustawiamy inne tło
  64. else $bg = "background:#252525;";
  65.  
  66.  
  67. $pierwszy = false;
  68. if (mktime(0, 0, 0, date("m"), date("d"), date("Y"))==
  69. mktime(0, 0, 0, $miesiac, $i, $rok)) $bg .= " font-weight:bold;";
  70. echo '<td style="'.$bg.'">'.$i.'</td>';
  71. }
  72. $koniec=7-($start+$iledni)%7;
  73. if ($koniec<>7) echo '<td colspan="'.$koniec.'"
  74. style="background:#252525;"> </td>';
  75. echo '</tr></table>';
  76.  
  77. }
  78.  
  79. // Wywołanie funkcji z aktualną datą
  80. rysujKalendarz(date("m"),date("Y"));
  81.  
  82. ?>


Tak więc jak już wcześniej wspominałem jestem zielony w tym temacie i robię to raz bo muszę dwa, że już zostało tak mało do skończenia że nie chcę komuś tego zlecać. Domyślam się, że brakuje jakiejś zmiennej?
Ze strony estetycznej natomiast chciałbym, żeby linki "poprzedni miesiąc" i "następny miesiąc" były po bokach tej komórki w której się znajdują natomiast nazwa aktualnego miesiąca i rok żeby były pomiędzy linkami.
camikazee
  1. // Rysowanie tabeli
  2. $poprzedni_rok = $rok;
  3. $nastepny_rok = $rok;
  4.  
  5. if($miesiac==1){
  6. $poprzedni_miesiac = 12;
  7. $poprzedni_rok--;
  8. }
  9. else{
  10. $poprzedni_miesiac = $miesiac - 1;
  11. }
  12.  
  13. if($miesiac==12){
  14. $nastepny_miesiac = 1;
  15. $nastepny_rok++;
  16. }
  17. else{
  18. $nastepny_miesiac = $miesiac + 1;
  19. }
  20.  
  21. echo '<table width="400px" border="1" bordercolor="#ffb4ee" cellspacing="0" cellpadding="6"><tr>';
  22. echo '<td colspan="20" style="text-align:center; background:#252525;">';
  23. echo '<a href="terminarz.php?rok='.$poprzedni_rok.'&amp;miesiac='.$poprzedni_miesiac.'">poprzedni </a>' ;
  24. echo '<a href="terminarz.php?rok='.$nastepny_rok.'&amp;miesiac='.$nastepny_miesiac.'"> następny</a>';
Pilsener
Po co tak kombinować? Wystarczy użyć: strtotime

  1. echo strtotime('+1 month');
- jak rok przeskoczy to też uwzględni, nie trzeba dodatkowych warunków, że jak ostatni miesiąc to miesiąc 1 a rok plus jeden i odwrotnie.
camikazee
Ja się dostosowałem do jego przykładu. Poza tym jeżeli użyjesz strtotime, to najpierw będziesz musiał złączyć datę, sprawdzić strtotime a potem znów ją rozbić na rok i miesiąc by dalej w skrypcie się wszystko zgadzało. Ok, ja też twierdzę, że można cały kalendarz zrobić lepiej, prościej i elastyczniej wykorzystując funkcje PHP do obsługi dat.
Pilsener
Po co rozbijać? Masz funkcje do tego:
  1. echo strftime('%Y-%m',strtotime('+1 month'));
camikazee
Ale skoro tak zrobi, to będzie musiał rozbić datę na rok i miesiąc, bo ona te parametry przenosi osobno, świadomie bądź nie.
  1. echo date('Y-m', strtotime($rok.'-'.$miesiac.' -1 month'));
  2. echo date('Y-m', strtotime($rok.'-'.$miesiac.' +1 month'));


Lub mozolnie tak
  1. $poprzedni_rok = date('Y', strtotime($rok.'-'.$miesiac.' -1 month'));
  2. $nastepny_rok = date('Y', strtotime($rok.'-'.$miesiac.' +1 month'));
  3. $poprzedni_miesiac = date('m', strtotime($rok.'-'.$miesiac.' -1 month'));
  4. $nastepny_miesiac = date('m', strtotime($rok.'-'.$miesiac.' +1 month'));


Czy można prościej?
Pilsener
Można prościej:
  1. $date = $_GET['date'].'-01'; //data w postaci YYYY-MM (plus dzień, bo taką datę łatwo obsłużyć)
  2. $date_month_next = strftime('%Y-%m',strtotime('+1 month',strtotime($date)));
  3. $date_month_prev = strftime('%Y-%m',strtotime('-1 month',strtotime($date)));
  4.  
  5. //wystarczy wstawić do url:
  6. echo '<a href="'.$date_month_prev.'">month prev</a>';


Teoretycznie wystarczą dwie linijki kodu wink.gif
kozak1987
Camikazee niestety twój sposób nie działa - ojawia sie tak samo jak to co ja napisałem, są linki ale zero akcji. Zauważyłem że po najechaniu na link to dobrze liczy bo jako następny miesiąc wyrzuca 5, a poprzedni 3 - tak więc to samo w sobie myślę że działa natomiast nie rysuje nowego miesiąca. Nie zmienia nazwy miesiąca itp - po prostu zero akcji.

Pilsner - twoje rozwiązanie w ogóle nie działa, po kliknięciu w link przenosi do strony której nie ma.

Pozostali - nie ogarniam o czym mówicie nerdsmiley.png ani nie wiem gdzie to powklejać.
camikazee
Bo my nie pisaliśmy całego kodu tylko modyfikacje, które miałeś zrobić.
Idąc Twoją metodą, masz kod:

  1. <?php
  2.  
  3. require("kal/connection.php");
  4. connection();
  5. // Funkcja rysująca kalendarz
  6. function rysujKalendarz($miesiac, $rok)
  7. {
  8. global $link;
  9.  
  10. // skonstruowanie zapytania do bazy danych w celu wyciągnięcia dni które mają być zaznaczone i wpisanie tych dni do tablicy $dni_zaznaczone
  11. $sql = "SELECT dzien FROM formularz WHERE miesiac = ".(int)$miesiac." AND rok = $rok ORDER BY dzien ASC";
  12. $res = mysql_query($sql);
  13. $dni_zaznaczone = array();
  14.  
  15.  
  16. while($row = mysql_fetch_array($res))
  17. {
  18. $dni_zaznaczone[] = $row['dzien'];
  19. }
  20.  
  21. // Ustawienie głównych zmiennych
  22. $znacznik = mktime(0, 0, 0, $miesiac, 1, $rok);
  23. $iledni = date("t", $znacznik);
  24. $start = date("w", $znacznik);
  25. $miesiace = array(
  26. "Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec",
  27. "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"
  28. );
  29.  
  30. // Rysowanie tabeli
  31. $poprzedni_rok = $rok;
  32. $nastepny_rok = $rok;
  33.  
  34. if($miesiac==1){
  35. $poprzedni_miesiac = 12;
  36. $poprzedni_rok--;
  37. }
  38. else{
  39. $poprzedni_miesiac = $miesiac - 1;
  40. }
  41.  
  42. if($miesiac==12){
  43. $nastepny_miesiac = 1;
  44. $nastepny_rok++;
  45. }
  46. else{
  47. $nastepny_miesiac = $miesiac + 1;
  48. }
  49.  
  50. echo '<table width="400px" border="1" bordercolor="#ffb4ee" cellspacing="0" cellpadding="6"><tr>';
  51. echo '<td colspan="20" style="text-align:center; background:#252525;">';
  52. echo '<a href="terminarz.php?rok='.$poprzedni_rok.'&amp;miesiac='.$poprzedni_miesiac.'">poprzedni </a>' ;
  53. echo '<a href="terminarz.php?rok='.$nastepny_rok.'&amp;miesiac='.$nastepny_miesiac.'"> następny</a>';
  54. echo $miesiace[$miesiac-1].' '.$rok.'</td></tr>';
  55. echo '<tr style="background:#252525;"><td>Nd</td><td>Pn</td>
  56. <td>Wt</td><td>Śr</td><td>Cz</td><td>Pt</td><td>So</td></tr>';
  57. echo '<tr align="right">';
  58. if ($start>0)
  59. echo '<td colspan="'.$start.'" style="background:#252525;"> </td>';
  60. else $pierwszy=true;
  61.  
  62. // Wypisanie wszystkich dni
  63. for ($i=1;$i<=$iledni;$i++)
  64. {
  65. $dzien = date("w", mktime(0, 0, 0, $miesiac, $i, $rok));
  66. if ($dzien==0 and !$pierwszy) echo '</tr><tr align="right">';
  67.  
  68. // Jeśli jest to dzień zaznaczony, to ustawienie koloru tła na podany kolor
  69. if (in_array($i, $dni_zaznaczone)) $bg = "background:#de00ac;";
  70. // W przeciwnym razie, gdy dzień jest niedzielą, ustawienie specjalnego koloru
  71. else if ($dzien==0) $bg = "background:#1d1d1d;";
  72. // W przeciwnym razie, wiemy że to zwykły dzień i ustawiamy inne tło
  73. else $bg = "background:#252525;";
  74.  
  75.  
  76. $pierwszy = false;
  77. if (mktime(0, 0, 0, date("m"), date("d"), date("Y"))==
  78. mktime(0, 0, 0, $miesiac, $i, $rok)) $bg .= " font-weight:bold;";
  79. echo '<td style="'.$bg.'">'.$i.'</td>';
  80. }
  81. $koniec=7-($start+$iledni)%7;
  82. if ($koniec<>7) echo '<td colspan="'.$koniec.'"
  83. style="background:#252525;"> </td>';
  84. echo '</tr></table>';
  85.  
  86. }
  87.  
  88. $rok = ($_GET['rok'] == '') ? date('Y') : $_GET['rok'];
  89. $miesiac = ($_GET['miesiac'] == '') ? date('m') : $_GET['miesiac'];
  90.  
  91. // Wywołanie funkcji z aktualną datą
  92. rysujKalendarz($miesiac, $rok);
  93.  
  94. ?>
kozak1987
Jesteś wielki!!! smile.gif
Tydzień szukałem rozwiązaniem a wystarczyło napisać temat, pare godzin i wszystko śmiga.
Jeszcze od strony estetycznej da radę zrobić tak, aby aktualny miesiąc i rok był pomiędzy tymi przyciskami? Zamieniam linijki miejscami i wywala mi cały czas błąd.
Lorum3
  1.  
  2.  
  3. echo '<table width="400px" border="1" bordercolor="#ffb4ee" cellspacing="0" cellpadding="6"><tr>';
  4. echo '<td colspan="20" style="text-align:center; background:#252525;">';
  5. echo '<a href="terminarz.php?rok='.$poprzedni_rok.'&amp;miesiac='.$poprzedni_miesiac.'">poprzedni </a>' ;
  6. echo $miesiace[$miesiac-1].' '.$rok;
  7. echo '<a href="terminarz.php?rok='.$nastepny_rok.'&amp;miesiac='.$nastepny_miesiac.'"> następny</a>';
  8. echo '</td></tr>';
  9. echo '<tr style="background:#252525;"><td>Nd</td><td>Pn</td>
  10.  
camikazee
  1. echo '<table width="400px" border="1" bordercolor="#ffb4ee" cellspacing="0" cellpadding="6"><tr>';
  2. echo '<td colspan="20" style="text-align:center; background:#252525;">';
  3. echo '<a href="terminarz.php?rok='.$poprzedni_rok.'&miesiac='.$poprzedni_miesiac.'">poprzedni </a> ';
  4. echo $miesiace[$miesiac-1].' '.$rok;
  5. echo ' <a href="terminarz.php?rok='.$nastepny_rok.'&miesiac='.$nastepny_miesiac.'"> następny</a></td></tr>';


spóźniony tongue.gif
kozak1987
Dzięki Panowie bardzo. Problem rozwiązany, można zamknąć smile.gif
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.