Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Kalendarz - system rezerwacji - udoskonalenie
Forum PHP.pl > Forum > Przedszkole
maxslawek
Witam,
Skończyłem robić właśnie mini aplikację internetową, w której w łatwy i przyjemny sposób administrator może dodawać/edytować i usuwać rezerwacje.
Stworzyłem również system wyświetlania rezerwacji - wybieramy rok i interesujący nas miesiąc i pobieramy wszystkie rezerwacje pasujące do zapytania.

Wszystko niestety oparłem o tabelę i wyszło dość sporo zagnieżdżeń tj. :
  1. <table class="kalendarz">
  2. <thead>
  3. <tr>
  4. <th>Pokój</th>
  5. <th>Max. Os.</th>
  6. <?php
  7. $number = cal_days_in_month(CAL_GREGORIAN, $miesiac, $rok);
  8. $x = 0;
  9. do{
  10.  
  11. $x = $x+1;
  12.  
  13. echo '<th>'.$x.'</th>';
  14. }
  15. while($x<$number)
  16. ?>
  17. </tr>
  18. </thead>
  19. <tbody>
  20. <?php foreach ($pokoje as $pokoje_spec):?>
  21. // TR dla każdego pokoju
  22. <tr>
  23. <td><?php if(isset($pokoje_spec['nazwa_pokoje']) and $pokoje_spec['nazwa_pokoje'] != NULL) {echo $pokoje_spec['nazwa_pokoje'];};?></td>
  24. <td ><?php if(isset($pokoje_spec['ilosc_osob_pokoje']) and $pokoje_spec['ilosc_osob_pokoje'] != NULL) {echo $pokoje_spec['ilosc_osob_pokoje'];};?></td>
  25. <?php
  26. $number = cal_days_in_month(CAL_GREGORIAN, $miesiac, $rok);
  27. $x = 0;
  28. do{
  29. // TD dla każdego dnia miesiąca
  30. $x = $x+1;
  31. $data_text = $rok.'-'.$miesiac.'-'.$x;
  32. $aktualna_data = date("Y-m-d", strtotime($data_text));
  33.  
  34. echo '<td>';
  35. foreach ($rezerwacje as $rezerwacje_spec) {
  36. if($rezerwacje_spec['id_pokoje'] == $pokoje_spec['id_pokoje']){
  37. // Foreach sprawdzający czy dana rezerwacja pasuje do założeń - najpierw jeden IF z samym pokojem, a potem 3 IF mniej ważnych (dla daty początkowej, końcowej i w trakcie rezerwacji)
  38. }
  39.  
  40. }
  41. echo '</td>';
  42. }
  43. while($x<$number)
  44. ?>
  45. </tr>
  46. <?php endforeach; ?>
  47.  
  48. <tr>
  49. <td colspan="2"><a class="admin_section_link" title="Anuluj zmiany" href="<?php echo base_url()?>admin_kalendarz">Powrót</a></td>
  50. </tr>
  51. </tbody>
  52. </table>

I teraz pytanie - można to jakoś uprościć by tych iteracji było znacznie mniej?

