Professional Documents
Culture Documents
POCZĄTKI
Otwarty format OASIS dla
dokumentów biurowych i CMS-ów 16
Nie odkrywajmy Ameryki na nowo!
Z nam wielu programistów PHP, którzy piszą swoje apli- Bård Farstad
kacje bazując wyłącznie na własnych rozwiązaniach Wklejanie czystego tekstu do CMS-a i jego ręczne
– rozwijają frameworki, tworzą proste narzędzia do debu- formatowanie jest zadaniem żmudnym i podatnym
gowania, czy próbują sami walczyć z niedopasowaniem na błędy. Gdyby tak można było stworzyć odpo-
relacyjno-obiektowym (narzędzia ORM) w aplikacjach bazo- wiedni dokument w swoim ulubionym pakiecie biu-
danowych. Za nic nie określiłbym ich mianem domorosłych rowym, a potem po prostu skopiować plik i wkleić
programistów webowych – to deweloperzy z kilkuletnim go do CMS-a... Taką właśnie możliwość daje połą-
czenie trzech nowatorskich produktów: uniwersal-
doświadczeniem, którzy PRAWIE profesjonalnie tworzą CRM-y czy dedyko-
nego formatu OpenDocument, CMS-a eZ publish
wane CMS-y. Kiedy opowiadają mi o swoich problemach (programistycznych),
i pakietu biurowego OpenOffice.org 2.0.
rozwiązaniach i pomysłach, przyznaję – ich twórczość i innowacyjność robi na
mnie wrażenie. Z reguły jednak odpowiadam im następująco: słuchaj, przecież
pisaliśmy już o tym w PHP Solutions.
Ich praca jest często mało wydajna, gdyż sami odkrywają i implementują NARZĘDZIA
rzeczy już wcześniej wymyślone i zbudowane. Dzieje się tak dlatego, gdyż Programowanie sterowane
są nieufni i nieświadomi wielu pożytecznych i istniejących już rozwiązań. testami za pomocą PHPUnit 22
Z tego powodu użyłem sformułowania PRAWIE profesjonalnie.
Aby tę tendencję odwrócić, regularnie oddajemy w Wasze ręce magazyn Timo Haberkern
PHP Solutions. Projekty i technologie, które opisujemy w obecnym numerze, Im większy projekt programistyczny, tym trudniej
na pewno pomogą Wam w codziennej pracy. wyłapywać pojawiające się w nim błędy, a usunię-
Szczególnie zachęcamy do budowania aplikacji w oparciu o technologię cie jednych usterek powoduje często powstanie
AJAX, która – dzięki wykorzystaniu JavaScriptu i XML-a – pozwala na two- następnych, w innej części aplikacji. Ręczne
rzenie wydajnych i wyjątkowo interaktywnych aplikacji WWW. Zastosowanie tworzenie testów dla setek klas jest nieskuteczne,
AJAX uwolni użytkownika od irytującego klikania i zbędnego oczekiwania a poza tym przyprawia o ból głowy i paraliżuje
pracę. Z pomocą przychodzi PHPUnit: narzędzie
– teraz dane mogą być przekazywane bez przeładowywania strony.
pozwalające zautomatyzować proces tworzenia
Gorąco polecam też artykuł o narzędziu PHPUnit (odpowiednik Junit dla
i wdrażania testów.
Javy) służącym do testowania modułów aplikacji. Dzięki niemu zbudujecie
stabilny i pozbawiony błędów kod w dużo krótszym czasie.
W numerze weźmiemy również pod lupę kilka absolutnych nowości, Drupal, czyli wielodomenowe,
m.in. PHP-GTK2, które oferuje rewolucyjne możliwości budowania aplikacji wielojęzyczne i modularne portale
okienkowych. SDO to kolejne rozwiązanie ze świata Javy przeniesione do w oparciu o AJAX i SEO 30
PHP przez IBM i Zend Technologies, które zapewniając jednolity dostęp do Uwe Hermann
różnego typu danych (bazy danych, XML). Drupal to rewolucyjny CMS po- Czy potrzebujesz systemu zarządzania treścią
zwalający na tworzenie wielodomenowych, wielojęzycznych i modularnych (CMS) ogólnego zastosowania, będącego w stanie
portali z wykorzystaniem takich technologii, jak AJAX. obsługiwać w jednej instancji kilka niezależnych
Zapraszam do lektury kolejnego numeru PHP Solutions. Satysfakcja serwisów WWW, z których każdy dostępny ma być
gwarantowana! w kilku wersjach językowych? Czy pełna internacjo-
Dariusz Pawłowski nalizacja powinna być możliwa za pomocą zaledwie
Redaktor prowadzący kilku kliknięć myszą? Może chciałbyś także dodać
do swojego serwisu elementy dynamiczne korzy-
stające z AJAX, albo zwiększyć jego popularność
dzięki zastosowaniu najlepszych technik SEO? Nie
musisz dalej szukać: wypróbuj system Drupal.
Nasz magazyn ukazuje się w czterech językach!
VARIA Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit firmy G DATA Software Sp. z o.o.
Porównanie ofert polskich firm Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu nośnikach informacje
i programy były poprawne, jednakże nie bierze odpowiedzialności za efekty wykorzystania ich; nie gwarantuje
hostingowych 74 także poprawnego działania programów shareware, freeware i public domain.
Uszkodzone podczas wysyłki płyty wymienia redakcja.
Paweł Grzesiak Wszystkie znaki firmowe zawarte w piśmie są własnością odpowiednich firm
i zostały użyte wyłącznie w celach informacyjnych.
Rynek usług hostingowych w Polsce rozwija się
Redakcja używa systemu automatycznego składu
dynamicznie. Jeżeli planujemy zakup własne- Do tworzenia wykresów i diagramów wykorzystano program firmy
go skrawka miejsca w sieci, warto zapoznać
Osoby zainteresowane współpracą prosimy o kontakt: cooperation@software.com.pl
się z przygotowanym przez nas porównaniem
Druk: ArtDruk
usług najpopularniejszych polskich providerów
internetowych. Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy technicznej w instalowaniu
i użytkowaniu programów zamieszczonych na płytach CD-ROM dostarczonych razem z pismem.
Sprzedaż aktualnych lub archiwalnych numerów pisma po innej cenie niż wydrukowana na okładce
Aktualności 6 – bez zgody wydawcy – jest działaniem na jego szkodę i skutkuje odpowiedzialnością sądową.
PHPAudit
PHPAudit to rozbudowany i bardzo funkcjonal- Pro-PHP Podcast
C
ny dedykowany system dystrybucji i licencjono-
hcesz posłuchać, co mają do powie-
wania oprogramowania, które tworzymy w PHP.
Zapewnia wiele gotowych rozwiązań w zakresie dzenia czołowi programiści PHP na
licencjonowania skryptów, pozwalając ogra- świecie? Zacznij słuchać podcastów o te-
niczać ich wykonywanie do jednej instalacji,
określonej domeny lub podanych adresów IP. matyce związanej z PHP. Słowo podcast
PHPAudit może współpracować z koderem powstało z połączenia słów broadcasting
IonCube.
http://phpaudit.com/ (transmisja) oraz iPod (znany wszystkim
przenośny odtwarzacz plików mp3). W na-
PEAR 1.4.0 szym przypadku podcastami będą audycje
Wraz z wersją 1.4.0, instalator PEAR osiągnął
dojrzałość. Najważniejszą nowością jest zapisane w plikach MP3.
wprowadzenie obsługi i możliwości tworzenia PHP podcast to najbardziej udane
własnych kanałów (PEAR Channels), czyli
niezależnych od serwera pear.php.net repo- przedsięwzięcie tego typu dla świata PHP.
zytoriów pakietów, które możemy instalować W rozmowach, wywiadach i debatach
używając polecenia pear. Pozwala to na wy-
godną dystrybucję własnego oprogramowania.
biorą bowiem udział pionierzy PHP, czyli
PEAR 1.4.0 potrafi też rozpakowywać archiwa, ludzie najbardziej aktywni w środowisku.
w których umieszczono kilka aplikacji (jest to Za pośrednictwem audycji usłyszymy
tzw. bundling). Wydzielono również osobne
polecenie do obsługi archiwów PECL-a, a także ich komentarze, a także myśli i pomysły kie audycje są bezpłatne i dostępne dla
poprawiono wiele błędów z poprzednich wersji. odnoszące się do PHP. Tematyka kon- każdego, bez konieczności rejestracji lub
http://pear.php.net/
centruje się zdecydowanie wokół zaawan- wykonywania jakichkolwiek dodatkowych
Zend Core dla Oracle sowanych aspektów programowania. czynności. Podcast to doskonała metoda
Wynikiem współpracy firm Oracle i Zend Jeżeli więc chcemy posłuchać, co ma na odświeżenie słownictwa używanego
Technologies jest wypuszczenie na rynek wersji
beta silnika Zend Core dla Oracle. Jest on cer- do powiedzenia Greg Beaver na temat no- w środowisku programistów PHP, która
tyfikowanym, łatwym w instalacji środowiskiem wego PEAR-a, czy Paul M. Jones, twórca może okazać się szczególnie przydatna
PHP ze zintegrowaną obsługą bazy Oracle.
Oprogramowanie zawiera uaktualniony ste- Savanta i SOLAR-a, to nic nie stoi na podczas prezentacji konferencyjnej w ję-
rownik OCI8, dzięki czemu udało się uzyskać przeszkodzie. Wystarczy wejść na stronę, zyku angielskim.
większą stabilność i wydajność współpracy
z produktami bazodanowymi Oracle. Zamiarem
pobrać odpowiednią audycję i uruchomić Nowe audycje ukazują się z częstotli-
obu firm było stworzenie gotowego do użycia ją na komputerze albo na przenośnym wością jednej na dwa tygodnie.
środowiska PHP do zastosowań korporacyj- odtwarzaczu, np. w drodze do pracy czy
nych, ułatwiającego rozwijanie oprogramowania
opartego o PHP i bazę Oracle. podczas przerwy w zajęciach. Wszyst- http://www.pro-php.com/
http://zend.com
KPHPDevelop
KPHPDevelop to środowisko programistyczne MySQL 5.0RC
U
(IDE, ang. Integrated Development Environ-
kazała się prawdopodobnie najważ-
ment) pracujące pod KDE. Jest udostępniane
bezpłatnie i oferuje standardową funkcjo- niejsza odsłona systemu bazodano-
nalność, jak na aplikację tego typu. Koloruje wego MySQL w historii: 5.0 RC. Poprze-
składnię, podpowiada nazwy funkcji oraz
parametry wejściowe oraz pozwala na sprawne dziły ją liczne wersje beta. Liczba pobrań
zarządzanie wszystkimi plikami, które składają przekroczyła ponad dwa miliony.
się na projekt. Godna uwagi jest obsługa baz
danych, z analizatorem zapytań SQL na czele.
Piąta odsłona MySQL-a szykuje wie-
http://kphpdev.sourceforge.net le możliwości, które będą interesujące
przede wszystkim dla zaawansowanych to nierozerwalny blok operacji (zapytań),
Net_Curl
Ukazała się wersja 1.2.2 biblioteki Net_Curl, programistów. Istotę nowości wprowadzo- cechujący się tym, że gdy choć jedno
która wprowadza obiektowy interfejs do rozsze- nych w tej wersji dobrze oddają trzy sło- z nich nie będzie wykonane poprawnie,
rzenia cURL. Przyda się głównie programistom
tworzącym aplikacje zorientowane obiekto- wa: widoki (ang. views), wyzwalacze (ang. w systemie nie zostanie zapisany rezultat
wo. Wszystkie nazwy funkcji i ich parametry triggers) i transakcje (ang. transactions). żadnego z nich.
wejściowe pozostają bez zmian w stosunku
Widoki tworzymy w celu ogranicze- W MySQL 5.0 wprowadzono ponadto
do cURL. Jedyna różnica polega na tym, ze
odwołujemy się do nich jak do metod. nia dostępu do danych zgromadzonych wiele usprawnień wydajności (w szcze-
http://pear.php.net/package/Net_Curl w tabelach. Każdy widok może zawierać gólności InnoDB), obsługę kursorów,
HTML_Safe 0.9.0alpha1 dane umieszczone w różnych tabelach, zaawansowane zarządzanie procedurami
Wciąż rosnące zagrożenie ze strony ataków a użytkownik ma wrażenie, że pracuje na i funkcjami użytkownika. Rozszerzono
XSS powoduje powstawanie coraz większej
ilości bibliotek do walidacji wprowadzanych
normalnej, rzeczywistej tabeli. Stanowiące również rozmiar danych typu VARCHAR
przez użytkownika danych. XHTML_Safe to drugą nowość wyzwalacze są proce- do 65532 bajtów. Należy wspomnieć także
narzędzie należące do repozytorium PEAR, durami uruchamianymi pod warunkiem o implementacji dwóch nowych silników do
pozwalające dokładnie sprecyzować, jakie
dane mają prawo być kontrolowane, a jakie nie wystąpienia jakiegoś zdarzenia. Przykła- obsługi danych: ARCHIVE (rozległe bloby)
(możliwość stworzenia dokładnej listy tagów). dowo, gdy użytkownik spróbuje usunąć i FEDERATED (dla rozwiązań zdalnych).
Parser biblioteki usunie potencjalnie niebez-
pieczne części kodu HTML, w tym niezamknię- dane z którejś z tabel, wyzwalacz wykona Podsumowując: zmiany dokonane
te znaczniki, skrypty JavaScript oraz wszystkie zaprogramowaną wcześniej procedurę. w wersji 5.0RC MySQL-a są poważnym
inne tagi, które mogą się okazać zagrożeniem.
http://pear.php.net/package/HTML_Safe/
Można w ten sposób zapobiec rozher- argumentem na rzecz migracji na tę plat-
metyzowaniu danych. Trzeci element formę bazodanową.
wprowadzony w MySQL 5.0, transakcja, http://mysql.org
lchash 0.9.1
Zend Platform 2 LCHASH to mała biblioteka, która zapewnia
F
dostęp do natywnych tablic rozproszonych
irma Zend Technologies ogłosiła cje, błędy zaistniałe podczas połączeń,
(ang. Hash Tables), dostępnych w bibliotece
nową wersję swojej platformy do czy też błędy w samym kodzie. Teraz libC. Korzystając z tego mechanizmu można
zarządzania aplikacjami PHP. Zend Plat- będzie można prześledzić problemy, do- bardzo szybko i efektywnie tworzyć oraz
przechowywać duże porcje danych, używając
form 2 ma łączyć w sobie takie cechy jak cierając do ich źródła. przy tym jedynie pamięci podręcznej. Rozwią-
niezawodność, skalowalność i zgodność Nowa wersja platformy Zend to rów- zanie to jest co prawda trochę wolniejsze od
tablic PHP, lecz wykorzystuje znacznie mniej
wymaganą w ważnych aplikacjach biz- nież szybsze wykonywanie aplikacji PHP. pamięci.
nesowych. Dla bardzo obciążonych ser- PHP Performance Managment odpo- http://pecl.php.net/package/lchash
werów przewidziano Klastrowanie Sesji wiada za akcelerację kodu, dynamiczne
File 1.2.2
(ang. Session Clustering), czyli efektywną buforowanie danych wyjściowych oraz Ukazała się wersja 1.2.2 narzędzia File umożli-
wymianę danych sesyjnych pomiędzy kompresję danych, która pozwala ograni- wiającego obiektowy dostęp do plików. Zawiera
ona zestaw metod, które w znaczący sposób
serwerami pracującymi w strukturze kla- czyć do 10% nominalny transfer danych. przyspieszają wykonywanie operacji na plikach.
stra. W ten sposób serwery pracujące PHP/Java Integration Bridge to ko- Przydatny może okazać się także interfejs do
obsługi plików zapisanych w formacie CSV.
w klastrze mogą skuteczniej wyrównywać lejna ciekawa cecha Zend Platform 2. Licencja: PHP
obciążenie pomiędzy sobą. Wg oficjalnych Jak sama nazwa wskazuje, jest to most http://pear.php.net/package/File/
danych Zend, Klastrowanie Sesji powodu- pomiędzy światami PHP i Javy, umożli-
CodeGen_MySQL_UDF
je nawet dziesięciokrotny wzrost wydajno- wiający m.in. korzystanie z bibliotek i klas Istnieją dwa sposoby dodawania nowych funkcji
ści aplikacji. Javy z poziomu PHP (w tym bezpośred- do MySQL-a. Pierwszą jest wbudowanie ich
do natywnego kodu MySQL-a i skompilowanie
Kolejną ważną funkcjonalnością Zend nie wywoływanie metod tych klas). serwera bazodanowego. Drugą jest dodanie
Platform 2 jest PHP Intelligence: system Podsumowując: opisane rozwiąza- funkcji poprzez interfejs UDF (ang. user-defi-
oparty na zdarzeniach, służący do prze- nia dają ogromne możliwości i powinny nied function). Z tej możliwości korzysta biblio-
teka UDF_Gen, której zadaniem jest ułatwianie
prowadzania analizy aplikacji PHP w cza- zainteresować korporacje, które tworzą dodawania funkcji do MySQL-a. UDF_Gen
sie rzeczywistym. Jego wykorzystanie i korzystają ze złożonych aplikacji napisa- czyta konfigurację, prototypy funkcji i fragmenty
kodu z pliku XML i generuje gotowe do użycia
pozwoli nam na skuteczniejsze odnajdy- nych w języku PHP. rozszerzenie UDF. Przyda się każdemu, kto
wanie błędów spowodowanych ciągłymi chcąc przyspieszyć swoje aplikacje, powierza
niektóre zadania bazie danych.
zmianami dokonywanymi w kodzie pro- http://pear.php.net/package/CodeGen_
gramów. Zaprezentuje nieużywane funk- http://zend.com/ MySQL_UDF/
DB_QueryTool 1.0.1
DB_QueryTool to narzędzie pozwalające
Roundcube Webmail Project tworzyć zapytania bazodanowe w oparciu
C
o paradygmat obiektowy. Umożliwia budowanie
hoć bezpłatnych programów do ob- kwerend przy pomocy metod takich, jak
sługi poczty przez WWW jest wiele, setWhere(), setGroup(), setJoin(), itp.
W ten sposób rozległe zapytania wyglądają na
w Roundcube jest coś, co zwraca uwagę.
bardzo uporządkowane i takimi w istocie są.
Narzędzie to ma szczególnie estetyczny Dokonywanie późniejszych zmian w kodzie
i funkcjonalny wygląd, charakterystyczny staje się znacznie łatwiejsze. Warto jeszcze
dodać, że trendem w tworzeniu modułów
dla aplikacji pracujących na platformie działających pod PHP5 jest całkowite przejście
Macintosh. wszystkich bibliotek na model obiektowy.
http://pear.php.net/package/DB_QueryTool/
Roundcube jest łatwy w instalacji
i konfiguracji. Działa w oparciu o PHP PHPRunner
oraz systemy bazodanowe, takie jak: PHPRunner to narzędzie do zautomatyzowane-
go tworzenia interfejsów bazodanowych w PHP.
MySQL, PostgreSQL oraz SQLite (któ- Twórcy zapewniają, że za jego pomocą można
rego popularność rośnie wraz z rozwo- całkowicie uniknąć własnoręcznego programo-
wania. Generuje strony WWW na podstawie
jem PHP5). Wśród funkcji, które producent planu- danych wprowadzonych w panelu i pozwala
Motywy graficzne aplikacji stwo- je, znajduje się przekazywanie wiadomo- zabezpieczyć je hasłem oraz dodać formularz
logowania. Stworzony interfejs może być
rzone zostały w oparciu o standardy ści wraz z załącznikami, wyszukiwarka
wielojęzyczny. Wbudowany do PHPRunnera
projektowania stron WWW, takie jak wiadomości, obsługa filtrów i reguł, wspar- klient FTP pozwala automatycznie zamieszczać
XHTML i CSS 2.0. Roundcube jest cie dla standardu VCard (wizytówki), moż- stronę WWW na serwerze.
http://www.xlinesoft.com/phprunner/
aplikacją dostępną w różnych wersjach liwość importu oraz eksportu maili, edytor
językowych, obsługuje typy MIME i wia- wiadomości HTML (typu WYSIWYG), phpHtmlLib 2.5.4
Pojawiła się wersja 2.5.4 phpHtmlLib – zbioru
domości w formacie HTML. Pozwala narzędzia do sprawdzania pisowni czy klas i bibliotek służących do budowy, debugo-
również wysyłać załączniki (ang. at- wsparcie dla GPG/PGP. wania i przetwarzania dokumentów zapisanych
tachments) do wiadomości. W aplikację Produkt udostępniany jest na licencji w formatach XML, HTML, XHTML, WAP/WML
oraz SVG (Scalable Vector Graphics). Do
wbudowano prostą książkę adresową, GPL. Jego działanie przetestowano na phpHtmlLib dochodzi zaawansowany analizator
możliwość tworzenia katalogów i sys- przeglądarkach Firefox 1.0, Safari 2.0, formularzy, który pozwala budować złożone
formularze HTML/XHTML. W wersji 2.5.4 po-
tem buforowania, przyspieszający pra- Opera 8.0 oraz Internet Explorer 6.0. Ro- prawiono wiele błędów i dodano parę nowości,
cę całej aplikacji. Ponieważ Roundcube undcube działa w nich prawidłowo. takich jak możliwość szeregowania w klasie
FEComboListBox czy całkowicie nowe klasy
wciąż jest w stadium rozwoju alfa, wiele (DataObjectDataListSource i FEColorPicker).
opcji nie zostało jeszcze zaimplemento- Licencja: LGPL
wanych. http://roundcube.net/ http://phphtmllib.newsblob.com/
Gregarius
Agregator RSS to aplikacja, która automa- HTML_Progress
P
tycznie pobiera i wyświetla aktualności z wielu
odczas przesyłania plików na ser-
kanałów RSS (również RDF i ATOM) jednocze-
śnie. Gregarius to kompletny skrypt pełniący wer przydatny jest pasek postępu.
rolę agregatora. Pobiera z wielu wskazanych HTML_Progress to biblioteka należąca
wcześniej źródeł internetowych świeże informa-
cje, aby je następnie przetworzyć i wyświetlić do repozytorium PEAR, która implemen-
na stronie głównej. Program oferuje sprawny tuje takowy. Jej możliwości są naprawdę
mechanizm przeszukiwania wiadomości
i generuje strony wynikowe w oparciu o XHTML zaawansowane. Mamy do wyboru ponad
i CSS. Do poważnych zalet narzędzia Grega- 30 różnych typów paska postępu, w tym
rius zalicza się również łatwa instalacja i prosty
pionowe, poziome, w postaci okręgu,
w obsłudze panel administracyjny.
Licencja: GPL eliptyczne, kwadratowe i prostokątne.
http://gregarius.net HTML_Progress może ponadto poka-
Libchart zywać liczbowo procent przesłanych
Tworzenie wykresów w PHP nie należy do danych.
najprzyjemniejszych czynności. Biblioteka Lib-
chart próbuje to zmienić, oferując bardzo prosty
Wszystkie elementy układu paska
interfejs do tworzenia wykresów słupkowych są w pełni konfigurowalne na poziomie
i kołowych. Produkt współpracuje z PHP4 HTML, a biblioteka spełnia warunki danych na serwer. Jedyne wymagania
i PHP5, a do pracy wymaga zainstalowanej
biblioteki GD obsługującej FreeType. Pozwala zgodności ze standardami XHTML stawiane przez aplikację to dostęp do
umieszczać etykiety danych (m.in. na osiach) i CSS. Najmniejszych problemów nie PHP oraz obsługa DHTML-a w przeglą-
oraz tworzyć legendę. Projekt ma w miarę do-
brą dokumentację (w tym tutorial). Najnowsza powinna również sprawić integracja darce WWW. Biblioteka została stwo-
wersja Libcharta nosi numer 1.0. biblioteki HTML_Progress z systemami rzona w oparciu o wzorzec projektowy
Licencja: GNU LGPL
http://naku.dohcrew.com/libchart
szablonów, takimi jak np. Smarty. Za Obserwator (ang. Observer), co po-
generowanie kolejnych etapów postępu zwala na dodawanie Listenerów. Pod-
User Files odpowiadają skrypty napisane w języku sumowując: HTML_Progress istotnie
Własna usługa w rodzaju e-dysku (dysku
internetowego, pozwalającego gromadzić JavaScript. wzbogaci funkcjonalność naszych stron
swoje pliki na koncie dostępnym przez prze- Możemy umieszczać wiele pasków WWW.
glądarkę WWW)? Z User Files to bardzo pro-
ste. Narzędzie to pozwala zarejestrowanym
postępu na jednej stronie i nie wymaga
użytkownikom przechowywać pliki na dysku to korzystania z wewnętrznych ramek Licencja: PHP License 3.0
naszego serwera. By skorzystać z usługi, (iframe). Użytkownik w każdej chwili http://pear.php.net/package/HTML_
każdy użytkownik musi założyć swoje konto,
podając swój prawdziwy adres e-mail. może zatrzymać proces przesyłania Progress/
Możliwe jest jednoczesne przesyłanie wielu
plików na serwer, określenie maksymalnych
limitów objętości oraz ustalenie dozwolonych
przez nas formatów plików. User Files potrafi PhpPeanuts
P
zmieniać rozmiary obrazów i dodawać do
nich opisy.
eanuts to zorientowany obiektowo
Licencja: Freeware framework do tworzenia aplikacji
http://www.playth.com/scripts/userfiles/ w PHP. Programowanie z jego użyciem
HTML_Table_Matrix 1.0.8 opiera się na architekturze kierowania
Łatwe i automatyczne tworzenie i uzupełnianie modelami (ang. Model Driven Archi- skrócić cykl rozwoju oprogramowania.
tabel staje się możliwe dzięki wykorzystaniu
biblioteki HTML_Table_Matrix. Jest ona bardzo
tecture), która jest tworem stosunkowo Wszystkie części frameworka są skalo-
zaawansowanym rozwiązaniem i pozwala do- świeżym, bazującym na założeniach walne, każda może zostać pominięta,
wolnie sortować dane, które chcemy wprowa-
programowania ekstremalnego (XP, ang. poszerzona lub uzupełniona.
dzić do tabeli (rosnąco, malejąco, losowo, itd.),
dbając przy tym o czystość kodu wynikowego eXtreme Programming). PhpPeanuts został napisany w PHP
tabeli. Podawanie wymiarów tworzonej tabeli PhpPeanuts pokazuje swoje zalety z wykorzystaniem HTMl-a i JavaScriptu.
nie jest wymagane, gdyż biblioteka sama doko-
na obliczeń na podstawie umieszczanych w niej już w bardzo wczesnych fazach rozwoju Może pracować na dowolnych konfigu-
danych. Do działania HTML_Table_Matrix oprogramowania. Wystarczy stworzyć kil- racjach i jest łatwy w instalacji. Intefejs
wymaga pakietu PEAR-owego HTML_Table.
Licencja: PHP v3.0
ka komponentów aplikacji i tabel w bazie użytkownika phpPeanuts całkowicie
http://pear.php.net/package/HTML_Table_ danych, a oprogramowanie automatycznie opiera się na wzorcu Model-Widok-Kon-
Matrix/
utworzy działający prototyp aplikacji. troler, czyli MVC (ang. Model-View-Con-
MP3_Playlist 0.5.0alpha1 Użytkownicy będą w stanie przete- troller). phpPeanuts pozwala na
Były już skrypty do odczytu zawartych w pli- stować prototyp i wyrazić swoją opinię jednoczesną obsługę wielu aplikacji na
kach MP3 tagów ID3, a teraz przyszła pora
narzędzie do obsługi list odtwarzania (ang. na jego temat, co w rezultacie pozwoli jednym serwerze.
playlists). MP3_playlist pozwala na tworzenie efektywnie dopracować i uzupełnić pro- Zdecydowanie polecamy ten frame-
i przetwarzanie tych list. Po uruchomieniu
gram. Twórcy frameworka przygotowali work zaawansowanym programistom,
rozpocznie przeszukiwanie folderów w celu
znalezienia plików MP3 i utworzenia z nich listy łatwe w użyciu komponenty do genero- którzy posiadają duże doświadczenie
odtwarzania. Plik wynikowy możemy zapisać wania tabel, zakładek, formantów, okien w zakresie programowania zorientowa-
w wielu formatach: M3U, SMIL, a nawet XML
i XHTML. Istnieje ponadto możliwość tworzenia dialogowych oraz wyszukiwania stron nego obiektowo.
kopii zapasowych list odtwarzania w oparciu w bazach danych.
o bazę SQLite.
Licencja: PHP Kiedy tylko dokonamy zmian, phpPe-
http://pear.php.net/package/MP3_Playlist/ anuts błyskawicznie zaktualizuje interfejs Licencja: Academic Free License v. 2.0
użytkownika. Pozwala to maksymalnie http://www.phppeanuts.org/
Time Management
PHP121 Instant Messenger Time Management to prosty, ale funkcjo-
P
nalny skrypt, który pełni rolę terminarza
HP121 Instant Messenger to komu-
zadań. Użytkownik widzi typowy miesięczny
nikator internetowy na stronie WWW, kalendarz podzielony na oznaczone datami
nie różniący się wyglądem od komunikato- kratki, w których wpisane są czynności do
wykonania o określonej godzinie. Nowe
rów działających po stronie klienta. zadania przypisujemy do konkretnych dni
Osoba, która chce korzystać i godzin, korzystając z bardzo wygodnego for-
mularza. Możemy także edytować i kasować
z PHP121 Instant Messengera na naszej zadania znajdujące się na liście. Tę pierwszą
witrynie, musi się najpierw zarejestrować, czynność wykonujemy również za pomocą
formularza. Zarządzanie kalendarzem jest
podając swój identyfikator (login), hasło
możliwe dla zalogowanego użytkownika. Time
oraz adres e-mail. Po zalogowaniu się Management wymaga dostępu do bazy My-
może rozmawiać z innymi użytkownikami, SQL 4+, a jego instalacja jest bardzo prosta.
Licencja: GPL
którzy w tym czasie przebywają w sieci. http://phptime.us/
Ciekawym zastosowaniem programu
może być ułatwienie obsługi klientów, oci8 1.1.1
Pojawiła się udoskonalona wersja interfejsu
którzy aktualnie znajdują się na naszym padku, gdy wybierzemy wydanie PHP- do obsługi baz Oracle. Narzędzie to korzysta
sklepie internetowym i chcieliby nas o coś Nuke, potrzebny będzie również system z Oracle Call Interface (OCI). W tym, jak
również poprzedzającym je o kilkanaście dni
zapytać. Jego głównym przeznaczeniem PHPNuke w wersji nowszej niż 6.0. poprzednim wydaniu poprawiono wiele błę-
jest jednak umożliwienie rozmów między Produkt dostępny jest w zasadzie dów, w tym błąd naruszenia ochrony pamięci
(segmentation fault) czy problemy pojawiające
zarejestrowanymi użytkownikami serwisu bezpłatnie, lecz aby otrzymać jego naj- się po użyciu funkcji oci_error() bez argumen-
internetowego. nowszą wersję, należy wesprzeć opro- tów. Wprowadzono też obsługę keszowania
oraz zewnętrznych list uwierzytelniających.
Istnieje osobne wydanie PHP121 gramowanie odpowiednim datkiem (co Dodano również nowe opcje konfiguracji
IM, stworzone z myślą o użytkownikach stanowi pewne kuriozum, gdy weźmiemy stałych połączeń oraz poprawiono błędne
pakietu PHPNuke. Integruje się ono z po- pod uwagę jego licencję). Tym niemniej, działanie funkcji oci_close(), odpowiedzialnej
za zamykanie połączenia z bazą.
zostałą częścią portalu. poprzednia wersja programu jest zawsze Licencja: PHP
Wymagania, jakie stawia PHP121 darmowa. http://pecl.php.net/package/oci8
Instant Messenger to parser PHP i baza Net_IPv6 1.0.5
MySQL. Po stronie przeglądarki musi być Licencja: GNU GPL Biblioteka Net_IPv6 pozwala na stwierdzenie
włączona obsługa JavaScriptu. W przy- http://www.php121.com/ czy wprowadzony adres IP jest adresem
z rodziny IPv6 –protokołu, który jest następ-
cą IPv4. Umożliwia też sprawdzenie, czy
adres IPv4 posiada końcówkę kompatybilną
DreamWeaver 8 z IPv6. Wśród jego funkcji jest również
kompresja i dekompresja adresów IPv6.
File_Find 1.0.1
Jeżeli potrzebujemy biblioteki do przeszuki- PHP/Java Bridge
P
wania dużej ilości plików, powinniśmy zwrócić
HP/Java Bridge, czyli most pomiędzy chcą powoli rezygnować z rozwiązań
uwagę na bibliotekę File_Find. Obsługuje
poszukiwanie rekurencyjne (ang. recursi- PHP a Javą to moduł PHP, który po- opartych o Javę oraz integrować swoje
ve), co oznacza, że zagląda do wszystkich zwala na połączenie systemu obiektowe- oprogramowanie z PHP.
katalogów podrzędnych. Biblioteka pozwala na
odnajdywanie plików, których nazwy spełniają go PHP z systemem Javy lub ECMA. Jest Już dziś obserwujemy wzrastającą
postawione założenia. Możemy również szukać dostępny jako java.so (pod Linuksa) lub tendencję migracji z Javy na PHP. Wi-
ciągu znaków wewnątrz plików podając
określony szablon. File_Find sporządzi ponadto php_java.dll (pod Windows). Tam, gdzie dać to choćby po coraz liczniejszych
mapę plików w katalogu oraz rekursywną mapę to możliwe, implementuje JSR 223 (język projektach, próbujących przenieść funk-
wszystkich plików i katalogów podrzędnych.
skryptowy Javy) i może być używany do cjonalność Javy do PHP, co jest w dużej
Licencja: PHP
http://pear.php.net/package/File_Find/ połączenia z językami CLR (wspólnego mierze spowodowane nowym, ulepszo-
środowiska uruchomieniowego, stanowią- nym modelem (i silnikiem) obiektowym
HTTP_Session 0.5.1
Prezentowana biblioteka jest interfejsem cego podstawę frameworka Microsoftu PHP5.
obiektowym dla funkcji z rodziny session_*. .NET), takimi jak VB.NET, czy C#. Problemem PHP/Java Bridge może
Oprócz typowej zamiany nazw funkcji na nazwy
metod, mamy do czynienia z paroma dodatko-
Podstawowym środowiskiem, z któ- się jednak okazać jego jego niewystar-
wymi możliwościami, takimi jak składowanie rym moduł ten umożliwia połączenie, jest czająca wydajność. Zaleca się więc sto-
danych o sesjach w bazach danych przy użyciu Java, włączając w to również takie sowanie tego rozwiązania wszędzie tam,
pakietów (Pear) DB, MDB, MDB2. Pojawiają
się również nowe metody, w tym: isNew(), rozwiązania, jak KAWA czy Jruby. Aby gdzie nie istnieje zagrożenie przeciążenia
useCookies(), setExpire(), setIdle(), zapewnić efektywną wymianę informacji, serwera, czyli głównie w rozwiązaniach
isExpired(), isIdled() i inne.
Licencja: PHP most pomiędzy PHP, a Javą komunikuje intranetowych oraz ekstranetowych. Pod-
http://pear.php.net/package/HTTP_Session/ się z wirtualną maszyną Javy (ang. Java sumowując: kolejny dobrze pomyślany
Virtual Machine) przy użyciu lokalnych projekt, który przysparza popularności
crack 0.4
Ukazała się w pełni stabilna wersja narzędzia portów. Dzięki PHP/Java Bridge możemy PHP i pozwala temu językowi zdobywać
crack, nosząca nxumer 0.4. Zadaniem cracklib odwoływać się bezpośrednio do Javy, następne zastosowania i przełamywać
jest sprawdzanie jakości haseł. Dokonuje ono
setek testów, mających na celu ustalenie, korzystając z typowej składni PHP. Ten kolejne bariery.
czy wybrane przez nas hasło jest trudne do fakt w znaczący sposób ułatwia pracę
odgadnięcia, czy też nie. Wykorzystuje do tego
słownik, sprawdzając czy jako hasła nie używa-
z zewnętrznymi aplikacjami tworzonymi
my powszechnienie znanego słowa. Biblioteka w języku Java.
próbuje też znaleźć podobieństwo hasła do PHP/Java Bridge przyda się fir- Licencja: PHP License
nazwy użytkownika. Ostatecznie uzyskuje-
my informację, czy wybrane przez nas hasło mom, które doceniając możliwości PHP http://php-java-bridge.sourceforge.net/
spełnia podstawowe zasady bezpieczeństwa.
Crack bazuje na bibliotece libcrack, która jest
standardowo dostępna w większości systemów
unixowych. W wersji 0.4 narzędzia crack, za- PHPBeans
P
pewniono zgodność z PHP 4.1 oraz współpracę
z PEAR 1.4.0. Dodano także wersję binarną dla
HPBeans jest serwerem obiektów
Windows. i zgodnie z aktualną tendencją, sta-
Licencja: PHP nowi kolejne rozwiązanie przeniesione
http://pecl.php.net/package/crack
z Javy. Jest oparty o specyfikację RMI,
html2ps 0.7.1 czyli Remote Method Invocation (zdalne
Biblioteka html2ps oferuje funkcjonalność
zbliżoną do jej odpowiednika napisanego
wykonywanie metod). Jego działanie
w Perlu. Jej zadanie polega na konwertowa- opiera się na relacji klient-serwer. W roli pularnych protokołach dla Web Servi-
niu dowolnego dokumentu HTML (również
tego drugiego występuje PHPBeans ces, takich jak SOAP czy XML-RPC.
zawierającego DHTML) lub XHTML do formatu
PostScript. Pozwala ustawiać m.in. orientację Object Server, stanowiący repozytorium, Twórcy phpBeans Protocol wykorzystali
strony (pozioma lub pionowa) i rozmiar papieru w którym umieszczamy wszystkie nasze własne, dedykowane rozwiązania, by
w dokumencie wynikowym. Biblioteka radzi
sobie z obrazkami, skomplikowanymi tabelami klasy przeznaczone do udostępnienia komunikacja była łatwa, szybka i efek-
(również tymi używającymi tagów rowspan aplikacjom klienckim. tywna.
i colspan), warstwami, znacznikami <div> oraz
stylami CSS. W nowej wersji dokonano wielu
Interfejsem klienta jest z kolei Php- PhpBeans to jednak nie tylko opro-
udoskonaleń w metodzie odpowiedzialnej za Beans Client API. Może on połączyć gramowanie klienta i serwera. To przede
zwracanie dokumentu wynikowego (biblioteka
się zdalnie z serwerem w celu wykona- wszystkim metoda dostępu do klas
PDFLIB), m.in. poprawiono obsługę bloków.
Licencja: GPL nia zgromadzonych tam metod. Przyda ulokowanych poza naszym środowi-
http://www.tufat.com/script19.htm się to szczególnie tam, gdzie istnieje skiem pracy. PHPBeans to rozwiązanie
PHPlist 2.10.1 wiele rozproszonych instancji jednej kierowane do twórców zaawansowa-
PHPList to jeden z najpopularniejszych i naj- aplikacji. Istnieją dwie wersje oprogra- nych, komercyjnych rozwiązań na dużą
lepszych programów do masowego rozsyłania
mowania klienckiego: jedna z nich jest skalę.
poczty elektronicznej (mailingu) i tworzenia
newsletterów. Aplikację przeznaczono do obsługi przeznaczona dla PHP, a druga dla
wielu list mailingowych, wzbogacając ją o mecha- Ruby'ego (niezależny skryptowy język
nizm pozwalający gościom naszej strony zapisy-
wać się na wybrane listy. W nowej wersji (2.10.1) obiektowy). Oprogramowanie serwera
dodano wiele nowych funkcji. Najważniejszą i klienta pobieramy oddzielnie. Licencja: GNU GPL lub komercyjna (ser-
z nich jest edytor WYSIWYG, którego rolę pełni
znany produkt o nazwie FCK Editor 2, pracujący Do wymiany informacji między wer) oraz GNU LGPL (klienci dla PHP
zarówno pod przeglądarką Firefox, jak i Mozilla. serwerem a klientem służy phpBeans i Ruby'ego)
http://www.phplist.com
Protocol. Nie został on oparty na po- http://www.phpbeans.com/
GraPHPite
eyeOS
e yeOS to niecodzienne rozwiązanie:
CMS przypominający swoim wyglą-
dem i zachowaniem okienkowy system
operacyjny, taki jak Windows czy Linux
z zainstalowanym środowiskiem X-Win-
dow. Działa w przeglądarce internetowej
i umożliwia wykonywanie typowych czyn-
ności biurowych, takich jak liczenie na kal-
kulatorze, tworzenie podręcznych notatek
czy edytowanie dokumentów tekstowych.
Obecnie w dystrybucji systemu znajduje
się 10 tego rodzaju aplikacji.
Przykładowo, aby dokonać obliczeń,
uruchamiamy pod eyeOS-em swój kal-
kulator, a gdy na chwilę nie będzie nam
potrzebny, minimalizujemy go i np. uru-
chamiamy edytor tekstu, który przypomina
Worda lub OpenOffice.org Writera. Każda
aplikacja działa w osobnym oknie, które
możemy dowolnie przesuwać w oknie
przeglądarki, a także minimalizować, po-
większać lub zamykać. (ma m.in. wersję polską, francuską, wło- cają do przenoszenia do niego kolejnych
Aplikacja dysponuje ponadto własnym ską i niemiecką). aplikacji ze świata PHP. Podsumowując:
komunikatorem oraz przeglądarką stron Produkt znajduje się jeszcze w fazie bardzo ciekawe rozwiązanie, które może
WWW. Nie zabrakło również narzędzia do rozwoju, a aktualną wersją pozostaje 0.8.3. zrewolucjonizować nasze podejście do
zarządzania plikami. Cały system sprawia EyeOS ma pewne problemy z obsługą kwestii związanych ze środowiskiem pracy
wrażenie funkcjonalnego i intuicyjnego, przeglądarek, choć nie szkodzi to zbytnio oraz interfejsami użytkownika w PHP.
bazując przy tym na nowoczesnym de- jego funkcjonalności. Z założenia jest rów- Licencja: GNU GPL
signie. eyeOS jest również wielojęzyczny nież rozbudowywalny, a jego twórcy zachę- http://www.eyeos.org
SugarCRM 3.5.0
Licencja: GPL
Cena wersji komercyjnej (Sugar Professio-
nal): 239,00$
http://www.sugarcrm.com
apisać pod a
proszę n dres
z płytą : cd
@s
ów of
b lem tw
are
p ro .co
z ie m
ra .p
W
l
na naszej stronie internetowej pod adresem www.phpsolmag.org/pl
F
ormat OpenDocument, czyli otwar- zapisu dokumentów, niezależnej od
ty format dla aplikacji biurowych, wewnętrznych formatów poszczególnych
został opracowany przez kon- aplikacji. Wprowadzenie wspólnego for-
sorcjum OASIS (Organization for the matu oznacza dla użytkownika swobodę
Advancement of Structured Information wyboru aplikacji, a dla producentów opro-
Standards, czyli Organizację ds. Rozwoju gramowania zwiększoną konkurencję,
Strukturalizowanych Standardów Informa- a zarazem konieczność współpracy.
cyjnych) i jest propozycją standardowego Od strony technicznej, specyfikacja
W SIECI formatu zapisu i wymiany dokumentów OASIS jest dokumentem określającym
tworzonych w pakietach biurowych, metody opisu tekstu i treści multime-
1. http://www.oasis-
a więc arkuszy kalkulacyjnych, prezen- dialnych w typowych dokumentach
open.org/committees/ tacji, wykresów czy też tekstów. W tym pakietów biurowych. Standard definiuje
tc_home.php?wg_ artykule zajmiemy się przede wszystkim schemat XML pozwalający opisywać
abbrev=office – standard
OASIS OpenDocument dokumentami tekstowymi.
2. http://en.wikipedia.org/wiki/ Pierwsza wersja specyfikacji Open-
OpenDocument – wpis Powinieneś wiedzieć...
w Wikipedii na temat formatu Document powstała w wyniku współpra- Powinieneś znać podstawy pracy z PHP
OpenDocument cy organizacji zrzeszonych w ramach i eZ publish.
3. http://www.ez.no – strona
OASIS. Podstawą dla specyfikacji był
projektu eZ publish
4. http://www.ez.no/community/ XML-owy format plików OpenOffice.org,
Obiecujemy...
Po przeczytaniu artykułu będziesz
contribs/import_export/ jednak specyfikacja wprowadza też wiele
oasis_open_document_ wiedział jak przekazywać treść mię-
extension – rozszerzenie istotnych zmian. Format OpenDocument dzy programem OpenOffice.org Writer
OASIS dla eZ publish został zatwierdzony jako standard OASIS a systemem eZ publish oraz jak dołą-
5. http://www.ez.no/ czać obsługę formatu OpenDocument
documentation – pierwszego maja 2005 roku. Celem stan-
do aplikacji PHP.
dokumentacja eZ publish dardu jest dostarczenie wspólnej metody
Migracja z formatów
poszczególnych aplikacji
Istniejące dokumenty zapisane we wła-
snych formatach aplikacji (na przykład
dokumenty MS Word) można konwerto-
wać do formatu OpenDocument za po-
mocą oprogramowania Open Source,
na przykład pakietu OpenOffice.org
– darmowej aplikacji obsługującej wiele
różnych formatów, w tym OpenDocument.
Konwersję dokumentów w OpenOffice.org
dodatkowo ułatwia możliwość wywoływa-
nia makr z linii poleceń. Oznacza to, że
wykorzystanie OpenOffice.org pozwala
nie tylko ręcznie konwertować dokumenty
Rysunek 1. Dokument edytowany w MS Word do formatu OpenDocument, ale również
automatyzować ten proces i wbudowywać
strukturę tekstu, nagłówków, list, tabel, Według Wikipedii, do aplikacji obsłu- go w inne aplikacje. Niektóre produkty (na
obiektów osadzonych i innych elemen- gujących format OpenDocument należą przykład eZ publish) już teraz obsługują tę
tów dokumentu. Wynikowy plik jest obecnie: metodę konwersji, choć korzystanie z ich
zwykłym archiwum ZIP, zawierającym możliwości wymaga zainstalowania wersji
pewną liczbę plików XML i ewentualnie • Abiword, 2 pakietu OpenOffice.org.
osadzonych w dokumencie obrazów lub • eZ publish,
obiektów multimedialnych. • IBM Workplace, Praktyczny przykład
Format OASIS OpenDocument jest • Knomos, Wykorzystanie standardu OpenDocu-
standardem otwartym i prawdopodobnie • KOffice, ment i oprogramowania Open Source do
stanie się w przyszłości standardem ISO.
Ponieważ jest to format otwarty, można
go używać do zapisu i wymiany informacji
w dowolnych aplikacjach.
Aplikacje obsługujące
format OpenDocument
Od czasu oficjalnego ogłoszenia standar-
du OpenDocument w maju 2005 r. pojawi-
ło się już kilka aplikacji ten format obsługu-
jących. Coraz szerszej obsłudze standar-
du w aplikacjach towarzyszy jego rosnąca
popularność wśród użytkowników.
Wykorzystanie formatu
OpenDocument
w aplikacjach PHP
Rysunek 9. Bardziej złożony dokument po imporcie do eZ publish Wiemy już, na czym polega wymiana
danych OpenDocument między klien-
Listing 1. Dokument XML opisujący nagłówek i akapit tekstu tem i serwerem, pora więc zająć się
implementacją obsługi tego formatu
<office:document-content> w naszych aplikacjach PHP. Napisze-
<office:body>
my skrypt pobierający treści tekstowe
<office:text>
<text:h text:style-name="Heading_20_1" text:outline-level="1">To jest
z pliku ODT i przekształcający je na
nagłówek</text:h> stronę XHTML. Najpierw musimy się
<text:p text:style-name="Text_20_body"> zaopatrzyć w parser DOM XML – w tym
To jest zwyczajny akapit.</text:p> przykładzie wykorzystamy wchodzącą
</office:text>
w skład środowiska eZ publish bibliote-
</office:body>
</office:document-content>
kę eZ xml, ale równie dobrze sprawdzi
się dowolny inny parser XML.
Listing 2. Parsowanie zawartości pliku .odt w PHP Spójrzmy na przykładowy kod z Li-
stingu 2. Zaczynamy od wypisania tekstu
<h1>Test importu XML z pliku OpenDocument</h1>
HTML informującego o teście importu
<hr />
<?php XML-a z pliku OpenDocument, po czym
include_once('lib/ezxml/classes/ezxml.php'); wstawiamy poziomą linię. Kod PHP za-
// $xml jest instancją eZXML, a $dom - modelem obiektowym dokumentu XML czynamy od dołączenia biblioteki XML,
$xml = new eZXML(); której nakazujemy następnie wczytanie
$dom =& $xml->domTree(file_get_contents("documents/simpledoc/content.xml"));
danych XML i utworzenie dla nich drze-
$bodyNodeArray = $dom->elementsByNameNS( 'body',
'urn:oasis:names:tc:opendocument:xmlns:office:1.0' ); wa DOM. Potrzebne nam dane znajdują
// sprawdzenie, czy w pliku występuje pojedynczy znacznik ciała dokumentu się wewnątrz znacznika <body>, więc
if ( count( $bodyNodeArray ) == 1 ){ próbujemy pobrać zawartość węzła body,
$bodyNode =& $bodyNodeArray[0]; podając jego nazwę i URI przestrzeni
$xhtmlTextBody = "";
nazw. Warto zwrócić uwagę, że identyfi-
foreach ( $bodyNode->children() as $childNode ){
$xhtmlTextBody .= handleNode( $childNode ); // dopisywanie wynikowego kodu XHTML katorem przestrzeni nazw nie jest tu sam
} przedrostek office, ale pełna nazwa za-
print( $xhtmlTextBody ); sobu (URN), czyli urn:oasis:names:tc:
} opendocument:xmlns:office:1.0. Jest to
konieczne, gdyż przedrostek przestrzeni
nazw jest jedynie aliasem dla pełnej na- kod nagłówka HTML odpowiedniego
zwy zasobu i może ulec zmianie. poziomu. Potem wystarczy już tylko do- ���������������
Sprawdzamy, czy znaleźliśmy dokład- pisać tekst nagłówka wraz ze stosownymi
��������
nie jeden pasujący węzeł drzewa DOM, co znacznikami do zmiennej $htmlTextCon-
������������
pozwala dodatkowo zweryfikować popraw- tent, w której przechowujemy zwracany ��������
ność dokumentu (powinien być tylko jeden przez funkcję kod HTML.
znacznik <body>). Gdy już mamy węzeł Przetwarzanie znacznika <p> jest nie- ����������
body, możemy przejść po wszystkich jego co bardziej skomplikowane. Węzeł akapitu �������������
�����������
węzłach potomnych w pętli foreach. Do może mieć węzły potomne, po których
przetwarzania węzłów potomnych stwo- przechodzimy w pętli foreach. W bloku ��������
rzyłem funkcję handleNode(), zwracającą switch sprawdzamy nazwę bieżącego
wyświetlany na końcu kod HTML. węzła – w naszym prostym przykładzie ��������
Kod funkcji handleNode() przedstawia obsługiwane są jedynie węzły o nazwach
������������
Listing 3. Zaczynamy od sprawdzenia #text i image, a napotkanie dowolnej
nazwy bieżącego węzła (czyli znacznika) innej nazwy znów kończy się komunika- ����������
w bloku switch. Dla potrzeb tego przy- tem Nieobsługiwany element. Zawartość
kładu obsłużymy jedynie <h> oraz <p> węzła #text jest doklejana do zmiennej
Rysunek 10. Zawartość pliku .odt
– napotkanie dowolnego innego znacz- przechowującej treść akapitu, natomiast
– struktura plików i katalogów
nika spowoduje wyświetlenie komunikatu w przypadku węzła image (czyli obrazu),
Nieobsługiwany element. będzie nas interesować tylko ścieżka do <img>. Dodatkowo usuwamy pierwszy
W przypadku znacznika <h> (czyli na- pliku obrazu, więc pobieramy wartość znak ciągu pobranego z href, dzięki
główka), zaczynamy od pobrania atrybutu atrybutu href węzła obrazu i używamy jej czemu otrzymujemy względną ścieżkę
level, na podstawie którego generujemy do zbudowania HTML-owego znacznika do pliku, nadającą się do bezpośrednie-
go użytku. Po przetworzeniu wszystkich
Listing 3. Kod funkcji handleNode() węzłów potomnych dopisujemy ich zawar-
tość oraz zamykający znacznik </p> do
function handleNode( $node ){ zmiennej przechowującej wynikowy kod
$xhtmlTextContent = "";
HTML akapitu.
switch ( $node->name() ){
case 'h' : {
$level = $node->attributeValueNS( 'level', Podsumowanie
'urn:oasis:names:tc:opendocument:xmlns:text:1.0' ); W tym artykule starałem się pokazać moż-
if ( $level >= 1 && $level <= 6 ){ liwości wykorzystania standardu OASIS
$xhtmlTextContent.="<h$level>".$node->textContent()."</h$level>";
OpenDocument w codziennej pracy i wy-
}
else print( "Nieobsługiwany poziom nagłówka" );
mianie informacji. Aplikacje Open Source
}break; dają tu ogromne możliwości, w tym łatwe
case 'p' : { przechodzenie z własnych formatów
$paragraphContent = ""; aplikacji (np. Worda) na formaty otwarte
foreach ( $node->children() as $childNode ){
oraz możliwość bezpośredniej edycji
switch ( $childNode->name() ){
case "#text" : {
konwertowanego dokumentu. Prześledzi-
$paragraphContent .= $childNode->content(); liśmy też przykład edycji treści w różnych
}break; aplikacjach i kontekstach, przekonując się,
case "image" : { że dane mogą równie dobrze występować
$href = ltrim( $childNode->attributeValueNS( 'href',
w postaci tradycyjnych dokumentów, jak
'http://www.w3.org/1999/xlink' ), '#' );
$paragraphContent .= "<img src='$href' alt=''/>";
i artykułów publikowanych w Internecie.
}break; Wszystko to pokazuje, jak wiele mogą
default: { zdziałać producenci oprogramowania, gdy
print( "Nieobsługiwany element: " . $childNode->name() . ustalą wspólny standard i zaimplementują
"<br>" );
go w swoich aplikacjach. n
}break;
}
}
$xhtmlTextContent .= '<p>' . $paragraphContent . '</p>';
}break; O autorze
default: {
print( "Nieobsługiwany element " . $node->name() . "<br/" ); Bård Farstad jest jednym z założycieli
} i głównym deweloperem eZ systems.
} CMS-ami profesjonalnie zajmuje się od
return $xhtmlTextContent; 1999 roku. Jest autorem wielu projek-
} tów oraz bibliotek dla PHP (np. ez XML
?> – parser XML-a).
Kontakt z autorem: bf@ez.no
Programowanie sterowane
testami za pomocą PHPUnit
Timo Haberkern
W
yobraźmy sobie fikcyjną, łanie innego? Odbywa się to za pomocą
obiektowo zorientowaną apli- predefiniowanych testów. W każdym z nich
kację PHP, która składa się sprawdzana jest konkretna funkcjonalność
z bardzo wielu klas. Między tymi klasami wybranej klasy, a zwrócony rezultat funkcji
istnieją oczywiście zależności, co oznacza jest porównywany z wartością oczekiwaną.
również, że błędy występujące w klasie Jeżeli oba wyniki są równe, to znaczy,
bazowej powodują kolejne w klasach po- że badana funkcja działa poprawnie.
tomnych. W aplikacji zawierającej kilkaset W przeciwnym wypadku mamy do czynie-
klas może to doprowadzić do poważnych nia z błędem. PHPUnit pozwala na łatwe
problemów, gdyż nie możemy po każdej pisanie testów i gromadzenie ich większej
zmianie w klasach bazowych testować liczby w tzw. zbiorach testów (PHPUnit:
od nowa całej aplikacji. Przynajmniej TestSuites). PHPUnit sprawdza wszyst-
dotychczas tak było! W świecie Javy od kie testy w zbiorze i zwraca nam liczbę
dawna możemy przeprowadzać testy
zwane jednostkowymi (ang. unit tests). Co należy wiedzieć...
Są one wykonywane automatycznie przez Powinieneś znać podstawy programo-
framework testowy, a ich rezultatem jest wania obiektowego w PHP.
W SIECI m.in. liczba testów zakończonych powo-
dzeniem i niepowodzeniem. Stworzone
Co obiecujemy...
Po przeczytaniu artykułu będziesz wie-
przez Sebastiana Bergmanna narzędzie dział, jak automatycznie i bez zbytniego
1. http://www.phpunit.de – stro-
ny projektu PHPUnit PHPUnit jest frameworkiem zapewniają- wysiłku sprawdzać działanie aplikacji
2. http://www.testdriven.com cym tę funkcjonalność w PHP. PHP za pomocą testów jednostkowych
– witryna o TDD i frameworka PHPUnit. Artykuł bazuje na
3. http://www.junit.org – projekt Zapytacie pewnie, jak to możliwe, że
wersji 2.2.1 PHPUnit.
jUnit jeden program testuje automatycznie dzia-
������ ��������
Ponieważ komunikaty zwracane przez nie-
������ �������� które metody assert, np. assertEqual() są
wyczerpujące, więc dodawanie własnych
������
������� informacji nie zawsze jest konieczne.
��� ��������
Gromadzenie testów w zbiory
������ �������� Z reguły nie chcemy wywoływać pojedyn-
czego testu. Postępowanie, które opisa-
��������� liśmy nie sprawdziłoby się w przypadku
dużej liczby testów. Na szczęście również
������ ������
tutaj PHPUnit oferuje nam wygodne me-
�������
������� chanizmy. Większą liczbę testów możemy
umieścić w zbiorze testowym (TestSuite),
a następnie wywołać pojedynczym po-
leceniem. Listing 4 pokazuje, jak można
Rysunek 2. Zasada działania zautomatyzowanych testów dodawać pojedyncze testy do TestSuite
za pomocą metody addTest(). TestSuite
że nasza klasa pracuje prawidłowo, jako że (jako parametr) własne komunikaty, które możemy następnie wykonać poleceniem:
nie mamy żadnych słówek w naszym słow- zostaną wyświetlone w przypadku nie-
niku. Jeżeli jednak isEmpty() zwróci false, powodzenia testu. Jeżeli zastąpimy linię phpunit DictionaryTestSuite
to mamy do czynienia z błędem. Założenie z metodą assert na Listingu 3 zapisem:
assertTrue() będzie niespełnione i PHPU- Wynik, który zobaczymy na ekranie, odpo-
nit stwierdzi błąd. Zadaniem metod assert $this->assertTrue("samolot" == $strResult, wiada temu, co znamy z dotychczasowych
jest porównywanie oczekiwanego wyniku "Tłumaczeniem 'plane' jest pojedynczych wywołań.
ze zwróconym przez funkcję. Do dyspo- '$strResult'. Oczekiwano: 'samolot'")
zycji mamy kilka rodzajów tych metod, setUp() i TearDown()
niektóre z nich przedstawiamy w Ramce to w przypadku niepowodzenia testu otrzy- Jeśli przyjrzymy się uważnie Listingowi 1,
Metody assert. Będziemy z nich korzystać mamy następujący komunikat: zwrócimy uwagę na funkcje loadFromDb()
w następnych przykładach. i saveToDb(). Jak sugerują nazwy, odpo-
Metoda testująca może zawierać F wiadają one za ładowanie (load) i zapisy-
więcej metod typu assert. Można to wy- Time: 0.004560 wanie (save) słownika do bazy danych.
korzystać, by sprawdzać wartości zależne There was 1 failure: Załóżmy, że w bazie znajduje się kilka
od siebie. 1) testTranslation(TranslateTest) tysięcy słów, więc ich ładowanie trochę
Tłumaczeniem 'plane' jest 'error'. potrwa. Ponieważ wiele testów korzysta
Ulepszone Oczekiwano: 'samolot'. z wypełnionego słownika, więc ładowanie
komunikaty o błędach FAILURES!!! danych dla każdego pojedynczego testu
Komunikaty zwracane przez PHPUnit
w razie zakończenia testu niepowodze-
niem mówią czasami niewiele. Załóżmy,
że metoda getTranslation() zwraca
nieprawidłowy rezultat, co spowoduje, że
nasz test z Listingu 3 zakończy się nastę-
pującym komunikatem:
F
Time: 0.012339
There was 1 failure:
1) testTranslation(TranslateTest)
FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0,
Incomplete Tests: 0.
R E K L A M A
DictionaryTestSuite
Listing 4. Gromadzenie pojedynczych testów w TestSuite
Listing 7. Część automatycznie utworzonego szkieletu testowego dla klasy słow- Podsumowanie
nikowej PHPUnit jest interesującym projektem,
który bardzo ułatwia kontrolowanie bez-
<?php błędności naszej aplikacji w trakcie jej
if (!defined("PHPUnit2_MAIN_METHOD")) {
pisania. Drastyczne zmniejszenie nakła-
define("PHPUnit2_MAIN_METHOD", "DictionaryTest::main");
} dów pracy odczujemy przede wszystkim
require_once "PHPUnit2/Framework/IncompleteTestError.php"; dzięki automatycznemu dodawaniu testów
require_once "PHPUnit2/Framework/TestCase.php"; dla każdej metody, które uwalnia nas od
require_once "PHPUnit2/Framework/TestSuite.php"; żmudnego, ręcznego wykonywania tych
require_once "Dictionary.php";
operacji. W polączeniu z łatwością obsłu-
// Test class for Dictionary.
// Generated by PHPUnit2_Util_Skeleton on 2005-09-11 at 18:09:24. gi PHPUnita, możliwości te zadają kłam
class DictionaryTest extends PHPUnit2_Framework_TestCase { pokutującemu przekonaniu, że z powodu
public static function main() { konieczności dotrzymania terminów nie ma
require_once "PHPUnit2/TextUI/TestRunner.php"; czasu na testowanie programu w czasie
$suite = new PHPUnit2_Framework_TestSuite("DictionaryTest");
jego powstawania.
$result = PHPUnit2_TextUI_TestRunner::run($suite);
} Przyszłość PHPUnita rysuje się jesz-
// @todo Implement testAddTranslation(). cze ciekawiej. Niedługo ukaże się wersja
public function testAddTranslation() { dla PHP 5.1, korzystająca z jego nowych
throw new PHPUnit2_Framework_IncompleteTestError; możliwości, a także (co nie ma związku
}
z PHP 5.1) oferująca funkcjonalność
// @todo Implement testGetTranslation().
public function testGetTranslation() { taką, jak atrapy obiektów (ang. mock
throw new PHPUnit2_Framework_IncompleteTestError; objects) – to drugie zbliża ją do pierwo-
} wzoru ze świata Javy, którym jest jUnit.
// @todo Implement testRemoveTranslation(). Autorzy zapowiadają również możliwość
public function testRemoveTranslation() {
tworzenia testów przy użyciu interfejsu
throw new PHPUnit2_Framework_IncompleteTestError;
} graficznego (GUI) działającego pod GTK.
// @todo Implement testIsEmpty(). Ma on zostać napisany, gdy pojawi się
public function testIsEmpty() { GTK dla PHP5. W odległej przyszłości
throw new PHPUnit2_Framework_IncompleteTestError; planowana jest integracja PHPUnita ze
}
środowiskami programistycznymi, takimi
}
if (PHPUnit2_MAIN_METHOD == "DictionaryTest::main") { jak Eclipse, Zend Studio czy Maguma
DictionaryTest::main(); Workbench. Jak będzie, pokaże czas,
} a na razie warto zacząć korzystać z do-
?> stępnych możliwości PHPUnita, wdraża-
jąc go w swoich projektach. n
Listing 8. Umiejscowienie testu wewnątrz pliku klasy
<?php
class example {
// some class code here
} O autorze
if ( strstr($_SERVER['PHP_SELF'], "TextUI/TestRunner.php") != false ) {
require_once ("PHPUnit2/Framework/TestCase.php"); Timo Haberkern jest architektem opro-
class exampleTest extends PHPUnit2_Framework_TestCase { gramowania biznesowego w firmie EME-
// your test cases here DIA OFFICE. Poza tym bierze aktywny
} udział w rozwijaniu wielu projektów open
} source w językach PHP, Java i Java-
?> script.
D
rupal to opensourcowy, napisany categorizing) i znakowanie (ang. tagging)
w PHP CMS. Opiera się na rela- treści, optymalizacja pod kątem wyszuki-
cyjnej bazie danych (MySQL lub warek (ang. Search Engine Optimization,
PostgreSQL). Jest modularny, elastyczny SEO) oraz użycie technologii AJAX w in-
i skalowalny. Rdzeń systemu Drupal, po- terfejsie użytkownika. W artykule zajmuje-
dobnie jak większość modułów i motywów my się przyszłą, jeszcze niewydaną wersją
graficznych przygotowanych przez jego Drupala o numerze 4.7, która będzie ofe-
użytkowników, udostępniany jest na licen- rowała wiele ciekawych rozszerzeń w sto-
cji GNU General Public License. sunku do bieżącej wersji stabilnej.
Drupal ma potężne możliwości
w porównaniu z rozwiązaniami konkuren-
cyjnymi, a jednocześnie jest wystarczająco Powinieneś wiedzieć...
Powinieneś znać PHP, Apache'a i My-
elastyczny, by mógł być wykorzystywany SQL-a. Przydatna będzie również wiedza
na serwisach WWW dowolnego rodzaju: ogólna o systemach CMS oraz o SEO.
portalach, stronach osobistych, forach
W SIECI dyskusyjnych, blogach, fotoblogach czy Obiecujemy...
Po przeczytaniu artykułu będziesz wie-
podcastach – możliwości jest wiele.
dział, jak za pomocą Drupal stworzyć
Pokażemy, jak wykorzystać Drupala wielodomenowy, wielojęzyczny serwis
1. http://drupal.org – oficjalna
strona domowa Drupal do zbudowania złożonego serwisu portalo- WWW. Skupimy się przy tym na niektó-
2. http://cvs.drupal.org – repo- wego, koncentrując się na najbardziej za- rych spośród jego najbardziej zaawanso-
zytoria CVS Drupal wanych elementów, takich jak instalacja
3. http://drupaldocs.org – doku- awansowanych komponentach systemu,
dla wielu serwisów, internacjonalizacja,
mentacja API programistycz- takich jak wielowitrynowość, czyli instalacja interfejsy użytkownika AJAX oraz Search
nych Drupal
4. http://opensourcecms.com
dla wielu serwisów (ang. multi-site installa- Engine Optimization.
– strona o CMS tion), wielojęzyczność, kategoryzacja (ang.
będzie miał poddomenę w ramach naszej Stwórz zadanie crona pytające regularnie o plik cron.php. Przykładowo, aby wywo-
wspólnej domeny example.com. Główny ływać tę czynność co godzinę, należy dodać do /etc/crontab następującą linijkę:
serwis będzie dostępny pod adresem http:
0 * * * * wget -O - -q http://www.example.com/testsite/cron.php
//www.example.com; osobne poddomeny
dla gatunków będą nosiły nazwy takie, jak
Wymagania
http://rock.example.com, http://blues.exam- Minimalne wymagania instalacyjne Drupala to: PHP (PHP4 od wersji 4.3.3 lub PHP5),
ple.com czy http://electronica.example.com. system relacyjnych baz danych (MySQL lub PostgreSQL) oraz serwer HTTP (Apache lub
Witryna dla każdego gatunku będzie miała IIS). Opcjonalne, ale zalecane są: rozszerzenie XML dla PHP, obsługa mod_rewrite i plików
.htaccess.
własne ustawienia, motywy graficzne, blo-
ki, treść, fora itd. Z drugiej jednak strony
chcemy, by nasi użytkownicy mogli założyć
pojedyncze konto i wykorzystywać je do lo- Instalacja wyszukiwania przez system Drupal pli-
gowania się we wszystkich serwisach (ang. wielowitrynowa ków konfiguracyjnych, modułów oraz in-
single sign-on). Z tego względu poszcze- (wieloserwisowa) nych elementów. W przypadku instalacji
gólne serwisy będą korzystały ze wspólnej Instalacja wielowitrynowa pozwala nam jednoserwisowej, pełna ścieżka do pliku
bazy użytkowników. tworzyć wiele serwisów, dostępnych pod settings.php to sites/default/settings.php.
osobnymi domenami lub poddomenami W przypadku scenariusza wielowitry-
Listing 1. Definicja naszych poddo- czy podkatalogami pojedynczej domeny. nowego musimy natomiast stworzyć
men dla Apache'a Każdy z tych serwisów może mieć własne odpowiedni podkatalog dla każdego
ustawienia, moduły i motywy graficzne serwisu w sites, a następnie umieścić
<VirtualHost *:80> pomimo, że korzysta z tej samej co inne w nim dostosowany do tej witryny plik
DocumentRoot /var/www
instalacji systemu Drupal. Ponadto w za- setttings.php.
ServerName www.example.com
</VirtualHost> leżności od potrzeb, poszczególne serwisy Nazwy tych podkatalogów zawierać
<VirtualHost *:80> mogą korzystać z całkowicie niezależnych, muszą nazwę poddomeny (vhost) dome-
DocumentRoot /var/www częściowo wspólnych, bądź całkowicie ny, numer portu (tylko w przypadku, gdy
ServerName rock.example.com wspólnych tabel w bazie danych. jest on inny niż 80) oraz nazwy folderów
</VirtualHost>
na danym serwisie. Poszczególne części
<VirtualHost *:80>
DocumentRoot /var/www Jak działa instalacja składające się na taką nazwę oddzielone
ServerName blues.example.com wielowitrynowa są kropkami. Dotyczy to również numeru
</VirtualHost> Podstawowym mechanizmem stojącym portu, który zazwyczaj oddzielamy dwu-
za instalacją wieloserwisową jest sposób kropkiem.
Węzeł (ang. node) – zawartość naszego serwisu przechowywana jest w węzłach; ist- Tworzenie tabel w bazie danych
nieje szereg typów węzłów, takich jak: strona, wpis w blogu, ankieta czy też zdarzenie.
Blok (ang. block) – niewielki fragment zawartości, umieszczany zwykle po lewej lub Kolejnym krokiem jest stworzenie tabel dla
prawej stronie strony serwisu. Jako przykłady można wymienić Kto jest zalogowany każdego serwisu w bazie danych. Mamy
lub Najświeższe komentarze. tutaj kilka możliwości. Jeżeli chcemy, by
Moduł (ang. module) – rozszerzenie Drupala (napisane w PHP), dodające do nasze- żadna z tabel nie była dzielona między
go serwisu określoną funkcjonalność.
Taksonomia (ang. taxonomy) – pozwala porządkować zawartość naszego serwisu serwisami, tj. żeby były one od siebie cał-
według kategorii bądź znaczników. kowicie niezależne, po prostu tworzymy
Motyw (ang. theme) – przesłania możliwe do modyfikacji funkcje Drupal, zapewnia- osobną bazę dla każdego serwisu:
jąc unikalny wygląd naszego serwisu.
Silnik motywów (ang. theme engine) – każdy motyw wymaga odpowiedniego silnika
motywów. Domyślnym jest PHPTemplate, ale możemy skorzystać z innych, jak np. mysql -u dbuser -p database1 §
XTemplate czy Smarty. < database/database_1.mysql
mysql -u dbuser -p database2 §
< database/database_2.mysql
W przypadku naszego przykładowego by działały w nim hosty wirtualne. Ponie-
portalu, struktura katalogów i plików dla waż używamy Apache'a, którego drzewo W przeciwnym przypadku dzielone będą
serwisów www.example.com, blues.exam- dokumentów znajduje się w /var/www, mu- wszystkie tabele, a wszystkie serwisy bę-
ple.com i rock.example.com powinna wy- simy dodać do naszego pliku /etc/apache/ dą miały identyczne ustawienia, motywy
glądać następująco: httpd.conf zawartość Listingu 1. graficzne, treść itd. Wystarczy nam wtedy
Spowoduje to skierowanie poddomen: pojedyncza baza dla wszystkich serwisów:
sites/example.com/settings.php, www, rock oraz blues do naszego drzewa
sites/rock.example.com/settings.php, dokumentów, w którym zainstalujemy mysql -u database_user_name -p §
sites/blues.example.com.subdir/ pojedynczą kopię kodu Drupal, mającą db_for_all < database/database.mysql
settings.php. obsługiwać wszystkie nasze serwisy. Opi-
sany scenariusz wieloserwisowy powinien W przypadku naszego portalu muzycznego
Jeżeli serwis ma być dostępny zarówno ja- działać także w przypadku większości skorzystamy z oferowanych przez Drupal
ko example.com jak i www.example.com, dzielonych kont hostingowych. Konieczne możliwości pracy z prefiksami tabel. Tabele
zaleca się utworzenie katalogu o nazwie może okazać się jednak pozostawienie dla wszystkich podserwisów naszej witryny
example.com. konfiguracji poddomen administratoro- będą przechowywane w jednej bazie, ale
wi, albo skorzystanie z udostępnionego ich nazwy będą się zaczynały odpowied-
Konfiguracja poddomen przez niego w tym celu interfejsu webo- nimi przedrostkami. Pozwoli to wyraźnie
Przejdźmy teraz do stworzenia opisanych wego, gdyż przeważnie nie będziemy określić, do którego serwisu należy dana
poddomen. W tym celu zmodyfikujemy mieli dostępu do pliku httpd.conf. Jeżeli tabela. Chcąc uniknąć zbędnych kompli-
konfigurację naszego serwera WWW tak, żadne z tych rozwiązań nie jest możliwe, kacji, nadamy tabelom głównego serwisu
przedrostek shared_ (jako, że część
z nich będzie dzielona z innymi serwisa-
mi). Tak więc, serwis rock.example.com
otrzyma prefiks rock_, a blues.exam-
ple.com – blues_. Aby uzyskać taki re-
zultat, użyjemy najpierw skryptu prefix.sh
z katalogu scripts/, który nada odpowiednie
przedrostki nazwom tabel z pliku database/
database.mysql, a następnie załadujemy
tabele do bazy danych:
oraz:
Rysunek 1. Strona ustawień Drupal pozwala nam modyfikować rozmaite aspekty Patrząc na polecenia SQL, plik databa-
naszego serwisu se.mysql.shared zawiera teraz linijki takie,
jak CREATE TABLE shared_users zamiast podania w tych plikach odpowiednich na sztywno ustawić pewne parametry po-
wcześniejszej CREATE TABLE users, pod- wartości zmiennych $base_url, $db_url szczególnych serwisów. W szczególno-
czas gdy w database.mysql.rock znajduje i $db_prefix. Zmienna $base_url zawiera ści, Drupal pozwala nam na przesłonienie
się polecenie CREATE TABLE rock_users, główny URL danego serwisu (np. http:// dowolnych spośród swoich zmiennych
itd. Teraz, kiedy nazwy tabel w każdym pli- rock.example.com), podczas gdy $db_url konfiguracyjnych (przechowywanych
ku mają odpowiednie przedrostki, możemy wskazuje na miejsce przechowywania pa- zwykle w tabeli variable w bazie da-
załadować je do naszej bazy MySQL: rametrów serwisu w bazie. nych) przy wykorzystaniu następującej
W przypadku naszego portalu, konstrukcji:
mysql -u dbuser -p dbname § wszystkie serwisy korzystają z tej samej
< database.mysql.shared bazy, więc wartość $db_url jest identycz- $conf = array(
mysql -u dbuser -p dbname § na we wszystkich plikach settings.php. 'site_name'=>
< database.mysql.rock Zmienna $db_prefix zawiera tablicę 'Rock music discussion site',
asocjacyjną kojarzącą nazwy tabel z ich 'theme_default'=>'pushbutton',
oraz: przedrostkami (patrz ramka Zawartość 'comment_preview'=>'1'
plików settings.php). Jeżeli nie chcemy );
mysql -u dbuser -p dbname § dzielić żadnych tabel, $db_url zamiast
< database.mysql.blues tablicy będzie zawierać łańcuch, np. W powyższym przykładzie definiujemy
prefix_, albo "" (pusty tekst), jeżeli nie własną nazwę serwisu oraz jego domyśl-
Konfiguracja serwisów chcemy w ogóle stosować przedrostka. ny motyw graficzny, a także ustawiamy
Ostatnim krokiem instalacji wieloserwiso- Należy pamiętać, że chcemy zaim- funkcjonalność podglądu publikowanych
wej jest edycja każdego pliku settings.php plementować wspólne logowanie do komentarzy na wymaganą. Oprócz wła-
tak, by jego treść odpowiadała wyma- wszystkich serwisów naszego portalu, snego pliku settings.php, każdy serwis
ganiom danego serwisu. W wariancie a więc część tabel będzie dzielona. może mieć swoje katalogi modules/
minimalnym oznacza to konieczność Decyzja o tym, które tabele powinny i themes/. Pozwala to powiązać określone
być dzielone nie jest łatwa, ponieważ moduły i motywy graficzne z konkretnymi
wymaga ona bliższej znajomości we- serwisami. Wymienione foldery zakładamy
Zawartość plików wnętrznych mechanizmów działania sys- w odpowiednim dla danego serwisu kata-
settings.php temu Drupal i w dużym stopniu zależy od logu konfiguracyjnym, na przykład:
Oto istotne ustawienia znajdujące się
jego docelowej konfiguracji. Dla naszych
w pliku sites/www.example.com/settings.
php: potrzeb będziemy dzielić następujące ta- sites/rock.example.com/settings.php
bele: users, users_roles, sessions, role, sites/rock.example.com/modules
$base_url="http://www.example.com"; authmap, sequences, profile_fields oraz sites/rock.example.com/themes
$db_url="mysql://database_user:
profile_values.
database_password@database_host/
database_name";
Oprócz zdefiniowania zmiennych Teraz, kiedy już zakończyliśmy instalację
$db_prefix = "shared_"; $base_url, $db_url i $db_prefix, w odpo- wieloserwisową, przejdziemy do konfigu-
wiednich plikach settings.php możemy rowania naszego portalu.
Dla odmiany, w sites/rock.example.com/
settings.php będziemy mieli:
$base_url="http://rock.example.com";
$db_url= ...;
$db_prefix = array(
'default' =>'rock_',
'users' =>'shared_',
'users_roles' =>'shared_',
'sessions' =>'shared_',
'role' =>'shared_',
'authmap' =>'shared_',
'sequences' =>'shared_',
'profile_fields' =>'shared_',
'profile_values' =>'shared_',
);
$base_url=
"http://blues.example.com";
$db_url = ...;
$db_prefix = array(
'default' => 'blues_'
...
); Rysunek 2. Strona parametrów motywów pozwala nam włączyć jeden lub więcej
motywów, a także wybrać jeden z nich jako domyślny dla danego serwisu
Podstawowa
konfiguracja
Czas utworzyć naszego pierwszego
użytkownika. Po wejściu na stronę http://
www.example.com, klikamy na Utwórz
nowe konto w bloku Logowanie po lewej
stronie ekranu. Pierwszy stworzony przez
nas użytkownik, niezależnie od nadanej
mu nazwy, będzie administratorem po-
siadającym uprawnienia do wykonywania
wszelkich operacji na serwisie.
Po zalogowaniu się na to konto, pod
zakładką zarządzaj –> ustawienia zmieni-
my kilka podstawowych ustawień, takich
jak nazwa serwisu (Portal muzyczny).
Ustawimy też opcję Raportowanie błędów
na Zapisuj błędy do dziennika, nie chcemy
bowiem pokazywać użytkownikom na-
szych wewnętrznych błędów.
Uaktywnimy także opcję Czyste URL-
e, aby uzyskać ładniej wyglądające adresy Rysunek 3. Korzystając z podstawowych odnośników definiujemy menu w prawym
URL i włączymy wbudowany mechanizm górnym rogu serwisu
pamięci podręcznej, aby zwiększyć wy-
dajność. Warto pamiętać, że ponieważ pojawiał się komunikat napisany przez profile – pozwala nam określić jakie
dzielimy między bazami tylko tabelę users użytkownika <nazwa> dnia <data>, nie pola powinien zawierać profil użytkow-
oraz tabele z nią powiązane, parametry te chcemy widzieć go na stronach statycz- nika, np. imię, dzień urodzenia, e-mail,
nie będą wspólne dla wszystkich serwi- nych, takich jak O .... W tym celu wyłączy- ulubione zespoły, itd.
sów. Nasze ustawienia przedstawiamy na my opcję Włącz wyświetlanie informacji nt. blog – daje każdemu z zarejestrowa-
Rysunku 1. wypowiedzi dla węzłów typu strona. nych użytkowników możliwość posia-
dania bloga. Przykładowo, URL-em
Motywy graficzne Moduły bloga użytkownika naszego serwisu
Do dystrybucji systemu Drupal dołączono Rozszerzymy teraz funkcjonalność nasze- o nazwie 23 to http://www.example.com/
kilka motywów graficznych. Więcej może- go portalu, włączając na stronie zarządzaj blog/23. Dodatkowo, automatycznie
my znaleźć pod adresem http://drupal.org/ -> moduły (patrz Rysunek 4) kilka dodat- i bez żadnych dodatkowych działań
project/Themes. Procedura ich instalacji kowych, dołączonych do pakietu Drupal otrzymujemy blog grupowy (gdzie
jest całkiem prosta: należy pobrać odpo- modułów: agregowane są posty wszystkich użyt-
wiedni plik spod adresu drupal.org i rozpa-
kować go do katalogu themes/. W naszym
głównym portalu wykorzystamy domyślny
motyw graficzny, za to dla podstron dla
poszczególnych gatunków muzyki pobie-
rzemy i zainstalujemy inne; przykładowo,
na rock.example.com wykorzystamy mo-
tyw FriendsElectric, rozpakowując go do
katalogu sites/rock.example.com/themes/
friendselectric. Następnie wybierzemy
odpowiedni motyw za pomocą menu
zarządzaj –> motywy graficzne (patrz
Rysunek 2).
Korzystając z zarządzaj –> motywy
graficzne –> konfiguruj możemy też zała-
dować własne logo oraz obraz favicon dla
naszego serwisu. Natomiast aby wyświe-
tlać linki O ..., FAQ i Kontakt (patrz Rysu-
nek 3) wykorzystamy listę podstawowych
odnośników, podając ich nazwy i względne
URL-e. Oczywiście, musimy stworzyć od-
powiednie strony! Wreszcie, o ile chcemy, Rysunek 4. Strona przeglądu modułów Drupal pokazuje wszystkie zainstalowane
by we wpisach w blogach i komentarzach moduły
Tworzenie zawartości
Nadeszła pora, by rozpocząć tworzenie
Rysunek 6. Tworzymy prostą stronę z treścią zawartości naszego serwisu. Będzie to
statyczna strona O ... informująca, jaką
Optymalizacja pod
kątem wyszukiwarek
Ponieważ chcemy, by nasz serwis
zajmował jak najwyższe pozycje w wy-
szukiwarkach internetowych, a jego po-
pularność ciągle wzrastała, istotnym
zagadnieniem jest dla nas optymalizacja
pod kątem wyszukiwarek (SEO).
Pathauto
Kolejne usprawnienia w tej dziedzinie
zapewnia nam zewnętrzny moduł pa-
thauto, wymagający standardowego
modułu path. Pozwala on na elastyczną
automatyzację generacji aliasów ścieżek
dla węzłów, wpisów do blogów, stron
użytkowników, terminów taksonomii (ka-
tegorii bądź znaczników) i wielu innych.
Główną ideą tego modułu jest, by za-
miast ręcznie wprowadzać alias ścieżki
podczas tworzenia węzła, jednorazowo
podawać wzorzec ścieżki pod zarządzaj
–> ustawienia –> pathauto. Od tej pory,
tworząc nowy węzeł po prostu pozosta- Rysunek 15. Dialog parametrów pathauto
R E K L A M A
K
ażdy, kto interesuje się PHP i jego ki nim programista nie musi martwić się
rozwojem zdążył zauważyć, że o sposób fizycznego rozmieszczenia da-
wielkie firmy informatyczne, takie nych w różnych źródłach. Dane, wchodzą-
jak Oracle czy IBM zaczęły traktować ten ce do obiektów DAS i z nich wychodzące,
język i otaczające go środowisko progra- mają postać drzewa obiektów SDO. Bez
mistów bardzo poważnie. Świadczą o tym względu na fakt, czy operujemy na danych
chociażby specjalnie przygotowane wersje pochodzących z plików XML, czy też rela-
PHP dla baz danych Oracle i DB2. Dzięki cyjnej bazy danych, otrzymywane przez
temu, nie tylko PHP wkracza w świat apli- nas obiekty są identyczne.
kacji klasy Enterprise, ale także technolo- Pokażemy, w jaki sposób wykorzystać
gie wywodzące się z rozwiązań tej klasy SDO do stworzenia prostej aplikacji służą-
W SIECI wkraczają do PHP. Tak też stało się z SDO. cej do administracji i prezentacji systemu
SDO to skrót od Service Data Objects. Jest newsów na stronie WWW. Newsy będą
nazwą architektury stworzonej przez IBM podzielone na kategorie, a każdy z nich
1. http://pecl.php.net/package/ i BEA, mającej na celu ułatwić, czy wręcz będzie mógł należeć do jednej kategorii.
sdo – pakiet SDO w repozy-
torium PECL ujednolicić dostęp do danych pochodzących
2. http://us2.php.net/manual/ z wielu różnych źródeł. Dzięki niej, progra-
en/ref.sdo.php – rozsze-
miści będą mogli, poprzez spójny interfejs,
Co należy wiedzieć...
rzenie SDO – oficjalna Powinieneś znać podstawy MySQL-a
dokumentacja PHP zarządzać danymi m.in. z relacyjnych baz i programowania obiektowego.
3. http://www.zend.com/pecl/
danych, plików XML czy Web Services.
tutorials/sdo.php – tutorial
o SDO Spójrzmy na Rysunek 1, na którym Co obiecujemy...
4. http://www.ibm.com/ Po przeczytaniu artykułu będziesz wie-
przedstawiamy schemat architektury SDO.
developerworks/webservices dział jak wykorzystać SDO do stworzenia
– specyfikacje technologii Za dostęp do źródeł odpowiedzialne są prostego systemu newsów.
SDO obiekty DAS (Data Access Service). Dzię-
PHP i SDO
SDO powstało z myślą o platformie J2EE.
Jednak dzięki dużemu zainteresowaniu
IBM-a technologią PHP i porozumieniu
������
z ZEND Technologies, zostało ono włą-
czone również do PHP. Obecna imple-
mentacja nie jest tak dopracowana, jak
������ ��������������� ��� �������������
wydanie dla Javy i nie osiągnęła nawet
statusu wersji stabilnej. Dostępna jest
jedynie jako rozszerzenie PECL (PHP
�����
Extensions Community Library). Ponad-
to, do swojego poprawnego działania
wymaga parsera PHP w wersji 5.1, który
w czasie pisania tego artykułu również nie
był dostępny w wersji stabilnej. Rysunek 1. Architektura SDO
Mimo wczesnego stadium rozwoju,
SDO dla PHP pozwala już zarządzać warstwa obiektów DAS. Ukrywa ona Aktualna implementacja obiektów
danymi pochodzącymi z bazy danych przed programistą szczegóły implemen- DAS ma, niestety, szereg ograniczeń.
i plików XML. Niestety, aktualna imple- tacji związane z komunikacją ze źródłami Najważniejsze z nich to m.in. obsługa
mentacja ma szereg ograniczeń, o któ- danych. W przybliżeniu, jest to rozszerze- jedynie dwóch silników bazodanowych:
rych szczegółowo napiszemy w dalszej nie koncepcji warstwy dostępu do danych, DB2 i MySQL, czy możliwość zdefinio-
części artykułu. często spotykanej w korzystających z baz wania tylko jednego (jednopolowego)
danych aplikacjach PHP. klucza głównego na tabelę oraz brak
Tajemnice drzewa Twórcy specyfikacji DAS poszli krok transparentnej obsługi relacji typu wiele-
obiektów SDO dalej i nie tylko ujednolicili dostęp do baz do-wielu. To ostatnie oznacza, że model
Tajemnicę swojego działania SDO ukry- danych, ale zadbali także, aby w podobny SDO nie przewiduje przechowywania
wa w koncepcji tzw. grafów danych (ang. sposób można było się komunikować z in- informacji o relacji pomiędzy danymi
data graphs). Mówiąc najprościej, dane nymi źródłami, np. plikami XML. To ostat- z dwóch tabel w tzw. tabeli relacji.
są zorganizowane w postaci drzewia- nie jest szczególnie przydatne podczas
stych struktur obiektów. Przykładowo, eksportu danych z bazy oraz ich importu. Instalacja
jeżeli dane, z którymi aktualnie pracuje- Wymiana danych z bazami odbywa rozszerzenia SDO
my, pochodzą z bazy, to każdy z obiek- się z wykorzystaniem rozszerzenia PDO. Procedura instalacji zależy od platformy
tów SDO odpowiada jednemu rekordowi Do komunikacji z plikami XML zaprzęgnię- systemowej. W przypadku Windows, po-
w określonej tabeli znajdującej się to natomiast rozszerzenie SimpleXML. My bieramy ze strony PHP ostatnią skompi-
w tej bazie. Natomiast relacje pomiędzy skupimy się na pokazaniu, w jaki sposób lowaną wersję PHP 5.1 (w czasie pisania
obiektami znajdującymi się w drzewie są SDO komunikuje się z bazą danych. artykułu była to wersja RC1) i zestaw
tożsame z relacjami w bazie danych (np.
jeden-do-wielu). Pełną koncepcję drzewa
SDO obrazuje Rysunek 2.
Poza drzewem danych, w osobnej ������
gałęzi w ramach struktury obiektów SDO
przechowywane są informacje o wszyst-
kich zmianach wykonanych na danych.
Dzięki temu, obiekty DAS mogą w prosty
sposób synchronizować źródła danych ������ ������
z drzewami obiektów. SDO zapewnia �������� �����
pełne API do zarządzania zmianami
w drzewie, co umożliwia nam tworzenie
własnych obiektów DAS.
Drzewo SDO posiada jeszcze jedną
ciekawą cechę: umożliwia przeszukiwanie
wszystkich dostępnych w drzewie obiek-
tów przy pomocy zapytań XPath.
są relacje, potrzebna jest jeszcze jedna Na Listingu 2. pokazujemy przykła- mieć tylko jedną relację (jeden klucz
tablica zawierająca informacje o kie- dową konfigurację dla tabel news_groups obcy). Na szczęście, w wielu prostych
runku tych relacji, tzn. która z tabel jest i news_contents. bazach danych, ograniczenia te nie mają
nadrzędna, a która podrzędna. Przypo- Patrząc na tablice konfiguracyjne, znaczenia. Ponadto, należy zakładać, że
mnijmy, że obecna implementacja obsłu- zauważamy jedne z największych bolą- w miarę rozwoju projektu, autorzy rozwiną
guje jedynie relacje jeden-do-wielu oraz czek obecnej implementacji SDO: klucz jego funkcjonalność również w tych dzie-
jeden-do-jednego. główny jest jednopolowy, a tablica może dzinach.
Skoro mamy już skonfigurowany
Listing 3. Skrypt dodający grupę newsów do bazy danych obiekt DAS, najwyższa pora utworzyć
kod, który zapisze grupę newsów do
<?php bazy danych. Odpowiedni skrypt z po-
require_once 'Relational.php'; minięciem mappingu przedstawiamy na
$dbConnection = new PDO('mysql:host=localhost;dbname=nazwa_bazy_danych',
Listingu 3.
'użytkownik','hasło');
$das = new SDO_DAS_Relational( array($newsGroupsMap,$newsContentsMap), Pierwszą operacją, jaką musimy
'news_groups',array( $newsContentsRelationsMap )); wykonać jest otwarcie połączenia do
$root = $das->createRootDataObject(); bazy danych. Pamiętajmy, że SDO
$newsGroup1 = $root->createDataObject('news_groups'); korzysta w tym celu z PDO. Po nawią-
$newsGroup1->ng_name = "Grupa Pierwsza";
zaniu połączenia tworzymy obiekt klasy
$newsGroup1->ng_description = "Opis dla pierwszej grupy";
$das->applyChanges($dbConnection, $root); SDO_DAS_Relational, który będzie odpo-
?> wiedzialny za zapisanie grupy newsów
do naszej bazy danych. Jako parametry,
Listing 4. Skrypt pobierający jeden rekord z bazy danych i modyfikujący go klasa ta musi otrzymać tablice konfi-
<?
gurujące wszystkie tabele, z którymi
require_once 'Relational.php'; będziemy się komunikować poprzez
$dbConnection = new PDO SDO, a także nazwę tabeli nadrzędnej
('mysql:host=localhost;dbname=nazwa_bazy_danych','użytkownik','hasło'); i tablicę z typami relacji pomiędzy tabe-
$das = new SDO_DAS_Relational( array($newsGroupsMap,$newsContentsMap),
lami. Nic nie stoi na przeszkodzie, aby
'news_groups', array( $newsContentsRelationsMap ) );
$root = $das->executeQuery($dbConnection, 'select * from news_groups where
dla każdej z tabel naszej bazy stworzyć
ng_id=1', array( 'news_groups.ng_id', 'news_groups.ng_name', osobne obiekty DAS. Pozbawiłoby nas
'news_groups.ng_description' ) ); to jednak możliwości jednoczesnego
$root['news_groups'][0]->ng_name = 'The future of GUIs for PHP'; zapisywania drzew obiektów, między
$das->applyChanges($dbConnection, $root);
którymi istnieje relacja.
?>
Wracając do przykładu: dwie naj-
Listing 5. Skrypt pobierający jeden rekord z bazy danych i kasujący go. Drugą ważniejsze klasy są już gotowe. Mu-
metodą usunięcia obiektu z drzewa jest przypisanie mu wartości null simy jeszcze utworzyć korzeń drzewa
obiektów SDO. Służy do tego metoda
require_once 'Relational.php';
createRootDataObject(), którą wywołu-
$dbConnection = new PDO
('mysql:host=localhost;dbname=nazwa_bazy_danych','użytkownik','hasło'); jemy na obiekcie DAS. Mając korzeń,
$das = new SDO_DAS_Relational( array($newsGroupsMap,$newsContentsMap), możemy teraz utworzyć obiekt news_
'news_groups', array( $newsContentsRelationsMap ) ); groups, który zapiszemy później do
$root=$das->executeQuery($dbConnection, 'select * from news_groups where bazy danych. Do tworzenia obiektów
ng_id=1', array( 'news_groups.ng_id', 'news_groups.ng_name',
w drzewie SDO, przeznaczona jest me-
'news_groups.ng_description' ) );
unset( $root['news_groups'][0] ); toda createDataObject(). Ma ona jeden
$das->applyChanges($dbConnection, $root); parametr: nazwę tabeli, dla której należy
utworzyć obiekt. W naszym przypadku
Listing 6. Skrypt umożliwiający jednoczesne dodanie do bazy danych grupy jest to news_groups. Obiekt news_groups
i związanego z nią newsa
posiada atrybuty publiczne, których na-
$newsGroup = $root->createDataObject('news_groups'); zwy są tożsame z nazwami odpowiednich
$newsGroup->ng_name = "PHP-related news"; kolumn w tabeli news_groups, znajdującej
$newsGroup->ng_description = "The best news around the world of PHP"; się w bazie danych. Informacji o nazwach
$newsContent1 = $newsGroup->createDataObject('news_contents'); tych kolumn dostarcza SDO mapping.
$newsContent1->nc_subject = 'SDO is becoming popular';
Przypisując tym atrybutom odpowiednie
$newsContent1->nc_lead = 'SDO or Service Data Objects is gaining more and more';
$newsContent1->nc_content = 'the content of article on SDO'; wartości możemy stworzyć pożądany
$newsContent2 = $newsGroup->createDataObject('news_contents'); obiekt. Aby zapisać go do bazy danych,
$newsContent2->nc_subject = 'AJAX and PHP'; należy na obiekcie DAS wykonać metodę
$newsContent2->nc_lead = 'AJAX is a solution for the interactive web pages'; applyChanges(). Ma ona dwa parametry:
$newsContent2->nc_content = 'the content of the article';
obiekt PDO i drzewo obiektów SDO.
$das->applyChanges($dbConnection, $root);
Tak oto, w siedmiu linijkach kodu,
bez napisania choćby jednego polecenia
zapytania. Jego rozwiązanie pokazujemy Na zakończenie pokażemy jeszcze, ju, jego funkcjonalność jest imponująca.
na Listingu 7. jak skasować grupę i związane z nią Miejmy nadzieję, że już wkrótce jego
Pomijając oczywiście operacje związa- newsy. Jest to bardzo proste, ponie- autorzy wydadzą wersję stabilną, która
ne z konfiguracją połączenia i klasy DAS waż wystarczy pobrać grupę wraz ze będzie pozbawiona obecnych manka-
widzimy, że wszystko, co musimy napisać, związanymi z nią newsami (wszystkimi) mentów. Warto pamiętać, że pomijając
zawiera się w jednej linii kodu! i wykonać na niej funkcję unset() lub wymienione ograniczenia, już obecnie
Metoda executeQuery() potrzebuje przypisać do niej wartość null. Jeżeli kod biblioteki SDO jest bardzo solidny.
dwóch parametrów: połączenia do bazy pobierzemy samą grupę, to SDO będzie Zachęcamy więc do własnych ekspe-
danych i zapytania SQL. Trzeci para- próbowało skasować jedynie ją. Nie jest rymentów i zapraszamy do następnego
metr jest opcjonalny, wymagany jedynie to oczywiście problemem, gdy pracuje- artykułu o technologiach SDO i XML,
w sytuacjach, gdy nazwa którejkolwiek my na bazie wyposażonej w mechanizm który ukaże się w kolejnym numerze
kolumny występuje dwa razy w mappin- kluczy obcych. Jeżeli jednak nasza PHP Solutions. n
gu. Taka sytuacja ma miejsce w naszym baza danych to np. MySQL, a tabele
przykładzie: kolumna ng_id pojawia na których operujemy, są w formacie
się zarówno w tabeli news_groups, jak MyISAM, to usunięcie samej grupy
i news_contents. Fakt, że są to inne ta- powiedzie się, ale dane w bazie będą
bele, nie ma znaczenia. Jeżeli więc nie niespójne. Skrypt ilustrujący kasowanie O autorze
chcemy podawać trzeciego parametru, grupy wraz z newsami pokazany jest na
musimy pamiętać, aby w naszym mo- Listingu 8. Piotr Szarwas jest pracownikiem SU-
PERMEDIA Interactive i doktorantem
delu nie powtarzała się nazwa żadnej na wydziale Fizyki Politechniki War-
kolumny. Wystarczy więc przyjąć odpo- Podsumowanie szawskiej. Od 2003 roku projektuje
wiednią strategię nazewnictwa. Rezul- Budując prostą bazę danych dla sys- aplikacje WWW w oparciu o PHP4/5.
tatem wykonania tego kodu jest drzewo temu newsów, pokazaliśmy możliwości Obecnie zajmuje się tworzeniem frame-
worka dla PHP opartego na rozwiąza-
obiektów SDO, które przedstawiamy na drzemiące w SDO. Mimo, że rozszerze- niach Hibernate i Spring.
Rysunku 4. nie to znajduje się ciągle w fazie rozwo-
R E C E N Z J A
Jestem nieco znudzony ofertą polskich wydań książek o PHP, pewnie dlatego również po tę pozycję sięgałem niechętnie. Przypuszcza-
łem, że będzie to materiał podobny do bardzo dobrej książki PHP Zaawansowane programowanie. Vademecum profesjonalisty autor-
stwa Georga Schlossnagle’a, tyle że z większym naciskiem na PHP5. Na szczęście PHP5 Zaawansowane programowanie okazało się
inne. Dużo inne. Książka nie stanowi vademecum profesjonalisty – nie przeczytamy w niej (w sposób encyklopedyczny) o wszystkich
zaawansowanych cechach języka PHP. Przeczytamy w niej o profesjonalnym podejściu do tworzenia złożonych aplikacji w PHP5.
Autorzy skupili się na dogłębnym opisaniu modelowania w UML, korzystania ze wzorców projek-
towych, testowania aplikacji (PHPUnit) czy tworzenia własnego warsztatu programisty – narzędzi
które będzie można wielokrotnie wykorzystać w każdym projekcie.
Bardzo ciekawa jest część (ponad 200 stron) opisująca Studium przypadku – automatyzacja
działu sprzedaży. Dowiemy się, jak podejść do dużego projektu informatycznego i jak nim zarzą-
dzać. Omówione zostaną pojęcia planowania i architektury systemu. Razem z autorami stworzymy
aplikację automatyzującą pracę zespołu sprzedaży i solidną platformę raportującą.
Szczerze poleciłbym tę książkę programistom PHP, którzy mają już za sobą kilka projek-
tów w PHP, ale chcą zacząć tworzyć aplikacje w sposób bardziej profesjonalny – przemyślany,
solidny i wydajny. Jeśli planujesz wykonanie większego projektu lub nie wierzysz (nie znasz)
w PHP5, a szukasz dobrej platformy programistycznej do tworzenia aplikacji WWW – ta lektura
jest dla Ciebie.
Dariusz Pawłowski
A
JAX pozwala stworzyć dodatkowy asynchronicznej wymiany danych. Techni-
kanał komunikacji między klientem ki te są łączone w jedną całość za pomocą
a serwerem PHP, a tym samym JavaScriptu, odpowiedzialnego za logikę
wysyłać i odbierać dane bez przeładowy- aplikacji i dynamiczną aktualizację interfej-
wania strony. Otwiera to zupełnie nowe su użytkownika stosownie do potrzeb.
możliwości, a w połączeniu z operacjami Pomimo XML w nazwie, AJAX nie-
na modelu DOM z poziomu JavaScriptu, koniecznie wymaga używania formatu
oznacza nadejście ery bogato wyposażo- XML do wymiany danych. Poza XML-em
W SIECI nych, interaktywnych aplikacji PHP, wol- obsługiwane są między innymi zwykły
nych od irytującego klikania i czekania. tekst, sformatowany HTML (dodawany
W tym artykule przedstawimy prak- do bieżącej strony poprzez właściwość
1. http://sourceforge.net/
projects/jpspan/ – strona tyczne wprowadzenie do techniki AJAX innerHTML) oraz format JSON (JavaScript
główna projektu JPSpan na przykładzie dwóch bibliotek PHP i nie-
2. http://pear.php.net/package/
wielkiej aplikacji o działaniu podobnym do
HTML_AJAX/ – strona głów- Powinieneś wiedzieć...
na pakietu HTML_AJAX Google Suggest. Powinieneś się dobrze orientować
3. http://www.google.com/
webhp?complete=1&hl=en w zasadach programowania obiektowe-
– Google Suggest Czym jest AJAX? go w PHP4 lub PHP5. Przyda się też
4. http://www.ajaxpatterns.org/ pewna znajomość JavaScriptu.
AJAX (skrót od Asynchronous JavaScript
– serwis poświęcony wzor-
com aplikacji AJAX And XML) jest nazwą nowej metody pro- Obiecujemy...
5. http://www.ajaxpatterns.org/ gramowania, łączącej kilka różnych tech- Po przeczytaniu artykułu będziesz znał
Suggestion – opis wzorca
w stylu Google Suggest nik: (X)HTML i CSS do tworzenia interfej- zasadę działania i stosowania techniki
6. http://blog.joshuaeichorn. su użytkownika, DOM (Document Object AJAX oraz śledzenia kodu. Pokażemy
com/archives/category/php/ też możliwości bibliotek implementują-
ajax – blog Joshuy Eichorna
Model) do obsługi elementów dynamicz- cych tę technikę.
poświęcony AJAX-owi nych i interakcji oraz XMLHttpRequest do
����
nego innego formatu danych dającego się ������������������ ���
obsłużyć w JavaScripcie i PHP.
����������������
AJAX-a można najprościej zde-
finiować jako metodę wykorzystania ��������������
������������������������
JavaScriptu do komunikacji z serwerem ������������ ����
niezależnie od tradycyjnych żądań POST ������������������
������
i GET. Strona techniczna jest tu jednak
�������������������
mniej istotna – najważniejsze są zupełnie ���������������
nowe możliwości tworzenia aplikacji inter-
netowych.
��������������
Podstawą pracy AJAX-a jest obiekt ������������������������
����
XMLHttpRequest, stanowiący standar- �������������
������������������
dowy element wielu przeglądarek. Jeśli
������
postanowisz dodać obsługę AJAX-a do �������������������
swojej aplikacji za pomocą biblioteki, ���������������
���
������������������ wyłącznie żądania pobierające nowe, po-
�����������������
trzebne dane, a odpowiedź serwera jest
przetwarzana przez JavaScript po stronie
��������������������� klienta. Dzięki wprowadzeniu tej dodatko-
wej warstwy JavaScriptu, przetwarzanie
danych nie spowalnia działania interfejsu
������������������
��������������������� ���� użytkownika. Cała aplikacja działa znacz-
nie szybciej, gdyż między serwerem,
��������������������
������������������� a klientem przesyłanych jest nieporów-
����������������������� nanie mniej danych, a spora część prze-
twarzania odbywa się po stronie klienta
(Rysunek 2).
Praktycznie rzecz ujmując, stworze-
Rysunek 1. Przepływ danych w tradycyjnej aplikacji internetowej nie aplikacji AJAX wymaga zatem dwóch
elementów: odpowiednich skryptów po Explorerze z wyłączoną obsługą ActiveX, z Flasha. Warto w tym miejscu zaznaczyć,
stronie klienta i specjalnego kanału komu- co często dotyczy na przykład kafejek że pomimo teoretycznej możliwości połą-
nikacji z serwerem. internetowych. Może się także zdarzyć, czenia zalet AJAX-a i Flasha w ramach
że aplikacja będzie działać nieco inaczej jednej aplikacji, złożoność takiego rozwią-
Zalety techniki AJAX w różnych przeglądarkach i na różnych zania jest na tyle duża, że lepiej używać
AJAX ma wiele zalet, z których najbardziej platformach, choć to samo dotyczy tych technik osobno.
zauważalną jest znaczące rozszerzenie tworzenia tradycyjnych aplikacji interne-
zakresu możliwości interfejsu użytkowni- towych. Wykorzystanie bibliotek
ka. Jednak samo w sobie to nie wystar- AJAX oferuje spore możliwości inte- Istnieje wiele bibliotek narzędziowych
czy – w końcu istnieje też wiele innych rakcji, ale do wielu zadań po prostu się mających na celu ułatwienie integracji Ja-
technologii o zbliżonych możliwościach. nie nadaje, na przykład do dynamicznego vaScriptu i PHP. Wszystkie uwzględniają
O wyjątkowości AJAX-a stanowi przede rysowania elementów czy obsługi anima- jakąś metodę przesyłania danych, ale
wszystkim to, że bazuje on na uznanych cji – w takich sytuacjach lepiej korzystać większość oferuje dodatkowe możliwości,
standardach, więc w przeciwieństwie do
innych narzędzi do tworzenia interaktyw- Listing 1. Serwer JPSpan
nych aplikacji internetowych (na przykład
Flasha) można go z łatwością wpasować <?php
w istniejące procesy deweloperskie. Moż- session_start();
R E K L A M A
advAJAX,czyli praktyczne
zastosowanie technologii
AJAX
Łukasz Lach
O
technologii AJAX pisaliśmy już Do stworzenia naszych przykładów
w tym numerze PHP Solutions, wykorzystamy napisany przez autora tego
w artykule AJAX – wyjątkowo artykułu obiekt języka JavaScript o nazwie
interaktywne i wydajne aplikacje WWW. advAJAX (ang. Advanced AJAX, http://
Teraz zajmiemy się jej praktycznym wy- advajax.anakin.us). Obiekt advAJAX uła-
korzystaniem i stworzymy kilka przykła- twia korzystanie z opisywanej technologii
dów obrazujących jej możliwości. Jak już i znacznie rozszerza jej możliwości, doda-
wiemy, główną zaletą AJAX-a jest to, że jąc m.in. pełną obsługę formularzy HTML,
pozwala on na dokonywanie zmian w in- przedawnień czasu połączeń, kontrolę
terfejsie użytkownika po stronie przeglą- nad pamięcią tymczasową przeglądarki
darki, bez potrzeby przeładowywania całej czy kontrolę nad kilkoma wywołaniami
strony i ponownego wczytywania arkuszy AJAX jednocześnie, za pomocą systemu
CSS czy plików graficznych.
Zyskuje na tym atrakcyjność serwisu,
Powinieneś wiedzieć...
gdyż możemy uczynić go dynamicznym, Powinieneś znać języki JavaScript i PHP.
jak i jego wydajność, ponieważ AJAX Pomocna w zrozumieniu technologii adv-
W SIECI umożliwia nam przesyłanie jedynie AJAX będzie również lektura artykułu
niewielkiej porcji danych (zamiast całej AJAX – wyjątkowo interaktywne i wy-
dajne aplikacje WWW.
strony WWW) pomiędzy serwerem,
1. http://advajax.anakin.us/
– projekt advAJAX
a klientem. To z kolei oznacza skrócenie Obiecujemy...
2. http://www.ajaxpatterns.org/ czasu ich dostarczania i zmniejsza ob- Po przeczytaniu artykułu będziesz wie-
– strona o wzorcach AJAX-a ciążenie serwera. Przesyłane za pomocą dział, jak korzystać z obiektu advAJAX
3. http://www.w3schools.com/ i z jego pomocą tworzyć aplikacje inter-
jsref/default.asp – dokumen- AJAX-a dane mogą mieć dowolny format,
netowe wykorzystujące AJAX-a.
tacja języka JavaScript np. CSV albo XML.
System
bezpiecznego logowania
Niemal każdy serwis tworzony w PHP
zawiera panel administracyjny, za pomocą
którego zarządzamy jego zawartością. Nie-
odłączną częścią panelu administracyjnego
jest formularz logowania, który umożliwia
dostęp wyłącznie uprawnionym użytkowni-
kom. Potrzebujemy więc przesyłać nazwę
użytkownika i hasło, co pociąga za sobą
ryzyko przechwycenia tych danych przez
osoby niepowołane. Stosowanie połączeń
szyfrowanych SSH zmniejsza to zagroże-
nie. My postąpimy inaczej: wykorzystując
AJAX-a stworzymy system bezpiecznego
logowania, który nie używa SSH.
Jak już wiemy, zastosowanie techno-
logii AJAX uwalnia nas od konieczności Rysunek 1. System bezpiecznego logowania
przeładowywania całej strony. W przypad-
ku systemu logowania, potrzebujemy jedy- mularza. Jej pierwszym parametrem jest to loginForm. Drugim jest nieposiadają-
nie wysłać na serwer kilkadziesiąt bajtów, obiekt formularza, który ma zostać zmo- cy nazwy obiekt definiujący wywołanie
które składają się na nazwę użytkownika dyfikowany – w naszym przypadku jest – zestaw parametrów obiektu advAJAX.
i hasło. Odpowiedź serwera również bę-
dzie krótka: zamiast całego dokumentu
HTML, otrzymamy jeden bajt. Jest to
idealny przykład, pokazujący możliwości
optymalizacyjne AJAX-a.
Podstawą naszej pracy jest formularz
logowania, podobny do przedstawionego
na Listingu 1. W nagłówku widocznego
tam dokumentu HTML dołączamy trzy
skrypty w języku JavaScript. Pierwszy,
o nazwie advajax.js zawiera obiekt adv-
AJAX. W drugim, md5.js, umieszczone
zostały funkcje tworzące hash MD5,
które pozwolą nam na zakodowanie
hasła przed wysłaniem. Ostatni skrypt,
1.js, zawiera funkcję updateObjects(),
uruchamianą po załadowaniu dokumen-
tu. Umieszczony na stronie formularz,
któremu nadaliśmy unikalną nazwę
loginForm, przesyła dane do pliku 1.php.
Z pozoru jest to typowa strona logowania,
jednak po wywołaniu wspomnianej funkcji
updateObjects() wszystko się zmienia.
Funkcja ta wywołuje wewnętrzną
metodę obiektu advAJAX (patrz Listing
2) o nazwie assign(), która powoduje
włączenie funkcjonalności AJAX-a do for- Rysunek 2. Stronicowanie danych
Należy w tym miejscu wspomnieć, że nie Przyjrzyjmy się elementom wspo- hasła algorytmem MD5 oraz informuje
musimy nigdzie podawać adresu URL mnianego już obiektu, będącego dru- użytkownika, że pobierany jest wynik lo-
dokumentu, który ma zostać wywołany, gim parametrem metody assign(). gowania, umieszczając opis proszę cze-
jak również metody jego wysłania (POST Pierwszym z nich jest funkcja on- kać na przycisku służącym do wysyłania
lub GET), ponieważ są one automa- Initialization() – pozwala ona okre- formularza. Również w tej funkcji odczy-
tycznie pobierane z atrybutów action ślić akcję, która ma zostać wykonana tujemy hasło. Jest ono przechowywane
i method znacznika form. Omawiany przed rozpoczęciem głównych procedur przez pole password obiektu parameters
obiekt zadba także o to, żeby zabloko- pobierania dokumentu. Dostęp do obiek- (obj.parameters), z którego korzystamy
wać wszystkie pola formularza aż do za- tu możliwy jest poprzez jedyny parametr podobnie, jak z tablic asocjacyjnych
kończenia zapytania, aby użytkownik nie tej funkcji o nazwie obj. w PHP.
mógł dokonywać żadnych zmian w trak- W naszym skrypcie, funkcja Następnym elementem jest on-
cie wykonywania i pobierania wyniku. onInitialization() tworzy skrót (hasz) Complete(). Powinien on wskazywać
funkcję, która zostanie wywołana po
Listing 1. Formularz logowania zakończeniu pobierania dokumentu.
W tym miejscu bardzo istotne jest to, że
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/ wewnątrz tej funkcji nie wiemy, czy wy-
DTD/xhtml11.dtd"> wołanie zakończyło się powodzeniem.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
Funkcja, uruchamiana po udanym
<head> wywołaniu, znajduje się pod elemen-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> tem onSuccess(). Sprawdzamy w niej,
<script type="text/javascript" src="advajax.js"></script> czy logowanie zakończyło się sukce-
<script type="text/javascript" src="md5.js"></script> sem: jeśli tak, to wartością zmiennej
<script type="text/javascript" src="1.js"></script>
obj.responseText powinien być znak 1
</head>
(obiecany jeden bajt). W takim wypad-
<body onload="updateObjects()"> ku, przekierowujemy użytkownika na
<form method="post" action="1.php" id="loginForm"> stronę przeznaczoną dla administrato-
<label for="username">Nazwa użytkownika:</label> ra, a w innym wyświetlamy odpowied-
<input type="text" name="username" id="username" />
ni komunikat i proces się powtarza.
<br />
<label for="password">Hasło:</label> Warto wspomnieć, że ciasteczka są
<input type="password" name="password" id="password" /> obsługiwane przez advAJAX, tak więc
<br /> można bez problemu stworzyć sesję po
<input type="submit" value="OK" id="submitBtn" /> stronie serwera i będzie ona dostępna
</form>
tak samo, jak w sytuacji niekorzystania
</body>
</html> z AJAX-a.
Ostatni element o nazwie onError tak-
Listing 2. Dołączenie funkcjonalności AJAX-a do formularza HTML że wskazuje na funkcję, która ma zostać
wywołana w przypadku problemu z pobra-
function updateObjects() {
niem dokumentu (nie z połączeniem), np.
advAJAX.assign(document.getElementById("loginForm"), {
kiedy plik nie istnieje i serwer zwróci kod
onInitialization : function(obj) { 404 Not Found.
obj.parameters["password"] = hex_md5(obj.parameters["password"]); Jak widzimy, cały proces dołączenia
document.getElementById("submitBtn").value = "Proszę czekać...";
możliwości AJAX-a do naszego formula-
},
rza sprowadził się do wykorzystania jednej
onComplete : function() { metody. W efekcie otrzymaliśmy przyjaź-
document.getElementById("submitBtn").value = "OK"; niejszy dla użytkownika i bardziej opty-
},
malny i – co najważniejsze – bezpieczny
onSuccess : function(obj) { system logowania. Przedstawiamy go na
if (obj.responseText == "1") Rysunku 1.
document.location = "/admin"; else {
alert("Nieprawidłowa nazwa użytkownika lub hasło."); Stronicowanie danych
document.getElementById("password").value = "";
Jeśli w naszym serwisie umieszczamy
window.setTimeout("document.getElementById('password').focus();",
100); większe ilości danych, to koniecznością
} staje się ich wyświetlanie z podziałem
}, na strony zawierające po kilka lub
kilkanaście rekordów. W tradycyjnej
onError : function(obj) {
aplikacji webowej, każdorazowa zmiana
alert("Nie można nawiązać połączenia z serwerem, spróbuj później.");
} strony tej listy pociąga za sobą przełado-
}); wanie całego dokumentu HTML, mimo,
że modyfikacji ulega tylko jego główna
powoduje ukrycie przycisków nawigacyj- będącym instancją obiektu XMLDocument, Całość jest już w pełni funkcjonalna,
nych i wyświetlenie informacji, że trwa której kod również znajduje się na Li- jednak nic nie szkodzi na przeszkodzie,
pobieranie żądanych danych. Kiedy stingu 4. Aby dostać się do danych za- aby przedstawiony przykład rozbudować.
nastąpi wywołanie funkcji zapisanej wartych w pobranym dokumencie XML, Można dodać jeszcze jedną kolumnę,
pod onSuccess() powoduje uruchomienie korzystamy z wbudowanych metod DOM w której umieścimy hiperłącza pozwala-
metody parseRecords(), z parametrem (ang. Document Object Model). jące na usunięcie czy edycję wybranego
rekordu. Możliwości jest wiele, gdyż po-
Listing 4. Główny skrypt dynamicznej tabeli tencjał AJAX-a jest ogromny. Ostateczny
wynik zależy zaś wyłącznie od naszych
var maxPage; potrzeb.
function $(id) {
return document.getElementById(id);
Szybka edycja danych
} Ostatnim, równie przydatnym i efek-
tywnym przykładem będzie stworzenie
// Funkcja konwertująca dokument XML na kolejne wiersze tabeli edytora pozwalającego na zmianę tre-
function parseRecords(xml) { ści dokumentu bez przeładowywania
// Zapisanie danych bieżącej strony
strony, na której jest on wyświetlany.
with (xml.getElementsByTagName("records").item(0)) {
page = getAttribute("page")*1; Jego interfejs oprzemy na warstwach.
maxPerPage = getAttribute("max_per_page"); Edytor będzie uruchamiany po dwu-
startId = maxPerPage*page+1; krotnym kliknięciu na wybraną warstwę.
total = getAttribute("total")*1; Wówczas utworzona zostanie warstwa
maxPage = Math.ceil(total/maxPerPage);
zawierająca obiekt pola tekstowego
// ...wpisanie danych do stopki tabeli
} (textarea), do którego wpisana zo-
stanie treść edytowanego tekstu oraz
// Wpisanie danych rekordów do tabeli dwa przyciski, służące do zapisywania
d = $("dataTable"); i anulowania wprowadzanych zmian.
for (i = d.rows.length-1; i >= 0; i--)
Oczywiście edytor tego typu powinien
d.deleteRow(i);
record = xml.getElementsByTagName("record");
być dostępny jedynie, gdy zaloguje-
result = ""; my się jako administrator, dlatego też
for (i = 0; i < record.length; i++) { postaramy się maksymalnie ułatwić
tr = document.createElement("tr"); dołączenie jego kodu do istniejącej już
td = document.createElement("td");
strony. W tym celu stworzymy funkcję
td.innerHTML = startId + i;
tr.appendChild(td);
o nazwie assignEditor(), której para-
for (j = 0; j < 3; j++) { metrem jest unikalna nazwa identyfiku-
td = document.createElement("td"); jąca warstwę, wpisana w atrybucie id
td.innerHTML = record[i].childNodes[j].childNodes[0].nodeValue; dowolnego znacznika HTML. Pełny kod
tr.appendChild(td);
omawianej funkcji, jak i całego skryptu
}
d.appendChild(tr);
edytora znajduje się na Listingu 5.
} Istotną funkcją, którą stworzymy
return result; jest wywoływana w celu zapisania
} zmodyfikowanych danych na serwerze
saveData(). Tym razem korzystamy
// Główna funkcja wywołująca skrypt PHP i pobierająca dokument XML
function getRecords() {
z metody advAJAX.post(), ponieważ
advAJAX.get({ przesyłane dane mogą mieć większy
url : "2.php?p="+currentPage+"&s="+currentSort+"%20"+currentSortOrder, rozmiar, niż pozwala na to metoda GET.
onInitialization : function() { Również ta metoda przyjmuje jeden ar-
$("dataStats").innerHTML = 'Pobieranie danych...';
gument – parametry wywołania obiek-
$("btnPrev").style.visibility = $("btnNext").style.visibility =
$("btnFirst").style.visibility = $("btnLast").style.visibility =
tu advAJAX. Pierwszym elementem
"hidden"; jest url, wskazujący na skrypt 3.php,
}, który zapisze wyedytowane dane po
onSuccess : function(obj) { stronie serwera. Następnie mamy ele-
parseRecords(obj.responseXML);
ment parameters, omawiany już przy
}
},
skrypcie bezpiecznego logowania. Tym
razem przekazujemy unikalny identy-
onError : function(obj) { fikator edytowanego tekstu oraz jego
alert("Nie można nawiązać połączenia z serwerem, spróbuj później."); nową treść. Dostęp do tych zmiennych
});
uzyskamy poprzez tablicę $_POST
}
($_POST['id'] oraz $_POST['value'])
w skrypcie PHP. Funkcja zapisana
P
HP-GTK2 umożliwia połączenie Tak więc, w pierwszym menu bę-
funkcjonalności PHP5 i bibliote- dziemy mogli dodawać nowe produkty
ki Gtk-2.6. W artykule przyjrzy- (Dodaj), edytować już istniejące (Edytuj),
my się bliżej niezwykłym możliwościom wyczyścić całą bazę (Wyczyść), bądź
tej technologii na przykładzie aplikacji zakończyć działanie programu (Wyjdź).
umożliwiającej proste zarządzanie Korzystając z drugiego otworzymy prosty
przedmiotami (produktami) w sklepie. edytor tekstu, potencjalnie przydatny np.
Będziemy korzystać zarówno z nowo- do robienia notatek na temat naszych
ści, które pojawiły się w PHP-GTK2, zapasów. Trzecie natomiast będzie zawie-
jak i tych, które oferuje PHP5 (np. rało jedną opcję: Pomoc, wyświetlającą
nowy model obiektowy czy obsługa okno dialogowe O programie.
wyjątków). Dane będziemy składować Będziemy również potrzebowali okien
w bazie SQL. dialogowych m.in. dla opcji Wyczyść
po kliknięciu pozycji Edytuj w menu Plik. // Krótki tekst pomocy do umieszczenia w ekspanderze
Korzysta ona z klasy ProductList prze- $help = new GtkLabel;
chowywanej w pliku ProductList.class.php $help->set_alignment(0.2, 0.5);
(patrz Listingi 4 i 5). Nie musimy jej $help->set_markup('<b><u>Wypełnianie formularza</u></b>
Aby być w stanie wypełnić formularz, nie możesz pozostawić pól Kod,
dokładnie opisywać, więc podobnie jak
Opis i Cena pustymi...');
w przypadku poprzedniej metody, skon- $expander->add($help);
centrujemy się na jej najważniejszych $expander->set_expanded(true);
komponentach. $vbox->pack_start($expander, false, false);
Głównym zadaniem tej klasy jest wy- parent::add($vbox);
parent::show_all();
świetlenie edytowalnej listy wszystkich po-
}
siadanych przez nas produktów. W przy- // Metoda onSaveClick – Zapisuje dane z ekranu do bazy
padku edycji, dane mają być aktualizo- public function onSaveClick(){
wane bezpośrednio w bazie. Za wyświe- // odczyt danych z pól tekstowych i zapisywanie ich do bazy
tlanie listy będzie odpowiadał wprowa- $conn = sqlite_open('data.db');
$product->code = $this->entries[0]->get_text();
dzony w PHP-GTK2 widget GtkTreeView.
$sql = "INSERT INTO products (code, description, amount,
...
...
}
// Metoda Clear – czyści wszystkie pola formularza.
private function Clear(){
for ($n=0; $n<=5; $n++){
$this->entries[$n]->set_text('');
}
// ustawia kursor w pierwszym polu
parent::set_focus($this->entries[0]);
}
Rysunek 6. Autouzupełnianie
R E K L A M A
R
ynek usług hostingowych w Pol- więcej w czasie, gdy Google ogłosiło, że a jednocześnie są wciąż tańsze od na-
sce rozwija się dynamicznie. Do- planuje uruchomienie własnego serwera szych krajowych dostawców. Jednak
wodem na to są coraz lepsze pocztowego Gmail, oferującego zawrotną w perspektywie czasu, serwer ulokowa-
parametry usług oferowanych przez firmy, pojemność 1 GB, stało się jasne, że szy- ny poza granicami Polski może przestać
podczas gdy średnia cena hostingu wciąż kuje się w Polsce wojna o klienta. Usługi się opłacać.
maleje. Jeżeli planujemy zakup własnego hostingowe musiały bowiem nadążać za Jeszcze półtora roku temu providerzy
skrawka miejsca w sieci, warto zapoznać rodzimymi portalami, które zaoferowały bronili się rękami i nogami przed two-
się z przygotowanym przez nas porówna- bezpłatne skrzynki pocztowe, docelowo rzeniem zbyt wielkiej liczby kont e-mail,
niem usług najpopularniejszych polskich o pojemności 1 GB. czy podpinaniem wielu domen. Dziś
providerów internetowych. Co zabawne, zwiększenie pojemności standardem stało się wyrażenie „bez
Rok 2005 z pewnością możemy na- kont wcale nie równało się poniesieniu ograniczeń”, a na serwerze za kilkaset
zwać rokiem, w którym polski Internet roz- ogromnych nakładów finansowych. Więk- złotych można z powodzeniem urucho-
wijał się bardzo szybko. Motorem dla całej szość użytkowników nie wykorzystuje mić kilkanaście niezależnych serwisów
branży jest coraz powszechniejszy dostęp bowiem nawet 1% swojej powierzchni na internetowych.
Polaków do łącz szerokopasmowych. Fir- korespondencję. Zadziałał tu więc raczej
my telekomunikacyjne walczą o klientów, marketing. Kolejnym powodem, dla które- Jak powstało
co odbija się zarówno na cenie usług, jak go pośrednio obniżyły się ceny usług, było porównanie?
i coraz wyższej jakości łączy. Dziś rynek wejście usług hostingowych, z serwerami Tworząc swoisty ranking usług ho-
zaspokaja potrzeby zarówno tych, którzy zlokalizowanymi poza Polską. Miejsce na stingowych, za podstawowe kryterium
potrzebują szybkiego dostępu (liczonego takim serwerze było swego czasu sporo wzięliśmy statystyki ilości obsługiwanych
w MBPS), jak i tych, dla których podsta- tańsze, dlatego że serwery lokowano za domen przez każdego z providerów, ba-
wowym kryterium jest cena (już nie prze- oceanem. Na korzyść serwerów w USA zując na wynikach z witryny top100.pl.
kraczająca 100 zł). Coraz większa liczba działała różnica czasu. Gdy Amerykanie Usługi hostingowe bardzo ciężko jest
szybkich łącz dla klientów indywidualnych, spali, my korzystaliśmy z ich serwerów. jednoznacznie ocenić, wyłaniając przy
pociąga za sobą rozwój infrastruktury tele- Jednocześnie w Stanach ceny usług ho- tym zwycięzcę. Zarówno oferty, jak i ich
komunikacyjnej. stingowych i sprzętu komputerowego są ceny są bardzo do siebie zbliżone. Mo-
Skoro użytkownicy pobierają więcej niższe, więc możliwe było zaoferowanie gliśmy bazować na popularności i opinii
plików z sieci, serwery muszą sprostać ciekawych warunków cenowych. Wadą klientów. Postawiliśmy na to, sądząc, że
wzrastającemu obciążeniu. W ten sposób, były długie czasy odpowiedzi serwera, największe zaufanie budzi ten provider,
w ciągu ostatniego roku obserwujemy na czyli tzw. pingi, co wynikało z długości który zarejestrował dla swoich klientów
rynku znaczący wzrost pojemności serwe- odległości połączenia i bariery kontynen- najwięcej domen. Oczywiście nie powin-
rów WWW, większe limity transferu mie- talnej. Dla przeciętnego użytkownika nie no to stanowić kryterium decydującego
sięcznego, a także niższe ceny za ruch były jednak zauważalne opóźnienia przy o zakupie danej usługi. Zaprezentowane
dodatkowy. Powodów sytuacji, gdzie para- ładowaniu stron. 12 firm prezentuje bowiem bardzo wy-
metry usług są coraz lepsze, a ceny usług Dziś już odchodzi się od lokowania równany, wysoki poziom. Należy jesz-
maleją, jest co najmniej kilka. Główny serwera w USA, na rzecz krajów Euro- cze tylko dodać, że do rankingu zostały
impuls do zmian dały zagraniczne serwisy, py Zachodniej, a konkretniej Holandii zakwalifikowane tylko te firmy, których
oferujące konta e-mailowe o wielkościach i Niemiec, które są nam geograficznie podstawowym przedmiotem działalności
(na tamte czasy) astronomicznych. Mniej bliższe (stąd strony ładują się szybciej), są usługi hostingowe. n
www.phpsolmag.org
Biznes 250 500 MB 5 GB 30 b.o. 1 1 b.d. Tak - 880 Polska
Biznes 350 700 MB 7 GB 50 b.o. 1 1 b.d. Tak - 1199
Biznes 500 1 GB 10 GB b.o. b.o. 1 1 b.d. Tak - 1507
Agnat (agnat.pl) Profit 5 GB 5 GB 100 b.o. b.d. b.d. n.d.* - - 298
Polska
Expert 10 GB 10 GB b.o. b.o. b.d. b.d. n.d.* - - 598
Sisco (sisco.pl) Economic 300 300 MB 5 GB 5 b.o. b.o. b.o. 1 Tak - 300
Business 500 500 MB 8 GB 10 b.o. b.o. b.o. 2 Tak - 400
Pro 1000 1 GB 16 GB b.o. b.o. b.o. b.o. 3 Tak - 600 Polska
VIP 2000 2 GB 25 GB b.o. b.o. b.o. b.o. 5 Tak - 1000
Max 3000 3 GB 40 GB b.o. b.o. b.o. b.o. 8 Tak - 1600
AlphaNet (alpha.pl) Promo 500 MB 500 MB b.o. 5 GB b.o. b.o. 1 b.o. 1 Tak Tak 99
Prima 1 GB 1 GB b.o. 10 GB b.o. b.o. 2 b.o. 2 Tak Tak 190
Expo 5 GB 20 GB b.o. b.o. 4 b.o. 4 Tak Tak 290
Polska
Multi 3 GB 20 GB b.o. b.o. 20 b.o. 20 Tak Tak 399
Opti 6 GB 30 GB b.o. b.o. 50 b.o. 50 Tak Tak 599
Solid+ 15 GB 100 GB b.o. b.o. 150 b.o. b.o. Tak Tak 1500
AMM-Komputer (amm.net.pl) Start 1 GB 25 MB 2 GB b.o. b.o. b.d. b.d. 2 Tak - 100
Start+ 1,5 GB 50 MB 3 GB b.o. b.o. b.d. b.d. 3 Tak - 150
Mini 3 GB 75 MB 4 GB b.o. b.o. b.d. b.d. 3 Tak Tak 200
Polska
Standard 5 GB 10 GB b.o. b.o. b.d. b.d. 4 Tak Tak 300
Business 6 GB 15 GB b.o. b.o. b.d. b.d. 5 Tak Tak 400
Professional 7,5 GB 20 GB b.o. b.o. b.d. b.d. 7 Tak Tak 600
b.o. – bez ograniczeń; n.d. – nie dotyczy; b.d. – brak danych; * firma oferuje dostęp do bazy danych SQLite (moduł PHP5)
75
Ranking
Portal aktywnych internautów
C
odziennie w Polsce nowe firmy rozpo- w żadnych zbiorczych zestawieniach firmy
czynają działalność, łączą się, zmie- statystycznej Gemius SA. A wystarczy tylko
niają nazwy. Każdy przedsiębiorca sprawdzić, iż wyszukiwarka Google zaindekso-
i webmaster poszukuje sposobów, by pokazać wała 2,5 mln dokumentów portalu osemka.pl
w sieci siebie i swą ofertę z jak najlepszej – dla porówania w Google znajduje się 2,3 mln
strony, jak najniższym kosztem. W ostatnich dokumentów Wirtualnej Polski (webpark.pl),
latach było wiele firm oferujących usługi ho- czy 1,6 mln firmy Prv.pl. Świadczy to o ogrom-
stingowe, które po kilku miesiącach kończyły nej popularności usług proponowanych przez
swą działalność, a nasze pieniądze i trud wspomniany serwis oferujący 200 MB konta
w budowaniu stron legł w gruzach. Dla webma- na strony www oraz dostęp przez ftp. Wyróż-
stera podstawową sprawą jest znalezienie ta- niającą cechą tego portalu wśród konkurencji
kiego usługodawcy, który zapewni stabilność jest wysoka pozycja stron w domenie friko.pl
strony, szybki dostęp, a także wiele usług i za.pl w wyszukiwarkach (strona główna ma
dodanych. Jednak fundamentalnym kryterium Page Rank 6), a także możliwość skorzysta-
przy wyborze miejsca, w którym będziemy nia ze skryptów PHP 4.4.0. Niezwykle istotne
przetrzymywali naszą stronę jest cena. Two- jest, iż osemka.pl nie tworzy żadnych limitów
rząc strony w PHP staramy się, by czynność miesięcznych, czy rocznych na transfery pli-
ich aktualizacji przełożyć na barki właścicieli ków. Ta opcja jest praktycznie niedostępna u SZUKAMY WIĘCEJ MIEJSCA
stron. Korzystamy zatem z systemów umoż- konkurencji, a ponadto nawet serwisy płatne Naszą uwagę w poszukiwaniach darmowego
liwiających użytkownikowi samodzielne za- stosują limity. hostingu z obsługą php przykuła inna oferta
rządzanie treścią (CMS). Niestety na naszym polskiej firmy Spox.pl.
rynku istnieje niewielka liczba firm, których TESTUJEMY Wspomniany serwis oferuje całkowicie
oferta odpowiadałaby naszym potrzebom. Postanowiliśmy przetestować ofertę osem- bezpłatnie profesjonalny hosting o parame-
Najczęściej dostęp do serwera oferującego ka.pl. Rejestracja wyglądała prosto i sprawnie trach zarezerwowanych do tej pory dla komer-
kilkaset megabajtów miejsca na stronę WWW, – należało podać jedynie swoje dane oraz cyjnych i często bardzo drogich serwerów www.
możliwość dostępu do PHP w wersji nowszej adres email, następnie wybrać domenę dla Spox.pl proponuje aż 500 MB pamięci dysko-
niż 4.0, gwarantującego bezpieczeństwo na- naszej strony z łatwo zapadających w pamięć wej, transfer bez limitu, łatwy dostęp przez
szych danych, kosztuje od kilkudziesięciu do – za.pl i friko.pl. Momentalnie otrzymaliśmy FTP, cPanel. Dodatkowo istnieje także opcja
kilkuset złotych miesięcznie. wygenerowany automatycznie email z potwier- posiadania własnej domeny. Tutaj o rejestracji
dzeniem rejestracji i hasłem. Po zalogowaniu nie decyduje automat, a każde zgłoszenie jest
POSZUKUJEMY się nie napotkaliśmy jakichkolwiek problemów osobno rozpatrywane. Na odpowiedź i potwier-
DARMOWEGO HOSTINGU z edycją hasła, swoich danych itp. W panelu dzenie zgłoszenia rejestracyjnego czekaliśmy
Szukając rozwiązania naszych problemów użytkownika znaleźliśmy nieaktywną opcję niecałe 24h. Zaraz po zalogowaniu się i zmianie
związanych z koniecznością uiszczania opłat zakładania baz MySQL. Fakt jej umieszczenia hasła mogliśmy już swobodnie umieścić naszą
za hostowanie naszych stron, można natknąć może wskazywać, że programiści przewidzieli stronę w serwisie spox.pl. Transfer był szybki i
się na oferty kilku firm oferujących darmowe taką możliwość w przyszłości. Chwilę później nie zauważyliśmy jakichkolwiek problemów z
usługi. Jedną z nich jest oferta Ósemka.pl In- po szybkim transferze plikow na serwer, mo- funkcjonowaniem naszego site’a. Strona nadal
ternet Media, właściciela za.pl i friko.pl. Ósemka gliśmy się już pochwalić naszą stroną inter- działa bezbłędnie.
to jedna z najlepszych firm oferujących nie- netową, zbudowaną w systemie CMS, naszym
przerwanie od 1999 roku usługi hostingowe. znajomym i klientom, i to zupełnie za darmo! ZA GRANICĄ ZA DARMO
Obecnie w nowopowstałym Portalu Aktywnych Największą wadą tego serwisu, którą napotka- Przykładem sprawnego działania, bez koniecz-
Internautów, który połączył tradycję darmo- liśmy był tryb działania safe mode, który nieco ności obsługi skryptów PHP, jest zagraniczny
wych kont za.pl i friko.pl, zarejestrowanych jest ogranicza funkcje, lecz jednocześnie zwiększa serwis happyhost.org. Przede wszystkim należy
202 tysiące użytkownikow, a 66 tysięcy kont szansę, że nasz serwer bedzie działał dłużej. zaznaczyć, że jest to całkowicie darmowy serwis,
hostingowych jest aktywnych. Ze statystyk Zauważoną niedogodnością była funkcja inclu- bez limitów na przesył danych. Co prawda pingi
wynika, iż łącznie strony hostowane na ser- de, którą można stosować tylko do bieżącego wysyłane z Polski wracają po nieco dłuższym
werach portalu hosting.osemka.pl w miesiącu katalogu. Utrudnia to nieco pracę przy więk- czasie, niż w przypadku innych rodzimych
wrześniu 2005r. obejrzało blisko 3mln użyt- szych ilościach podstron, lecz zważywszy na serwisów, jednak sprawdzając połączenia z ser-
kownikow, generując ponad 25 mln odsłon. fakt, iż jest to całkowicie darmowy serwis – to werów znajdujących się w USA, wyniki wyglądają
Budzi zdziwienie fakt, iż nie jest to odnotowane i tak nieznaczne uchybienie. rewelacyjnie.
76
zamów prenumeratę PHP Solutions
nowa niższa cena: a otrzymasz prezent!
150zł 135zł
wybierz prezent:
78
d e d s i t e s > > >
Recommen
Jeśli prowadzisz ciekawą stronę internetową
i chcesz abyśmy przedstawili ją w ramach akcji Recommended sites,
skontaktuj się z nami pod adresem redakcja@phpsolmag.org
Całkowicie przebudowany serwis poświęcony Strona zawierająca artykuły związane z PHP Serwis dla webmasterów, organizujący konkurs
skryptom. Obecnie skupia się na zbiorze skryp- napisane przez autora. Zawiera też kolekcję we współpracy z naszym magazynem, promują-
tów z całego świata. zdjęć oraz opisy ciekawych książek. cy rozwiązania bez użycia systemów CMS itp.
www.antraxja-skrypty.iweb.pl www.antylameriada.net www.webmaster.bbsoft.pl
Serwis stworzony z myślą o programistach Bogate archiwum skryptów PHP, JavaScript, Skryptoteka to jeden z największych i najbar-
PHP, który stara się prezentować także ogólne CGI, Perl i ASP. Zawiera także artykuły, porady, dziej znanych zbiorów skryptów. Zawiera także
wiadomości związane Internetem. tutoriale, książki. artykuły, czcionki, szablony i podręczniki.
www.compzone.org www.megaskrypty.com www.skryptoteka.pl
Młody, rozwijający się serwis związany z PHP. Serwis zawierający kompletne kursy 9 technolo- Portal, który oprócz emitowania newsów czy
Zdaje się, że autorowi zależy na niestandardo- gii związanych z webmasteringiem oraz skrypty, wywiadów gromadzi bogate materiały związane
wej oprawie i zawartości. elementy grafiki, czcionki i narzędzia. z projektowaniem i pisaniem stron WWW.
www.sm00f.boo www.tymex.org www.webinside.pl
Serwis powstał w celu związania społeczności Wortal webmastera bogaty w wiele materiałów. Xklonos to serwis istniejący już od 2001 roku.
webmasterskiej. Użytkownicy mogą wymieniać Związany jest z Webserv – pakietem Apache, Każdy użytkownik może wpływać na jego
doświadczenia oraz uzyskiwać porady. PHP, MySQL, MySQL CC oraz NoIP. formę.
www.webmade.org www.webpl.org www.xklonos.cal.pl
ites
Recommended s
www.shop.software.com.pl
Prosimy wypełnić czytelnie i przesłać faksem na numer: (22) 887 10 11 lub listownie na adres: Software-Wydawnictwo Sp. z o.o.,
Piaskowa 3, 01-067 Warszawa, e-mail: pren@software.com.pl. Przyjmujemy też zamówienia telefoniczne: (22) 887 14 44
Dokładny adres....................................................................................................................................................................................................................
Tytuł
Ilość Od numeru Opłata
Ilość
zamawianych pisma lub w zł
numerów
prenumerat miesiąca z VAT
Software Developer’s Journal (1 płyta CD)
– dawniej Software 2.0 12 250/1801
Miesięcznik profesjonalnych programistów
SDJ Extra (od 1 do 4 płyt CD lub DVD)
– dawniej Software 2.0 Extra! 6 150/1352
Numery tematyczne dla programistów
Suma
W sprzedaży od 20 lutego!
■ Ilia Alshanetsky, twórca FUDforum, autor książki Guide to PHP Security, a także współautor
wielu projektów Open Source i rozszerzeń takich jak: PDO, SQLite czy GD prezentuje:
Ataki XSS oraz CSRF na aplikacje internetowe
Ponadto planujemy:
■ Wzorce projektowe