Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tree (drzewko)
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
nospor
info + demo
pobierz


To znowu ja smile.gif

Przedstawiam Wam moją nową klasę Tree. Służy ona do zarządzania strukturą drzewiastą.

Krótka charakterystyka:

Z założenie klasa miała operować na dowolnych danych: baza, pliki xml, system plików, itd. By to osiągnąć wprowadziłem interfejs, który każdy kto chce używać klasy musi zaimplementować. Klasa wówczas nie interesuje się skąd pochodzą dane. Ją interesuje tylko by dostać to co chce. W umieszczonym przykładzie załączyłem implementacje operujące na bazie oraz na zserializowanej tablicy zapisanej w pliku.

Całość oparta jest na ajaxie. Znaczy to, iż klasa nie generuje kodu html drzewka. Zadaniem klasy jest zwracanie xml'a, który reprezentuje potrzebne dane. Drzewo budowane jest po stronie klienta po odebraniu niezbędnych danych. Drzewo nie jest budowane w całości, ale dobudowywane jest na żądanie, czyli np: rozwijamy gałaź X, wówczas leci żądanie do serwera (przy pomocy ajaxa oczywiście), które prosi o dzieci dla gałęzi X. Gdy te dzieci dostaniemy to są dobudowywane.

Drzewo dostarcza standardowe akcje: usuwanie, edycja, dodawanie, checkbox, akcja po kliknięciu na gałąź.
Każdy może sobie sam zdefiniować, jakich akcji chce używać. Można definiować akcje globalnie dla całego drzewa, ale można też dla każdej gałęzi definiować oddzielne akcje. Czyli np: mowimy, że dla całego drzewa będzie akcja usuwania, ale dla gałęzi X nie pozwalamy na tę akcję.
Akcja checkboc może być przydatna np. do określania praw dla danych gałęzi.
Miejsce występowania akcji, tzn. czy mają być przed nazwą węzła, czy też po, można samemu określać.

Wywołanie akcji polega na:
- wysłaniu żądania na serwer z daną akcją
- serwer robi co ma robić i zwraca informacje czy sie powiodło
- jesli akcja na serwerze się powiodła, dopiero wówczas następuje wizualizacja u klienta.

Jest możliwość zapamiętywania stanu drzewa w sesji, dzięki czemu bo odswierzeniu strony, otrzymamy drzewo rozwinięte tak jak było przed odswierzeniem.

Serwer może zwracać komunikaty tekstowe lub też błędy. Obie te rzeczy zostaną wyświetlone dla klienta. W przykładzie co pokazalem, podczas usuwania gałęzi z drugiego drzewa, generowany jest testowy błąd, by pokazac jak to wygląda.
Skrypt do zarządania komunikatami ogranicza się do wywolania funkcji napisanej przez uzytkownika. Nie chcialem tutaj nikomu wchodzic w jego wlasne sposoby wyswietlania. Oczywiscie dołączony jest moj przykladowy sposob zarządzania komunikatami.

No to chyba wszystko. Zapraszam do testowania, używania i zgłaszania uwag.

edit:
Zapomnialem o najwazniejszym - zastosowanie:
Klasa przyda sie do wyswietlania drzewek i duzych i malych, ale jej plusy najbardziej widać będzie na duzych drzewach, gdzie nie trzeba będzie generować od razu calej struktury, a tylko to co jest w danej chwili potrzebne.

edit2
No to dowalilem dodatkowy interfejs do zarządzania prawami oraz akcjami. Teraz jak ktoś chce może definiować prawa i akcje wewnątrz pierwszego interfejsu, ale może również robić to w interfejsie specjalnie do tego stworzonym. Zaletą tego drugiego jest to, iż możemy raz napisac sterownik do zarządzania danymi w drzewie i wykorzystywać go bez zmian w roznych projektach. A jesli projekty będą roznily sie prawami, to bedzie mozna je bez problemu ustawic w drugim sterowniku.
W zalączonym przykladzie, pierwsze drzewo dziala po staremu, drugie natomiast wykorzystuje już interfejs praw i akcji.
Dorobilem również tryb debugMode, ktory umożliwia podejrzenie zwroconych danych przez serwer w przypadku, gdy xml bedzie bledny.
Pojawila się rownież ikona czekania.

