Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Terminarz PHP - problem z przewijaniem miesięcy
kozak1987
post 2.04.2012, 20:16:29
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
camikazee
post 3.04.2012, 08:36:11
Post #2





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  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>';


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
Pilsener
post 3.04.2012, 08:47:17
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
camikazee
post 3.04.2012, 08:54:02
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
Pilsener
post 3.04.2012, 09:02:33
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Po co rozbijać? Masz funkcje do tego:
  1. echo strftime('%Y-%m',strtotime('+1 month'));
Go to the top of the page
+Quote Post
camikazee
post 3.04.2012, 09:24:15
Post #6





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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?


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
Pilsener
post 3.04.2012, 10:31:33
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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

Ten post edytował Pilsener 3.04.2012, 10:35:14
Go to the top of the page
+Quote Post
kozak1987
post 3.04.2012, 13:18:08
Post #8





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.10.2011

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
camikazee
post 3.04.2012, 14:44:27
Post #9





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
kozak1987
post 3.04.2012, 17:14:00
Post #10





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Lorum3
post 3.04.2012, 18:24:00
Post #11





Grupa: Zarejestrowani
Postów: 86
Pomógł: 5
Dołączył: 10.12.2011
Skąd: Poznań

Ostrzeżenie: (0%)
-----


  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.  
Go to the top of the page
+Quote Post
camikazee
post 3.04.2012, 18:25:36
Post #12





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 17.04.2006
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  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

Ten post edytował camikazee 3.04.2012, 18:26:21


--------------------
www.fachoweuslugi.pl | www.zlec-usluge.pl | www.pokazsie.pl
Go to the top of the page
+Quote Post
kozak1987
post 3.04.2012, 18:28:38
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 13.10.2011

Ostrzeżenie: (0%)
-----


Dzięki Panowie bardzo. Problem rozwiązany, można zamknąć smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 00:40