Drzewka w PHP
1. Wprowadzenie
Artykuł zawiera prosty przepis jak zaimplementować drzewa w php.
2. Wstęp
Skrypt jest dość prosty, więc na pewno będzie wiele modyfikacji. Za które będę oczywiście wdzięczny. Bardzo ważną rzeczą jest fakt ze jest napisany strukturalnie a nie obiektowo. Nie wiem, czemu nie lubię obiektowego pisania, choć niewątpliwie ma wiele zalet. Przyczyna tego jest pewnie fakt ze wychowałem się na strukturalnych językach.
Z drzewkami spieram się już jakiś czas. A wczoraj po prostu usiadłem i napisałem wszystko od ręki.
3. Struktura bazy oraz podstawowe założenia
Do analizy wykorzystamy drzewko z artykułu rzSeattle o drzewkach.
0 0.SYSTEMY OPERACYJNE
/ \
1 1.LINUX 2.WINDOWS
/ \ / \
2. 3.SLACK 4.DEBIAN 5.NT 6.NO NT
/ \ / | \
3 7.WIN 2000 8.WIN XP 9.WIN 95 10.WIN 98 WIN ME
Podstawową rzeczą jest zastanowić się jak ma wyglądać baza danych.
Ja zrobiłem taka.
CREATE TABLE `foto_cat` (
`id` mediumint(100) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default ”,
`url` varchar(255) NOT NULL default ”,
`parent` varchar(10) NOT NULL default ”,
`user` varchar(100) NOT NULL default ”,
`data` datetime NOT NULL default ‘0000-00-00 00:00:00′,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
Wiadomo, co to jest id, name to nazwa katalogu. url to jest cala ścieżka od głównego katalogu. Parent to katalog nadrzędny. I na koniec data która dodaje z przyzwyczajenia a która może służyć do chociażby sortowania.
Trzeba przyjrzeć się dokładniej kolumnie url. Pierwsze katalogi maja wartość ‘0’
Format tej kolumny jest taki dla przykładu debiana będzie wyglądało tak:
0|1:LINUX a dla przykładu windowsa xp będzie cos takiego:
0|2:WINDOWS|5:NT
Czyli po pierwsze określa nie katalog docelowy tylko ten, w którym znajduje się katalog nas interesujący. I zawiera najpierw 0 potem id i nazwę katalogów. Oddzielanych ‘|’ a id i nazwę znakiem ‘:’. Mam nadzieje ze dosadnie wytłumaczyłem.
4. Przejdźmy do rzeczy.
Zacznijmy od wyświetlenia pierwszych folderów, są te wpisy w bazie które mają url=’0’ zatem zapytanie będzie proste.
4.1. Wyświetlanie wyników
$pytanie=mysql_query(„Select * from baza where url=’0’”);
Oczywiście wyniki można wyświetlić na wiele sposobów. Moim zdaniem taki jest dobry:
while ($q=mysql_fetch_array($pytanie)) {
$i++;
$content.=”
“;
}
Możemy to dać w ifie na przykład:
If(!isset($id) or $id==’’) {
..
}
Ok. zobaczmy, co się dzieje, do programu przekazany jest id katalogu który chcemy wyświetlić. Zatem to zróbmy do tego ifa dodajmy else a w nim:
$sql->query(“select * from baza where id=’$id’”);
$q=mysql_fetch_array();
$sql->query(“select * from baza where parent=’$id’”);
while ($q=$sql->fetchArray()) {
$content.=”
”;
}
A po nim jakieś zapytanie do innej bazy o elementy jakie są tam trzymane cos w stylu:
Select * from inna_baza where cat_id=’$id’
Do każdego whila można dodać rudne cuda i wodzidła ja dodałem ifa, który sprawdza czy aktualny gość jest adminem cos takiego:
If($_Session[‘admin’]==1) {
..
}
4.2 Usuwanie katalogów
A w nim na przykład opcje usunięcia katalogu przez zapytanie:
Delete from baza where id=’{$q[‘id’]}’ //oraz to:
Delete from baza where url like ‘%{$q[‘id’]}:{$q[‘name’]}%’
4.3 Dodawanie katalogów
Przed nim tez w ifie sprawdzającym jestestwo administratora opcje która umożliwią dodanie katalogu do aktualnego na przykład w taki sposób:
if ($run==’ok’) {
//tutaj sprawdza jednoczesnie czy dodajemy katalog I rzędu
if ($y>0) {//jak widac korzystam z klasy do mysqla, swietna sprawa.
//nie będę tego zmienial mysle ze każdy wie co tam wstawic.
$sql->query(“select * from foto_cat where id=’$y’”);
$q=$sql->fetchArray();
$urll=$q['url'].”|{$q['id']}:{$q['name']}”;
$sql->query(“insert into foto_cat (name, url, parent, user, data) values
(‘$FolderName’,'$urll’,'{$q['id']}’,’{$_SESSION['uid']}’,'”.date(“YmdHis”).”‘)”);
//a jeśli nie to za url dajemy 0
} else {
$sql->query(“insert into foto_cat (name, url, user, data) values
(‘$FolderName’,'0′,’{$_SESSION['uid']}’,'”.date(“YmdHis”).”‘)”);
}
} else {
//a tu formularz x_O
Echo “
<form action=”$PHP_SELF?id=$id&mode=dodaj” method=”post”>
<table border=”0″> <tbody> <tr> <td><input name=”FolderName” type=”text” /></td> </tr> <tr> <td><input name=”run” type=”submit” value=”ok” /></td> </tr> </tbody> <tbody></tbody> </table></form>“;
4.4 Nawigacja
Wstawmy na górze linijkę, która będzie nam mówiła gdzie aktualnie znajdujemy się możemy to zrobić tak:
If($id>0) {
$sql->query(“select * from baza where id=’$id’”);
$q=$sql->fetchArray();
$ur=explode(‘|’, $q['url']);
$navigator=”<a href=$PHP_SELF>Glowny</a>”;
for ($k=0;$k
$urr=explode(‘:’, $ur[$k]);
$navigator.=”<a href=$PHP_SELF?id={$urr[1]}>{$urr[1]}</a>“;
}
$navigator.=”<a href=$PHP_SELF?id={$q['name']}>{$q['name']}</a>”;
} else {
$navigator=”<a href=$PHP_SELF>Glowny</a>“;}
4.5 Podsumowanie
Oczywiście kombinować można z tym długo. Ja używam tego na stronie do galerii zdjęć, downloadu i artykułów, ale nie ma przeszkód żeby oprzeć na tym cala witrynę. Jest tylko jedno ograniczenie: wielkość wartości kolumny url oczywiście można jej zmienić tym na text ;-D
Ja posunąłem się na razie do tego, że każdy folder ma właściciela a on może z nim robić, co chce np. zabezpieczać hasłami bądź ukrywać, zmieniać szatę graficzna panującą w folderze itp… Jeśli macie jakieś sugestie lub propozycje zmian lub ulepszeń to śmiało piszczcie na adres jimmy0699@gmail.com
Comments
No comments yet, be the first to add one!