Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Drzewo kategorii - przeglądanie i prezentacja danych
Forum PHP.pl > Forum > PHP
Riggs
Witam.
Jednym z założeń uczelnianego projektu jest stworzenie hierarchicznej struktury kategorii (czyli po ludzku mówiąc drzewa winksmiley.jpg ). Czytałem o tym problemie na forum, jednak nie znalazłem odpowiedzi. Mam nadzieję że w tym temacie uda się to jakoś zebrać w całość i rozwiązać problem.
Mam z tym jednak kilka problemów.
Najpierw struktura tabeli:
  1. CREATE TABLE `categories` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(50) collate utf8_unicode_ci NOT NULL,
  4. `parent` int(11) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
  7.  
  8. INSERT INTO `categories` (`id`, `name`, `parent`) VALUES
  9. (0, 'root', 0);


Insert dodaje korzeń drzewa, tak żeby user przypadkowo nie zdefiniował wielu korzeni (root jest rodzicem dla wszystkich kategorii głównych).

Teraz problemy.
- wszytko wyświetlane jako listy.

Na stronie głównej w menu wyświetlam kategorie główne jako linki (np. tak jak w allegro.pl). Jest to proste.
  1. SELECT * FROM categories WHERE parent=0


Po kliknięciu w kategorię chciałbym, aby wyświetliły się jej dzieci, ale tylko poziom 1. Link oczywiście można zbudować tak
  1. <a href="?cat='id'>nazwa_podkategorii</a>
ale nie wiem jak to wyświetlić z widocznym rozróżnieniem na rodziców i potomków.
Dodatkowo przy kategorii chciałbym wyświetlić w nawiasach ile elementów zawiera kategoria i wszyscy jej potomkowie.
Mam rozwiązanie w rekurencji jednak przy dużym drzewie kategorii (raczej takie w projekcie nie powstanie ale lepiej się zabezpieczyć) gigantycznie rośnie liczba zapytań do bazy.

Jeśli nie da się jakoś ładnie zaprezentować takiego wyświetlania danych to proszę o jakieś nakierowania na inne sposoby.

Druga sprawa to dodawanie kategorii. Wiadomo, że każda kategoria musi mieć rodzica. Zrobiłem to jako pole <select> z opcjami jako rodzicem. Jednak zupełnie nie widać kto jest kogo rodzicem, kategorie wyglądają na równe sobie. Nie wiem jak to rozwiązać.

Ogólnie z mini-sondażu na uczelni wynika, że rozsądnym rozwiązaniem jest ograniczenie poziomów drzewa np do 4 poziomów. Co myślicie o takim rozwiązaniu?

PS. Nested sets w bazach danych nie wchodzi w tej chwili w grę - za słabo znam SQL i nie mam zbyt wiele czasu na zagłebienie się w niego.
.radex
Cytat
Druga sprawa to dodawanie kategorii. Wiadomo, że każda kategoria musi mieć rodzica. Zrobiłem to jako pole <select> z opcjami jako rodzicem. Jednak zupełnie nie widać kto jest kogo rodzicem, kategorie wyglądają na równe sobie. Nie wiem jak to rozwiązać.


Może tak:

Kod
root
| usr
|| bin
|| lib
| home
|| radex
||| Pulpit
| bin


?

Cytat
ale nie wiem jak to wyświetlić z widocznym rozróżnieniem na rodziców i potomków.


Po prostu w funkcji rekurencyjnej skanujesz katalogi w górę i w dół, albo od korzenia z podświetleniem obecnego.
Riggs
Skorzystałem z Materialized Path czyli Drzewa IP. Dość ciekawe rozwiązanie, łatwo się przegląda i działa bardzo szybko. Trudność to wysiłek przy implementacji, ale się opłaca.
Jak skończę projekt to wrzucę gotowca wraz z zestawem przydatnych funkcji.
Babcia@Stefa
Na PW Ci prześlę moją klasę (jest ona od pewnego mojego serwisu), ale zastrzegam sobię udostępniania jej.
Pozwala ona na tworzenie kategorii w nieskończoność, to znaczy możesz tworzyć kategorie, i subkategorie w nieskończoność.

Pozdrawiam, Babcia@Stefa
zwolu
Mam pytanie do metody The Nested Set Model, czy wszystkie kategorie trzymamy pomiędzy 1 i n, czyli tworzymy jedną kategorię mastera, w której tworzymy dopiero kategorię główne, czy tworzymy kategorie główne poprzez 1 kat lft 1 rgt 20 i kolejna lft 21 rgt 48 itd?
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.