====== Laboratorium, TIiM, PHP, Projekt ====== ===== Formularze XHTML ===== Tematem ćwiczenia jest sporządzenie formularzy służących do zbudowania aplikacji obsługującej [[http://pl.wikipedia.org/wiki/Blog|Blog]]. Docelowa aplikacja korzystająca z tych formularzy będzie umożliwiać utworzenie wielu blogów. Potrzebne są następujące dokumenty XHTML zawierające formularze. 1. **[1p]** Formularz do założenia Blogu musi umożliwiać wprowadzenie: nazwy blogu, nazwy użytkownika, hasła użytkownika, opisu blogu (wiele linii tekstu). 2. **[2p]** Formularz umożliwiający dokonanie wpisu w blogu: nazwa użytkownika, hasło (niewidoczne przy wpisywaniu), wpis (wiele linii tekstu), data (pole tekstowe: RRRR-MM-DD, zawierające aktualną datę), godzina (pole tekstowe: GG:MM), trzy pliki do dołączenia do wpisu (każdy wpis może posiadać 3 załączniki). 3. **[2p]** Formularz umożliwiający dodanie komentarza do wpisu w blogu: rodzaj komentarza: pozytywny, negatywny, neutralny (lista wyboru), komentarz (wiele linii tekstu), imię/nazwisko/pseudonim komentującego (pole tekstowe). 4. Zaobserwuj jak przekazywane są wartości pól formularza jeżeli w/w formularze są typu GET, a jak jeżeli są typu POST? Do tego celu możesz wykorzystać rozszerzenie 'Live HTTP Headers'. 5. Czy można w pojedynczym polu formularza typu 'file' wskazać więcej niż jeden plik? Co mówi o tym standard XHTML 1.0? 6. **[1p]** Każdy formularz musi posiadać przycisk służący do usunięcia wprowadzonych danych, etykiety przycisków w języku dokumentu (np. jeżeli dokument jest po polsku przycisk musi nazywać się 'Wyczyść' etc.). ===== Przetwarzanie danych z formularza w PHP ===== Napisz, korzystając z PHP, aplikacje implementującą prosty Blog. Wpisy, jak i komentarze maja być przechowywane w plikach. Pliki te maja być umieszczone w katalogu o nazwie takiej jak nazwa Blogu. 1. **[1p]** Utwórz skrypt o nazwie ''nowy.php'' obsługujący zakładanie blogu. Dane wejściowe pochodzą z formularza do założenia Blogu. Skrypt musi: * **[2p]** utworzyć katalog o nazwie blogu (albo zwrócić stosowny komunikat w przypadku istnienia katalogu o tej nazwie; nie może istnieć więcej niż jeden blog o tej samej nazwie), * **[1p]** w w/w katalogu utworzyć plik o nazwie ''info'' w którym należy umieścić dane o właścicielu blogu: * **[1p]** nazwę użytkownika (zakończona znakiem końca linii), * **[2p]** hasło użytkownika (zakończone znakiem końca linii, zakodowane z użyciem funkcji skrótu ''md5()''), * **[1p]** opis blogu (wiele linii tekstu). **Uwaga:** zwróć uwagę na prawa dostępu do pliku/katalogu tworzonego z poziomu PHP, w zależności od konfiguracji serwera WWW może się tak zdarzyć, że nie będziesz ich właścicielem!!!. Jak rozwiązać ten problem? 2. **[1p]** Utwórz skrypt o nazwie ''wpis.php'' umożliwiający dodanie wpisu do blogu. Dane wejściowe pochodzą z formularza do dokonywania wpisu. Skrypt musi weryfikować: * **[1p]** nazwę użytkownika, * **[2p]** hasło (należy zakodować dane pochodzące z formularza za pomocą ''md5()'' oraz porównać wynik z zakodowanym hasłem przechowywanym w ''info''). **[1p]** **Uwaga:** nazwa blogu nie jest (nie może być) podawana przez użytkownika w formularzu ani przekazywana do aplikacji w żaden inny sposób! Rozwiąż ten problem! **[2p]** Skrypt ma tworzyć nowy plik (w katalogu Blogu) o nazwie: ''RRRRMMDDGGmmSSUU'' gdzie: R - rok, M - miesiąc, D - dzień, G - godzina, m - minuta, S - sekunda, U - unikalny numer (dla wpisów dokonanych o tym samym czasie). **Uwaga:** R,M,D,G,m pochodzą z formularza, wartość S należy obliczyć na podstawie aktualnego czasu serwera. **[2p]** Pliki wysłane przez formularz wpisu winny mieć nazwę: ''RRRRMMDDGGmmSSUUN.OOO'' gdzie N jest kolejnym numerem pliku dołączonym do wpisu, R, M, D, G, m, S, U są takie same jak dla wpisu, OOO jest oryginalnym literowym rozszerzeniem nazwy pliku (może być dłuższe/krótsze niż 3 litery: ogólnie, ciag znakow wystepujacy po ostatniej kropce w nazwie pliku). 3. **[1p]** Utwórz skrypt o nazwie ''koment.php'' umożliwiający dodanie komentarza do wpisu w blogu. **[2p]** Komentarze umieszczane są w katalogu o nazwie: RRRRMMDDGGmmSSUU.k (w razie potrzeby skrypt musi tworzyć katalog automatycznie) **[2p]** Komentarze umieszczane są w plikach w w/w katalogu o nazwach będących kolejnymi liczbami dziesiętnymi zaczynając od 0. **[2p]** Zawartość pliku to: * rodzaj komentarza (zakończony znakiem końca linii) * data i godzina wysłania komentarza (zakończony znakiem końca linii, format: RRRR-MM-DD, GG:MM:SS, data i czas serwera) * imię/nazwisko/pseudonim komentującego (zakończony znakiem końca linii) * treść komentarza 4. **[2p]** Utwórz skrypt o nazwie ''blog.php'', który będzie wyświetlał zawartość blogu o wskazanej nazwie (wraz z komentarzami oraz hiperpołączeniami do odpowiednich formularzy i załączników). **[1p]** Nazwa blogu do wyświetlenia przekazana musi być za pomocą metody GET oraz atrybutu nazwa np.: http://......./blog.php?nazwa=Traktor **[1p]** W przypadku nie istnienia blogu o wskazanej nazwie musi być wyświetlony stosowny komunikat. **[2p]** W przypadku nie podania wartości atrybutu nazwa należy wyświetlić listę wszystkich dostępnych blogów. Elementy listy muszą być hiperpołączeniami do odpowiednich blogów. 5. Ponadto: * **[2p]** Zmodyfikuj swój portal, tak aby menu umożliwiające nawigacje pomiędzy dokumentami portalu było przechowywane w osobnym pliku oraz inkludowane przez wszystkiego dokumenty. Do tego celu wykorzystaj PHP. * **[6p]** Zidentyfikuj w swoim kodzie sekcje krytyczne. Zapewnij odpowiednie mechanizmy kontroli dostępu do nich. **Uwaga:** przy tworzeniu plików/katalogów upewnij się, że nie powstaną problemy związane z wyścigiem :!:.