ďťż

[PHP] Wyświetlanie kategorii nested sets Gdy trzeba ukryć niektóre kategorie

       

Podstrony


telcocafe

Stosuję strukturę kategorii nested sets. Przykładowe drzewo:
Programy Freeware Pirackie Polskie Zagraniczne Shareware Filmy Akcji Historyczne
Struktura tabeli cats w bazie danych:
ID | name | parent_id | type | left | right
Przy wyświetlaniu wszystkich kategorii wszystko jest dobrze. Kod: http://pastebin.com/d1cb5723
Gdy trzeba ukryć niektóre kategorie, cała struktura chwieje się - piekło. Przykłady w praktyce:
    lFormularz do edycji artykułów -> trzeba wyświetlić do wyboru tylko kategorie o type ARTYKUŁY, czyli `type` = 5
    l
    lUżytkownik ma uprawnienia tylko do wybranych kategoriil
Rozwiązaniem może być dodatkowe pole depth, ale wolałbym uniknąć dodawania dodatkowego pola do struktury tabeli.

Zastanawiam się, czy nie przejść np. na materialized path lub inny schemat, bo chyba więcej problemów być nie może. W nested sets zmiana położenia kategorii w drzewie wiąże się ze skomplikowanymi zapytaniami lub przebudową całego drzewa (na szczęście ten problem już rozwiązałem).



To chcesz coś zmieniać, czy nie? ;) Bo struktury tabeli nie chcesz zmieniać, ale zastosować inne podejście już tak :P Ja w swoich serwisach mam niejawne "kategorie" z relacją na siebie samą - tabela zawiera artykuły, które mogą mieć typ kategorii i mogą należeć do innego wpisu - stosowane do generowania "bread crubs" ( strona główna > gui > pyqt > tworzenie interfejsu ).

Tworzysz ten cały CMS od niepamiętnych czasów i nadal nic nie opublikowałeś (release early, release often) i nawet nie wiesz czy kogoś będzie interesowała obsługa jakiś "wyszukanych" rozwiązań. Podejście "Dużo i od razu" nie jest zbyt dobrym rozwiązaniem, bo nie wiesz czy to rzeczywiście będzie dużo dobrych rozwiązań (a o tym nie decyduje autor kodu, a użytkownicy).

Problemem jest jednak błędne obliczanie głębokości kategorii w drzewie, jeżeli trzeba ukryć niektóre z nich. Czy ktoś wie, jak sobie z tym poradzić?

Opisałem problem szczegółowo tutaj wraz z kodem źródłowym: http://www.unit1.pl/pb-939

Aby zrozumieć problem: wyświetlamy tylko kategorie, do których użytkownik ma uprawnienia. Na przykład spośród: 1, 2, 3, 4, 5, 6, 7 może zarządzać tylko 2, 5 i 7. Nie wiadomo, jaki LEFT czy RIGHT ma 1, 3, 4 i 6, co utrudnia prawidłowe obliczenie głębokości. Może wystarczy tylko wnieść drobne poprawki do obecnego algorytmu? Czy nie obędzie się bez dodania pola `depth` lub pobierania wszystkich kategorii?

PS. Wersja alfa CMS już jest, ale występuje w niej ww. błąd.

Spoiler Zmian w strukturze dokonam, gdy będzie trzeba. Rozważam też przejście na materialized path. Nie wiem, co lepsze. Jeśli przejdę na materialized path (drzewka IP), pewnie wpakuję się w kolejne problemy, o których teraz nie wiem. Nic nie zastąpi hierarchicznej bazy danych, której brakuje w MySQL i SQLite.
Pobierać dane o wszystkich kategoriach i finalnie wyświetlać tylko te, do których są uprawnienia (a reszta może być np. nieklikalna na szaro obrazując całość na liście)? Albo też napisać funkcję rekurencyjną pobierającą (domyślnie) główne kategorie i dla każdej z nich pobiera podkategorie wywołując samą siebie i generując wynik zagnieżdżonych list ul/li?

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.