Z zamiłowania tworzę strony internetowe. Moje teksty mają na celu opisanie
niektórych fragmentów internetu, którego ta strona jest częścią.
Konserwatywny, pewny siebie, niekonwencjonalny - to wady czy zalety? Sprawdź!
maciej łebkowski
Wakacje, trochę wolnego czasu, można zając się hobby, czyli tworzeniem WWW. Ostatnio w pocie czoła odnawiałem stronę domową, a tym razem w moje ręce wpadł notes - system, dzięki któremu można mieć dużo notek, a jeden plik. Takie wygodnickie narzędzie.
Właściwie nie zacząłbym tego projektu gdyby nie inny, zwany potocznie piaskownicą, ale to coś większego, więc nie będę teraz o tym pisał.
Założenia notesu są proste. Lista notatek, podzielona jakoś, żeby nie wyświetlać całej na stronie, treść, jakieś wspomaganie nawigacji (następny/poprzedni) no i edycja. Znalazłem coś takiego w swojej piaskownicy (czyli składzie plików różnych), ale było brzydkie i aż krzyczało, że autorem był kiepski programista (w tej roli ja oczywiście). Korzystając z nowo powstałej delty stworzyłem sobie szybko szablon, wypełniony losowym tekstem, skopiowałem i włączyłem mój edytor PHP.
Tworzenie kodu do notesu przebiegało trochę inaczej, niż to miało miejsce w moich dotychczasowych projektach. Właściwie przeleciałem od góry (gdzie zawarłem cały silnik) do dołu, uzupełniając kod HTML o instrukcje PHP. Nie wracalem za bardzo do góry. To ciekawe, bo nigdy wcześniej mi się coś takiego nie udawało.
Do pracy musiałem mieć bazę danych. Opis korzytania z mySQLa pominę i napiszę od razu, że efekt był następujący:
CREATE TABLE `notes` (
`id` int(11) NOT NULL auto_increment,
`data` int(11) default NULL,
`haslo` varchar(50) default NULL,
`tytul` tinyblob NOT NULL,
`tresc` blob,
PRIMARY KEY (`id`)
)
Na początek powiem kilka słów o niceurlach. Polega to na takim budowaniu strony, żeby adres był łatwy do zapamiętania i przyjemny dla oka (więcej o ładnych linkach u porneLa). U mnie będzie to: notes/id_notki/numer_strony. notes.php jest nazwą pliku, która obsługuje cały system. Reszta (to, co po ukośniku) będzie dostępna w komórce PATH_INFO w tablicy $_SERVER. Ucięcie rozszerzenia pliku jest możliwe dzięki ustawieniom mojego serwera, ale o tym tez nie będę dzisiaj pisał. Kod pobierający zmienne:
list( $id, $page, $edit ) = explode( '/', trim( $_SERVER['PATH_INFO'], '/' ) );Jak widać, kolejne elementy w adresie to: identyfikator notki, numer strony (dotyczy listy notatek) i informacja o edytowanej stronie (do CMSa). Ja wiem, że mój sposób (czytaj: mieszanie CMSa z treścią) jest dziwny, ale dla mnie wygodny. Otóż, po zalogowaniu pokazuje się ukryty dotąd kawałek strony, który pozwala edytować dane z bazy. Idąc dalej, skoro na stronie jest formularz, to musi być i kod PHP. W tym miejscu należy sprawdzić, czy istnieją jakieś dane w $_POST. Jeśli coś tam jest, to należy rozpoznać, czy jest to kasowanie, edycja czy dodawanie nowej notatki i zależnie od tego wykonać odpowiednie zapytanie do bazy SQL. Na przykład
$rezultat = mysql_query( $akcja." notes set `tytul` = ‘$tytul’, `tresc`=’$tresc’,
`data` = ".time().", `haslo`= ‘$haslo’".$warunek );
Tu oczywiście dane pochodzą z formularza, a zmienna $akcja przyjmuje wartość "UPDATE" jeśli edytuję lub "INSERT INTO" gdy chodzi mi o dodanie nowej notatki. Zależnie od rezultatu ustawiana jest zmienna $notice, która zawiera komunikat dla użytkownika.
Tyle na temat CMSa po stronie serwera. Nie mam czasu ani umiejętności dydaktycznych aby dość dobrze wytłumaczyć i opisać jego działanie. Teraz trzeba zając się wczytaniem danych z bazy do tablicy $wszystkie. Może nie jest to najbardziej optymalne rozwiązanie, ale przy tej wielkości bazie nikomu nic się nie stanie. Z tych wszystkich elementów trzeba wybrać kilka, które będą się wyświetlały na liście. Przyjmijmy sobie, że będzie ich dziesięć. Jeśli zmienna $page (zczytywana z adresu, patrz wyżej) jest ustawiona to sprawa jest prosta: array_slice( $wszystkie, $page, 10 ). Jednak w moim notesie ta zmienna jest opcjonalna. Dlatego trzeba pobierać z tablicy po dziesięć wpisów do czasu, aż znajdzie się wśród nich element, który chcemy wyświetlić (o identyfikatorze $id). Załatwiamy to takim kodem:
while( !$zlapal and @pos( $wszystkie ) ){
$lista = array();
for( $ii=0; $ii<ILENOTEK; $ii++ ){
if( $p = each($wszystkie) ){
$lista[] = $p[1];
if ($p[1]['id'] == $id){
$zlapal = true;
$element = $p[1];
$idx = $p[0];
}
}
}
}
W każdym przebiegu instrukcji while czyszczona jest lista a następnie dodawane są do niej kolejne elementy, aż do zapełnienia dziesięciu pól. Przy okazji, jeśli ID elementu jest równe naszemu szukanemu ID zapisujemy jego pozycję w tablicy ($idx), a dane elementu zapisujemy w zmiennej $element.
Engine (silnik) jest w już z grubsza napisany, teraz trzeba go odpowiednio ubrać w kod HTML. Oczywiście sekcja HEAD, nie zapominając o uzupełnieniu tytułu, załadowanie stylu, kodowanie, itd. Wyświetlenie listy nie powinno sprawić problemów. Należy jedynie pamiętać, że adres ma być zbudowany: notes/id_notki.
Przy treści musimy pamiętać o tym, że niektóre notki mają hasło. Trzeba najpierw sprawdzić, czy hasło jest puste – jeśli nie, wstawiamy formę, w której będzie można je wpisać. Ja wysyłam przez GET, żeby nie mieszało się z danymi z CMSa.
Co do linków nawigacyjnych, to sprawa też swoją złożonością daleko nie sięga. Trzeba sprawdzić, czy istnieją elementy o indeksie ($idx) większym/mniejszym i ewentualnie wstawić linki do tych elementów.
Jeszcze kilka słów o formularzu. Ja wstawiłem go na stronie głównej. Kilka pól, o odpowiednich nazwach związanych z kolumnami w tabeli SQL. Ich wartości są albo puste (nowa notatka), albo wypełnione danymi z elementu edytowanego. Skąd go wziąć? Wysłać zapytanie do bazy o element z ID równym temu, jakie zostało podane w adresie (u mnie to zmienna $edit).
Taki kod, w pełni funkcjonujący i nawet kontrolujący nieco zachowania użytkownika powstał w dwie godziny. Do tego trzeba dodać pół godziny kręcenia się bez celu po pokoju (wymyślając jakieś rozwiązania) i trochę zakładki... trzy godziny i mamy małą aplikację webową. Nie jest to trudne. Trzeba jedynie trochę pomyśleć, zastanowić się, jak ma działać i zacząć kodować - a jak nie wyjdzie, to poprawiać. W końcu doświadczenie też tu ma swoją rolę.