edit3:
Mozliwosc definiowania ikon folderow dla wybranych węzłów oraz klasy css. Akurat mi bylo to potrzebne to dorobilem smile.gif

edit4:
Z racji, ze w firmie uzywamy prototype do ajaxa, ustawilem przelacznik w drzewku, ktory mowi czy korzystac z advAjax czy prototype. Zmienie niewielkiej ulegl wiec Tree.js.
Na poczatku pliku jest zmienna ajaxLib, która trzeba odpowiednio ustawic by korzystac z danego liba.
Do drzewka dolaczony jest tylko advAjax 1.1. Pozatym na advAjax 2.0RC1 byly pewne problemy z rozpoznawaniem xml na FF.

edit:
Doszla mozliwość dodawania do każdego węzła dodatkowych parametrów, które będzie można odczytać później na stronie i wykorzystać do "niecnych" celów. U mnie w firmie drzewko jest dosc mocno eksploatowane i okazalo się, iż potrzeba takiego "bajeru" - to sie dorobilo winksmiley.jpg
Nowe zmiany w paczce 1.2
artur81
Hm, coś jest chyba nie tak,
Kodu nie analizowałem tylko zacząłem sobie klikać dodając nowe gałęzie do tego drzewka dolnego, które korzysta z bazy. Trzy razy zdażyło mi się że przy wpisywaniu nazwy nowej gałęzi wstawiło dwa razy taką samą. Czyli jednemu rodzicowi przypisało dwa dziecka, po jednym kliknięciu.
Usuwam jedno, dostaję komunikat "testower błędy, proszę nie wpadać w panikę" , próbuję usuwać drugie, nie usuwa się i dostaję komunikat że "Brak takiego węzła".
nospor
hmm, nie udalo mi sie osiągnac takiego efektu podwojnego dodania co mowisz. jeszcze popatrze pod tym kątem. co do:
Cytat
testower błędy, proszę nie wpadać w panikę
To juz pisalem w pierwszym poscie, ze przy usuwaniu jesli wszystko jest ok, to generuje taki komunikat, by pokazac jak wygladaja bledy smile.gif To tylko dla picu jest
artur81
hm, myślałem że coś poprawiłeś, bo już nie dodaje podwójnie blink.gif
co do błędów to wiem, że są to testowe, chodziło mi tylko o to, że jak utworzyły się dwa węzły z jednego
to przy pierwszym kasowaniu pokazywał się komunikat o tych testowych błędach (kasowało jeden węzeł) a przy drugim że nie ma węzła mimo że w gałęzi był.
Aha, nie jestem pod wpływem żadnych środków odurzających i widzę normalnie. tongue.gif
W każdym razie problem jakby zniknął.
nospor
udalo mi sie wychwycic problem. Wyglada jakby nie czekalo na to co mi zwroci jeden ajax, tylko leci juz do nastepnego. Dane dodają sie dobrze, ale wyswietlaja sie podwojnie. Popracuje nad tym bugiem.
A przy usuwaniu duplikatu walilo ci bledem, bo w bazie juz go nie bylo, bo usunales za pierwszym razem. A ze na liscie go jeszcze miales i probowales go usunac a juz go nie bylo to lecial blad.

edit: ja wiem ze ty wiesz o bledach. wyjasnialem tylko dla pewnosci winksmiley.jpg

Co do wystepowania bugu to juz wiem kiedy wystepuje. postaram sie to szybko poprawic.
artur81
IE 6.0, FF 1.5.0.7 i Opery 9.01. Błąd wyskoczył na Firefoksie.
Co do wyświetlania komunikatów o błędach to wiem że to o to chodziło, nie mam problemu ze zrozumieniem że jak czegoś nie ma w bazie to się tego nie da usunąć. tongue.gif
Pozdrawiam!

Na Operze też problem występuje.
Nie wiem czy to Ci się przyda, ale zauważyłem coś takiego że przy wstawianu gałęzi w pierwszej kolejności jest rysowany ten przycisk do zwijania i rozwijania a następnie wyświetlane są gałęzie. W przypadku gdy wyświetli się podówjny wpis, dane wyświetlają się jakby w innej kolejności. Tzn, najpierw pojawiają się dwie gałęzie a dopiero ten przycisk do zwiajania i rozwijania.

