Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]Elementy tr/td w pętli
Forum PHP.pl > Forum > Przedszkole
martinii007
Otóż mam następujący problem:

Chciałbym aby menu nad któym pracuję miało wygląd tabeli: i na przemian wiersze mają się zmieniać, raz czarny, raz biały.

  1.  
  2. <tr class="odd">
  3. <td>
  4. <span>Lobster Rolls with house made old bay potato chips</span>
  5. <p class="lang1">Lobster Rolls with house made old bay potato chips</p>
  6. <p class="lang2">Lobster Rolls with house made old bay potato chips</p>
  7. </td>
  8. <td class="price">$12.79</td>
  9. </tr>
  10. <tr>
  11. <td>
  12. <span>Lobster Rolls with house made old bay potato chips</span>
  13. <p class="lang1">Lobster Rolls with house made old bay potato chips</p>
  14. <p class="lang2">Lobster Rolls with house made old bay potato chips</p>
  15. </td>
  16. <td class="price">$12.79</td>
  17. </tr>
  18. <tr class="odd">
  19. <td>
  20. <span>Lobster Rolls with house made old bay potato chips</span>
  21. <p class="lang1">Lobster Rolls with house made old bay potato chips</p>
  22. <p class="lang2">Lobster Rolls with house made old bay potato chips</p>
  23. </td>
  24. <td class="price">$12.79</td>
  25. </tr>
  26. <tr>
  27. <td>
  28. <span>Lobster Rolls with house made old bay potato chips</span>
  29. <p class="lang1">Lobster Rolls with house made old bay potato chips</p>
  30. <p class="lang2">Lobster Rolls with house made old bay potato chips</p>
  31. </td>
  32. <td class="price">$12.79</td>
  33. </tr>
  34.  






  1. $menu = DatabaseManager::selectBySQL("SELECT * FROM Menu where id>=0 and id<=10"); //10 dań
  2. foreach($menu as $pozycje_menu) {
  3.  
  4. for($id=$pozycje_menu['id']; $id < 9; ++$id)
  5. {
  6.  
  7. $odd= "class=\"odd\"";
  8. $empty="";
  9.  
  10. echo '<tr '.($id & 1 ? $odd : $empty).'>';
  11.  
  12. <td>
  13. <span>'.$pozycje_menu['danie_1'].'</span>
  14. <p class="lang1">'.$pozycje_menu['opis_dania_1'].'</p>
  15. <p class="lang2">'.$pozycje_menu['opis_dania_2'].'</p>
  16. </td>
  17. <td class="price">'.$pozycje_menu['cena'].'</td>
  18. </tr>
  19. ';}}



Wszystko wyświetla się OK tylko, że są powielone rekordy. Potrzebuję jedynie "zlikwidować" te powtarzające się elementy, bo reszta wyświetla się prawidłowo.
b4rt3kk
Jeśli to możliwe, to proponuję zrezygnować z klas even, odd, a użyć zwyczajnie w tym celu css, czyli:

  1. tr:nth-child(even) {background: #CCC}
  2. tr:nth-child(odd) {background: #FFF}
martinii007
No piękne rozwiązanie smile.gif

A można to jakoś skrócić?

Zrealizowałem to w taki sposób:

  1. tr.odd:nth-child(1) {background-color: transparent}
  2. tr.odd:nth-child(2) {background: #FFF}
  3. tr.odd:nth-child(3) {background-color: transparent}
  4. tr.odd:nth-child(4) {background: #FFF}
  5. tr.odd:nth-child(5) {background-color: transparent}
  6. tr.odd:nth-child(6) {background: #FFF}
  7. tr.odd:nth-child(7) {background-color: transparent}
  8. tr.odd:nth-child(8) {background: #FFF}
  9. tr.odd:nth-child(9) {background-color: transparent}
  10. tr.odd:nth-child(10) {background: #FFF}
  11. tr.odd:nth-child(11) {background-color: transparent}
  12. tr.odd:nth-child(12) {background: #FFF}



P.S.

Jakby ktoś miał rozwiązanie w PHPie to również można podrzucić.
Sephirus
Panie autor przecież b4rt3kk podał Ci właśnie skróconą wersję smile.gif

Co do powielania rekordów to nie do końca kumam. Jakto one się powielają?
martinii007
W ten sposób nie działa:

  1. tr.odd:nth-child(even) {background-color: transparent}
  2. tr.odd:nth-child(odd) {background: #FFF}


Powielają się w następujący sposób:

Np. wiersz z id=1 wyświetla się na stronie 8 razy, następny również itd. zamiast pojedynczo wszystkie pokolei od id1 do 10, jeżeli chodzi o CSS to Klasa CSS jest dodawana prawidłowo i jest wyświetlone wszystko na przemian.
b4rt3kk
Cytat(martinii007 @ 2.04.2014, 11:25:16 ) *
No piękne rozwiązanie smile.gif

A można to jakoś skrócić?

Zrealizowałem to w taki sposób:

  1. tr.odd:nth-child(1) {background-color: transparent}
  2. tr.odd:nth-child(2) {background: #FFF}
  3. tr.odd:nth-child(3) {background-color: transparent}
  4. tr.odd:nth-child(4) {background: #FFF}
  5. tr.odd:nth-child(5) {background-color: transparent}
  6. tr.odd:nth-child(6) {background: #FFF}
  7. tr.odd:nth-child(7) {background-color: transparent}
  8. tr.odd:nth-child(8) {background: #FFF}
  9. tr.odd:nth-child(9) {background-color: transparent}
  10. tr.odd:nth-child(10) {background: #FFF}
  11. tr.odd:nth-child(11) {background-color: transparent}
  12. tr.odd:nth-child(12) {background: #FFF}



P.S.

Jakby ktoś miał rozwiązanie w PHPie to również można podrzucić.


Powinno działać, bo even i odd to w css słowa kluczowe, ale tutaj masz wersję z indeksem wiersza, to samo, tyle że inaczej zapisane.

  1. tr:nth-child(2n+1) {background-color: transparent}
  2. tr:nth-child(2n) {background: #FFF}


Poza tym nie zauważyłeś że masz pętlę w pętli? Wszystko wykonuje się tak na oko jakieś 88 razy, w zależności ile masz tam rekordów.

Powinno to wyglądać z grubsza tak:

  1. $menu = DatabaseManager::selectBySQL("SELECT * FROM Menu where id>=0 and id<=10"); //10 dań
  2. echo '<table>';
  3. foreach($menu as $pozycje_menu) {
  4. echo'<tr>
  5. <td>
  6. <span>'.$pozycje_menu['danie_1'].'</span>
  7. <p class="lang1">'.$pozycje_menu['opis_dania_1'].'</p>
  8. <p class="lang2">'.$pozycje_menu['opis_dania_2'].'</p>
  9. </td>
  10. <td class="price">'.$pozycje_menu['cena'].'</td>
  11. </tr>
  12. ';
  13. }
  14. echo '</table>';


I css jak wyżej.
trueblue
Wyrzuć tą pętle for w foreach, oprzyj tylko na jednej for. Odd i even oprzyj na zmiennej w tej pętli, a nie id pozycji menu.

  1. for($i=0;$i<count($menu);$i++){
  2. $odd=$i%2; //tu odd lub nie
  3. $menu[$i]['danie_1']; //w tej zmiennej będziesz mieć danie_1, analogicznie dla pozostałych
  4. }
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.