Pokoi jest 50. Dni w miesiącu mamy średnio 30. Rezerwacji niech będzie ~400 na miesiąc co daje ok. 600 000 operacji ;(
Foreach dla pokoi - potem do/while dla każdego dnia miesiąca no i potem przy każdym dniu sprawdzenie każdego zamówienia czy pasuje do założeń (dzień i pokój).
Jak na razie wszystko działa, ale chciałbym to rozwiązać nieco bardziej "profesjonalnie" wink.gif
JakubBab
ale Panie namieszales

Sprobuj cos w tym stylu (ponizszy kod nie bedzie dzialac bo nie znam Twoich tablic )

  1.  
  2.  
  3. $number = cal_days_in_month(CAL_GREGORIAN, $miesiac, $rok);
  4.  
  5.  
  6. $table = '<table class ="kalendarz"><tr><th>Pokój</th><th>Max. Os.</th>';
  7. for ($i=0;$i<$number;$i++){
  8.  
  9.  
  10. $table.= '<th>'.$i.'</th>';
  11.  
  12.  
  13.  
  14. }
  15.  
  16. $table .= '</tr>'<td>;
  17. //nie wiem jak wyglada tablica pokoje jesli ma w sobie dwie tabele to
  18.  
  19. foreach($pokoje as $pokojeKey => $pokojeVal){
  20.  
  21. if($pokojeVal != ''){
  22. $table.='<td>'.$pokojeVa.'<td>';
  23. }
  24.  
  25. }
  26.  
  27. $table .='</td>';


Bez sensu jest podawanie zalozen w if a nie kodu. CIezko pomagac kiedy musimy sie domyslac-> popraw

  1. foreach ($rezerwacje as $rezerwacje_spec) {
  2. if($rezerwacje_spec['id_pokoje'] == $pokoje_spec['id_pokoje']){
  3. // Foreach sprawdzający czy dana rezerwacja pasuje do założeń - najpierw jeden IF z samym pokojem, a potem 3 IF mniej ważnych (dla daty początkowej, końcowej i w trakcie rezerwacji)
  4. }
  5.  
  6. }
<-- wynik tego foreach-a wstaw w zmienna w pierwszej petli ( *for* bo i tu i to uzywasz tej samej zmiennej $x do iteracji wiec po co 2 razy to samo. i w odpowiednim momencie (podejrzewam, ze na koncu doklej do reszty.
maxslawek
Już tłumaczę.
Pokoje:
Id_Pokoje
Nazwa_pokoje
cena_pokoje
opis_pokoje
zdjecie_pokoje

Muszą wyświetlać się wszystkie pokoje - nawet te nie zarezerwowane.

Co do if wewnątrz sprawdzenia rezerwacji:
Kod
                 foreach ($rezerwacje as $rezerwacje_spec) {
                        if($rezerwacje_spec['id_pokoje'] == $pokoje_spec['id_pokoje']){  // Jeżeli jest rezerwacja dla danego pokoju

                            if ($rezerwacje_spec['data_poczatkowa_rezerwacje'] == $aktualna_data){ // Jeżeli data poczatkowa rezerwacji jest taka jak aktualna data przypisana do komórki w tabeli tzn. ,że to pierwszy dzień rezerwacji
                                echo '<div class="rezerwacje_min_start" title="'.$rezerwacje_spec['id_rezerwacje'].'"><a href="'.base_url().'admin_rezerwacje/rezerwacje_edit/'.$rezerwacje_spec['id_rezerwacje'].'"></a></div>';
                            }

                            elseif(($rezerwacje_spec['data_poczatkowa_rezerwacje'] < $aktualna_data) and
                                ($rezerwacje_spec['data_koncowa_rezerwacje'] > $aktualna_data)){  // Jeżeli data jest pomiędzy data poczatkowa i koncowa rezerwacji
                            echo '<div class="rezerwacje" title="'.$rezerwacje_spec['id_rezerwacje'].'"><a href="'.base_url().'admin_rezerwacje/rezerwacje_edit/'.$rezerwacje_spec['id_rezerwacje'].'"></a></div>';
                            }
                            elseif ($rezerwacje_spec['data_koncowa_rezerwacje'] == $aktualna_data){   // Jeżeli data koncowa rezerwacji jest taka jak aktualna data przypisana do komórki w tabeli tzn. ,że to ostatni dzień rezerwacji
                                echo '<div class="rezerwacje_min_end" title="'.$rezerwacje_spec['id_rezerwacje'].'"><a href="'.base_url().'admin_rezerwacje/rezerwacje_edit/'.$rezerwacje_spec['id_rezerwacje'].'"></a></div>';
                            }
                        }
                        
                    }


W skrócie chodzi o specyficzne oznaczenie rezerwacji tj pierwszy i ostatni dzień w siatce zajmuje tylko pół komórki a środkowe dni całą komórkę <td> wraz z przyciskiem umożliwiającym szybkie przejscie do edycji danej rezerwacji wink.gif

Chodzi mi przede wszystkim czy można jakoś zminimalizować ilość zagnieżdżeń foreach/do while, bo nic nie przychodzi mi do głowy wink.gif
JakubBab
Cytat
W skrócie chodzi o specyficzne oznaczenie rezerwacji tj pierwszy i ostatni dzień w siatce zajmuje tylko pół komórki a środkowe dni całą komórkę <td> wraz z przyciskiem umożliwiającym szybkie przejscie do edycji danej rezerwacji wink.gif


Jesli dobrze rozumiem, to chodzi o formatowanie stylu <td>? jesli tak to skorzystaj z : http://www.w3schools.com/html/html_tables.asp . Jesli natomiast chcsze formatowac ktoras z komorek to wtedt ustaw $counter =0 przed foreach a nastepnie w foreach $counter++ i warunek :
  1. if($counter == ($x -< ?ktora komorka?) {
  2. $table.= '<td " zajebisty kod css">'.$zmienna.'</td>';
  3. }else{
  4. $table.='<td>'.zmienna.'</td>';
  5. }
  6.  


Co do zagniezdzen uzyj tego co napisalem powyzej i bedzie git.

Co do ostatniego postu to tutaj zrobiles ten sam warunek co w peirwszej petli ( x< $number) tak wiec, mozesz skorzystac z jego dobrodziejstw i tam go wstawic tylko, ze w innej zmiennej:

  1. foreach ($rezerwacje as $rezerwacje_spec) {
  2. if($rezerwacje_spec['id_pokoje'] == $pokoje_spec['id_pokoje']){ // Jeżeli jest rezerwacja dla danego pokoju
  3.  
  4. if ($rezerwacje_spec['data_poczatkowa_rezerwacje'] == $aktualna_data){ // Jeżeli data poczatkowa rezerwacji jest taka jak aktualna data przypisana do komórki w tabeli tzn. ,że to pierwszy dzień rezerwacji
  5. $tableDiv.= '<div class="rezerwacje_min_start" title="'.$rezerwacje_spec['id_rezerwacje'].'"><a href="'.base_url().'admin_rezerwacje/rezerwacje_edit/'.$rezerwacje_spec['id_rezerwacje'].'"></a></div>';
  6. }
  7.  

itd itp. Tak wiec $tableDiv bedzie przechowywac juz sformatowane '<div>' -y gotowe zeby byly doklejone pod glowna $table.



Po skonczonym skrypcie wyswietlisz tylko raz kod bez potrzby zagniezdzania go w pierdylion linijek html-a.
maxslawek
Dziękuję za pomoc - kilka kwestii przetestuję wink.gif Co do pytania odnośnie formatowania <td> - nie, całego TD nie mogę formatować, ponieważ pierwszy i ostatni dzień danej rezerwacji nie może zajmować całego pola td - dlatego podesłałem informacje co mieści się w warunkach if(...) - w <td>, w którym jest jakaś rezerwacja występuje <div> którego klasa zależna jest od tego czy to pierwszy/ostatni czy środkowy dzień rezerwacji. Inne pola - bez rezerwacji - są czyste - tj. bez <div>.

Teraz pytanie - na ile rozwiązanie dotyczące przypisania całego kodu html do zmiennej a potem tylko wypisanie jej całej wpływa na szybkość działania całego serwisu? Można jakoś realnie określić wzrost wydajności? 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.