Edit: Ok, czekam z niecierpliwością, bo nieukrywam ale klasa by mi się przydała tongue.gif
hwao
jak klikniesz 2 razy to robi 2 requesty, tym samym potem sa dodane/pobrane podwojnie dane
nospor
@hwao ty to zgadujesz czy sprawdziles? Bo blad pojawia sie w innej sytuacji niz klikniecie dwukrotnie. Znaczy przy dwukrotnym (jak ci sie uda) to tez moze sie pojawic, ale to wina czego innego.
Bede mial chwilke to naniose poprawki. Wina jest w jednej funkcji js.

dane są dodawane dobrze - pojedynczo, a nie jak sugerujesz podwojnie. Tylko ze w pewnej sytuacji sie podwojnie wyswietlaja. ot co.

edit:
ok, bug poprawiony. Poprawki nanioslem tylko w pliku tree.js.
Poprawki umieszczone sa w starej paczce. Nie chcialem tworzyc nowego numerka tylko spowodu drobnych poprawek w js.

edit:
Poprawilem drobny błąd, ktory powodowal, iż mozna było wstrzyknąc kod html w nazwie węzła, nawet iż dalismy htmlspecialchars. Bylo to spowodowane zachowaniem xml'a, ktorego sie nie spodziewalem. No, ale czlowiek cale zycie sie uczy. winksmiley.jpg
Calosc w starej paczce. Jakos niechce mi sie teraz numerkow zmieniac.
bigZbig
@nospor - :O - co robią odwołania do tablicy REQUEST wewnątrz metod klasy Tree? Jak to się ma do ideii hermetyzacji? Klasy nie powinno obchodzić jakią metodą dane zostały dostarczone. Poza tym zapis
  1. <?php
  2. return isset($_REQUEST['tree_id']) ? $_REQUEST['tree_id'] : null;
  3. ?>

to masło maślane bo jest to równoznaczne z return $_REQUEST['tree_id'];

Tak samo z operacjami na zmiennych sesyjnych. Moim zdaniem powinno się to odbywać tak. W momencie utworzenia obiektu lub w wybranej chwili pobierasz jedną zmienną z sesji (zmienna ta to tablica zawierająca wszystkie właściwości obiektu przechowywane w sesji). Operujesz na tej zmiennej i jeśli dokonałeś jakichś zmian nadpisujesz tę zmienną w sesji. Powinieneś mieć możliwość nadania dowolnej nazwy tej zmiennej ponieważ stanowi ona jedynie rodzaj kontenera. Dzięki temu unikniesz konfiktów, które mogłyby wystąpić w przypadku gdyby dwie zupełnie różne klasy próbowały zapisywać coś w sesji w zmiennej o tej samej nazwie.

Klasa TreeImpl to moim zdaniem nieporozumienie bo w kodzie o charakterze uniwersalnym - typowym przykładzie DAO (Data Access Object) umieszczasz na sztywno skonkretyzowany tylko i wyłącznie dla danego przypadku kod:
  1. <?php
  2. $ar[$_key]['actions'] = array(
  3. 'onclick' => array('link'=>'http://www.interia.pl?$ID','disabled'=>$_key == 2),
  4. 'edit' => array('before' => true,'disabled'=>$_key == 2,'src'=>($_key == 2 ? './images/tree/emptyAction.gif' : false)),
  5. 'delete' => array('before' => true, 'disabled'=>($_key == 1 || $_key == 2 || $_key == 3 || $_key == 4)),
  6. 'checkbox' => array('before' => true, 'title' => 'Zaznacz mnie', 'checked'=>$_key == 2),
  7. );
  8. ?>

Przecież to powinno być ustawiane z "zewnątrz" i to w klasie Tree, a nie TreeImpl bo jest to funkcjonalność związana z widokiem a nie dostępem do danych (MVC).

