Lebkowski.info ,,Winning popularity contests since `85''

maciej lebkowski 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

poprzednia notka
Strona domowa od nowa
następna notka
Nowy layout "metra"
Adresy
niezmienny adres
komentarze

Notes - bardzo prosty CMS

15 lipca 2005

Wstęp

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.


Treść notki

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ę.

Komentarze

Masz coś ciekawego do dodania? Skontaktuj się ze mną prywatnie. Zerknij na metody kontaktu.

Strefa III Rzeczpospolitej – NIE dla Kaczystanu!