Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL][SMARTY]Forecah
Forum PHP.pl > Forum > Przedszkole
Stef@n
Witam,
Coś mi nie wychodzi z tym Smarty biggrin.gif. Kolejny dzień i kolejny problem. Wyświetlam z bazy MySql tabele kategorii gdzie jedna kategoria ma kilka podkategorii. Wszystko połączone "id". Problem polega na tym że pobieram dane z tabeli Kategorie i Podkategorie. Przesyłam dane do Smarty. W smarty Tworze pętle "foreach" by wyświetlał Kategorie a w tej pętli drugą pętle "foreach" z warunkiem "if" gdzie kategorie.id_kategorii == podkategorie.id_kategorii i wszystko było by git ale druga pętla przetwarza dane tylko raz. Więc wynik prawidłowy będzie tylko do kategorii która jest pierwsza wyświetlana.

Bardzo proszę o pomoc jak rozwiązać ten problem by druga pętla ładowała za każdym razem ponownie dane z podkategorii.

Tabela MySql wygląda tak:

  1. --
  2. -- Struktura tabeli dla `kategorie`
  3. --
  4.  
  5. CREATE TABLE `kategorie` (
  6. `id_kategorii` int(11) NOT NULL AUTO_INCREMENT,
  7. `nazwa_kategorii` varchar(40) NOT NULL DEFAULT '',
  8. PRIMARY KEY (`id_kategorii`)
  9. ) TYPE=MyISAM AUTO_INCREMENT=5 ;
  10.  
  11. --
  12. -- Zrzut danych tabeli `kategorie`
  13. --
  14.  
  15. INSERT INTO `kategorie` VALUES (1, 'Wiadomości');
  16. INSERT INTO `kategorie` VALUES (2, 'Rozrywka');
  17. INSERT INTO `kategorie` VALUES (3, 'Technologia');
  18. INSERT INTO `kategorie` VALUES (4, 'Różne');
  19.  
  20. -- --------------------------------------------------------
  21.  
  22. --
  23. -- Struktura tabeli dla `podkategorie`
  24. --
  25.  
  26. CREATE TABLE `podkategorie` (
  27. `id_podkategorii` int(11) NOT NULL AUTO_INCREMENT,
  28. `id_kategorii` int(11) NOT NULL DEFAULT '0',
  29. `nazwa_podkategorii` varchar(40) NOT NULL DEFAULT '',
  30. PRIMARY KEY (`id_podkategorii`,`id_kategorii`)
  31. ) TYPE=MyISAM AUTO_INCREMENT=13 ;
  32.  
  33. --
  34. -- Zrzut danych tabeli `podkategorie`
  35. --
  36.  
  37. INSERT INTO `podkategorie` VALUES (1, 1, 'Polityk');
  38. INSERT INTO `podkategorie` VALUES (2, 1, 'Sport');
  39. INSERT INTO `podkategorie` VALUES (3, 1, 'Pogoda');
  40. INSERT INTO `podkategorie` VALUES (4, 1, 'Kultura');
  41. INSERT INTO `podkategorie` VALUES (5, 2, 'Muzyka');
  42. INSERT INTO `podkategorie` VALUES (6, 2, 'Filmy');
  43. INSERT INTO `podkategorie` VALUES (7, 2, 'Książki');
  44. INSERT INTO `podkategorie` VALUES (8, 2, 'Imprezy');
  45. INSERT INTO `podkategorie` VALUES (9, 2, 'Motoryzacja');
  46. INSERT INTO `podkategorie` VALUES (10, 3, 'PC');
  47. INSERT INTO `podkategorie` VALUES (11, 3, 'GSM');
  48. INSERT INTO `podkategorie` VALUES (12, 4, 'Ciekawostki');