I jeszcze uwaga dotycząca zastosowania. Piszesz, że nadaje się do dużych i małych drzew. Do małych ok, choć niekiedy bardziej się opłaca załadować całe drzewo i sterować nim jedynie za pomocą js (brak opóźnień, jedno zapytanie do DB lub odczyt pliku itp.). Do dużych bardziej, ale tylko o niewielkim stopniu zagłębień i dużej liczbie podelementów w danym elemencie. Mówiąć inaczej jeśli masz 20 leweli w głąb drzewa, a każdy z elementów zawiera zaledwie po kilka potomków to zabawa staje się średnio przyjemna i wydajna. Przydała by się w takim wypadku możliwość wczytywania całych gałęzi, ale to już zahacza o zbiory zagnieżdżone albo drzewa depesza.
nospor
A więc pokolei.

Cytat
to masło maślane bo jest to równoznaczne z return $_REQUEST['tree_id'];

No nie. Nie jest rownowazne. W przypadku gdy nie ma tree_id, to poleci notice przy Twoim wywolaniu. A ja nie lubie noticow. Pozatym uzywam REQUEST, bo mnie wali czy to z GETA czy z POSTA bedzie.

Cytat
Dzięki temu unikniesz konfiktów, które mogłyby wystąpić w przypadku gdyby dwie zupełnie różne klasy próbowały zapisywać coś w sesji w zmiennej o tej samej nazwie.
Poto dla drzewka sie nadaje ID, by bylo unikalne. Jak ktos oto nie zadba to juz nie moja wina.

Cytat
Klasa TreeImpl to moim zdaniem nieporozumienie bo w kodzie o charakterze uniwersalnym - typowym przykładzie DAO (Data Access Object) umieszczasz na sztywno skonkretyzowany tylko i wyłącznie dla danego przypadku kod:
Przecież to powinno być ustawiane z "zewnątrz" i to w klasie Tree, a nie TreeImpl bo jest to funkcjonalność związana z widokiem a nie dostępem do danych (MVC).

Widzisz, nie zalapales idei. TreeImpl to jest juz klasa pisana przez usera. Co on tam napisze to mnie malo obchodzi. Klasa ta ma implementowac interfejs, a jak go zaimplementuje to jej sprawa.
Co do kodu o ktorym napisales. Kod ten przypisuje akcje dla danego wezla. Oczywiscie akcje te mozna zdefiniowac globalnie. Czyli mowisz ze dla calego drzewa mozliwa jest edycja i usuwanie. ALe np. dla wezla nr.1 nie chcesz pozwolic na usuwanie. To sie wlasnie okresla juz w implementacji interfejsu. Takze Twoje "oskarzenia" sa bez podstawne. Poprostu nie zrozumiales idei funkcjonowania i zarządzania drzewem.

Cytat
Przydała by się w takim wypadku możliwość wczytywania całych gałęzi,
I to tez jest mozliwe. uzytkownik moze zwrocic mi cale drzewo na raz. Skrypt js to zinterpetuje i utworzy drzewo prawidlowo. NIe ma wiec problemu.

Jeszcze jakies pytania i uwagi? smile.gif


edit:
Przyklad zwracania calego drzewa jest w przypadku drugiego drzewa w moim demie. Stan drzewa jest pamietany w sesji. I jesli rozwiniesz cale drzewo i przeladujesz strone, to otrzymasz cale rozwiniete drzewo.
bigZbig
Ja rozumiem, że TreeImpl może pisać user, ale czy to nie może być zgodne ze wzorcem MVC? User moze sobie pisac jak chce i ja nie bede tego oceniał (chyba, że mnie o to poprosi), ale ty pisząc przykład powinieneś dać przykład i napisać dla pierwszego przypadku klasę TreeImpl (dającą dostęp do danych) oraz klasę dziedziczącą po Tree zmieniającą sposób generowania drzewa (dodającą lub usuwającą pewne opcje).

Poza tym skoro już napisałeś dwie klasy typu DAO to czy ich użycie jest zabronione przez użytkownika? Skoro już są i mają charakter uniwersalny to czemu ich nie użyć?

Co do REQUESTA to nie chodzi o to czy to zastępuje POST czy GET - tablica superglobalna nie powinna się w ogóle znaleść wewnątrz klasy. Bo czym się ona różni w tym kontekście od tablicy $_GLOBALS lub słowa global?
nospor
Cytat
ale ty pisząc przykład powinieneś dać przykład i napisać dla pierwszego przypadku klasę TreeImpl (dającą dostęp do danych) oraz klasę dziedziczącą po Tree zmieniającą sposób generowania drzewa (dodającą lub usuwającą pewne opcje).

