Prado - Kolos
Transkrypt
Prado - Kolos
Technika Prado PHP Framework W artykule zajmiemy się frameworkiem dla języka PHP o nazwie PRADO (ang. PHP Rapid Application Development Object-oriented). Podobnie jak w opisywanym wcześniej PHP 4 Applications, tak i w tym przypadku, pisanie stron i aplikacji ułatwione jest dzięki dużej liczbie gotowych komponentów oraz obsłudze zdarzeń. Dowiesz się... Powinieneś wiedzieć... • Poznasz zasady tworzenia stron z użyciem frameworka PRADO. • Dowiesz się, jak stworzyć prostą aplikację księgę gości. • Powinieneś znać podstawy PHP oraz programowania obiektowego. Plik home.php – plik z implementacją klasy Home , w nim znajdzie się kod odpowiedzialny za obsługę kliknięcia przycisku (funkcja buttonClicked ). class Home extends TPage { public function buttonClicked( Poziom trudności J ednak w przeciwieństwie do P4A, PRADO oferuje znacznie szerszy zestaw komponentów oraz, co ważniejsze, obsługę szablonów. Dzięki szablonom mamy w zasadzie pełną kontrolę nad generowaną stroną, w pliku możemy np. przeplatać kod HTML z komponentami PRADO. Szablon, komponenty i obsługa zdarzeń, czyli HelloWorld Dzięki plikowi szablonu (rozszerzenie takiego pliku to .page), możemy łatwo wstawiać komponenty w określone miejsca kodu HTML. Kod wygląda niezwykle podobnie do zwykłego tagu XHTML, czyli dość schematycznie <com:TypKomponentu parametr1= ”wartosc1” parametr2=”wartosc2” /> Przykładowo, aby utworzyć przycisk należy napisać <com:TButton Text=”Przycisk 1” /> . Obsługa kliknięcia wymaga stworzenia skryptu php, który będzie „reagował” na różne zdarzenia występujące na danej stronie, np. na kliknięcie. Dlatego, aby poznać działanie PRADO napiszemy najprostszy możliwy przykład – przycisk z obsługą kliknięcia. Nasza pierwsza aplikacja będzie składała się z trzech plików – index.php, Home.page i Ho24 me.php. Dwa ostatnie pliki muszą znaleźć się w katalogu \protected\pages (Rysunek 1.). Musimy pamiętać, że katalogi assets (do niego trafiają zasoby udostępniane użytkownikowi przez komponenty np. obrazki, arkusze styli CSS itp.) oraz \protected\runtime (w nim zapisywane są tymczasowo dane dotyczące aplikacji, np. stan aplikacji i komponentów) muszą być dostępne do zapisu dla serwera (muszą mieć nadane odpowiednie prawa). Plik index.php jest jedynym plikiem dostępnym bezpośrednio dla użytkownika strony. Plik ten składa się przynajmniej z trzech linii, zawierających odpowiednie polecenia, czyli: komendy dołączenia biblioteki PRADO, stworzenia nowej instancji aplikacji i jej uruchomienia. $sender,$param) {//funkcja ta zostanie wywołana po kliknięciu przycisku $sender-> Text="Kliknąłeś przycisk "; //ustaw nową wartość Text, czyli etykiety przycisku //dołączenie biblioteki W wersji PRADO 3.1.0 (w chwili pisania artykułu jest to jeszcze wersja alpha) autorzy wprowadzili bibliotekę ActiveControls, która zawiera zamienniki większości podstawowych, występujących w PRADO, elementów, jedyna różnica polega na tym, że do ich obsługi używana jest technologia AJAX, zamiast przeładowywania całej strony. Wystarczy, że w pliku szablonu zamiast TButton napiszemy TActiveButton oraz w pliku z implementacją klasy Home dodamy linię Prado::using ('System. Web.UI.ActiveControls.*');, która jest odpowiedzialna za załadowanie biblioteki ActiveControls. //nowa instancja aplikacji Księga Gości require_once('sciezka/do/prado.php'); $application=new Tapplication; $application->run(); //uruchomienie aplikacji Plik home.page – to szablon dla strony głównej aplikacji. W naszej aplikacji, w sekcji BODY kodu HTML napiszemy następujące trzy linie (odpowiedzialne za stworzenie formularza i przycisku): <com:TForm> <com:TButton Text= "Kliknij tutaj" OnClick="buttonClicked" /> Napiszemy teraz niezwykle prostą księgę gości, używającą technologii AJAX do przesyła- Instalacja PRADO Instalacja PRADO sprowadza się do pobrania spod adresu http://www.pradosoft.com/ download/ odpowiedniej wersji frameworku (prezentowane w artykule skrypty testowane były na wersji 3.1.0a.r1626) oraz rozpakowaniu plików do katalogu dostępnego z sieci. Do poprawnej pracy PRADO wymagany jest interpreter języka PHP w wersji 5.1.0 lub wyższej. </com:TForm> 04/2007 Prado nia danych oraz pliku XML do przechowywania wpisów. Zacznijmy od stworzenia struktury katalogów i plików (będzie identyczna jak w przypadku HelloWorld, z tą różnicą, że mamy podkatalog App_Code w katalogu protected). Szablon Rysunek 1. Struktura katalogów dla pierwszej aplikacji Najpierw musimy stworzyć plik szablonu – będzie to standardowy plik HTML. W jego treści stworzymy sekcję div, w której wyświetlane będą wpisy. <com:TActiveTextBox id="nick" /> <com:TActiveTextBox TextMode= "MultiLine" id="message" /> <div id="messages"> <com:TActiveButton Text="Dodaj wpis" id= Ładowanie ... "addEntry" OnClick="addEntry" /> <com:TPlaceHolder ID= W drugim z komponentów TActiveTextBox ustawiliśmy parametr TextMode=”MultiLine” dzięki czemu zezwala on na wpisanie wielu linii tekstu (zamiast jednej). W przykładzie dołączonym do płyty poszczególne komponenty zostały rozmieszczone w komórkach tabeli. Ze względu na czytelność przykładu, nie zamieściłem tu pełnego kodu, a jedynie szkielet aplikacji. Mamy już możliwość dodawania wpisu, przydałoby się jeszcze odświeżać wpisy co jakiś czas np. co 15 sekund. W tym celu dodamy jeszcze jeden komponent – TimeTriggeredCallback. Już sama jego nazwa sugeruje do czego służy. Komponent ten co podaną ilość czasu wywołuje podaną funkcję (oczywiście używając technologii AJAX). Atrybuty, których użyjemy to Interval – odstępy czasu między kolejnymi wywołaniami funkcji, oraz OnCallback – nazwa funkcji z klasy Home do wywołania. Dodatkowo, atrybut StartTimerOnLoad ustawimy na true, dzięki czemu odliczanie "messageList" /> </div> W przykładzie zamieszczonym na płycie CD, w treści dokumentu znajduje się arkusz stylów, którego ze względu na rozmiar nie będę tutaj prezentował. Skoro gotowe jest już miejsce, w którym wpisy będą wyświetlane, musimy dać możliwość dodawania wpisów. W tym celu utworzymy kolejną sekcję div, tym razem jej id to newEntryBox. Wewnątrz utworzymy komponent TForm (<com:TForm> ... </com:TForm>) - to właśnie ten formularz będzie odpowiedzialny za przesłanie wpisu użytkownika do księgi. Wewnątrz sekcji utworzymy również trzy komponenty – dwa typu TActiveTextBox (nick i message) oraz jeden typu TActiveButton. Pierwsze z nich będą służyły do wpisania nicka i wiadomości (treści wpisu), zaś trzeci, przycisk, będzie służył do ich wysłania. Kod powinien wyglądać tak: R E K L A M Rysunek 2. Efekt końcowy naszych prac czasu zacznie się zaraz po załadowaniu strony. Ostateczny kod powinien wyglądać mniej więcej tak: <com:TTimeTriggeredCallback OnCallback= "refresh" Interval="15" "true" />. StartTimerOnLoad= Klasa Home Tradycyjnie, musimy stworzyć klasę Home (dziedziczącą po TPage), w której znajdzie się obsługa kliknięcia przycisku oraz funkcja odświeżająca listę wpisów. Funkcja dodająca wpis (o nazwie AddEntry) jest dosyć prosta. Tworzymy w niej obiekt klasy GuestBook (klasę tę niedługo zaimplementujemy, będzie ona odpowiedzialna za obsługę pliku XML zawierającego wpisy), wywołujemy funkcję dodającą wpis, ukrywamy obiekty służące do dodawania wpisów oraz odświeżamyna A Technika stronie. Treść funkcji addEntry($sender,$param) przedstawia się więc następująco: $entry = new GuestBook (); $entry->AddMessage ($this->message->Text, $this->nick->Text); $this->Page->CallbackClient-> puff("newEntryBox", ""); $this->refresh("", ""); //wywołujemy z pustymi parametrami Musimy jeszcze zaimplementować funkcję refresh . Wewnątrz niej utworzymy obiekt GuestBook, wywołamy metodę GetMessages, a następnie w pętli odczytamy i zaprezentujemy dane dotyczące każdego wpisu. Za chwilę zaimplementujemy klasę GuestBook (znajdzie się ona w pliku \protected\ App_Code\GuestBook.php), aby tego dokonać musimy poinformować PRADO, żeby dołączył ten plik do aplikacji. W tym celu wywołamy polecenie Prado:using('Application.App_Code.*'); Linię tę musimy umieścić na samym początku Home.php. Jak widać, jako podmoduł modułu Application podajemy nazwę katalogu. użycia obu tych klas nauczymy się na przykładzie, czyli pisząc klasę GuestBook. Na początku, w pliku \protected\App_ Code\GuestBook.php definiujemy nazwę pliku XML, w którym przechowywane będą wpisy (musimy pamiętać, aby nadać uprawnienia pozwalające na zapis do tego pliku), w naszym przykładzie będzie to DEFINE( "StorageFile", dirname(__FILE__) . "./../entries.xml" ); Tak więc plik entires.xml znajdzie się w katalogu \protected . Nasza klasa GuestBook będzie posiadać jedną zmienną - $doc, do której przypiszemy obiekt TXMLDocument. Jego utworzeniem zajmiemy się w konstruktorze klasy, tutaj też załadujemy zawartość entries.xml (pod warunkiem, że plik istnieje): $this->doc = new TxmlDocument ('1.0', 'utf-8'); if (file_exists(StorageFile)) //jeśli plik istnieje, załaduj dokument $this->doc->loadFromFile( StorageFile ); $this->doc->TagName = "guestbook"; // nazwa głównego elementu (root) dokumentu Obsługa XML w PRADO PRADO umożliwia nam niezwykle prostą obsługę plików XML, a wszystko za sprawą TXMLDocument i TXMLElement. Techniki Kolejnym zdaniem będzie funkcja dodająca wpis – w niej też nauczymy się, jak tworzyć element, ustawiać jego atrybuty i wartość: Listing 1. Metoda refresh klasy Home public function refresh($sender, $param) { $entry = new GuestBook (); // pobierz wpisy $msgs = $entry->GetMessages(); $code = ""; if (!empty($msgs)){ //w pętli odczytuj po jednej wiadomości for ($i = 0; $i < $msgs->Count; $i++){ // formatuj wiadomości (generowanie kodu XHTML) $code .= "<b>".$msgs[$i]-> getAttribute('nick'). "</b><br />\n"; } $code .= "<span class=\"msg\">".$msgs[$i]->getValue()."</span><hr /><br />"; } $elem = new TxmlElement(array()); //utwórz element $elem->TagName = "entry"; // nazwij go "entry" $elem->setAttribute("nick", $nick); // dodaj atrybut o nazwie nick i zawartości nicka podanego przez użytkownika $elem->setValue($message); //w wartości elementu ustaw wiadomość Teraz pozostało nam już tylko dodanie nowego elementu do dokumentu XML oraz zapis dokumentu do pliku: $this->doc->elements-> add ( $elem ); //dodaj element $this->doc->saveToFile ( StorageFile ); //zapisz plik Ostatnią wymaganą operacją jest napisanie funkcji pobierającej z dokumentu wszystkie elementy o nazwie entry: function GetMessages() { //zwraca liste elementow jako TList return } $this->doc-> getElementsByTagName("entry"); Nasza księga gości jest już gotowa do użycia! Podsumowanie Nauczyliśmy się, jak wygląda szkielet aplikacji używającej PRADO, jak tworzyć szablony, reagować na zdarzenia z umieszczonych komponentów, wreszcie, jak stworzyć aplikację używającą AJAX nie pisząc ani jednej linii kodu w języku JavaScript. Osoby znające nieco narzędzia do tworzenia aplikacji dla Windows (takie jak Borland® Delphi® czy Microsoft VisualStudio .NET) na pewno zauważyły, że duża część pomysłów zrealizowanych w PRADO jest „zapożyczona” z bibliotek dla Microsoft Windows, co wielu programistom ułatwa życie. Warta uwagi jest dokumentacja, dostępna pod adresem http://www.pradosoft.com/docs/ manual/. Zawiera ona bogaty opis klas i ich metod. Godne uwagi są również przykłady dołączone do PRADO, m.in. blog napisany w oparciu o SQLite. Księga gości stworzona w tym artykule nie wyróżnia się w żaden sposób od innych skryptów, jednak była doskonałym wprowadzeniem do funkcjonalności PRADO. // prześlij zawartość do <div id = "messages" > $this->Page->CallbackClient->update("messages", $code); } 26 MICHAŁ GAJEK Autor jest programistą – amatorem, od kilku lat piszącym również w języku PHP. Kontakt z autorem: [email protected] 04/2007