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