Na chwile obecna mozna zrobic to o czym mowisz. Mozna odziedziczyc po Tree, napisac wlasna metode GenerateXML() ktora bedzie modyfikowala akcje dla danego wezla. Albo mozna dopisac inna funkcje ktora zmodyfikuje te akcje a GenerateXML zostawic w spokoju. Nie ma problemu.
Czemu ja tego nie zrobilem w swoim przykladzie? No coz, osobiscie nie uwazam tego za dobry pomysl. Nie jestem zwolennikiem walenia wszedzie pewnych wzorcow. Dla mnie wygodniej bylo to umiescic w implementacji interfejsu i juz smile.gif Ale jak pisalem mozliwosci na Twoj sposob są i jak ktos chce to moze tak zrobic. Co komu wygodniej.

Cytat
Poza tym skoro już napisałeś dwie klasy typu DAO to czy ich użycie jest zabronione przez użytkownika? Skoro już są i mają charakter uniwersalny to czemu ich nie użyć?
A można. Ale przyklady te pisalem na szybko, by tylko pokazac jak dzialają. Przyklad pierwszy trzymajacy dane w serializowanej tablicy to robota w 5 minut. Czy warta polecenia dla czyjejs aplikacji? No raczej nie. No chyba zeby pare modyfikacji zrobic.
Przyklad drugi oparty jest na takiej strukturze tabeli, od ktorej juz sie raczej odchodzi. Rodzica okresla sie tylko przez parenta, bez zadnych sciezek. Oczywiscie mozna to lekko dopracowac i bedzie git. Niedlugo to drzewko zostanie zaprzęgniete do naszej aplikacji, gdzie struktura tabeli jest inna.
W przykladach chodzilo mi tylko by pokazac jak uzywac klasy i jak pisac wlasne sterowniki. Zazwyczaj kazdy jakies wlasne struktury juz ma.

Cytat
Co do REQUESTA to nie chodzi o to czy to zastępuje POST czy GET - tablica superglobalna nie powinna się w ogóle znaleść wewnątrz klasy. Bo czym się ona różni w tym kontekście od tablicy $_GLOBALS lub słowa global?

Hmmm, byc może masz racje. Chcialem jednak by uzytkownik nie zawracal sobie glowy takimi pierdulami.
Spodobal mi sie jednak Twoj pomysl odnosnie kontenera zamiast sesji. Daje to potencjalnie wieksze mozliwosci, jak np. zapamietywanie stanu drzewa nie tylko na okres sesji. Byc moze to zaimplementuje niedlugo. A jak to bede ruszal to moze i do tych REQUESTOW sie dobiore

ps: jak zwykle mnie "zjechales" winksmiley.jpg. Oby częściej smile.gif

edit:
Cytat
Ja rozumiem, że TreeImpl może pisać user,
Wybacz, nie mialem zlych zamiarow, ale po Twojej ostatniej "wpadce" przy Cache, wolalem sie upewnic winksmiley.jpg

edit2:
Tak jeszcze troche pomyslalem nad tym co napisales i faktycznie, w kontekscie tego, by napisane przeze mnie sterowniki byly mozliwe do wykorzystania bez zadnych zmian, to nalezaloby zarządzanie akcjami przeniesc do klasy dziedziczącej po Tree, a sterowniki by tylko zarządzaly danymi. Tu sie z Tobą zgadzam w 100%.
A mozna by sie posunac jeszcze o krok dalej i napisac oddzielny interfejs do zarządzania akcjami.

edit3
No to dowalilem dodatkowy interfejs do zarządzania prawami oraz akcjami. Teraz jak ktoś chce może definiować prawa i akcje wewnątrz pierwszego interfejsu, ale może również robić to w interfejsie specjalnie do tego stworzonym. Zaletą tego drugiego jest to, iż możemy raz napisac sterownik do zarządzania danymi w drzewie i wykorzystywać go bez zmian w roznych projektach. A jesli projekty będą roznily sie prawami, to bedzie mozna je bez problemu ustawic w drugim sterowniku.
W zalączonym przykladzie, pierwsze drzewo dziala po staremu, drugie natomiast wykorzystuje już interfejs praw i akcji.
Dorobilem również tryb debugMode, ktory umożliwia podejrzenie zwroconych danych przez serwer w przypadku, gdy xml bedzie bledny.
Pojawila się rownież ikona czekania.
nowe zmiany w paczce 1.1