kod PHP
  1. <?php
  2. //Łaczy z baza
  3. $wyniki_k = mysql_query ("SELECT * FROM kategorie");
  4.  
  5. //Pobieranie danych 
  6. while ($rekord_k = mysql_fetch_array ($wyniki_k)) {
  7. $dane_k['id_kategorii'] = $rekord_k['id_kategorii']; // id kategorii
  8. $dane_k['nazwa_kategorii'] = $rekord_k['nazwa_kategorii']; //Nazwa Kategorii
  9. $dane_tablica_k[] = $dane_k;
  10. }
  11.  
  12. //Łaczenie z baza
  13. $wyniki_pk = mysql_query ("SELECT * FROM podkategorie");
  14.  
  15. //Pobieranie danych z bazy
  16. while ($rekord_pk = mysql_fetch_array ($wyniki_pk)) {
  17. $dane_pk['id_podkategorii'] = $rekord_pk['id_podkategorii']; // id podkategorii
  18. $dane_pk['id_kategorii'] = $rekord_pk['id_kategorii']; // id kategorii
  19. $dane_pk['nazwa_podkategorii'] = $rekord_pk['nazwa_podkategorii']; //Nazwa podategorii
  20. $dane_tablica_pk[] = $dane_pk;
  21. }
  22.  
  23. //Przekazywanie zmiennych do Smarty
  24. $smarty -> assign('dane_k', $dane_tablica_k); //Dane Kategorie
  25. $smarty -> assign('dane_pk', $dane_tablica_pk); //Dane Podkategorie
  26. ?>


kod TPL
  1. {foreach item=dane_k from=$dane_k}
  2. <div><b>{$dane_k.nazwa_kategorii}</b>:</div>
  3. {foreach item=dane_pk from=$dane_pk}
  4. {if $dane_pk.id_kategorii == $dane_k.id_kategorii}
  5. <div> - {$dane_pk.nazwa_podkategorii}</div>
  6. {/if}
  7. {/foreach}
  8. {/foreach}


Dziękuje z góy za każdą pomoc.
JoShiMa
A po co robisz foreach skoro masz tablice indeksowane normalnie a nie tablice asocjacyjne. Ja na Twoim miejscu od razu na poziomie php inaczej skonstruowałabym tablicę:

  1. <?php
  2. //Łaczy z baza
  3. $wyniki_k = mysql_query ("SELECT * FROM kategorie");
  4.  
  5. //Pobieranie danych 
  6. while ($rekord_k = mysql_fetch_array ($wyniki_k)) {
  7. $dane[$rekord_k['id_kategorii']]['nazwa'] = $rekord_k['nazwa_kategorii']; 
  8. }
  9.  
  10. //Łaczenie z baza
  11. $wyniki_pk = mysql_query ("SELECT * FROM podkategorie");
  12.  
  13. //Pobieranie danych z bazy
  14. while ($rekord_pk = mysql_fetch_array ($wyniki_pk)) {
  15. $dane[$rekord_k['id_kategorii']]['id_podkategorii'][] = $rekord_pk['id_podkategorii'];
  16. $dane[$rekord_k['id_kategorii']]['nazwa_podkategorii'][] = $rekord_pk['nazwa_podkategorii'];
  17. }
  18.  
  19. //Przekazywanie zmiennych do Smarty
  20. $smarty -> assign('dane', $dane);
  21. ?>

W ten sposób masz tablicę o kluczach równych id_kategorii. Każdemu kluczowi przypisana jest nazwa kategorii oraz tablice id_podkategorii i nazwa_podkategorii

Teraz Smarty:

  1. <ul>
  2. {foreach key=id+kategorii from=$dane item=kategoria}
  3. <li><b>{$kategoria.nazwa_kategorii}</b>:
  4. <ul>
  5. {section name=podkategoria loop=$kategoria.nazwa_podkategorii}
  6. <li>{$kategoria.nazwa_podkategorii[podkategoria]}</li>
  7. {/section}
  8. </ul>
  9. </li>
  10. {/foreach}
  11. <ul>


Zwróć uwagę na użyte przeze mnie znaczniki HTML. Jest to bardziej prawidłowa (zgodna ze standardem) forma niż Twoje divy.
Stef@n
OK popróbuje Twojego sposobu biggrin.gif... dzięki za odzew, problem rozwiązałem też innym sposobem dużo łatwiejszym taki mi się wydaje.

Cytat
form musi być różnie od item - inaczej wartość form zostanie po pierwszej interencji nadpisana.


No ale każdy uczy się na błędach.

P.S A co do div to dałem tak na szybkiego, bo całość i tak w tabelach wyświetlam biggrin.gif


Jeszcze raz dzięki i Pozdrawiam
JoShiMa
Cytat(Stef@n @ 7.07.2008, 13:09:56 ) *
P.S A co do div to dałem tak na szybkiego, bo całość i tak w tabelach wyświetlam biggrin.gif


Tabelki? Blech..... Naprawdę, do tego służą listy i zrób to porządnie...

A co do wartości from i item to faktycznie nie zwróciłam uwagi, ze mają takie same nazwy sad.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.