edit4:
Mozliwosc definiowania ikon folderow dla wybranych węzłów oraz klasy css. Akurat mi bylo to potrzebne to dorobilem smile.gif
(paczka 1.1)

edit5:
Z racji, ze w firmie uzywamy prototype do ajaxa, ustawilem przelacznik w drzewku, ktory mowi czy korzystac z advAjax czy prototype. Zmienie niewielkiej ulegl wiec Tree.js.
Na poczatku pliku jest zmienna ajaxLib, która trzeba odpowiednio ustawic by korzystac z danego liba.
Do drzewka dolaczony jest tylko advAjax 1.1. Pozatym na advAjax 2.0RC1 byly pewne problemy z rozpoznawaniem xml na FF.

edit6
Poprawilem drobne bledy, ktore powodowaly bledne dzialanie pod IE. Bledy wynikly podczas ostatniej zmiany, a zapomnialem przetescic pod IE i dopiero dzis przypadkiem na to luknalem.
NuLL
Jaka to ma licencje ?
nospor
Cytat
Jaka to ma licencje

Jak kazda moja klasa dostepna publicznie: LGPL
Informacja o tym jest w kazdej klasie

edit:
Doszla mozliwość dodawania do każdego węzła dodatkowych parametrów, które będzie można odczytać później na stronie i wykorzystać do "niecnych" celów. U mnie w firmie drzewko jest dosc mocno eksploatowane i okazalo się, iż potrzeba takiego "bajeru" - to sie dorobilo winksmiley.jpg
Nowe zmiany w paczce 1.2
kacka
@Nospor Twój przykład na stronie nie działa po podaniu w nim polskich literek.
Na localu rozwiązałem to zmieniając kodowanie na iso-8859-2.
nospor
a spojrz teraz smile.gif "strona główna" jak marzenie. Jak na moj gust masz cos nie tak z klawiaturą. Polskie znaczki uzywam caly czas i nie ma z tym problemu
Aztech
@Nospor: jesteś wielki, właśnie zaoszczędziłeś mi mnóstwo, ale to mnóstwo pracy
misiek172
ale zonk... ratujesz mi tym życie, bo pisze program do magazynowania, ale mam problem bo nie moge tego uruchomić ;P

mój conf: PHP4, MySQL 4

wywołałem w bazie to co było w pliku tree.sql, i nie moge uruchomić tego tree.php, wyskakuje mi błąd

Parse error: parse error, unexpected T_STRING, expecting '{' in C:\www\magazyn 2.0\tree\Tree.php on line 8

w tej linice jest:

class TreeImpl implements iTree{
nospor
Cytat
mój conf: PHP4, MySQL 4

Ta klasa jest pisana pod php5
misiek172
tak coś czułem ;P, ściągłem PHP5 teraz próbuje zaintalować ;P, podmienił mi conf i wszystko jeb... zepsuło się ;P ale sobie poradze biggrin.gif

edit: nie no jednak nie moge sobie poradzić... możecie mi jakiś link do arta zapodać jak do apache z php4 dodać php5 ...
nospor
Cytat
edit: nie no jednak nie moge sobie poradzić... możecie mi jakiś link do arta zapodać jak do apache z php4 dodać php5 ...

http://forum.php.pl/index.php?showtopic=19...;hl=php4+i+php5
http://forum.php.pl/index.php?showtopic=7802

ps: i prosze skonczyc juz z tym OT smile.gif
misiek172
od czego zależy kolejność w drzewku?
nospor
Cytat
od czego zależy kolejność w drzewku?

Kolejnosc wyswietlania dzieci w danym weźle? Tak jak zapodasz, w takiej kolejnosci zostanie wyswietlone. Czyli jak chcesz miec jakas stala kolejnosc to musisz ją sam okreslic, chocby poprzez order by w zapytaniu pobierającym dane do drzewka, tudziez cos innego jak danych nie masz w bazie
misiek172
no właśnie w cały świat segreguje tongue.gif bo dodałem i odświeżyłęm i inaczej wyświetłiło, więc sobie posegreguje, zapytanie sql jest w pliku treeclass?
nospor
Cytat
zapytanie sql jest w pliku treeclass?
Tree.class.php to klasa, ktora przetwarza dane dostarczone przez ciebie. Ona nie biega juz po bazie. po bazie masz biegac ty i zwrocic dla klasy niezbędne dane.
Aby to zrobic musisz zaimplementowac interfejs iTree.
Przyklad takiej implementacji znajduje sie w pliku Tree.php. Masz tam klase TreeImplSql, ktora zawiera przykladowe metody z zapytaniami do pobierania danych z tabeli stworzonej przezemnie na cele przykladu.

edit: akurat w tamtym przykladzie nie uzylem sortowania smile.gif
misiek172
ów drzewko nie rozpoznaje, czy dana pozycja to folder czy juz główny plik, np te co nie maja dzieci nie powinny byc folderami, czyli miec ikony folderu, a tutaj jeśli mam w czymś 6 NIE folderów to on na nazmiane ustawia czyli 1 to folder drugi nie i tak do końca. Zrobisz jakąś poprawke aby rozpoznawał, że jeśli nie ma dzieci to nie ma dawać ikonki folderu... ?
nospor
Cytat
np te co nie maja dzieci nie powinny byc folderami, czyli miec ikony folderu

Musze cie rozczarowac, ale nie koniecznie jesli cos nie ma dzieci, to nie moze byc folderem. Spojrz na system plikow u siebie na kompie. Nie masz pustych folderów tam?

Cytat
, a tutaj jeśli mam w czymś 6 NIE folderów to on na nazmiane ustawia czyli 1 to folder drugi nie i tak do końca.

a teraz czytamy to co juz napisalem wczesniej:
Cytat
Niektórym węzłom drzewka zmodyfikowano ikony. Zrobiłem to, by pokazać, iż jest taka możliwość.

I wszystko jasne.
W dolączym przykladzie co iles tam zmieniam ikone, by pokazac iz mozna samemu ustawiac ikony. I teraz jesli chcesz, by "katalogi" bez dzieci mialy inne ikony, to sobie ustaw. Wystatczy tylko ze przejrzysz zalączone przyklady

edit:
pozatym taka "szachownica" jest tylko wtedy gdy sam okreslasz ikonki. Zobacz na obrazki dolaczone do drzewka. jest tam :emptyFolder.gif. wyglada on identycznie jak folder, ale wyswietla sie gdy folder jest pusty i sami nic nie okreslilismy. podmien ten obrazek na swoj lisc i bedziesz mial to co chcesz
misiek172
Kombinuje i kombinuje i jeszcze raz kombinuje i nie moge znaleźć dokładnie miejsca, w którym można by było ustawić coś takiego, iż po kliknięciu kolor czcionki danego node zmienia się na czerwony (naprzykład)
krótko mówią chodzi mi o oznaczenie aktywnych linków smile.gif
nospor
Cytat
iż po kliknięciu kolor
W co kliknięcie? W plusik co rozwija węzeł? Czy moze kliknięcie w węzel, ktore to klikniecie robi jakac akcje js tudziez jest linkiem do czegos? Napisz dokladnie o czym mowisz
pc5
Witam,
Szukałem czegoś takiego i znalazłem smile.gif

Brakuje mi opcji przenoszenia stworzonych kategorii do innych kategorii. Nie mam pojęcia póki co jak zabrać się do napisania takiego dodatku do tej klasy, ale powoli nad tym pracuję smile.gif Marzy mi się - po kliknięciu edytuj wyskakuje warstwa z 2 opcjami, pierwsza zmiana nazwy, druga zmiana rodzica. Przenoszenie całych poddrzew kategorii - to jest to! Z resztą dam już sobie radę...

Druga sprawa (to już czysta kosmetyka), fajnie by było gdyby drzewo było jakoś 'rysowane' przez kropkowane linie. Mam nadzieję, że wiadomo o co chodzi, efekt graficzny spotykany często w 'drzewkach'. Odpowiednie ustawienie obrazka wchodzi w grę, jego wybór itd itp.

Może jakieś wskazówki jak się do tego zabrać? Zależy mi zwłaszcza na pierwszej opcji. Kodem, nawet skromnym, też nie pogardzę smile.gif

Pozdrawiam i dziękuję - KM
Zeman
Cytat(nospor @ 4.10.2006, 09:27:10 ) *
Jest możliwość zapamiętywania stanu drzewa w sesji, dzięki czemu bo odswierzeniu strony, otrzymamy drzewo rozwinięte tak jak było przed odswierzeniem.


Ogólnie bardzo fajnie się prezentuje.

Tak sobie poklikałem i mam małe pytanie:
Sytuacja: kliknąłem w [+], wgrały się AJAXem dzieci, a plus zamienił się na minus. Klikam ponownie, teraz już w minus, gałąź się chowa a minus zamienia na plus. Klikam jeszcze raz w plus, gałąź się rozwija, ale tym razem szybciej.
Teraz pytanie: Czy raz wgrane gałęzie są pamiętane w JS czy usuwane i dogrywane później AJAXem ponownie? Jeśli są pamiętane w JS to się nasuwa pytanie czy ich stan będzie pamiętany w sesji / cookies i po odświeżeniu strony się prawidłowo odtworzy?
nospor
Cytat
Sytuacja: kliknąłem w [+], wgrały się AJAXem dzieci, a plus zamienił się na minus. Klikam ponownie, teraz już w minus, gałąź się chowa a minus zamienia na plus. Klikam jeszcze raz w plus, gałąź się rozwija, ale tym razem szybciej.
Teraz pytanie: Czy raz wgrane gałęzie są pamiętane w JS czy usuwane i dogrywane później AJAXem ponownie? Jeśli są pamiętane w JS to się nasuwa pytanie czy ich stan będzie pamiętany w sesji / cookies i po odświeżeniu strony się prawidłowo odtworzy?

Gdy pierwszy raz klikasz plus, ajaxem dogrywane sa dzieci. Potem wciskasz minus i zwijasz gałąź. Zwiniecie polega na ustawieniu display none i juz. Ale zeby stan sesji byl pamietany, leci jeszcze ządanie ajaxem, ktore informuje klase, iż ta gałąź zostala zwinieta. Klikasz ponownie plus i znowu juz js ustawia display na widoczne, dlatego szybko sie rozwija, a ajaxem przesylane jest juz tylko info o tym ze rozwinieto tę gałąź.


Cytat
Brakuje mi opcji przenoszenia stworzonych kategorii do innych kategorii. Nie mam pojęcia póki co jak zabrać się do napisania takiego dodatku do tej klasy, ale powoli nad tym pracuję Marzy mi się - po kliknięciu edytuj wyskakuje warstwa z 2 opcjami, pierwsza zmiana nazwy, druga zmiana rodzica. Przenoszenie całych poddrzew kategorii - to jest to! Z resztą dam już sobie radę...
Bylem bliski zrobienia tego, jednak w pracy mi to wyperswadowali i teraz troche zaluje. Moim zamiarem bylo zrobienie tak, ze lapiesz gałąź i przesuwasz ja do innej do ktorej chcesz cos wrzucic. Fajnie by wyglądalo smile.gif
Ale teraz mozesz w miare latwy sposob dopisac zmiane rodzica. Nadpisujesz metode js, ktora wyskakuje po klikniecu edycji i dodajesz jeszcze inputa na rodzica. Potem wysylasz żądanie zmiany rodzica i sobie zmieniasz w php. Wiem, troche na okolo, ale daje sie to zrobic smile.gif

Cytat
Druga sprawa (to już czysta kosmetyka), fajnie by było gdyby drzewo było jakoś 'rysowane' przez kropkowane linie. Mam nadzieję, że wiadomo o co chodzi, efekt graficzny spotykany często w 'drzewkach'. Odpowiednie ustawienie obrazka wchodzi w grę, jego wybór itd itp.
Tez mialo byc, ale zabraklo mi najzwyklej w swiecie czasu. W wolnych chwilach zajalem sie dopracowaniem SHoutBoxa. Teraz czas najwyzszy zajac sie jeszcze drzewkiem, wiec w wolnych chwilach zajmę sie nim 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.