You are on page 1of 84

WYMIANA NA IMPOZYCJACH\

SPIS TREŚCI
06 OPIS CD

AKTUALNOŚCI
08 Ogólne
Paweł Kołodziej

10 eZPublish
Juliusz Całuniuk

11 Joomla!
Michał Sobkowiak, Andrzej Wajda

DLA POCZĄTKUJĄCYCH
12 Pozycjonowanie strony
Łukasz Sosna
Łukasz, uczy jak obsługiwać serwisy do sprzedaży i wymiany lin-
ków. Pokaże również, jak stworzyć własny link w serwisach do ich
wymiany.

18 PHP i Flash
Dariusz Polarczyk Aka 'TRUI'
Dariusz pokazuje, jak budować formularze, pobierać dane i przesy-
łać je na serwer. Pobrane z serwera odpowiedzi wykorzystuje w śro-
dowisku Flash.

ROZWIĄZANIA
24 AJAX
Maciej Wiśniewski
Maciej uczy, jak skutecznie stosować AJAX na różnych rodzajach stron
WWW. Zaznajomi cię z popularnymi bibliotekami dla JavaScript.

Le périodique hakin9
PHP Solutions jestest publié par
wydawany przez Software-Wydawnictwo Sp. z o.o.
Software-Wydawnictwo Sp. z o.o.
Bokserska,
Dyrektor02-682 Varsovie,Sylwia
wydawniczy: Pologne
Pogroszewska
Tél. +48 22 887 10 10, Fax. +48 22 887 10 11
www.phpsolmag.org
Redaktor naczelny: Patrycja Wądołowska patrycja.wadolowska@software.com.pl

Directeur de la publication
Redaktorzy prowadzący:: Jarosław Szumski
Anna Kozioł anna.koziol@software.com.pl
Magdalena Sobiś magdalena.sobis@software.com.pl
Imprimerie, photogravure : 101 Studio, Firma Tęgi
Projekt okładki:
Ekonomiczna 30/36, Agnieszka
93-426 Łódź Marchocka
DTP Manager:
Imprimé Robert Zadrożny
en Pologne/Printed robert.zadrozny@software.com.pl
in Poland
Operator DTP: Ewa Najduk ewa.turowska@software.com.pl
Abonnement (France métropolitaine, DOM/TOM) : 1 an
(soitKierownik
6 numéros) produkcji:
38 € Marta Kurpiewska marta.kurpiewska@software.com.pl

Korekta:
Dépôt légal : Mateusz
à parutionLipiński matlipinski@wp.pl
ISSNWyróżnieni
: 1731-7037 betatesterzy: P. Gradziński, P. Brzózka, L. Sewastianowicz
Distribution : MLP
ParcDział reklamy:
d’activités adv@software.com.pl
de Chesnes, 55 bd de la Noirée
BP Prenumerata: Marzena Dmowska pren@software.com.pl
59 F - 38291 SAINT-QUENTIN-FALLAVIER CEDEX
(c) 2005 Software-Wydawnictwo, tous les droits réservés
Nakład: 6 000 egz.

4
28 Kohana
Karol Gusak
Karol schrakteryzuje framework Kohana. Wskazuje podobieństwa i
różnice w stosunku do CodeIgnitera oraz jego nowatorskie i unia-
klne cechy.

38 SDO i SCA
Marcin Zbijowski
Marcin w prosty sposób obrazuje, jak stworzyć webservice, wyko-
rzystując eksperymentalne biblioteki.

42 CRE Loaded
Michał Wójtowicz NARZĘDZIA
Michał obrazuje, jak poprawnie skonfigurowac serwer pod CRE Lo-
aded. Uczy również, jak dokonać ewentualnej migracji naszego skle- 66 Asido
pu internetowego z OsCommerce. Przemysław Bańka
Przemek w artykule przedstawia klasę Asido, której prostota i wy-
jątkowa funkcjonalność w prosty sposób pozwala manipulować
TECHNIKA grafiką.

50 Joomla!
Magdalena Maryańska TESTY KONSUMENCKIE
Magda prezentuje trzy praktyczne rozwiązania które pomogą po-
czątkującym użytkownikom Joomli dopasować system do wła- 70 Szablony stron WWW
snych potrzeb za pomocą dostępnych komponentów. Uczy też,
jak za pomocą dodatku Add PHP umieścić własny skrypt php w
treści artykułu, jak dodać do galerii PonyGallery możliwość wypi- WYWIAD
sanie kategorii naszych zdjęć w postaci linków w menu oraz jak
umożliwić odwiedzającym dodawanie ogłoszeń na stronie wyko- 76 Wywiad z Danielem Dryzkiem, Dtrektorem Za-
rzystując komponent JA rządzającym Active24 Polska

58 PHP i Oracle
Maciej Maleta RECENZJE
Maciej dostarcza informacji na temat serwera baz danych firmy
Oracle, opisuje instalację i konfigurację potrzebna do połączenia z 79 PHP i MySQL. Księga przykładów, Skalowane wi-
parserem PHP, a także podstawy pisania skryptów do obsługi bazy tryny internetowe
danych Oracle. Tomasz Kostro, Łukasz Skowroński

Rédacteur
Adres en chef : Marek Bettman marekb@software.com.pl
korespondencyjny: La rédaction fait tout son possible pour s’assurer que les logiciels sont à
Rédacteurs : Aneta Cejmańska
Software-Wydawnictwo anetta@software.com.pl
Sp. z o.o., Redakcja używa
jour, pourtant ellesystemu automatycznego
décline toute składu
responsabilité pour leur utilisation. Elle ne
Ewa
ul. Dudzic ewal@software.com.pl
Bokserska 1, 02-682 Warszawa, Polska fournit pas de support technique lié à l’installation ou l’utilisation des logiciels
Préparation
tel. +48 22 427du CD : Aurox
36 86, Core
fax +48 22Team
427 36 69 Do tworzenia
enregistrés surwykresów i diagramów
le CD-ROM. Tous les wykorzystano
logos et marques déposésprogramsont la firmy
Maquette : Anna Osiecka
www.phpsolmag.org annao@software.com.pl
cooperation@software.com.pl propriété de leurs propriétaires respectifs.
Couverture : Agnieszka Marchocka
Traduction : Iwona Czarnota, Aneta Lasota, Marie-Laure Perrotey, Osoby zainteresowane
La rédaction współpracą
utilise le système PAO prosimy o kontakt:
Grazyna Wełna
Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit firmy cooperation@software.com.pl
Pour créer les diagrammes on a utilisé le programme
Bêta-testeurs
G DATA Software : Thomas Bores, Tony Boucheau, Pascal Foulon, Pascal Miquet,
Sp. z o.o.
Romain Lévy, Augustin Pascual, Julien Poulalion, Alain Ribault Druk: ArtDrukjoint au magazine a été testé avec AntiVirenKit de la société G
Le CD-ROM
Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu Data Software Sp. z o.o
Les personnes
nośnikach intéressées
informacje parbyły
i programy la coopération sont priées
poprawne, jednakże de nous
nie bierze contacter :
odpowiedzialności Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy
cooperation@software.com.pl
za efekty wykorzystania ich; nie gwarantuje także poprawnego działania programów technicznej w instalowaniu i użytkowaniu programów zamieszczonych na płycie
AVERTISSEMENT
shareware, freeware i public domain. CD-ROM dostarczonej
Les techniques razem
présentées z pismem.
dans les articles ne peuvent être utilisées qu'au
Abonnement : abonnement@software.com.pl sein des réseaux internes.
Fabrication : Marta Kurpiewska marta@software.com.pl Sprzedaż
La rédaction aktualnych lub n'est
du magazine archiwalnych numerów
pas responsable pisma po innej
de l'utilisation ceniedes
incorrecte niż
Diffusion
Uszkodzone : Monika
podczasGodlewska monikag@software.com.pl
wysyłki płyty wymienia redakcja. wydrukowana na okładce – bez zgody wydawcy – jest działaniem na jego
techniques présentées.
Publicité : publicite@software.com.pl szkodę i skutkuje
L'utilisation odpowiedzialnością
des techniques présentéessądową.
peut provoquer la perte des données !

Si vous êtes
Wszystkie intéressé
znaki parzawarte
firmowe l’achat w
depiśmie
licence
sąde publication
własności de revues merci
odpowiednich de
firm zostały Pismo ukazuje się w następujących wersjach językowych:
contacter
użyte : Monika
wyłącznie Godlewska
w celach monikag@software.com.pl , tél : +48 (22) 887 12
informacyjnych.
66 fax : +48 (22) 887 10 11 polskiej , francuskiej , niemieckiej

5
Opis CD

CakePHP
Na załączonej płycie CD znajdziecie Państwo najnowszą wer-
sję CakePHP w wersji stabilnej 1.1.19 oraz rozwojowej 1.2.0.
CakePHP to framework wzorowany na pakiecie Ruby On Ra-
ils http://www.rubyonrails.org , który ułatwia tworzenie, wdra-
żanie oraz opiekę nad kodem aplikacji internetowych (ang.
Web Applications).
Zbudowany w oparciu o architekturę Model-View-Controller
(MVC, pol. Model, Widok, Kotroler), która umożliwia odse-
parowanie źródeł danych (model) od reguł ich przetwarzania
(kontroler) oraz sposobu prezentacji (widok). CakePHP wy-
posażony jest również w mechanizmy umożliwiające automa-
tyczne generowanie zapytań od bazy danych bez znajomości
kodu SQL!
Archiwum framework'u zawiera komplet plików umożli-
wiający samodzielne tworzenie własnych serwisów interne-
towych.
mularzy oraz walidacji danych w CakePHP. Film zawiera tak-
Cake.forum że rozwiązania typowych problemów jakie mogą się pojawiać
Razem z CakePHP na płycie znajduje się archiwum zawiera- podczas uruchamiana aplikacji.
jące przykładową aplikację omawianą w niniejszym nume- Jeżeli do tej pory nie korzystałeś z tego framework'u a
rze magazynu PHP. Cake.forum to proste forum internetowe chciałbyś przekonać się jak można tworzyć zaawansowane
umożliwiające przeglądanie działów w poszukiwaniu intere- aplikacje pisząc mniej kodu koniecznie obejrzyj załączony ma-
sujących tematów oraz zabieranie głosu w toczących się dys- teriał. Na płycie znajduje się również film obrazujący sposób
kusjach. przeniesienia aplikacji działającej w trybie scaffold ze środo-
wiska developerskiego na serwer WWW dostawcy internetu.
Filmy instruktażowe
Płyta zawiera także filmy instruktażowe, które obejmują 2 go- Ponadto na CD:
dziny materiału z zakresu instalacji, konfiguracji połączenia
do bazy danych MySQL oraz przygotowania prostej i urucho- • szablony stron WWW;
mienia aplikacji, która demonstruje mechanizmy obsługi for- • PHP Processor.

6
Jeśli nie możesz odczytać zawartości płyty CD, a nie
jest ona uszkodzona mechanicznie, sprawdź ją na co
najmniej dwóch napędach CD. W razie problemów
z płytą, prosimy pisać pod adres: cd@software.com.pl

Redakcja nie udziela pomocy technicznej w instalowaniu


i użytkowaniu programów zamieszczonych na płytach
CD-ROM dostarczonych razem z pismem.
Aktualności

Wyciek pamięci – już nie!


Jak poinformował wiceprezes Funda-
cji Mozilla, Mike Schroepfer – w Firefox
Nadal masz umowę?
N
w wersji beta 3.0 poprawiono obsługę adal pamiętamy, gdy niespełna rok
pamięci. Przewiduje się, że wersja ta będzie temu na rynku dostaw interneto-
znacznie lepiej gospodarować pamięcią niż wych pojawili się konkurenci TP.
np. IE7. S.A. Wówczas wielu miało okazję skorzystać
Okazało się, że załatano ponad 350 różnych
wycieków pamięci! Jednak to nie wszystko,
z sytuacji i podpisać umowę z nowym opera-
ponieważ okazuje się, iż pozostało nadal torem po naprawdę przystępnych cenach.
wciąż sporo podobnych błędów, Funda- Pojawia się jednak pewien problem, mia-
cja planuje wydanie wersji 4 beta. Naj- nowicie niezerwanie umowy na czas, dopro-
prawdopodobniej jeszcze w marcu będzie wadzi do nieprzyjemnej niespodzianki. często niezdający sobie sprawy użytkownik,
gotowa, dlatego od 26 lutego do progra-
Pierwsze takie umowy już przeszły na czas miesiąc później otrzymuje dwukrotnie więk-
mu nie będą dodawane żadne funkcje, a
twórcy skupią się na poprawianiu istnieją- nieokreślony, a osoby, które nie przedłużyły szy rachunek.
cych błędów. umowy promocyjnej, lub zamieniły na in- Operatorzy przypominają, że umowę na
Mike Schroepfer nie podał, kiedy plano- ną, na równie atrakcyjnych warunkach, jak czas nieokreślony można zerwać w każdej
wane jest wydanie finalnej wersji Firefok- pierwsze będą musiały płacić dużo wyższy chwili, bez ponoszenia konsekwencji finan-
sa 3, zapewne nastąpi to jeszcze w pierw- abonament. sowych, jeśli jednak się spóźnisz i przegapisz
szej połowie roku.
Taki obrót sprawy, spowodowany jest zapi- moment przedłużenia umowy, i tak będziesz
Czy to koniec polskiego eBaya? sem, jaką podpisali alternatywni operatorzy musiał zapłacić przynajmniej za ten jeden
Jak podaje witryna Aukcje.org, drastycz- internetu, jak Netia, czy Multimo. Po przej- miesiąc, w którym złożyłeś wypowiedzenie.
nie spada liczba polskich aukcji. Aby ściu na umowę na czas nieokreślony dostaw- Wypowiedzenie najlepiej składać listem
ratować statystyki, eBay w skład aukcji cy są rozliczani przez TP wg zwykłej taryfy, poleconym bądź osobiście , wówczas zysku-
zalicza przedmioty, które mają zazna-
czyli za łączę o prędkości 1Mb/sek zapłaci- je się potwierdzenie złożenia i dostarczenia
czoną opcję wysyłki w dowolny region
świata. I tak dowiadujemy się, że w tym my 228,14 zł minus 51% rabat, wynikający z rezygnacji.
momencie na eBay jest 81 529 aukcji, z umowy międzyoperatorskiej oraz ramowej. Netia to niezależny operator telefonii
czego polskich ofert jest jedynie 8066. Dział obsługi klienta Netii informuje, iż przewodowej w Polsce. Poprzez szereg zabie-
Jeszcze kilka tygodni temu aukcji było stara się informować swoich klientów, któ- gów marketingowych, jak coraz to nowsze i
około 400tyś. Czy zatem to zmierzch pol-
rym kończy się umowa promocyjna o moż- ciekawsze oferty dla klientów pretenduje do
skiego eBaya?
liwości podpisania kolejnej umowy termino- bycia najszybciej rozwijającym się dostawcą
Szczegóły: http://www.aukcje.org/ wej. Gdy klient się nie godzi na pozostanie, usług telekomunikacyjnych.
wówczas bez konsekwencji może zrezygno- Multimo – alternatywny operator teleko-
wać z dostawcy. munikacyjny. Świadczy zintegrowane usłu-
Oczywiście zdarza się, że nie każdy taki gi. Usługa realizowana jest na łączach GTS
telefon otrzyma (z różnych powodów), dla- Energis.
tego odbiorcy sami także powinni zatrosz- Szczegóły:
czyć się o swój portfel. O wiele gorzej wy-
gląda sytuacja w Multimo, tutaj dostawca w • http://gospodarka.gazeta.pl/technologie/
ogóle z upływu czasu nie stara się nawet in- • http://www.netia.pl
formować swoich klientów o upływie czasu i • http://www.multimo.pl/

Ach, te domeny
Jak podają Domeny.pl, od począt-
ku stycznia nastąpił gwałtowny wzrost
liczby rejestracji domen internetowych.
Wg statystyk pod koniec grudnia 2007
roku zarejestrowanych polskich domen
narodowych było około 760 tys. A już
w miesiąc później przybyło ok. 1,500
rodzimych adresów unijnych (.eu). Jak
się przewiduje, jeszcze przed wakacjami
możliwe jest zarejestrowanie milionowej
polskiej domeny.
Taka tendencja wzrostowa zauważalna
jest także w innych krajach Europy i w
przeciągu kilku ostatnich lat stopniowo
rośnie.

Szczegóły: http://domeny.pl/

Znacie polskietechnologie.pl?
Ruszył serwis poświęcony nowinkom
technologicznym, tworzonym przez

8 03/2008
Aktualności

Google Summer of Code polskie placówki badawcze. Przed uru-


chomieniem witryny twórcy pracowa-
li ponad rok nad jej zawartością. Tyle

J
uż wkrótce kolejna edycja Summer W zapoczątkowanym w 2005 roku progra- bowiem trwało zebranie i gromadzenie
of Code. Jest to program firmy Go- mie do tej pory wzięło udział ponad tysiąc informacji, kontakty i rozmowy ze spe-
ogle skierowany do studentów – deve- pięciuset studentów z dziewięćdziesięciu cjalistami związanymi z projektowaniem
oprogramowania oraz narzędzi webma-
loperów. Przy współpracy z grupami twór- krajów, co przełożyło się na więcej niż 130
sterskich. Serwis jest ciągle rozwijany,
ców darmowego oprogramowania oraz mi- powstałych projektów open source i miliony nad jego funkcjonowaniem oraz jako-
łośnikami nowoczesnych technologii Go- wklepanych linijek kodu. ścią merytoryczną czuwa zespół admi-
ogle ma ponownie zamiar na przestrzeni Jakie są założenia Summer of Code, oraz wy- nistratorów.
najbliższych miesięcy sfinansować kilkana- mogi, znajdują się na stronie przedsięwzięcia. Serwis jest podzielony na wiele tema-
ście ciekawych studenckich projektów open tycznych rozdziałów, m.in.: struktu-
ra bazy, finansowanie badań, własność
source. • http://code.google.com/soc/2008/
intelektualna itd. Ponadto będą publi-
kowane artykuły fachowe, informacje o
imprezach oraz wiadomości dotyczące

Znacie Momail? polskiej nauki i przemysłu.

J
uż od 20 lutego w Polsce dostępna jest do modelu telefonu, na jakim jest przegląda-
bezpłatna usługa umożliwiająca wysyła- ny, grafika i zdjęcia są automatycznie zmniej-
nie i odbieranie poczty w telefonie komór- szane do rozmiaru wyświetlacza. Pliki DOC
kowym. Uruchomienie usługi zajmuje dosłow- i PDF są zmniejszane na tekst, który nie zaj-
nie kilka minut, jest całkowicie bezpłatna. muje wiele miejsca.
Z Momomaila mogą korzystać użytkownicy Serwis został także wyposażony w wie-
ponad 1000 modeli telefonów komórkowych le zabezpieczeń antywirusowych i ochronę
dostępnych na rynku. przed spamem.
Aby móc korzystać z Momomaila, wystar- Momail oferuje bezpłatne, globalne usłu-
Szczegóły: http://polskietechnologie.pl/
czy wypełnić elektroniczny formularz na stro- gi poczty elektronicznej dla urządzeń mo-
nie www.momail.pl, następnie poczekać na bilnych. Dzięki opatentowanej, niezależnie Już czas – Internet Explorer 8
wiadomość SMS potwierdzającą rejestrację, a opracowanej technologii, Momail radykal- Niespełna parę tygodni temu rozpoczął
wtedy nasz aparat telefoniczny zostaje auto- nie zwiększa efektywność komunikacji za się program testowania Internet Explo-
rera 8.
matycznie skonfigurowany do pracy z Moma- pomocą urządzeń mobilnych.
Na razie wydanie zostało udostępnio-
ilem. Każdy użytkownik otrzymuje adres e- Momail współpracuje z coraz szerszym ne jedynie wąskiej grupie betatesterów,
mail odpowiadający numerowi jego telefonu. gronem partnerów oferujących usługi mobil- z czasem jednak każdy zainteresowany
Jak się okazuje, Momail może pełnić funk- ne oparte na produktach i rozwiązaniach fir- będzie miał możliwość przetestowania
cję mobilnego łącznika telefonu z kontami my, dlatego nazwa Momail ma duże szanse wersji beta1. Prace nad Internet Explo-
poczty założonymi na innych serwisach, przy stać się synonimem mobilnej komunikacji. rerem zakończą się zapewne w połowie
roku 2009. IE8 będzie pracował w trzech
czym inteligentnie potrafi rozróżnić adresy Szczegóły: różnych trybach, niestety ta w najbar-
– dzięki czemu odpowiedzi są automatycz- dziej kompatybilnym wymagać będzie
nie podpisane właściwą sygnaturą. Ponadto • http://www.momail.pl/ umieszczenia w kodzie dodatkowego
przychodzący mail jest od razu dostosowany • http://www.gazetaautorow.pl/ znacznika. Informacja ta wywołała szereg
protestów.

Szczegóły: http://blogs.msdn.com/ie/archive/
2008/01/21/compatibility-and-ie8.aspx

Nie masz kasy, a chcesz


coś kupić? To już nie problem!
Okazuje się, że programy open source
– osCommerce i xt:commerce posiada-
ją niesamowite luki, które sprawiają, że
możliwe jest dokonanie zakupów bez
konieczności płacenia za towar. Jak się
okazuje, programy te źle analizują dane
otrzymane z odpowiedzi z ipayment.
Potencjalny oszust może wykorzystać
ten błąd – dzięki czemu system przyj-
mie, że płatność została dokonana, pod-
czas gdy faktycznie nie miało to miejsca.
Tak naprawdę do tej pory nie wiadomo
ile sklepów korzysta z wadliwych pro-
gramów, dystrybutorzy jednak udostęp-
nili łaty.

Szczegóły: http://www.arcabit.pl/

www.phpsolmag.org 9
Aktualności
dział prowadzi: Juliusz Całyniuk juliusz.calyniuk@ws-webstyle.com

SHARE! Magazine
Pojawiło się pierwsze wydanie newslettera
SHARE! Magazine. Co miesiąc ukażą się w nim
eZ Projekty Martina Bauera
M
wywiady, komentarze oraz artykuły dotyczą- anaging eZ Publish Web Content Ma-
ce eZ Ecosystem. W pierwszej edycji opubliko- nagement Projects, autorstwa Martina
wano kilka wywiadów z programistami zwią- Bauera, to książka skierowana przede
zanymi z eZ Publish. Jednym z rozmówców wszystkim do osób zajmujących się kierowaniem
był Piotr Karaś, aktywny członek społeczności.
wdrożeniami systemu eZ Publish. Autor opiera
Nowy eZ Newsletter się na wieloletnim doświadczeniu w zarządzaniu
W nowej wersji 1.5.3 udostępniono mecha- projektami, które zdobył w designIT, firmie part-
nizmy pozwalające na stosowanie specyficz- nerskiej eZ Systems z Australii. Przedstawione
nych ustawień i warunków dla wysyłanych
techniki poparte zostały przykładami z rzeczy-
mailingów. Dodatkowo opracowano statysty-
ki przeczytanych wiadomości i przede wszyst- wistych realizacji.
kim poprawiono wydajność aplikacji. Aktualna Pierwszy rozdział koncentruje się na cechach
wersja przeznaczona jest dla eZ Publish 3.9. wyróżniających systemy typu Web Content Ma-
nagement. Autor przedstawia różnice pomię-
Konferencja OSMB 2008
dzy różnego typu aplikacjami dla WWW: stro-
eZ Systems w roli platynowego sponsora kon-
ferencji Open Source Meets Business. W konfe- nami statycznymi, dynamicznymi, serwisami ryzykiem w kontekście projektów wdrożenio-
rencji wzięły udział firmy, które z powodze- WWW, systemami obiegu informacji i transak- wych. Interesującym rozdziałem jest Open Pro-
niem kreują i wykorzystują otwarte oprogra- cyjnymi. Prezentuje punkty widzenia: progra- ject Management. To najmniej techniczna część
mowanie w rozwiązaniach klasy Enterprise. misty, klienta i użytkownika końcowego. Martin książki, w której autor skupia się na uczestni-
Poza producentem eZ Publish, pojawili się Bauer uważa, że dla kierownika projektu wszy- kach projektu i komunikacji jako kluczowym
przedstawiciele: IBM, Oracle, HP, Novell oraz
scy uczestnicy są ważni, a zrozumienie ich po- źródle sukcesu lub porażki. Martin analizuje
RedHat. Przy okazji OSMB odbyło się między-
narodowe spotkanie partnerów eZ Systems. trzeb i umożliwienie współdziałania stanowi proces przepływu informacji pomiędzy uczest-
klucz do sukcesu. nikami oraz wskazuje metody diagnozowania i
Wsparcie dla Mac OS X Server Kolejne rozdziały skupiają się na bardziej reagowania w warunkach trudnych, mogących
eZ Publish uzyskał wsparcie producenta dla szczegółowym opisie architektury systemów prowadzić do impasu, a w skrajnej sytuacji do
profesjonalnych rozwiązań opartych na Mac
zarządzania treścią oraz mechanizmów dostęp- porażki. Zarządzanie komunikacją jest często
OS X Server v10.5 Leopard. Jest to kontynu-
acja kierunku wyznaczanego przez eZ Flow, nych w eZ Publish. Jest to wstęp, który pozwala pomijane w tematyce projektowej skoncentrowa-
certyfikowanego rozszerzenia eZ Publish w dalszej części książki skoncentrować się na de- nej jedynie na technologii w małych kilkuosobo-
dedykowanego mediom. eZ Flow posia- finiowaniu projektu wdrożeniowego. Od pierw- wych projektach. Zakończenie prac wdrożenio-
da duże możliwości sterowania publikowa- szego etapu, czyli gromadzenia podstawowych wych wiąże się z przekazaniem finalnego produk-
niem treści multimedialnych w oparciu o sieć informacji przekazywanych przez klienta, za- tu osobom, które będą go użytkować. Zbudowa-
WWW. Rozszerzenie wspiera wiele nośników
informacji, między innymi Apple iPhone. leży powodzenie kolejnych działań. Kierow- nie serwisu WWW opartego na CMS wiąże się
nik projektu jest odpowiedzialny za stworzenie zawsze z koniecznością szkolenia personelu. Mar-
eZ Conference 2008 wstępnej specyfikacji, która będzie zrozumiała tin przedstawia w skrócie podstawowe wskazów-
Trwają przygotowania do corocznej konfe- dla wszystkich uczestników – zespołu wdroże- ki dla trenerów prowadzących szkolenia.
rencji organizowanej przez eZ Systems w nor-
niowego i sponsora. Na jej podstawie określane Spora część książki poświęcona jest samej im-
weskim Skien. W tym roku konferencja zgro-
madzić ma przeszło tysiąc uczestników. Poza są cele i zakres prac, ale przede wszystkim wstęp- plementacji oraz testowaniu zastosowanych roz-
deweloperami eZ pojawią się przedstawicie- ne kalkulacje terminowe i kosztowe. Następ- wiązań. Pracownicy designIT, dzięki aktywne-
le firm partnerskich oraz członkowie społecz- ne rozdziały prezentują dokładne przedstawie- mu uczestnictwu w życiu społeczności eZ Com-
ności eZ Community. Hasło przewodnie tego- nie pracy planistycznej. Na podstawie wstępne- munity oraz doświadczeniu w pracy z eZ Pu-
rocznego spotkania to Open for Business. W go szkicu opisującego zakres prac, tworzona jest blish, posiedli rozległą wiedzę, którą dzielą się z
trakcie konferencji odbędzie się także trady-
szczegółowa specyfikacja wdrożenia, która obej- czytelnikami. Ta wiedza może przydać się pro-
cyjna gala eZ Awards.
muje między innymi: określenie grup użytkow- gramistom na różnym poziomie umiejętności.
Nowe eZ Components ników oraz uprawnień, stworzenie mapy stro- Podsumowując, książka Managing eZ Publish
Ogłoszono kolejne plany rozwoju bibliotek. ny, ustalenie funkcjonalności, typów danych Web Content Management Projects wypełnia lu-
eZ Components 2008.1 Roadmap wyznacza oraz części wizualnej, czyli układów stron, a tak- kę, która bardzo długo była niedostrzegana. Za-
terminy wypuszczenia nowych wersji Alpha że wymagań dotyczących projektu graficznego. rządzanie projektami to tematyka posiadają-
i Beta na maj, a wersji stabilnej na czerwiec
Dobrze przygotowany dokument pozwala zapla- ca szeroką listę publikacji. Jednak specyficzne
tego roku. Nowe komponenty zawierać będą
funkcje do konwersji dokumentów, obsłu- nować etapy prac wdrożeniowych oraz określić podejście związane z wdrożeniami systemów
gi RSS/ATOM oraz wsparcia indeksowania i ich kolejność i długość trwania. Web Content Management nie było głębiej ana-
selekcji danych dla różnych systemów wyszu- W książce znalazł się także bardzo ciekawy lizowane. W opinii Sandro Groganza, odpowie-
kiwania. rozdział dotyczący ryzyka projektowego. Autor dzialnego w przeszłości za zarządzanie wiedzą
ukazuje kilka poziomów, na których mogą po- w eZ Systems, a obecnie niezależnego eksperta
Uwagi do eZ Publish 4.0
Łukasz Serwatka, programista eZ Systems, jawić się problemy. Świadomość ryzyka wystą- od systemów Open Source, przedstawioną me-
przedstawił na swoim blogu dziesięć uwag pienia przeszkód w trakcie pracy projektowej todologię można zastosować dla wszystkich sys-
dotyczących potencjalnych problemów, jakie pozwala minimalizować ich negatywne konse- temów Web Content Management. Trudno nie
mogą napotkać deweloperzy. Newralgiczne kwencje w sytuacji, kiedy faktycznie się pojawią. zgodzić się zatem z opinią, że jeśli zajmujesz się
punkty związane są z migracją z wersji PHP4 Martin Bauer przedstawia praktyczne metody, projektami CMS, powinieneś sięgnąć po lekturę
do PHP5, mogą być jednak trudne do zdia-
które okazują się użyteczne przy zarządzaniu Martina Bauera.
gnozowania.

10 3/2008
Aktualności

Tomek wygrał GHOP! Forum bardziej GNU/GPL


forum.joomla.org od połowy lutego
opiera się na phpBB. Powodów rezygna-

G
oogle Highly Open Participation to rzenia dla Joomla! 1.5, przeprowadził trzy wni- cji z forum SimpleMachines (SMF) było
konkurs organizowany przez Google kliwe testy głównych komponentów składowych wiele, m.in. wielkość społeczności i ofe-
w celu wsparcia Wolnego Oprogra- Joomla! oraz przetłumaczył całą instrukcję insta- rowane przez phpBB możliwości. Jednak
mowania. W przeciwieństwie do SoC skupiają- lacji (mimo że wymagano tylko fragmentu). Nie najistotniejszym powodem była zgod-
ność licencji phpBB i Joomla!, umożli-
cego się na studentach, GHOP jest skierowany to przesądziło jednak o wygranej. Jak wszyscy wiająca integrację z Joomla! i dzielenie
do młodszych internautów. Zadania dla pierw- zgodnie stwierdzili, Tomek uosabia idealne cechy się opracowanymi rozwiązaniami ze spo-
szej edycji przygotowano w dziesięciu katego- członka społeczności Wolnego Oprogramowania. łecznością.
riach, w każdej z nich wyłoniono jednego zwy- Współpraca z nim przypomniała nam powody i Olbrzymie przedsięwzięcie, jakim było
cięzcę. Zwycięzcą w ramach Joomla! został To- emocje, dla których sami kiedyś przyłączyliśmy się przeniesienie bazy ponad 170 tys. użyt-
kowników i 1,2 miliona postów prze-
masz Dobrzyński [depresz]! W nagrodę Tomek do tego ruchu. W ramach konkursu rozwiązano
biegło gładko, choć forum nie uzyska-
odwiedzi kwaterę główną Google w Kalifornii. prawie tysiąc zadań. W wydarzeniu wzięło udział ło od razu pełnej sprawności, choćby ze
Tomek ukończył 7 zadań, jednocześnie oka- 350 uczestników, z czego największą liczbę – 75., względu na potrzebę ponownego indek-
zując się jednym z najbardziej wszechstronnych przyciągnął projekt Joomla!, na którego potrzeby sowania treści na potrzeby wyszukiwa-
uczestników. Przekazał społeczności trzy rozsze- uczestnicy rozwiązali 135 zadań. nia. Zachowano dotychczasową struk-
turę adresów i identyfikatory wątków i
postów.

Joomla! 1.5 wydana Obfitość wydarzeń


Przełom roku był niesamowity. Mimo że

W
styczniu została wydana pierwsza Kod Joomla! został całkowicie przepisany z uży- był okresem wyjątkowo wytężonej pracy
stabilna wersja, od dawna oczeki- ciem architektury MVC. Stworzono całe środo- związanej z przygotowaniem wydań obu
linii Joomla! przyniósł wszystkim zaan-
wanego, Joomla! 1.5. Na pozór wisko programistyczne, pozwalające na budowę
gażowanym w rozwój projektu wiele
przynosi ona niewiele zmian: aplikacji opartych bezpośrednio na nim, teore- satysfakcji.
tycznie nawet niekorzystających z Joomla!. Obfitował w liczne wydarzenia: GHOP,
• Drobne ułatwienia administracyjne takie Największy postęp dokonał się w zakresie który wniósł powiew młodości w nasze
jak: możliwość sortowania list według ko- wsparcia językowego. Joomla! został napisany w szeregi, Pizza Bugs and Fun przyspieszył
usuwanie błędów w Joomla! 1.5 i prze-
lumn, pojedynczy edytor przy wprowa- całości z myślą o użyciu kodowania UTF-8. Zmie-
rodził się w wydarzenie permanentne
dzaniu treści skracający czas ładowania, niono również sposób przechowywania plików nazwane BugSquad, a DocCamp pozwo-
wygodniejsze dodawanie mediów również językowych i umożliwiono tłumaczenie zaple- lił na przyspieszenie prac nad dokumen-
w trakcie edycji artykułu; cza, co do tej pory nie było możliwe bez dokony- tacją.
• Ułatwienie zmiany sposobu wyświetlania wania zmian w kodzie każdego, nawet małego, Udział w tych wydarzeniach zawiązał
zawartości komponentów poprzez rozsze- nowego wydania. To ostatnie usprawnienie, mi- bliższe relacje między członkami naszej
międzynarodowej społeczności i przy-
rzenie funkcjonalności szablonów; mo że początkowo wymaga ogromnej pracy, ja-
niósł nam wiele radości.
• Systemowe wsparcie dla różnych sposobów ką jest przetłumaczenie od początku całego Jo-
uwierzytelniania ułatwiające m.in. łączenie omla!, jest wielkim ułatwieniem dla tłumaczy i w Rozstania i powroty
Joomla! z innym oprogramowaniem; przyszłości pozwoli na szybkie wydawanie dowol- Po wielu miesiącach, a nawet latach współ-
• Poprawienie i usprawnienie różnych me- nych wersji językowych. Wkrótce zostanie wyda- pracy projekt opuszczają:
chanizmów, np. wyświetlania czytelnych na wersja 1.5.2 poprawiająca część niedociągnięć • Tonie de Wilde, który czuwał nad ser-
adresów. w systemie lokalizacji. wisami Joomla!
• Robin Muilwijk, który ostatnio koor-
dynował projekt razem z Wilco.
Robin pozostanie nadal głównym
moderatorem forum.joomla.org.
• Andy Miller [Rhuk] od początku dba-
jący o wygląd Joomla!, współautor
interfejsu zaplecza i autor szablo-
nów.

Po dłuższej nieobecności wraca nato-


miast legenda Joomla! – Andrew Eddie.
Andrew był głównym developerem i
liderem projektu od jego początków w
2005 roku. Obecnie będzie koordynował
projekt wspólnie z Wilco.
Zespół PCJ! pragnie wyrazić wdzięczność
dla Toniego, Robina i Andiego za ich wkład
w rozwój Joomla! i nadzieję, że jeszcze do
nas powrócą.

www.phpsolmag.org 11
Dla początkujących

Pozycjonowanie
strony z użyciem linków
Systemy wymiany i kupna linków
Serwis WWW mimo dobrze opisanej treści i zaindeksowania w Google będzie
ciągle pokazywał się na samym dole wyników. Dobrze będzie jeżeli pojawi
się on około setnej strony. W większości wypadków dzieje się tak z powodu
braku powiązań do naszego serwisu z serwisów o podobnej tematyce.
by jednak była, zignoruj go i kup link u innej
Dowiesz się... Powinieneś wiedzieć... osoby, ponieważ osób chętnych do tego rodza-
• W jaki sposób kupić miejsce na stronach prze- • Wiedzieć pod jakimi frazami chcesz wypozy- ju zarobku jest naprawdę dużo.
znaczonych na linki; cjonować swój serwis WWW.
• Obsługiwać serwisy do sprzedaży linków; Rejestracja w systemie
• Obsługiwać serwisy do sprzedaży linków; Wybrałeś już stronę, na której chciałbyś umie-
• Obsługiwać serwisy wymiany linków; ścić swój link. Jednak aby złożyć zamówie-
• Jak stworzyć swój własny link w serwisach do nie należy najpierw się zarejestrować. Kliknij
ich wymiany. na głównej stronie u góry na łącze Rejestracja.
Zobaczysz formularz w którym wypełnij pole
E-mail swoim adresem e-mail na który otrzy-
zawsze sprawdzić wchodząc na jej stronę. Z sys- masz wiadomość z linkiem do potwierdzenia
temami wymiany linków różnie to bywa. Jeden rejestracji, oraz w polu Hasło wpisz hasło dostę-
Poziom trudności z czołowych systemów specjalnie nabijał liczni- pu do swojego konta. Musisz jeszcze zaznaczyć
ki osobom, które zamieszczały linki na swoich pole Zgoda na przetwarzanie danych osobowych.
stronach, w ten sposób musiały wyświetlić wię- Teraz kliknij na przycisk Zarejestruj się.
cej linków sponsorowanych. Teraz sprawdź swoją skrzynkę e-mail, w któ-

K
ażdy link z serwisu o dobrym Page- rej powinien znajdować się list od administra-
Rank jest bardziej cenny niż jakiekol- LinkStore tora serwisu. Znajdziesz w nim link który na-
wiek słowo kluczowe użyte nawet w Jeden z lepszych serwisów tego typu, właściwie leży kliknąć, aby aktywować swoje konto. W
nagłówku poziomu jeden na naszej stronie. to jeden z dwóch godnych polecenia ze wzglę- przypadku gdyby twój program pocztowy nie
Ważne jest aby do strony prowadziły linki z du na fakt odwiedzania go przez bardzo dużą wyświetlał poprawnie linku, skopiuj go i wklej
witryn o podobnej tematyce i aby linki te by- ilość osób. Również ilość stron dodana do jego do paska adresu przeglądarki.
ły umieszczone na stałe, a nie tylko na jednej zasobów robi dobre wrażenie. Dzięki temu bę-
podstronie. dziesz mógł kupić link na stronie pasującej do Logowanie
Przedstawię w tym artykule najpierw syste- twojej tematyki. W przeglądarce internetowej Kiedy masz już aktywne konto i możesz się
my przeznaczone do wymiany linków, tak aby wpisz adres: http://linkstore.pl/. Możesz od razu na nie zalogować. W tym celu wejdź na stro-
każdy mógł spokojnie i bez ponoszenia nawet sprawdzić ile będzie kosztował link na danym nę główną systemu, a następnie wpisz swój lo-
minimalnych kosztów ze swojej strony zacząć serwisie, nawet jeżeli nie ma go w spisie witryn, gin, czyli adres e-mail do pola E-mail oraz ha-
pozycjonować. które sprzedają miejsce na linki. Pozwoli to na sło do pola Hasło. Następnie kliknij na przy-
Prawdziwe linki są umieszczane za opłatą na bardzo łatwe zorientowanie się ile powinieneś cisk Zaloguj się.
stronach, które wybierzemy z pośród bogatej zapłacić za hiperłącze na stronach innej osoby.
oferty serwisów zajmujących się ich sprzedażą. Przejdź do formularza Wycena linku - Definiowanie linków
Jednak wiąże się to z dużymi kosztami. W do- sprawdź, ile naszym zdaniem jest wart link oraz zamawianie pakietu
brym serwisie z dobrym PR trzeba zapłacić już bezpośredni umieszczony na twojej stronie na Pierwszym elementem, który musisz zro-
od stu złotych za miesiąc wyświetlania. okres 30 dni. W polu formularza Adres stro- bić będzie zdefiniowanie własnego linku, któ-
ny wpisz pełny URL, strony którą masz za- ry później będziesz mógł zamieszczać na stro-
Kup link u zaufanego partnera miar sprawdzić. Następnie kliknij na przycisk nach innych osób. Kliknij w łącze Moje linki tek-
Zakup linków pozycjonujących jest dość dro- Sprawdź. stowe znajdujące się tuż pod logiem, a następ-
gi, ale odnosi o niebo lepsze rezultaty niż lin- Teraz czerwoną czcionką został pokazany ile nie przejdź do formularza. Pole Adres docelo-
ki umieszczane za pomocą systemu do ich wy- powinien wynosić koszt umieszczenia linku na wy wypełnij adresem URL twojej strony, w po-
miany. Po pierwsze, nie musisz zamieszczać lin- stronie, jest to oczywiście cena jaką wylicza ser- lu Treść linka (anchor) podaj treść, która będzie
ków od innych osób, po drugie masz pewność, wis. Jednak żądana ilość pieniędzy od właścicie- stanowiła link, najlepiej dwa lub trzy słowa.
iż dana osoba zamieściła twój link. Możesz to la nie powinna być większa. W przypadku gdy- Kliknij w przycisk Dodaj link tekstowy.

12 03/2008
Pozycjonowanie

Kiedy dodasz link będzie on widoczny w niony na stronach za pomocą boldów. Pole Czy ra tutaj wygląda prawie tak samo, poza niektó-
polu powyżej. Możesz dodać kolejny link, a chcesz, aby twój link wyświetlał się w kolorze mo- rymi danymi które należy wprowadzić. Manka-
przy zamówieniu wybierać, który chcesz za- żesz zdecydować czy chcesz widzieć link poka- mentem tego rozwiązania jest brak wyceniarki
mieścić na podanej stronie. Linki można tak- zywany w innej barwie niż wszystkie linki na która podpowiedziała by ci czy cena którą ktoś
że usuwać wykrając łącze Usuń dla każdego z stronie. Jeżeli wybierzesz z pola wartość Tak zaoferował za link jest do przyjęcia. Jednak za-
nich. Jeżeli dany link nie będzie ci już potrzeb- wówczas w polu poniżej podpisanym jako # wsze możesz wpisać dane do formularza na
ny, a tylko zajmuje miejsce możesz go bez pro- zdefiniuj kolor za pomocą palety RGB. Przejdź LinkStore. Pierwszym elementem jest oczywi-
blemu usunąć. do pola Wybierz link, który chcesz wyświetlać i ście rejestracja w systemie. Kliknij na łącze Re-
Teraz zajmę się zamawianiem linku, w praw- zaznacz je poprzez kliknięcie. Następnie z po- jestruj znajdujące się na górze strony. Następnie
dzie proces rejestracji, aktywacji konta, logo- la rozwijanego poniżej możesz wybrać jaki link należy wypełnić formularz nieco bardziej za-
wania i definiowania własnego linku potrwał chcesz umieścić na stronie. Teraz wystarczy awansowany niż w poprzednim systemie. Po-
trochę czasu, jednak trzeba go wykonać aby kliknąć już tylko na Wyślij zamówienie. le Email wypełnij adresem, na który otrzymasz
móc korzystać z systemu jakim jest LinkStore. Pozostało już tylko zapłacić za link. System link przeznaczony do aktywacji swojego konta.
Przejdź na główną stronę systemu. Wybierz przekierował automatycznie do listy wykupio- W polu Hasło wprowadź swoje hasło dostępu
link ,który cię interesuje. Pakiet jest opisany nych linków. Wystarczy przy linku który chce- za pomocą którego będziesz się mógł w później-
w odpowiedni sposób. Znajduje się tutaj URL my opłacić wybrać opcję zapłać. System poka- szym czasie zalogować na stronie. Powtórz Ha-
strony na jakiej chcesz zamieścić link, po klik- że nam wszystkie dane potrzebne do zrobienia sło jest polem w którym należy powtórnie wpi-
nięciu otworzy się nowe okno, w którym po- przelewu na konto lub innego sposobu zapłaty sać swoje hasło, aby system mógł sprawdzić czy
dana strona zostanie otwarta. Bardzo ważnym za link, na przykład PayPal. się zgadzają. Następnie pole Wpisz znaki z toke-
elementem jest kolumna PR oznaczająca Pa- Zamówienie możesz także bez problemu na służy do wpisania znaków które pojawiły się
geRank. W kolumnie PG znajdziesz ilość pod- usunąć jeżeli wypełniłeś jakieś pola w zły spo- poniżej w polu Kod tokena, dzięki temu system
stron które Google zaindeksowało na tej witry- sób lub zorientowałeś się iż zawiera ono in- jest zabezpieczony przed rejestracją robotów.
nie WWW, jeżeli liczba ta jest skreślona ozna- ne błędy. Wystarczy wówczas kliknąć na łącze Po wypełnieniu pól kliknij na przycisk Wyślij.
cza to, iż link będzie wyświetlany wyłącznie na Usuń, a następnie potwierdzić chęć usunięcia Teraz przejdź do swojego konta pocztowego
stronie głównej, natomiast nie na podstronach. poprzez kliknięcie przycisku OK w komunika- i sprawdź czy są na nim nowe wiadomości. Po-
W przypadku gdy liczba ta nie została skreślo- cie który się pojawił. winna znajdować się tam informacja od Link-
na, oznacza to, że twój link będzie znajdował Gdybyś logował się ponownie do systemu, Shop wraz z linkiem po którego kliknięciu two-
się na każdej podstronie serwisu. W kolumnie wszystkie linki które kupiłeś lecz jeszcze nie za- je konto stanie się aktywne. W przypadku gdy-
LW odnajdziemy ilość linków wychodzących ze płaciłeś za nie dostawcy znajdują się po pozycją byś nie był w stanie kliknąć na łącze, skopiuj ca-
strony, bardzo ważne jest, aby ich ilość nie prze- menu Moje zamówienia, która pojawiła się tuż ły adres i wklej do przeglądarki internetowej.
kraczała dwudziestu, co jest już wartością gór- pod logiem systemu.
ną. DMOZ jest kolumną zawierającą informa- Pamiętaj aby zawsze wylogować się podczas Logowanie na konto
cję na temat tego czy strona znajduje się w ka- zakończenia korzystania z systemu. Zrobisz to Po aktywacji konta należy się na nie zalogować,
talogu, na podstawie którego Google tworzy bez problemu klikając na łącze Wyloguj się znaj- aby uzyskać dostęp do możliwości kupowania
swój własny katalog. Jednak nie należy się tym dujące się u góry witryny z jej prawej strony. linków na stronach. Wejdź na stronę główną,
przejmować, ze względu, iż moderatorami ka- w prawej części nagłówka znajduje się formu-
talogu DMOZ zostają przypadkowe osoby, któ- LinkShop larz za pomocą którego możesz zalogować się na
re w ten sposób pozycjonują sobie własne stro- Drugi co do ilości system w którym możesz swoje konto. W pole LOGIN wpisz swój e-mail
ny. Kolumna WK określa wiek strony w miesią- kupić linki na stronach innych osób. Procedu- pod którym rejestrowałeś się w systemie, a w po-
cach, im więcej jest w tej kolumnie tym lepiej
gdyż strona jest bardziej wiarygodna. Następ- Listing 1. Włączanie pliku linkor.php
nie w ostatniej kolumnie znajduje się wycena
linku przez serwis LinkStore, które nie wiado- ini_set ("include_path", ini_get ("include_path") . ':../:../../:../../../:../../../
mo dlaczego od pewnego czasu przestała dzia- ../');
łać. Miejmy jednak nadzieję iż twórcy aplikacji include_once ('linkor.php');
usuną ten błąd. Poniżej zdefiniowane są okresy
na jakie możemy wykupić link wraz z ich cena- Listing 2. Wyświetlanie linków poziomo
mi. Dodatkową informację stanowi wyświetla- linkor_wyswietl_poz();
nie linku za pomocą boldów czyli pogrubionej,
za pomocą kolorowej czcionki. Ważną informa- Listing 3. Wyświetlanie linków pionowo
cją jest maksymalna długość tekstu z linku, pa- linkor_wyswietl_pion();
miętaj aby nie definiować długich treści, ponie-
waż później będziesz miał problem aby kupić u
danej osoby swój link. Kiedy się już zdecydowa-
łeś kliknij na Złóż zamówienie na ten pakiet.
Przeszedłeś do strony na której widzisz
szczegóły swoje zamówienie. Możesz wybrać
jego szczegóły. Pole Wybierz okres przez jaki
chcesz wyświetlać swój link lub linki na wy-
mienionych wyżej witrynach służy do wybra-
nia podanego okresu w jakim twoje linki będą
znajdowały się na wybranych stronach. W po-
lu Czy chcesz, aby twój link wyświetlał się pogru-
biony zdecyduj czy chcesz posiadać link wyróż- Rysunek 1. Wiadomość e-mail wraz z adresem do aktywacji konta

www.phpsolmag.org 13
Dla początkujących

lu HASŁO wpisz podane przez ciebie hasło dla kolejnej kolumnie znajduje się Wiek strony po- Serwisy wymiany linków
konta. Następnie kliknij na przycisk ze strzałką. dawany w miesiącach. Na dole tabeli widocz- Stron które oferują wymianę linków jest bar-
Teraz zostaniesz zalogowany na swoje konto. ne są ceny za okres wyświetlania linku. Znaj- dzo dużo, ostatnio uległy nagłemu rozmno-
dują się tutaj także informacje o tym o ile żeniu gdyż taki serwis to całkiem dochodowy
Definiowanie własnego linku wzrośnie cena jeżeli link będzie pogrubiony biznes, w którym pobiera się opłaty od osób
Kolejnym krokiem jest zdefiniowanie własne- lub kolorowy. Są także dostępne dodatkowe które chcą wyświetlać swoje linki na stronach
go linku który będziesz mógł wykupić na stro- informacje takie jak maksymalna długość WWW. Rejestrując się otrzymujesz ratio czy-
nach partnerów. Kliknij na Link kupna znajdu- linku, system płatności oraz to gdzie będą li ilość wyświetlenia twojego linka w stosunku
jące się w górnym menu. Teraz możesz dodać wyświetlane linki. ilości wyświetleń linków na twojej stronie. W
nowy link do swojego panelu. Przejdź na stro- Kiedy wybierzesz daną stronę kliknij na ten sposób nic nie musisz płacić za korzysta-
nie do formularza i wypełnij pole Adres docelo- zieloną ikonę z koszykiem i strzałką. Wów- nie z tego serwisu, a i jego administrator ma
wy wpisując w nie adres twojej strony WWW czas przejdziesz do zakupu danego linka. z tego zyski.
którą będziesz chciał podlinkować na innych. Na samej górze jest widoczny adres stro-
Pole Treść linka (anchor) wypełnij treścią któ- ny na którym chcesz złożyć zamówienie. Linkor.pl
ra będzie pokazywana przy twoim linku. Naj- Następnie możesz wybrać opcję Proszę bez- Jednym z najbardziej popularnych systemów
lepiej wypełnić te pole słowami kluczowymi pośrednio wpisać adres linku tekstowego oraz wymiany linków jest system Linkor - www.lin-
pod które chcesz wypozycjonować swoją stro- anchor, który ma zostać wyświetlony na ku- kor.pl rozwijany dla potrzeb polskiego Interne-
nę. Kliknij na przycisk Dodaj link. powanych witrynach pakietu, jeżeli chcesz tu. System ten jak już wspomniałem jest całko-
Możesz zdefiniować kilka linków jeżeli bę- wpisać adres w tym miejscu, jednak lepiej wicie darmowy, a może przynieść twojej stro-
dziesz chciał wypozycjonować kilka serwisów jest wybrać drugą opcję. Kliknij na Proszę nie w początkowej fazie rozwoju dużą popra-
lub jeden serwis pod różnymi słowami kluczo- wybrać jeden link wcześniej zdefiniowany w wę w rankingach Google i w wynikach wyszu-
wymi. Linki które nie są ci już potrzebne mo- zakładce Link do kupowania. Z pola obok kiwania.
żesz także usunąć klikając na łącze Usuń w ko- wybierz link który będziesz chciał aby po-
lumnie Operacje. Dzięki temu panelowi mo- kazał się na stronie. Pole Wybierz okres przez Rejestrujemy się w systemie
żesz dowolnie zarządzać łączami które chcesz jaki chcesz wyświetlać swój link służy do W celu zarejestrowania się w systemie. Wejdź
dodać do innych stron. wybrania okresu przez jaki będziesz chciał na stronę www.linkor.pl. Z prawej strony w ta-
wyświetlać swój link na stronie danej oso- beli Mój linkor znajduje się łącze Nowy użyt-
Składanie zamówienia by. Oprócz okresu są tam podane także ceny kownik, które należy kliknąć. Przeszedłeś te-
Kiedy jesteś zalogowany i masz dodany przy- jakie będziesz musiał zapłacić. W polu Czy raz do formularza w którym wpisujesz: Na-
najmniej jeden link do swojej strony możesz chcesz, aby Twój link wyświetlał się pogrubio- zwa użytkownika – twoją wymyśloną nazwę
zacząć przeglądać strony które chcą sprzedać ny wybierz czy chcesz aby link był wyświe- użytkownika, Hasło – twoje hasło do syste-
miejsce na twoje hiperłącze. tlany za pomocą boldów. Pole Czy chcesz, mu, Potwierdź hasło – powtarzasz swoje ha-
System oferuje kilka przydatnych infor- aby Twój link wyświetlał się w kolorze służy sło dostępu do systemu, Adres e-mail – po-
macji takich jak URL strony wraz z jej zrzu- do wybrania czy link ma być wyświetlany dajesz swój adres e-mail. Po wypełnieniu po-
tem ekranu który jest zamieszczony pod ad- w danym kolorze który zdefiniujesz w po- wyższych pól klikasz na przycisk Załóż kon-
resem. Możesz kliknąć w adres i zobaczyć so- lu Wybierz kolor z palety kolorów do które- to. W tym momencie twoje konto zostało za-
bie stronę na której będziesz mógł wykupić go możesz wpisać notacje lub wybrać go po- łożone.
link. Następnie są tutaj trzy kolumny: Go- przez kliknięcie na łącze Wybierz kolor. Po
ogle, Yahoo oraz MSN które odpowiadają ilo- zakończeniu wypełniania formularza klik- Logowanie do systemu
ści stron zaindeksowanych w trzech najpo- nij na Wyślij zamówienie. W celu zalogowanie się do systemu będziesz
pularniejszych wyszukiwarek. W kolumnie Teraz twoje zamówienie zostało złożo- potrzebował swojej nazwy użytkownika oraz
Google znajdują się PR, czyli PageRank da- ne. Następnie musisz je opłacić. Po złoże- hasła do systemu które podałeś podczas zakła-
nej strony, Linki wychodzące z danej strony, niu zamówienia zostaniesz poinformowa- dania konta. Wejdź na stronę www.linkor.pl.
ilość podstron zaindeksowanych oraz Cache ny o tym gdzie i w jaki sposób masz doko- Po prawej stronie widzisz tabelę z nagłówkiem
która przechowuje datę ostatniego zarchiwi- nać płatności. Mój linkor. Wpisujesz w pole Użytkownik swo-
zowania strony. W kolumnach Yahoo i MSN Pamiętaj aby za każdym razem po za- ją nazwę użytkownika, a w pole Hasło swoje ha-
znajdują się tylko kolumny Linki i Podstro- kończeniu pracy wylogować się z kon- sło które podałeś dla swojego konta. Następnie
ny. Następną kolumną jest DIR która okre- ta, zwłaszcza jeżeli korzystasz z syste- kliknij na przycisk Zaloguj. W tym momencie
śla czy strona znajduje się w katalogu. Pierw- mu w kawiarence internetowej. Jest to bar- zostałeś przekierowany do systemu
szym jest katalog DMOZ, a drugim Yahoo. W dzo ważne aby nikt nie przejął twojego konta.
Ilość otrzymanych punktów
Ilość otrzymanych punktów jest ważnym
czynnikiem biorąc pod uwagę częstotliwość
wyświetlania się naszego linku na czyichś
stronach WWW. Im więcej punktów mamy
tym częściej nasza strona będzie wyświetla-
na na innych stronach zapisanych do systemu
Linkor. Po zalogowaniu się na swoje konto
widzisz zakładkę punkty która zawiera ilość
punktów otrzymanych dla twojego konta w
systemie, jest to ilość sumaryczna punktów
które otrzymały twoje własne strony WWW
oraz ilość punktów które otrzymały strony
Rysunek 2. Przykładowa strona oferująca sprzedaż linków którym poleciłeś system.

14 03/2008
Pozycjonowanie

Dodawanie nowej tuł twojej strony który będzie wyświetlany jako dawać ją na przykład do kategorii Sport, gdyż
strony do systemu wymiany tekst w linku. Pole Adres WWW służy do wpi- link do twojej strony nie byłby na właściwych
Pierwszym korkiem jest dodanie dla własnej sania całego adresu WWW do którego ten link stronach i przez to będzie niezbyt skuteczny.
strony odpowiednich plików które można po- będzie się odwoływał. Wpisz adres razem z pre- Następne pole czyli Priorytet określa jak czę-
brać ze strony domowej Linkora. Znajdują się fiksem http://. W polu Opis linku wpisz opis te- sto chcesz aby link był wyświetlony. W syste-
one pod adresem: http://www.linkor.pl/pobierz- go co będzie na twojej stronie domowej. Na- mie Linkor możesz mieć kilka linków i w tym
linkora.html. System Linkor wymaga do swoje- pis ten pojawi się z atrybucie title znacznika miejscu definiujesz jak często ten link ma być
go działania PHP 4.3.0 lub PHP 5 wraz z mo- a. Pole Kategoria służy do wybrania kategorii wyświetlany. Najlepiej wybrać wartość 10 w
dułem Curl. Po wgraniu rozpakowanego archi- do której twój link będzie należał. Pamiętaj przypadku gdy mamy tylko jeden link gdyż
wum na swój serwer tak aby plik linkor.txt znaj- że im trafniej określisz kategorię tym lepiej to da nam pewność iż link będzie wyświetla-
dował się w katalogu głównym serwisu. Jeżeli będzie wypozycjonowana twoja strona. Gdyż ny cały czas. W polu Aktywny możesz zde-
korzystasz z serwera pracującego pod kontrolą w przypadku gdy będziemy mieli stronę na cydować czy link ma być aktywny czyli wy-
systemu Linux lub Unix będziesz musiał nadać przykład ze sprzętem komputerowym najle- świetlany od momentu jego dodania do sys-
dla pliku odpowiednie uprawnienia tak aby sys- piej jest dodać ją do kategorii Sklepy gdyż bę- temu wymiany. Po zakończeniu wypełnia-
tem mógł go zaktualizować. Robisz to polece- dzie wyświetlała się tylko na innych stronach nia pól kliknij na przycisk Dodaj, a link zo-
niem chmod. Po wykonaniu tego polecenia na- o podobnej tematyce. Niemądrze było by do- stanie dodany.
leży włączyć plik linkor.php do swoich plików,
a następnie wyświetlić linki w nim zawarte za Listing 4. Konfiguracja funkcji show_links
pomocą specjalnej funkcji.
W tym momencie masz już zainstalowany show_links (1,2,3,4,5);
system Linkor na swojej stronie WWW. Teraz 1 - ilość linków na danej stronie
przyszedł czas aby dodać nową stronę do syste- 2 - kod w języku HTML który znajdzie się przed linkami
mu wymiany. Wejdź na stronę www.linkor.pl i 3 - separator, którym będą oddzielane linki od siebie
zaloguj się na swoje konto. W głównej części 4 - kod w języku HTML który znajdzie się za linkami
okna kliknij na zakładkę Strony WWW. Zosta- 5 - nazwa klasy CSS dla linków
łeś przeniesiony do miejsca w którym znajduje
się formularz do dodania nowej strony WWW.
W polu Adres http:// wpisz adres swojej strony,
jednak nie poprzedzaj jej prefiksem http:// gdyż
taki jest dodawany automatycznie. Następnie
kliknij na przycisk Dodaj stronę. W tym mo-
mencie linkor sprawdzi czy na podanym adre-
sie znajduje się jego plik instalacyjny. Jeżeli bę-
dzie się znajdował poinformuje cię o tym i do-
da twoją stronę.

Uruchomienie nieaktywnej strony


Jeżeli dodałeś stronę przed uruchomieniem
systemu Linkor na swoich własnych stronach
lub jeżeli system przestał działać na twojej stro-
nie możesz go aktywować. W celu aktywowa-
nia systemu Linkor. Wejdź na stronę www.lin-
kor.pl i zaloguj się do panelu administratora.
Następnie kliknij na głównym obszarze stro-
ny u góry na łącze Strony WWW. Znajdź stro-
nę która jeszcze nie jest aktywna i kliknij na łą-
czu aktywuj pod tą stroną. Jeżeli na serwerze
jest zainstalowany system linkor i jeżeli pokazu-
je linki na twojej stronie WWW aktywacja się
uda. Aktywacja nie przebiegnie poprawnie w
wypadku: gdy nie masz na swoim serwerze za-
instalowanego systemu Linkor oraz plik progra-
mu nie jest dołączony do twojej strony WWW.

Dodawanie własnych linków do systemu


Gdy skonfigurowałeś konto i Linkor działa na
twoim serwerze WWW możesz zamieszczać
własne linki które będą pokazywane u innych
osób na ich stronach. W celu dodania nowe-
go linku. Wejdź na stronę www.linkor.pl i za-
loguj się do panelu administratora. Kliknij w
głównym obszarze strony na zakładkę Linki.
W tym momencie widzisz formularz do doda-
wania nowych linków. W polu Tytuł wpisz ty- Rysunek 3. Definiowanie zamówienia

www.phpsolmag.org 15
Dla początkujących

Edycja linków w systemie ty momencie system cię zarejestrował i poinfor- i wgrać go na swoje konto na serwerze WWW.
Po dodaniu pierwszego linku pojawiło nam się mował iż na adres e-mail który podałeś w for- Jeżeli twój serwer pracuje pod systemem Linux
pole gdzie zawarte są informacje o tym linku mularzu został przesłany list e-mail wraz z lin- lub Unix będziesz musiał mu nadać odpowied-
takie jak wprowadziliśmy do systemu wymia- kiem aktywacyjnym który należy kliknąć. nie uprawnienia. Zrobisz to za pomocą polece-
ny. Link taki możemy także edytować. Wejdź nia chmod którym należy dla tego pliku ustawić
na stronę www.linkor.pl i zaloguj się do pane- Logowanie do systemu prawa na 666. Następnie z punktu 2 kopiujesz
lu administratora. Kliknij w głównym obsza- Po aktywacji swojego konta które zrobiłeś po- tekst zawarty w szarej ramce i wstawiasz go na
rze strony na zakładkę Linki. W tym momen- przez kliknięcie linku w liście e-mail wysłanym stronie gdzie będziesz chciał wyświetlić linki.
cie widzisz linki które dodałeś. Kliknij na do- do ciebie przez system możesz się na nie już za- Możesz skonfigurować funkcję show_links tak
wolnym linku. Znalazłeś się teraz w miejscu logować. Wejdź na stronę www.linkujpro.pl. Z aby odpowiadała twoim potrzebą.
w którym możesz zmienić priorytet tego wła- prawej strony okna znajduje się formularz lo- Po wykonaniu powyższych kroków wróć do
śnie linku. Zmień priorytet i kliknij na przyci- gowanie do konta. W pole login wpisz swój lo- strony na której jest wyświetlany link do two-
sku Zmień. W tym momencie priorytet linku gin który podawałeś podczas procesu rejestra- jej strony. Kliknij przy stronie dla której zain-
został zmieniony. cji. Pole hasło służy wpisaniu hasła także poda- stalowałeś link na łącze Sprawdź instalacje.
wanego w rejestracji. Następnie kliknij na przy- Otworzy ci się okno w którym widać czy sys-
LinkujPro.pl cisk zaloguj. W tym momencie zostałeś zalogo- tem poprawnie się zainstalował. W przypad-
System LinkujPro.pl jest kolejnym systemem wany do swojego konta. ku gdyby coś się nie udało zostaniesz powia-
wymiany lików godnym polecenia. Różnica po- domiony o tym fakcie i poproszony o odpo-
między nim, a linkami pochodzącymi na przy- Konfiguracja konta wiednią reakcje.
kład z systemu Linkor polega na tym iż linki z W celu edycji swoich wprowadzonych danych
tego systemu są stałe, co oznacza że zawsze na należy wybrać konfigurację konta dzięki cze- Dodawanie swojego linku
naszych stronach będą wyświetlane te same lin- mu będziesz mógł zmienić swoje dane wpro- Kiedy masz już zaakceptowaną stronę w ser-
ki. Dzięki temu nie będzie miała możliwości sy- wadzone w formularzu rejestracyjnym. Wejdź wisie możesz przystąpić do dodawania swo-
tuacja iż Google wejdzie na naszą stronę i za każ- na stronę www.linkujpro.pl. Zaloguj się na swo- ich linków wyświetlanych na stronach WWW
dym razem pojawią się inne linki co spowoduje je konto. Kliknij na łącze Ustawienia konta. W u innych użytkowników systemu. Wejdź na
efekt nieznacznego podniesienia naszej pozycji tym momencie zostanie ci pokazana strona z stronę www.linkujpro.pl. Zaloguj się na swo-
zamiast wyraźnego poprawienia strony w wyni- danymi które wprowadziłeś dla swojego kon- je konto. Wybierz pozycję Zarządzanie lin-
kach wyszukiwania. ta. Popraw dane, a następnie kliknij na przycisk kami z menu górnego. Teraz widzisz formu-
zmień. W tym momencie dane twojego konta larz w którym możesz wpisać dane dotyczą-
Rejestracja w systemie zostały zmienione. ce twojego linku. W polu Adres linku (z http:
W celu zarejestrowania się w serwisie Linkuj- //) wpisz adres twojej strony do której chcesz
Pro.pl wejdź na stronę główną serwisu, a na- Dodawanie swoich stron do systemu aby był wyświetlany link. Pole Tytuł linku to
stępnie wypełnij formularz do założenia no- Pierwszym krokiem w umieszczeniu linków pole na wpisanie jego tytułu czyli wartości
wego konta. Wejdź na stronę www.linkujpro.pl. w systemie wymiany jest rejestracja swojej wi- wyświetlającej się w łączu. W polu Kategoria
Kliknij na przycisk zarejestruj się. W tym mo- tryny w systemie. W celu dodania swojej stro- wybierz właściwą kategorię do której należy
mencie przeszedłeś do formularza w którym je- ny. Wejdź na stronę www.linkujpro.pl. Zaloguj twój serwis. Pole Ilość linków dziennie ozna-
steś proszony o podanie swoich danych. W po- się na swoje konto. Na górze strony w menu cza maksymalną ilość linków która może zo-
lu Login wpisz swoją nazwę użytkownika dzię- znajduje się opcja Zarządzanie stronami któ- stać umieszczona na dzień na stronach posia-
ki której zalogujesz się do systemu. W pola Imię rą należy kliknąć. W pole Adres WWW na- dających ten system. W polu Limit linków wy-
i Nazwisko wpisz swoje dane. Pole Adres e-mail leży wpisać adres swojej strony WWW. Z po- bierz czy chcesz zakończyć pokazywanie lin-
służy do wpisania twojego adresu e-mail. W po- la Kategoria wybierz kategorię dla twojej stro- ków po ustalonej liczbie jego wyświetlenia czy
la Hasło i Powtórz hasło wpisz swoje hasło dostę- ny. Następnie kliknij na przycisku dodaj. W też chcesz aby był on cały czas wyświetlany. Po
pu do serwisu. Zaznacz pole Chcę otrzymywać tym momencie twoja strona została dodana zakończeniu wypełniania pól formularza klik-
informacje o zatwierdzeniu/odrzuceniu strony je- do systemu. nij na przycisku dodaj.
żeli chcesz być informowany poprzez list e-mial Następnie należy poczekać na list e-mail od Następnie musisz poczekać na list e-mail od
odnośnie zatwierdzenia lub odrzucenia strony. obsługi serwisu czy twoja strona została zaakcep- administratora systemu który poinformuje cię
Zaznacz pole Chcę otrzymywać informacje o towana. Jeżeli została zaakceptowana, możesz czy link został zaakceptowany.
zatwierdzeniu/odrzuceniu linków jeżeli chcesz dodawać linki do swojej strony. Jeżeli nie została
być informowany poprzez list e-mail o zatwier- musisz dodać inną stronę ponieważ ta, którą do- Wylogowanie z systemu
dzeniu bądź odrzuceniu linków. Pole Zapozna- dałeś nie została przyjęta przez serwis. Po zakończeniu swojej pracy w systemie mo-
łem się z regulaminem i akceptuję warunki w nim żesz się z niego wylogować korzystając z łą-
zawarte musi zostać zaznaczona aby można by- Instalacja systemu na swoim koncie cza Wyloguj znajdującego się w menu po pra-
ło zarejestrować swoje konto. Po wypełnieniu W momencie gdy masz już odpowiednio skon- wej stronie.
wszystkich pól kliknij na przycisk zarejestruj. W figurowany program i dodaną swoją stronę mu-
sisz jeszcze pobrać plik który należy wgrać na
serwer i włączyć do strony za pomocą polecenia ŁUKASZ SOSNA
include. Wejdź na stronę www.linkujpro.pl. Za- Łukasz Sosna od 5 lat zajmuje się informatyką,
loguj się na swoje konto. Wybierz Zarządzanie dzięki czemu napisał kilkanaście książek oraz kil-
stronami z menu głównego. Następnie znajdź ka artykułów, między innymi: Jak stworzyć wła-
swoją stronę na liście. Kliknij na łącze Instruk- sny CMS, phpMyAdmin - proste zarządzanie ba-
cja instalacji. W punkcie 1 w pozycji a znajduje zą MySQL oraz bestseller wydawnictwa Helion
się plik który należy pobrać i wgrać go na swoje jakim jest książka Linux. Komendy i polecenia.
konto na serwerze WWW. W punkcie 1 w pozy- Kontakt z autorem:
Rysunek 4. Rejestracja w systemie LinkujPro cji c znajduje się plik który także należy pobrać lukasz.bluedragon@gmail.com

16 03/2008
Dla początkujących

PHP i Flash
Podstawy komunikacji

Artykuł ten, na przykładzie prostego formularza, prezentuje schemat


przesyłania danych między środowiskiem Flash, a środowiskiem typu
server side, w tym przypadku PHP.

ActionScript – budujemy szkielet


Dowiesz się... Powinieneś wiedzieć... Skoro mamy już formularz, to możemy za-
• Jak zbudować formularz i pobrać dane; • Jak pracuje się z danymi POST / GET w PHP; cząć programować. Na początek zacznij-
• Jak przesłać dane na serwer; • Powinieneś znać środowisko Flash (przynajm- my od stworzenia prostego szkieletu, któ-
• Jak pobrać odpowiedź z serwera i wykorzy- niej od strony interface`u); ry z czasem będziemy rozbudowywać.(Li-
stać ją w środowisku Flash. • Znać podstawy języka ActionScript. sting 1.)
Tak więc tworzymy funkcję init, która
nie przyjmuje, ani nie zwraca żadnych da-
prawym przyciskiem myszy i za pomocą funk- nych (Void). We wnętrzu funkcji ustawia-
cji Convert to Symbol zmieniamy go w MovieC- my 3. standardowe właściwości, a mianowi-
Poziom trudności lip. Jego instancję na scenie nazywamy sub- cie wyrównanie całości do środka, zakaz ska-
mit_btn i to praktycznie koniec budowy for- lowania naszych obiektów oraz ograniczenie
mularza. funkcji prawego przycisku myszy. Następnie
Czas umieścić go na scenie... Wracamy więc do przycisku w formularzu, a dokładniej do

C
hyba każdy internauta zna słowo na główną linię czasową i przeciągamy z bi- zdarzenia kliknięcia , podpinamy akcję, któ-
Flash. Większość kojarzy go z wszel- blioteki symbol form na scenę. rą chcemy wywołać.
kiego typu bannerami, śmieszny- Na koniec jego instancji nadajemy nazwę W tym przypadku będzie to funkcja
mi animacjami itp. Jednak jest to tylko jed- form, tak byśmy mogli odwoływać się do niej on_click, którą umieścimy za chwilę rów-
na strona medalu. Flash to również całkiem z poziomu kodu. nież na głównej linii czasowej. By z pozio-
sensowne środowisko programistyczne, po-
zwalające na dość dużą swobodę w warstwie
client-side, jak i w komunikacji z server-si-
de. W tym artykule, na przykładzie proste-
go formularza, chciałbym przedstawić jed-
ną z metod komunikacji Flash – PHP. A więc
do dzieła...

Przygotowanie
interface'u formularza
Tworzymy nowy symbol w bibliotece [Ctr-
l+F8] - nazywamy go form, a jego typ ustawia-
my na MovieClip.
Następie w jego wnętrzu tworzymy 3. pola
tekstowe typu input i nadajemy im odpowied-
nio nazwy autor, email, komentarz.
Następnie tworzymy całą otoczkę formula-
rza, czyli podpisy pól, ramki, ewentualne cie-
niowania etc. Na koniec rysujemy kształt, któ-
ry będzie naszym przyciskiem wyślij – propo-
nuję by był to owal, bądź koło, a więc klikamy
o, wybierając tym samym odpowiednie narzę-
dzie i za pomocą myszy rysujemy odpowied-
ni kształt. Następnie zmieniamy narzędzie na
narzędzie wyboru (v), klikamy w nasz kształt Rysunek 1. Tworzenie nowego symbolu typu Movie clip

18 02/2008
PHP i Flash

mu przycisku, który znajduje się wewnątrz Mając już funkcję przygotowującą da- pić do wysyłania danych. Wykorzystując da-
obiektu form, wywołać funkcję on_click, ne, czas na funkcję, która prześle te dane ne wejściowe funkcji send_data, wywołuje-
musimy wrócić na główną linię czasu, a do- na serwer. Do tego celu potrzebny nam bę- my metodę sendAndLoad obiektu data_obj.
konać można tego na kilka sposobów. dzie obiekt LoadVars, który możemy nazwać Jako url podajemy adres, który będzie zde-
Ja posłużyłem się pewnym trikiem, któ- result_lv. Przypiszmy do niego zdarzenie finiowany w dest_addr. Jako cel określamy
ry polega na zdefiniowaniu obiektu refThis onLoad, które zostanie wywołane w momen- nasz obiekt LoadVars (result_lv), a jako me-
wskazującego na główną linię czasową i wi- cie, gdy przesyłanie danych zakończy się (bez todę przesyłania danych ustawiamy POST
docznego praktycznie z dowolnego miej- względu na to czy powiodło się, czy nie). By (Listing 4.).
sca w naszym projekcie. W tym miejscu za- upewnić się, czy proces wysyłania powiódł By wszystko to zadziałało, musimy jesz-
miast refThis.on_click() można użyć się, możemy dopisać sprawdzenie statusu, cze uzupełnić ciało funkcji on_click. Trace,
_root.on_click(), czy też this._parent._ który zwraca zdarzenie onLoad. Do tego ce- który został tam zawarty, możemy już zastą-
parent.on_click(), choć sam zalecam sto- lu podczas tworzenia aplikacji, możemy po- pić faktycznym kodem, który potrzebujemy.
sowanie składni w oparciu o obiekt z referen- służyć się funkcją trace. Mając tak przygo- Jest to miejsce, w którym musimy spiąć w
cją. Następnie tworzymy funkcję on_click towany obiekt result_lv, możemy przystą- całość wcześniej napisany kod, a więc mu-
i w jej ciele, przynajmniej na razie, wstawia-
my tylko testową instrukcję trace (test, czy Listing 1. Szkielet kodu ActionScript
to działa).
Na tym etapie pozostaje nam zdefiniowa- this.init = function(Void):Void
nie wywołania funkcji init i sprawdzenie {
czy to co napisaliśmy działa. Stage.align="CC";
Jeśli po wyeksportowaniu pliku [Ctrl+En- Stage.scaleMode="noScale";
ter] pokazuje się formularz, a po kliknięciu Stage.showMenu=false;
przycisku wyślij, w oknie Output pojawia się this.refThis=this;
napis test, czy to działa to znaczy, że jak do this.form.submit_btn.onRelease = function() { refThis.on_click(); };
tej pory wszystko poszło godnie z planem i z };
czystym sumieniem możemy dalej rozwijać this.on_click = function():Void
nasz kod. {
}
Pobieramy dane this.init();
z formularza i je wysyłamy
Stwórzmy na głównej linii czasowej dwie do- Listing 2.Szkielet obsługi przesyłania danych
datkowe funkcje, które odpowiedzialne będą
odpowiednio za pobranie danych z formula- this.prepare_data = function(Void):LoadVars
rza i za wysyłkę danych na serwer. Pierwszą z {
funkcji nazwijmy prepare_data i ustawmy, by }
nie przyjmowała żadnych danych, ale by zwra- this.send_data = function(data_obj:LoadVars,dest_addr:String):Void
cała obiekt typu LoadVars, który utworzymy {
z danych formularza. Drugą z funkcji nazwij- }
my send_data i zdefiniujmy, że ma przyjmo-
wać dwa argumenty. Pierwszym niech będzie Listing 3. Funkcja prepare_data odpowiedzialna za zbieranie danych z formularza
data_obj typu LoadVars, a drugim dest_addr
typu String. Ponieważ nie będziemy potrze- this.prepare_data = function(Void):LoadVars
bować żadnej informacji zwrotnej od tej funk- {
cji, możemy śmiało ustawić Void jako typ var data_lv:LoadVars = new LoadVars();
obiektu, który funkcja zwraca podczas wy- data_lv.autor = this.form.autor.text;
wołania. Mając już taki szkielet możemy za- data_lv.email = this.form.email.text;
cząć wypełniać go według naszych potrzeb data_lv.komentarz = this.form.komentarz.text;
(Listing 2.). return data_lv;
Zacznijmy więc od funkcji prepare_data, };
która ma być odpowiedzialna za zbiera-
nie danych z formularza i zwracanie ich w Listing 4. Funkcja send_data odpowiedzialna za wysyłkę danych (ver. 1.)
postaci obiektu LoadVars. W ciele funkcji
utwórzmy więc nowy obiekt data_lv typu this.send_data = function(data_obj:LoadVars,dest_addr:String):Void
LoadVars i przypiszmy do niego wszystkie in- {
teresujące nas dane z formularza. Na koniec var result_lv:LoadVars = new LoadVars();
zwróćmy cały obiekt za pomocą wyrażenia result_lv.onLoad = function(success:Boolean):Void
return.(Listing 3.) {
if(success) trace("OK - udało się połączyć z serwerem");
else trace("Ups - coś poszło nie tak – najprawdopodobniej na serwerze nie ma
Biblioteka symboli pliku, który chcemy wywołać");
Jeśli masz problem ze zlokalizowaniem bi-
blioteki symboli, użyj skrótu [Ctrl+L] lub };
uaktywnij ją z wykorzystaniem górnego data_obj.sendAndLoad(dest_addr, result_lv, "POST");
menu Flash (Window –> Library) };

www.phpsolmag.org 19
Dla początkujących

simy pobrać dane z funkcji prepare_data i warunkowych if oraz właściwości length po- go, czy w inny sposób zaznaczyć, które po-
przekazać je do funkcji send_data. Dodatko- szczególnych obiektów warunki jakie muszą la zostały nieprawidłowo wypełnione (np.
wo w tym miejscu możemy dokonać wery- spełniać wprowadzane dane i w przypadku zmiana koloru na czerwony). Flash oczywi-
fikacji wprowadzonych przez użytkownika gdy wartości danych odbiegają od tego cze- ście oferuje również bardziej wyrafinowane
danych i w razie potrzeby wyświetlić komu- go oczekujemy zmieńmy wartość zmiennej metody sprawdzania poprawności wprowa-
nikat o błędzie. Do tego celu posłużymy się checked z true na false. Dodatkowo w tym dzanych danych – z obsługą wyrażeń regu-
prostym sprawdzeniem długości wprowa- miejscu możemy dodać informację zwrotną larnych włącznie, jednak jako materiał szko-
dzonego ciągu znaków. Stwórzmy więc so- dla użytkownika, które pola zostały niepra- leniowy w artykule dotyczącym komunika-
bie zmienną o nazwie checked typu Boolean widłowo wypełnione. Ja pozostawię w tym cji Flash-PHP rozpisywanie się o tym było-
i przypiszmy jej wartość true (wartość tę bę- miejscu informację zwracaną przez funkcję by stratą czasu.
dziemy zmieniać tylko w wypadku, gdy któ- trace widoczną tylko w oknie Na koniec pozostaje nam sprawdzić, czy
reś pole będzie wypełnione nieprawidłowo). Output, ale nic nie stoi na przeszkodzie zmienna checked nadal ma wartość true, a
Następnie rozpiszmy za pomocą instrukcji by przepisać ją do dowolnego pola tekstowe- co za tym idzie, czy formularz jest popraw-
nie wypełniony i dane z niego możemy wy-
słać do PHP. Wysyłkę realizujemy za pośred-
nictwem funkcji send data do której prze-
kazujemy obiekt data_lv zawierający dane
z formularza oraz String, który określa ad-
resu url, gdzie mają zostać przesłane nasze
dane. Parametr ten może mieć zarówno po-
stać ścieżki względnej (/save.php), jak i po-
stać ścieżki bezwzględnej (http://localhost/
save.php) (Listing 5.).

Czas na PHP
Ponieważ Flash już próbuje wysyłać dane,
co można sprawdzić eksportując plik [Ctr-
l+Enter], czas zająć się warstwą sever side.
Odbieranie danych w PHP, praktycznie ni-
czym nie różni się od obsługi zwykłego for-
mularza. Dane, zgodnie z tym, co napisali-
śmy we Flashu, przekazywane są za pośred-
nictwem metody POST, a więc w PHP do-
stęp do nich uzyskujemy za pomocą wywo-
łań $_POST[„autor”], $_POST[„email”],
$_POST[„komentarz”]. To czy zapiszemy
je do bazy, do pliku, czy wyślemy mailem,
praktycznie nie ma znaczenia. Osobiście od
Rysunek 2. Tworzenie pola tekstowego typu input niepamiętnych czasów korzystam z metody
zrzucania danych wywołania skryptu (GET
/ POST) do pliku tekstowego. Poniżej znaj-
duje się skrypt, który wszystkie dane zarów-
no z pobrane metodą GET, jak i POST zrzu-
ca w dość przejrzysty sposób do pliku log.txt
(Listing 6.).
Ponieważ mamy już plik PHP, który od-
biera dane i zapisuje je do pliku, czas prze-
testować, czy to wszystko działa. Plik PHP
umieszczamy na serwerze pod adresem,
który wcześniej wpisaliśmy w kodzie Ac-
tionScript (w naszym wypadku jest to http:
//localhost/save.php) i uruchamiamy nasz Fla-
showy formularz. Jeśli po jego wypełnieniu
i wysłaniu na serwerze w pliku log.txt poja-

Funkcja trace()
Warto wiedzieć, że funkcja trace() we Fla-
shu działa podobnie do funkcji print _ r
w PHP, czyli dostosowuje swój sposób dzia-
łania do typu argumentu, z którym jest wy-
woływana i np. w przypadku tablic zwra-
ca ich zawartość. Wiedza ta jest bardzo
przydatna na etapie testowania aplikacji i
znacznie skraca ten proces.
Rysunek 3. Umieszczenie na scenie przycisku „wyslij”

20 02/2008
PHP i Flash

wiły się wpisane dane, oznacza to, że wszyst-


ko działa jak należy. Warto w tym miejscu Listing 5. Obsługa przycisku wyślij w formularzu
wspomnieć, że natywnym kodowaniem dla
Flasha jest UTF-8 i z wykorzystaniem wła- this.on_click = function():Void
śnie tego formatu kodowania domyślnie wy- {
syła i odbiera on dane. Oczywiście z pozio- var data_lv:LoadVars = this.prepare_data();
mu ActionScript istnieje możliwość zmia- var checked:Boolean = true;
ny kodowania, w którym Flash będzie pra- if(data_lv.autor.length<1)
cował, lecz zdecydowanie nie polecam tego {
typu praktyk. checked=false;
Najczęściej kończy się to niepoprawną ob- trace("Pole autor jest nieprawdiłowo wypełnione");
sługą polskich znaków np. na komputerach }
typu Macintosh. if(data_lv.email.length<1)
{
Czas przekazać checked=false;
dane w drugą stronę trace("Pole email jest nieprawdiłowo wypełnione");
Wszystko co do tej pory robiliśmy, miało na }
celu przekazanie danych z Flasha do PHP. if(data_lv.komentarz.length<1)
Nadszedł czas, by odwrócić kierunek prze- {
kazywania danych i odesłać coś z PHP do checked=false;
Flasha. trace("Pole komentarz jest nieprawdiłowo wypełnione");
Szczerze mówiąc, to nasz kod Action- }
Script już w tej chwili odbiera dane z PHP, if(checked)
a wszystko za sprawą metody sendAndLoad, {
którą wykorzystaliśmy w funkcji send_data. this.send_data(data_lv,"http://localhost/save.php");
Metoda ta odpowiedzialna jest za wysłanie }
danych do skryptu PHP i przypisaniu zwrot- }
ki do obiektu result_lv. Obiekt ten posia-
da zdefiniowane zdarzenie onLoad, które zo- Listing 6. Kod po stronie serwera odpowiedzialny za odbieranie danych
staje aktywowane w momencie zakończenia
transmisji Flash–>PHP–>Flash, czyli w mo- <?php
mencie, w którym z poziomu ActionScript $uchwyt = fopen("log.txt", 'a');
uzyskamy dostęp do danych przekazanych $tresc="Zrzut danych wywolania skryptu :\n-----------------------------------------
przez PHP. Zobaczmy jak można to w prak- ---------------------------\n\n";
tyce wykorzystać. if(!empty($_POST))
By przekazać zmienną i jej wartość do {
Flasha musimy wypisać ją – np. za pomo- $tresc.="Zrzut danych z POST: \n------------------------------------------------
cą funkcji echo. Idea jest prosta – najpierw ---------------------\n";
definiujemy nazwę zmiennej, następnie sta- foreach($_POST AS $k => $w)
wiamy znak równości, po którym wypisuje- {
my wartość zmiennej. Jeśli chcemy przeka- $tresc.=$k."=>".$w."\n";
zać więcej niż jedną zmienną musimy roz- }
dzielić je znakiem &. Nasza przykładowa $tresc.="koniec danych z POST: \n----------------------------------------------
zwrotka w kodzie PHP, w której będziemy -----------------------\n\n";
chcieli przekazać dwie zmienne, będzie wy- }
glądała tak jak na Listingu 7. if(!empty($_GET))
Skoro plik PHP zwraca już jakieś dane, {
wróćmy do kodu ActionScript i postaraj- $tresc.="Zrzut danych z GET: \n-------------------------------------------------
my się je odebrać. Jak już pisałem wcześniej, --------------------\n";
metoda sendAndLoad po wywołaniu, prze- foreach($_GET AS $k => $w)
pisze dane z PHP do obiektu result_lv i {
będziemy do nich mogli odwoływać z wy- $tresc.=$k."=>".$w."\n";
korzystaniem składni result_lv.nazwa_ }
zmiennej. Musimy jednak zdawać so- $tresc.="koniec danych z GET: \n------------------------------------------------
bie sprawę, że dostęp do tych danych uzy- ---------------------\n\n";
skamy dopiero po zakończeniu transmi- }
sji, a więc wszelkie próby odwołania się fwrite($uchwyt, $tresc);
do nich bezpośrednio po nawiązaniu po- fclose($uchwyt);
łączenia zakończą się niepowodzeniem. ?>
Łatwo to można sprawdzić dodając w
ciele funkcji send_data po wywołaniu Listing 7. Fragment kodu PHP generujący odpowiedź dla Flasha
sendAndLoad() funkcję trace, która będzie
próbowała wyświetlić wartość zmiennej echo("&status_num=123&status_txt=Dane tekstowe przekazane z PHP");
result_lv.status_num (Listing 8.).

www.phpsolmag.org 21
Dla początkujących

Wywołanie takie, zamiast wartości jaką zdarzenia. zamiast undefined w Flashowym pól formularza i przypisaniem jednemu z
przypisaliśmy w PHP powinno zwrócić war- oknie Output widzimy wartość zmiennej, ja- nich wartości, jaką przekazaliśmy z PHP.
tość undefined, co wynika oczywiście z tego, ką ustanowiliśmy z poziomu PHP. Do zawartości pól tekstowych już się odwoły-
że dane po prostu jeszcze nie zostały wczyta- Ponieważ nasz mały eksperyment po- waliśmy podczas pobierania danych z formula-
ne do obiektu. Z pomocą w tej sytuacji przy- wiódł się i udało nam się przekazać dane z rza, a do tego celu wykorzystywaliśmy właści-
chodzi nam zdarzenie onLoad. Umieszcza- Flasha na serwer i z powrotem z PHP do Fla- wość text. Właściwość ta nie jest tylko do od-
jąc to samo wywołanie trace wewnątrz tego sha, zakończmy aplikację wyczyszczeniem czytu, a więc możemy ją śmiało nadpisać i tym
samym zmienić zawartość pola tekstowego. Na-
Listing 8. Nieudana próba odwołania się do wczytywanych danych sza funkcja send_data powinna wyglądać tak,
jak na Listingu 9.
data_obj.sendAndLoad(dest_addr, result_lv, "POST"); Trace`y, oczywiście przed publikacją w
trace(result_lv.status_num); sieci, można powyłączać, ale na czas budo-
wy i testowania są jak najbardziej wskazane.
Listing 9. Funkcja send_data odpowiedzialna za wysyłkę danych (ver. 2.) Warto też zwrócić uwagę na to w jaki spo-
sób Flash adresuje obiekty. Zwróćcie uwa-
this.send_data = function(data_obj:LoadVars,dest_addr:String):Void
gę na ostatnią linię w warunku if. Po usu-
{ nięciu znaków komentarzy i wyeksportowa-
var result_lv:LoadVars = new LoadVars(); niu okaże się, że wewnątrz zdarzenia onLoad
result_lv.onLoad = function(success:Boolean):Void do obiektu result_lv można odwołać się
{ zarówno za pomocą wywołania this, jak i
if(success) result_lv.
{
Podsumowanie
trace("OK - udało się połączyć z serwerem"); Mam nadzieję, że powyższy artykuł rzucił
trace(this.status_num); trochę światła na zagadnienie komunikacji
trace(this.status_txt); Flash-PHP. Przedstawiony przykład prezen-
refThis.form.autor.text = ""; tuje jedną z możliwych form komunikacji,
refThis.form.email.text = ""; która moim zdaniem jest idealna w pracy z
refThis.form.komentarz.text = this.status_txt; danymi o niezbyt złożonej formie. Chciał-
//trace(result_lv); // trace(this); bym, byście mieli również świadomość te-
go, że Flash w komunikacji może wykorzy-
} stywać XML, przesyłać pliki z dysku użyt-
else trace("Ups - coś poszło nie tak – najprawdopodobniej na serwerze nie ma kownika, czy też działać na gniazdach (ang.
pliku, który chcemy wywołać"); sockets).
}; Moim zdaniem, dzięki penetracji na pozio-
data_obj.sendAndLoad(dest_addr, result_lv, "POST"); mie >99% i niesamowitych możliwościach,
//trace(result_lv.status_num); jakie Flash oferuje, zarówno grafikom, jak
}; i programistom, jest to środowisko o naj-
większych możliwościach po stronie klienta
i w tyle zostawia nawet Javę. Na pewno war-
to poświęcić trochę czasu i bliżej poznać tę
technologię od środka.
Ponieważ tekst ten był pierwszym na te-
mat Flasha w PHP Solutions, chętnie po-
znałbym Wasze opinie na jego temat. Szcze-
rze mówiąc, dość długo walczyłem z sobą, by
napisać kod w ActionScript 2, a nie Action-
Script 3. Mimo wszystko uznałem, że star-
sza wersja jest jeszcze dużo bardziej dostęp-
na, a co ważniejsze łatwiejsza na start. Jeśli
jednak okaże się, że istnieje zainteresowa-
nie wśród Was – czytelników zagadnienia-
mi związanymi z AS3, nic nie stoi na prze-
szkodzie, by powstało kilka artykułów wła-
śnie na ten temat.

DARIUSZ POLARCZYK AKA TRUI


Jestem dyrektorem technicznym w Agencji Interak-
tywnej MUG, a z Flashem pracuję od sześciu lat i z
całą odpowiedzialnością mogę powiedzieć, że cięż-
ko jest nudzić się pracując w tym środowisku.
Rysunek 4. Umieszczenie na scenie gotowego formularza Kontakt z autorem: dariusz@polarczyk.com

22 02/2008
PHP i Flash

www.phpsolmag.org 23
Rozwiązania

AJAX – kiedy i jak?


Czyli krótka recepta na to gdzie i w jaki sposób stosować AJAX

Artykuł ma na celu pokazanie przypadków, w których totalne i bezwzględne


implementowanie AJAX, gdzie tylko się da, niekoniecznie musi być
korzystne dla serwisu, a kiedy jest wręcz niepożądane. Postaram się
także w kilku krótkich przykładach omówić najciekawsze, moim zdaniem,
podejścia do implementacji AJAX oraz pola ich zastosowań.
przeglądarki i dobrze oprogramowanej obsługi
Dowiesz się... Powinieneś wiedzieć... zdarzeń spowoduje, iż jeszcze bardziej zatrze-
• Jak skutecznie stosować AJAX na różnych ro- • Znać podstawy programowania obiektowego my różnicę. Zarówno jednolite środowisko dzia-
dzajach stron WWW; w JavaScript; łania, jak i pole eksploatacji sprzyja AJAX. Brak
• Zapoznasz się również z popularnymi bibliote- • Posiadać doświadczenie w tworzeniu opro- konieczności rejestrowania statystyk odwiedzin
kami AJAX dla JavaScript. gramowania komercyjnego. również działa na korzyść AJAX–a, gdyż tech-
nologia ta zaburza nam działanie narzędzi ana-
litycznych, rejestrujących ruch w serwisie i mu-
Środowisko działania serwisu simy mieć to na uwadze przede wszystkim w
Pierwszym pytaniem, na jakie należy so- trzecim z omawianych typów serwisów.
Poziom trudności bie odpowiedzieć, jest – jaki serwis tworzy-
my w PHP? Z uwagi na to określamy parame- Zwykła strona
try techniczne środowiska pracy naszego pro- W drugim przypadku przygotowując pojedyn-
jektu, wymagania dotyczące dopuszczalnych czą stronę WWW, blog czy inny serwis dla

O
statnio bardzo popularna techno- transferów, oczekiwań użytkowników końco- niezbyt dużej ilości użytkowników, przy czym
logia AJAX (ang. Asynchronous Ja- wych oraz przewidywanego czasu odpowiedzi użytkownik końcowy to zwykły websurfer, już
vaScript and XML) rewolucjonizu- serwera. Wyróżniłbym trzy typy, z jakimi mo- można poważnie się zastanowić nad elementa-
je świat witryn internetowych. Coraz więcej żemy się spotkać, jeżeli Czytelnik uzna, iż ja- mi tego typu. Należy sprecyzować, że mówimy
stron i serwisów internetowych z powodze- kiegoś brakuje – na pewno uda się go dopaso- o tym, co ogląda użytkownik końcowy. Jeżeli
niem stosuje tę technologię, kusząc użytkow- wać na podstawie opisu środowiska, do którejś przygotowywana przez nas strona zawiera CMS
ników pięknym interfacem, brakiem przeła- z grup: intranet lub extranet, pojedyncza stro- lub podobne narzędzia – bliższe będą one gru-
dowań strony i wizualną płynnością ładowa- na WWW lub blog (czy inne, niemasowe tre- pie pierwszej. Pojedyncze strony, nawet jeżeli za-
nia danych. Niewątpliwie pomysł na wyko- ści), portal lub serwis. wierają sporą ilość treści, na ogół ciekawiej jest
rzystanie obiektów XMLHttpRequest z Ja- wzbogacić grafiką, animacją, obiektami, Flash,
vaScript (czy innych języków skryptowych Sieci wewnętrzne i korporacyjne ciekawym menu, niż inwestować czas w dużą
Jscript, czy VBScript), przeżywa swoją świet- W przypadku intranetu lub extranetu ma- ilość gadżetów AJAX–owych. Jeżeli taka poje-
ność i jest czymś, bez czego nowoczesny pro- my do czynienia ze środowiskiem oferującym dyncza strona zawiera elementy jakiś dużych ta-
jekt wygląda, co najmniej blado, na tle pełnych nam bardzo wiele i takim, które wiele wybacza bel danych, obrazów, krótkich tekstów czy opi-
gadżetów produktów konkurencji. Cechą cha- od strony optymalizacji transferów klient–ser- sów – warto zastosować AJAX do pojedynczych
rakterystyczną XMLHttpRequest, jest możli- wer, konieczności rejestracji statystyk, precy- elementów położonych gdzieś na stronie, ale ra-
wość wykonywania żądań do serwera już po zji określenia parametrów technicznych klien- czej tylko wtedy, gdy zrobi to znaczącą różni-
załadowaniu strony internetowej w trakcie in- tów – rodzaj przeglądarki, system operacyjny. cę w stosunku do tradycyjnego podejścia, czy
terakcji z użytkownikiem. Otrzymanych od- W tego typu aplikacjach końcowy użytkow- wpłynie na estetykę i użyteczność.
powiedzi używamy do dynamicznej modyfi- nik liczy na maksymalny performance1 nasze-
kacji wyświetlanej treści. Developerzy niejed- go systemu. Od końcowego użytkownika w naj- Duże serwisy
nokrotnie stają w obliczu bezpośrednich żą- lepszym przypadku możemy oczekiwać biegłej W końcu w trzeciej grupie – serwisów inter-
dań klienta o to, by aplikacja wyposażona by- obsługi pakietów biurowych, dlatego wyświetla- netowych lub portali – zdecydowanie odra-
ła w tego typu mechanizmy. Stały się one nie- nie danych, które co jakiś czas znikają, po to by dzałbym używania AJAX do całości zawarto-
omal koniecznością wynikającą z wysokich strona się przeładowała, raczej ich nie zachwy- ści, a nawet nie zawsze do drobnych kontro-
wymagań klienta. Niestety – programista naj- ci – klient bardzo doceni zastosowanie AJAX lek. Dlaczego? Powodów jest kilka. Pierwszym
częściej przystaje na sugestie i otrzymujemy do stopnia, przy którym nasz system oparty o z nich jest kwestia kompatybilności. Duży ser-
strony bez przeładowań, których ocena oglą- WWW nie będzie się wizualnie odróżniał od wis to duża ilość użytkowników i różnorod-
dalności przy pomocy standardowych narzę- innych aplikacji zainstalowanych na stacji robo- ność przeglądarek, systemów operacyjnych,
dzi staje się utrudniona. czej. Osobne okno bez pasków nawigacyjnych konfiguracji, a nawet samych urządzeń. W spo-

24 03/2008
Listing 1. Przykład inicjacji obiektu XML HTTP Request
sób szczególny zwrócić uwagę należy na sferę
urządzeń – gdyż ilości użytkowników ogląda-
jących strony przy pomocy telefonów komórko-
var xmlhttp=false; wych, palmtopów i podobnych urządzeń mo-
/*@cc_on @*/ bilnych ciągle rośnie. Przeszłość wiele nauczy-
/*@if (@_jscript_version >= 5) ła twórców o urokach JavaScript i pozostałych
// JScript daje nam możliwość warunkowej kompilacji języków skryptowych oraz różnych związanych
try { z tym trudnościach – po prostu zastosowanie
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); zbyt wyrafinowanych rozwiązań może okazać
} catch (e) { się złym pomysłem w zderzeniu z rzeczywisto-
try { ścią. Doświadczony programista użyje rozma-
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); itych trików, aby zapewnić serwisowi działanie
} catch (E) { w sposób tradycyjny w przypadku braku do-
xmlhttp = false; stępności wyrafinowanych narzędzi po stronie
} klienta, jednakże należy liczyć się tym samym
} z koniecznością podwójnej implementacji tych
@end @*/ samych rozwiązań. Jeżeli termin nas goni, trze-
ba wziąć powyższe czynniki pod uwagę w fazie
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { projektowania i planowania.
try { Warto AJAX zastosować do elementów,
xmlhttp = new XMLHttpRequest(); które możemy szybko wykonać i zabezpiecze-
} catch (e) { nie ich funkcjonalności nie będzie kłopotli-
xmlhttp=false; we, a w skrajnej sytuacji (do której dobry pro-
} gramista nie powinien dopuścić), nie odbie-
} rze serwisowi funkcjonalności. Elementy, ja-
if (!xmlhttp && window.createRequest) { kie bym tutaj wymienił to: wszelkiego rodza-
try { ju oceny (selekcja liczbowa, gwazdki czy inne
xmlhttp = window.createRequest(); graficzne znaczniki), krótkie komentarze, nie-
} catch (e) { które wybieraki, rozwijane drzewa, krótkie an-
xmlhttp=false; kiety, shoutbox’y, niektóre proste formy wy-
} szukiwania, operowanie na elementach takich
} jak zamieszczone w serwisie Goggle Maps. Po-
dejmując decyzję, które z elementów chcemy
Listing 2. Przykład implementacji żądania przy pomocy obiektu XML HTTP Request wykonać w AJAX trzeba osiągnąć kompromis
pomiędzy korzystnym zmniejszeniem transfe-
xmlhttp.open("GET", "test.php",true); ru, poprawieniem użyteczności, a ilością pra-
xmlhttp.onreadystatechange=function() { cy, jaką będziemy musieli zainwestować oraz
if (xmlhttp.readyState==4) { negatywnymi skutkami dla tradycyjnych sta-
alert(xmlhttp.responseText) tystyk strony.
} Powód, który jest z mojego punktu widzenia
} najważniejszy, a stawia pod znakiem zapytania
xmlhttp.send(null) wszechobecne używania AJAX, dotyczy poten-
cjalnych dochodów z serwisu – im więcej prze-
ładowań tym więcej odsłon reklam, a im więcej
odsłon reklam tym więcej w nie kliknięć. Istnie-
ją ciekawe rozwiązania na rzecz wymiany reklam

R E K L A M A

www.phpsolmag.org 25
Rozwiązania

bez przeładowań (np. http://ajax.phpmagazine.net/ chael’a Kerner: http://www.internetnews.com/ implementacji, PRADO oferuje nam również
2006/02/rotating_ads_with_ajax.html), ale każdy xSP/article.php/3666656 oraz kontrowersyjny wsparcie dla obiektów DOM, komunikacji
zauważy, że w ten sposób nie osiąga się oczekiwa- i wymagający na dziś drobnego uaktualnie- obiektowej pomiędzy JavaScript, a PHP oraz
nego przez klienta rezultatu. Klient, jeśli zamawia nia (lecz nadal ciekawy) Why Ajax Sucks (Most wiele innych interesujących mechanizmów.
u nas duży serwis publiczny, chce na nim zarobić of the Time) autorstwa Jakob’a Nielsen’a: http: Skorzystanie z pełnego wachlarza rozwiązań
– ograniczając przeładowania (te odbywające się w //www.usabilityviews.com/ajaxsucks.html. W wymaga poświęcenia sporej ilości czasu na na-
tradycyjny sposób), obcinamy mu potencjalne do- dalszej części przedstawię odrobinę podejścia ukę, ale jeżeli chcemy wyciągnąć maksimum
chody i powodujemy nie lada kłopot w interpreta- praktycznego do stosowania AJAX. wydajności na rzecz użytkownika końcowego,
cji statystyk dostarczonych przez Webalizer czy na- zwłaszcza przy aplikacjach z dużą ilością for-
wet Goggle Anaylics (chociaż to drugie wykazuje Wszystko w AJAX mularzy i danych, mających zachowywać się,
pewną odporność przy odpowiedniej konfigura- W aplikacjach z grupy pierwszej, które rozwi- jak desktopowe – jest to dobre rozwiązanie.
cji). Z drugiej strony użytkownicy końcowi często jamy najczęściej na bazie gotowych komplekso-
poirytowani są częstymi przeładowniami – znów wych frameworków, przy odpowiednim dobo- Małe kontrolki
musimy znaleźć kompromis. rze być może istnieje możliwość, iż nie będzie- W przypadku projektów z grupy drugiej i de
my musieli znacząco się napracować, aby zasto- facto trzeciej, implementujemy małe kon-
Odrobina sceptycyzmu, sować AJAX. Przykładem wybranym przeze trolki, jak oceny (ratings), komentarze, so-
analityczny koszmar mnie jest popularny framework PRADO, który utbox'y, krótkie teksty czy inne podobne.
Istnieje szereg powodów, dla których używa- swoją prostotą uruchomienia AJAX moim zda- Nie potrzebujemy więc dużych objętościo-
nie AJAX musi być przemyślane, zważywszy niem wyróżnia się znacząco od innych. wo i funkcjonalnie frameworków, komplek-
na statystyki. Szerokie grono analityków za- W PRADO po utworzeniu formularza, je- sowych rozwiązań do wszystkiego. Najczę-
uważyło komplikację w sposobach mierzenia żeli chcemy, aby był on AJAX–owy po pro- ściej nasze zastosowanie AJAX będzie się
popularności strony ze względu na nowe ele- stu zmieniamy użyte kontrolki z np. TButton, sprowadzało do wysłania kilku wartości do
menty i jasne jest, że miara liniowa oglądalno- na TActiveButton – i to wystarczy! Doku- bazy danych i odebrania krótkiego rezulta-
ści strony w stosunku do ilości wejść, odsłon, mentacja PRADO prezentuje nam łatwość tu, czy to w postaci komunikatu, czy jakie-
itp. zdezaktualizowała się w obliczu nowych i skuteczność tego rozwiązania za pomocą goś kodu HTML, dlatego zastosujemy po-
technologii. Konkurencyjność serwisów wy- prostego przykładu konwertera walut http: jedynczą biblioteczkę do komunikacji al-
maga dostarczania jeszcze większej ilości in- //www.pradosoft.com/demos/currency-converter/ bo też skorzystamy bezpośrednio z obiektu
formacji na jednej stronie i ciągłej interakcji . Więcej o samym użyciu tzw. Active Con- XMLHttpRequest , dostępnego w JavaScript,
z użytkownikiem dla realizacji postulatów trols Czytelnik znajdzie pod adresem http:// także w JScript i VBScript. Przedstawione
WEB2.0. Często chybionym przybliżeniem www.pradosoft.com/demos/quickstart/index.ph przykłady przygotowane są w JavaScript i w
jest uznanie, że wybór informacji przez użyt- p?page=ActiveControls.Home. Poza samym bar- dalszej część artykułu skupię się właśnie na
kownika wiąże się z przeładowaniem. Otwie- dzo elegancko przygotowanym mechanizmem implementacjach w tym języku.
ra się tutaj szerokie pole dla nowych pomy-
słów na badanie popularności serwisu, jed-
nak nie ma w tym zakresie wyznaczonych
żadnych standardów. Co jakiś czas pojawia-
ją się pomysły oparte o mierzenie użytkowa-
nia widgetów – czyli elementów składowych
strony, lecz jak na razie nie znalazły one glo-
balnego poparcia w sensie sformalizowanego
standardu, który pomógłby nam za pomocą
zewnętrznej aplikacji zbierać dane analitycz-
ne – możemy co najwyżej zaimplementować
to we własnym zakresie. Wciąż w zastosowa-
niach uniwersalnych zmuszeni jesteśmy poru-
szać się w miarach aktualnie stosowanych, a na
ich wyniki AJAX nie wpływa pozytywnie. W
sieci znajdują się dwa dość ciekawe artykuły
budzące uzasadniony dystans wobec wszech-
obecnego entuzjazmu dla AJAX: Is AJAX
The Page View Killer? autorstwa Sean’a Mi-

Rysunek 1. Jedno z najczęstszych zastosowań


AJAX przy weryfikacji logowania użytkownika, na Rysunek 2. Popularne zastosowanie AJAX do szybkiego wysyłania ocen użytkowników na przykładzie
przykładzie systemu Google Analytics popularnego serwisu Youtube

26 03/2008
AJAX – kiedy i jak?

XMLHttpRequest jak pozyskać zawartość pliku test.php. XHR da- Prostota użycia, łatwość operowania na więk-
Bezpośrednie użytkowanie XMLHttpRequest je nam najszerszą z możliwych kontrolę nad wy- szej ilości przesyłanych zmiennych i wygodny
(XHR) może być odrobinę kłopotliwe, jednak- syłanymi zapytaniami i ich treścią – łącznie z sposób niemal zdarzeniowego programowania
że wiele osób z powodzeniem używa bezpo- kontrolą nagłówków i pozyskiwaniem wielu da- czynią z tej biblioteki bardzo wygodne narzę-
średnio tego obiektu. Obiekt XHR nie ma ogra- nych jak Content–Type, czy Last–Modified. dzie. Listing 3. zawiera przykład implementa-
niczeń do wyłącznie plików XML, może żądać Aby szczegółowo zapoznać się z możliwościa- cji funkcji przesyłającej dane z formularza z Li-
albo przesyłać każdy typ dokumentów, jednak- mi używania tego obiektu, zachęcam do prze- stingu 4. Jak widać na przykładzie, mamy do
że działanie na danych binarnych jest proble- czytania artykułu autorstwa Jima Leya pod ad- dyspozycji szereg zdarzeń związanych z trans-
matyczne. Jak zazwyczaj nazwa obiektu zależy resem http://www.jibbering.com/2002/4/httpre- misją. Biblioteka advAjax jest narzędziem god-
od nazwy przeglądarki. Pod Internet Explorer quest.html. Autor w sposób dość wyczerpujący, nym polecenia osobom początkującym, jak i z
tworzymy obiekt używając new ActiveXObjec na przykładach, prezentuje przykłady użycia te- doświadczeniem. Więcej dowiedzieć się moż-
t("Msxml2.XMLHTTP") lub new ActiveXObject go obiektu. na na stronie projektu http://advajax.anakin.us/
("Microsoft.XMLHTTP") w zależności od wer- XMLHttpRequest to rzeczywiście bezpośred- index-pl.htm.
sji MSXML, która jest zainstalowana (wersji nie użytkowanie natywnych metod obiektu Ja-
tej przeglądarki). W produktach Mozilli i Safari vaScript, który po przyjrzeniu się bardziej skom- mintAjax
powinniśmy używać new XMLHttpRequest(). plikowanym przykładom trochę odstrasza, dla- Sama koncepcja mintAjax jest zbliżona do
Dodatkową ciekawostką jest, że przeglądar- tego warto pokusić się o użycie jakiejś małej, działania advAJAX, jednakże nie należy
ka IceBrowser, wymaga jeszcze innej metody: lecz efektywnej biblioteczki. Mi bardzo bliskie dać się zwieść. MintAjax to odrobinę śwież-
window.createRequest() . są dwa dosyć popularne rozwiązania AJAX– sze spojrzenie na temat. Na Listingu 5. znaj-
W praktyce oznacza to, że do każdej przeglą- owe, z resztą naszego rodzimego pochodzenia. duje się wzorcowy przykład implementacji
darki musimy używać innej metody, gdyż to, Pierwsze to advAJAX, a drugie to mintAjax. funkcji wysyłającej dane formularza z Listin-
co działa w jednej spowoduje błędy w drugiej. gu 4. Zachęcam Czytelnika do analizy kodu,
Kod na Listingu 1. prezentuje przykład inicjacji advAJAX a więcej przykładów porównawczych znaleźć
obiektu z uwzględnieniem konieczności dywer- AdvAJAX był już wielokrotnie opisywany i jest można na stronie projektu w wyjątkowo rze-
syfikacji. Na Listingu 2. mamy prosty przykład bardzo ceniony przez osoby, które go używają. czowej i dobrze przygotowanej dokumentacji
http://mintajax.pl/Przewodnik/. Myślę, że jed-
Listing 3. Przykład implementacji funkcji wysyłającej formularz o id=„moj_forumlarz” przy użyciu nym z ciekawszych pomysłów zastosowanych
advAjax w mintAjax jest funkcja $, która stanowi cie-
kawy pomysł i spore ułatwienie. Chodźby z
function wyslijDane () { uwagi na funkcję $ warto przyjrzeć się min-
var moj_formularz = document.getElementById("moj_formularz"); tAjax bliżej.
advAJAX.submit( moj_formularz, {
url: ( "skrypt_obslugi_formularza.php" ), Podsumowanie
onSuccess : function(obj) { Mam nadzieję, że ten krótki artykuł pomo-
alert(obj.status); że właściwie, pomysłowo i efektywnie wyko-
}, rzystywać technologię AJAX. Niewątpliwie
onError : function(obj) { AJAX jest czymś niezbędnym w nowocze-
alert("Error: " + obj.status + ' ' + url); snym webdesignie, a zastosowanie tej tech-
} nologii na pewno doceni użytkownik koń-
}); cowy. Dosyć rozbudowany wstęp teoretycz-
} ny daje podstawę do właściwego wyboru jed-
nego z zaproponowanych rozwiązań. Poza za-
Listing 4. Przykład formularza o id=„moj_forumlarz” prezentowanymi istnieją setki innych, dlate-
<form id="moj_formularz” method="POST" action="form_post.php"> go Czytelnik, jeżeli nie będą mu odpowiadać
Pole tekstowe: zaprezentowane tu przykłady, bez problemu
<input name="text" type="text" /><br /> znajdzie w sieci bibliotekę AJAX w sam raz
Checkbox: dla siebie, choćby przeglądając stronę http:
<input name="checkbox" type="checkbox" /><br /> //ajaxpatterns.org/. A jeżeli nie – to już wie
Radio: choćby z tego artykułu, że może stworzyć
<input name="radio" type="radio" value="Lorem" checked /> Lorem ją sam na bazie XMLHttpRequest – do czego
<input name="radio" type="radio" value="Ipsum" /> Ipsum gorąco zachęcam, gdyż daje to najszerszy po-
</form> gląd na działanie AJAX i inspiruje do znajdo-
<div id="response"></div> wania coraz ciekawszych zastosowań.
<button onclick="wyslijDane()">Wyślij formularz</button>

Listing 5. Przykład implementacji funkcji wysyłającej formularz przy użyciu mintAjax MACIEJ WIŚNIEWSKI
function wyslijDane () { Maciej Wiśniewski jest szefem iCEAM.com We-
var req = mint.Request(); bdesigner Team oraz studentem Wyższej Szko-
req.OnSuccess = function() { ły Informatyki Stosowanej i Zarządzania WIT w
$("response").innerHTML = this.responseText; Warszawie, na specjalizacji inżynieria oprogra-
} mowania. Od 2001 roku profesjonalnie zajmuje
req.SendForm("moj_formularz"); się tworzeniem aplikacji, stron i serwisów inter-
} netowych dla dużych, małych i średnich firm.
Kontakt z autorem: maciej.wisniewski@iceam.com

www.phpsolmag.org 27
Rozwiązania

Kohana
Powiew świeżości wśród frameworków PHP

Kohana to młody, dynamicznie rozwijany framework PHP, charakteryzujący


się dużą wydajnością i niebywałą wygodą użytkowania. Posiada on
najlepsze cechy swojego protoplasty – CodeIgnitera - eliminując przy tym
dobrze znane użytkownikom bolączki.

nia frameworka musimy dokonać podsta-


Dowiesz się... Powinieneś wiedzieć... wowej konfiguracji. W naszym przypadku
• Co charakteryzuje framework Kohana; • Jak programować obiektowo w PHP5; wystarczy, że zmienimy wartość elementu
• Jakie są podobieństwa i różnice w stosunku do • Co to jest framework; site_domain w pliku application/config/con-
CodeIgnitera; • Czym jest wzorzec MVC; fig.php zgodnie z instrukcjami w komenta-
• Jakie nowości i unikalne cechy wprowadza • Zalecana znajomość CodeIgnitera. rzach. Ten krok jest dobrze znany użytkow-
Kohana. nikom CodeIgnitera, jednak już na tym eta-
pie pojawiają się pierwsze różnice. Więk-
szość plików konfiguracyjnych została bo-
gą mieć istotne różnice w API. Zaznaczamy wiem przeniesiona do folderu system/config.
więc, że wszystkie rady i listingi zamieszczo- Jest to spowodowane nowym podejściem do
Poziom trudności ne w tym artykule dotyczą wersji 2.1.2. struktury katalogów i hierarchii ładowania
plików – więcej na ten temat w dalszej czę-
Coś więcej niż Hello World ści artykułu.

K
ażdy użytkow- Fundamentalne aspekty pracy z Kohaną Skoro jesteśmy już przy plikach konfigu-
nik CodeIgnitera powie, że jedną omówimy na podstawie w pełni działające- racyjnych, stwórzmy jeszcze jeden, który
z jego największych zalet jest pro- go mini serwisu, który będzie pobierał, prze- okaże się niezbędny dla naszego projektu.
stota. Aby zapoznać się z zasadami i sche- twarzał, archiwizował, a następnie wyświe- Plik ten nazwaliśmy settings.php, a jego za-
matami programowania w CI wystarczał je- tlał wiadomości z wybranych kanałów RSS. wartość przedstawia Listing 1. Tworzymy
den wieczór. Niestety, autor tego framewor- Do tego celu wykorzystamy takie możliwo- w nim nową opcję konfiguracyjną o nazwie
ka nie przykładał się do sukcesywnego wzbo- ści Kohany jak obsługa RSS, buforowanie, rssaddr , która jest tablicą zawierającą adre-
gacania go o nowe możliwości oraz do napra- paginacja i archiwizacja. sy przykładowych kanałów RSS.
wiania problemów wykrytych przez społecz- Prosimy pamiętać, że artykuł kierujemy Kohana, podobnie jak CodeIgniter, wy-
ność. W wyniku niezadowolenia z takiej po- przede wszystkim do osób zaznajomionych korzystuje wzorzec MVC (Model View Con-
stawy, rozpoczęto prace nad forkiem Code- z frameworkiem CodeIgniter, dlatego skupi- troller), jednak nie zmusza do jego wykorzy-
Ignitera. Szybko narodził się Blue Flame, my się bardziej na różnicach aniżeli na opi- stania. Jeśli stopień skomplikowania projek-
który napisany od nowa i przemianowany na sywaniu podstaw. tu jest niewielki, wygodniejszym rozwiąza-
Kohana (w języku Dakotów oznacza szybki, Pierwszym krokiem jest oczywiście ścią- niem może okazać się wykorzystanie tylko
prędki) stał się oddzielnym projektem na li- gnięcie oficjalnego wydania Kohany ze stro- kontrolera i widoku, pomijając tym samym
cencji BSD. ny projektu (patrz ramka W Sieci) oraz roz- warstwę modelu. My jednak skorzystamy z
Pomimo dużych powiązań z CodeIgnite- pakowanie go do folderu dostępnego z po- pierwszego sposobu, gdyż kod pobierający
rem Kohana nie jest wstecznie kompatybil- ziomu serwera PHP. Zawartość paczki moż- dane z kanałów RSS dobrze wpasowuje się w
na. Różnice między dwoma frameworkami na dostosować (podobnie jak w mootools) ideologię modelu.
będą się powiększać wraz z biegiem czasu. – zalecamy zaznaczenie wszystkich modu- Otwórzmy kontroler welcome.php (jest to,
Kohana jest bardzo młodym projektem, jed- łów. Przed przystąpieniem do użytkowa- podobnie jak w CI, domyślny kontroler, ła-
nak już teraz posiada wiele cech, dla których
warto przesiąść się zarówno z CodeIgnitera,
jak i z innych frameworków. Wymagania Kohany
Aby móc wykorzystać w pełni potencjał Kohany, należy spełnić kilka wymagań dotyczących serwera:
W niniejszym artykule przedstawimy
Wam większość z tych cech, opierając się na • Serwer z PHP w wersji 5.2 (lub nowszej) obsługujący Unicode
konkretnych przykładach. Prosimy pamię- • PCRE skompilowane z flagami -enable-utf8 i -enable-unicode-properties
tać, że Kohana jest w fazie dynamicznego • Biblioteki iconv (transliteracja) i mcrypt (szyfrowanie)
rozwoju. Dodatkowo autorzy ostrzegają, że • Biblioteka mbstring znacznie przyśpieszy funkcje UTF-8 (opcjonalna)
główne (major) wydania frameworka mo-

28 03/2008
Kohana

dowany w sytuacji, gdy użytkownik nie po- Listing 1. Plik settings.php zawierający adresy kanałów RSS
da w adresie żadnych dodatkowych para-
metrów). Zmieńmy jego zawartość na tą za- <?php defined('SYSPATH') or die('No direct script access.');
mieszczoną w Listingu 2. $config['rssaddr'] = array(
Kontroler w Kohanie to (podobnie jak w 'http://www.chip.pl/rss/newsroom.rss',
CI) klasa rozszerzająca klasę Controller. 'http://rssout.idg.pl/rss_news_30.xml',
Nazwa klasy musi zaczynać się wielką literą 'http://rssout.idg.pl/pcworld/news_utf.xml',
oraz mieć przyrostek _Controller. Poszcze- 'http://rssout.idg.pl/zoom/news_utf.xml',
gólne nazwy funkcji (metod klasy) odpowia- );
dają drugiemu segmentowi adresu URL. Me-
toda index jest tą, która zostanie załadowa- Listing 2. Kontroler welcome.php będący sednem serwisu
na w sytuacji, gdy nie podano owego segmen- <?php defined('SYSPATH') or die('No direct script access.');
tu. W Kohanie pojawia się dodatkowo meto- class Welcome_Controller extends Controller {
da _default, wykonywana w sytuacji, gdy żą- public function index() {
dana metoda nie istnieje (CodeIgniter zwra- // Ładujemy bibliotekę Cache
ca w takiej sytuacji błąd 404). Wszystkich $this->cache = new Cache;
pozostałych metod, których nazwy zaczynają // Jeśli nie istnieje cache kanałów RSS, musimy go wygenerować
się od podkreślenia, nie da się wywołać z po- if( ($feeds = $this->cache->get("rssfeeds")) === NULL ) {
ziomu przeglądarki – mogą zostać bezpiecz- // Ładujemy model RSS i pobieramy kanały
nie użyte do wewnętrznych operacji. $rss_model = new Rss_Model;
Kohana wprowadza nowy (w stosunku $feeds = $rss_model->get_feeds(config::item('settings.rssaddr'));
do CI) sposób ładowania zasobów takich // Buforujemy dane
jak biblioteki, czy modele. Od wersji 2.1.2 $this->cache->set("rssfeeds", $feeds);
nie można już stosować kodu $this->load- // Zapisujemy RSS w postaci plików XML na dysku
>cokolwiek(), co nastręcza nieco proble- $rss_model->save_feeds(config::item('settings.rssaddr'));
mów przy przenoszeniu serwisu na nowy // Tworzymy archiwum ZIP zawierające pliki XML
framework. Zalecanym sposobem ładowania $this->archive = new Archive;
bibliotek jest $this->nazwa = new Nazwa, $this->archive->add('application/cache/feeds/', 'feeds/', true);
a w przypadku modeli $model = new Nazwa_ $this->archive->save('application/cache/feeds_'.date('Y-m-d_H-i-s').'.zip');
Model. Zaprezentowany sposób zapisu nazw }
(wielką literą; nazwa modelu z przyrostkiem
_Model) jest obowiązkowy. W przypadku in- // Personalizujemy ustawienia biblioteki Pagination
nych zasobów stosuje się analogiczny zapis. $this->pagination = new Pagination(array(
Pragniemy zwrócić uwagę czytelni- 'base_url' => 'welcome/index',
ka na warunek instrukcji if znajdującej 'uri_segment' => 'index',
się w kontrolerze. Metoda $this->cache- 'total_items' => count($feeds),
>get("rssfeeds") zwraca dane cache o id 'items_per_page' => 5,
rssfeeds (mogą one mieć dowolną postać, 'style' => 'digg',
np. ciągu znaków, tablicy, czy nawet obiek- ));
tu), lub null w przypadku niepowodzenia. // Wycinamy ze wszystkich wpisów RSS te, które odpowiadają numerowi strony
Z oczywistych względów przy pierwszym $feeds = array_slice($feeds, ($this->uri->segment(3, 1) - 1)*5, 5);
uruchomieniu skryptu kod zawarty w in- // Ładujemy widok i przekazujemy do niego wybrane wiadomości RSS
strukcji warunkowej zostanie wykonany. $welcome = new View('welcome');
Blok zawarty we wspomnianej instrukcji $welcome->feeds = $feeds;
warunkowej wykonuje szereg operacji. Po $welcome->render(TRUE);
załadowaniu modelu, którego metoda get_
feeds zwraca tablicę zawierającą wpisy ze }
wszystkich kanałów RSS (chwilowo pomi- public function _default() {
niemy dokładną zasadę działania tej meto- // Przekierowanie na stronę główną
dy), zapisujemy ją do pliku za pomocą wbu- url::redirect('welcome/index/');
dowanego systemu cache. Do tego celu mu- }
simy podać id (które umożliwi systemowi }
późniejsze pobranie odpowiednich danych)
oraz rzecz jasna dane do zbuforowania. Pro-
simy zwrócić uwagę na różnicę w sposobie
buforowania w stosunku do CodeIgnitera,
Umiejscowienie katalogów Kohany
Podczas umieszczania struktury katalogów Kohany na serwerze warto rozważyć przeniesie-
gdzie cache dotyczył całej strony. Następną nie folderów application/, modules/ i system/ poza katalog publicznie dostępny z poziomu prze-
instrukcją w kodzie kontrolera jest: glądarki. Jest to dobra praktyka, gdyż wszystkie wywołania stron są obsługiwane przez plik in-
dex.php (jego nie możemy przenieść), a bezpośredni (publiczny) dostęp do wyżej wymienionych
$rss_model->save_feeds(config::item('setting folderów nie jest wymagany do poprawnego działania frameworka. Tym prostym sposobem
zwiększamy bezpieczeństwo kodu źródłowego naszych aplikacji, nie narażając się na wykorzy-
s.rssaddr'));,
stanie przez osoby trzecie błędów oprogramowania. Należy jednak pamiętać, aby po przenie-
sieniu folderów zmodyfikować ich ścieżki w pliku index.php (zmienne $kohana _ application,
która zapisuje na dysk pobrane pliki XML. $kohana _ modules i $kohana _ system ).
Dokonujemy tego wyłącznie w celu zade-

www.phpsolmag.org 29
Rozwiązania

monstrowania archiwizera plików dostęp- biblioteki Pagination odpowiedzialnej (po- łącznie arytmetycznie – na podstawie poda-
nego standardowo w Kohanie (bibliote- dobnie jak w CodeIgniterze) za wygenerowa- nych wartości generuje określoną liczbę od-
ka Archive). Potrafi on wygenerować ar- nie linków do poszczególnych stron serwisu. nośników, których obsługą musimy zająć się
chiwum ZIP zarówno z pojedynczych pli- Jako parametr podajemy tablicę z podstawo- sami. W naszym przypadku jest to dość pro-
ków, jak i całych folderów. Dodajemy wymi ustawieniami – ich nazwy są dość jed- ste zadanie – wystarczy, że z bazy wszyst-
je za pomocą metody $this->archive- noznaczne, w dodatku są one znane z frame- kich wiadomości RSS wyjmiemy te, które
>add('ścieżka/do/pliku') – możemy wy- worka CI. Przyjrzymy się tylko opcji style, odpowiadają aktualnemu numerowi stro-
wołać ją wielokrotnie. Po dodaniu wszyst- która określa wygląd (styl) linków. Dostępne ny. Wykorzystujemy do tego celu funkcję
kich plików generujemy archiwum ($this- standardowo wartości to: classic, digg, exten- PHP array_slice. Ważny jest jej drugi pa-
> a rc h iv e-> sav e('ścieżk a/d o /plik u')), ded, punbb. rametr, a szczególnie funkcja $this->uri-
którego nazwa w naszym przypadku składa Nic nie stoi na przeszkodzie, aby stworzyć >segment(3, 1), która pobiera trzeci seg-
się ze słowa feeds oraz aktualnej daty. Ścież- własny styl formatowania linków. Możemy ment adresu URL (numer strony), a w sy-
ki przekazywane do biblioteki Archive posłużyć się jednym z wymienionych sche- tuacji, gdy ów segment nie istnieje, zwraca
muszą być relatywne względem pliku in- matów, których kod znajdziemy w folderze wartość 1.
dex.php. /system/views/pagination/. W ostatnim bloku kodu metody index ła-
Zbliżamy się powoli do końca pliku kon- Biblioteka Pagination jest bardzo przydat- dujemy widok o nazwie welcome (sposób ła-
trolera. Kolejnym krokiem jest załadowanie na i wygodna w użyciu, lecz działa ona wy- dowania jest analogiczny do omówionego
wcześniej, dotyczącego bibliotek i modu-
łów), a następnie przekazujemy do widoku
Listing 3. Plik rss.php zmienną o nazwie feeds. Tym sposobem
możemy przekazywać zmienne każdego ty-
<?php defined('SYSPATH') or die('No direct script access.'); pu, nawet obiekty.
class Rss_Model extends Model { Końcowy krok to oczywiście wysłanie
public function get_feeds($rssaddr) { strony do przeglądarki (wartość FALSE prze-
// Tworzymy tablicę, do której umieścimy dane ze wszystkich kanałów RSS kazana do metody render spowodowała-
$feeds = array(); by zwrócenie kodu HTML do zmiennej za-
// Parsujemy kolejno dane z każdego adresu URL miast bezpośredniego wysłania go do prze-
foreach($rssaddr as $address) { glądarki użytkownika).
$feeds = array_merge($feeds, feed::parse($address)); Przejdźmy teraz do opisu modelu. Jest to
} plik /application/models/rss.php, którego zawar-
return $feeds; tość prezentuje Listing 3.
} Nasz model dostarcza tylko dwie metody
public function save_feeds($rssaddr) { – get_feeds odpowiedzialną za pobranie i
// Zapisujemy na dysk nieprzetworzone dane z każdego kanału osobno sparsowanie danych z kanałów RSS oraz save_
foreach($rssaddr as $id => $address) { feeds zapisującą nieprzetworzone dane (w po-
file_put_contents(APPPATH.'cache/feeds/'.$id.'.xml', file_get_ staci plików XML) na dysk. Modele – tak jak
contents($address)); kontrolery, czy biblioteki – muszą stosować
} określony schemat nazewnictwa (nazwa wielką
} literą, przyrostek _Model). Metoda get_feeds
} przechodzi iteracyjnie przez kolejne adresy ka-
nałów RSS parsując ich zawartość i umieszcza-
Listing 4. Widok welcome zawierający kod HTML ze wstawkami PHP jąc ją w tablicy.
Zatrzymajmy się na chwilę, aby omówić
<html><head> dość tajemniczo wyglądające (szczególnie
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> dla użytkowników CodeIgnitera) wywoła-
<title>Najświeższe wiadomości</title> nie feed::parse($address). Tak w Koha-
</head><body> nie wywołuje się funkcje (a właściwie me-
<?php foreach($feeds as $feed): ?> tody) helperów. W przeciwieństwie do CI,
<h3><a href="<?=$feed['link']?>"><?=$feed['title']?></a></h3> helpery w tym frameworku mają postać kla-
<p><?=$feed['description']?></p> sy ze statycznymi metodami. Aby wywołać
<p><small>Data Publikacji: <?=$feed['pubDate']?></small></p> którąś z nich, nie musimy dokonywać wcze-
<?php endforeach; ?> śniejszego ładowania helpera – po prostu od-
<p><?=$this->pagination->create_links()?></p> wołujemy się do niego w postaci klasa::
</body></html> metoda(zmienne).
Wróćmy jeszcze na chwilę do kodu nasze-
Listing 5. Kod SQL tabeli articles go kontrolera. Tam do metody get_feeds
przekazaliśmy (co można wywnioskować
CREATE TABLE IF NOT EXISTS `articles` ( po nazwie elementu) adresy kanałów RSS:
`id` int(11) NOT NULL auto_increment, config::item('settings.rssaddr'). To
`title` varchar(255) collate utf8_unicode_ci NOT NULL, najwygodniejszy sposób pobierania usta-
`text` text collate utf8_unicode_ci NOT NULL, wień z plików konfiguracyjnych dostępny
PRIMARY KEY (`id`) w Kohanie – config to rzecz jasna jeden ze
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; standardowo dostępnych helperów, a item to
jego metoda przyjmująca jako parametr na-

30 03/2008
Kohana

zwę elementu, która również jest nieco in- wbudowaną klasę Template_Controller ry katalogów. Kohana implementuje kaska-
na niż w CI. Za pomocą metody config:: (jej kod można znaleźć w folderze /system/ dowy system plików, dzięki czemu zarów-
item możemy nie tylko wczytać konkret- controllers/). Kontrolery właściwe, które od- no folder application/, jak i system/ (a rów-
ny element z dowolnego pliku konfigura- powiadają za wyświetlanie poszczególnych nież podfoldery w folderze modules/) ma ta-
cyjnego (obowiązujący schemat zapisu to stron (np. Welcome_Controller) muszą roz- ki sam układ katalogów. Framework poszu-
'nazwapliku.element' – plik konfigura- szerzać z kolei owy kontroler pośredniczący. kując dowolnego pliku, najpierw sprawdza
cyjny zostanie automatycznie wczytany, je- Dzięki takim zmianom jesteśmy w stanie do- folder application/, a w przypadku niepowo-
śli jeszcze to nie nastąpiło), ale również za- konać operacji o wiele bardziej skomplikowa- dzenia folder system/ (ewentualnie przeszu-
ładować cały plik (przekazując do metody je- nych niż automatyczne ładowanie zasobów, kuje przedtem odpowiednie podkatalogi fol-
go nazwę). które zostaną każdorazowo wykonane przed deru modules/, jeśli jakieś moduły zostały za-
Skoro wiemy już jak wyglądają helpery w instrukcjami zawartymi w kontrolerach. ładowane). Pozwala to nam na zachowanie
Kohanie, wróćmy do omawianego wcześniej Kolejnym ważnym usprawnieniem jest większego porządku i logiki w systemie pli-
kodu modelu Rss. Metoda save_feeds przyj- standaryzacja i usystematyzowanie struktu- ków. Omawianą funkcjonalność klarownie
muje jako parametr tablicę adresów kanałów
RSS, które następnie wykorzystuje do po-
brania danych XML i zapisania ich na dys- Listing 6. Model Article będący potomkiem biblioteki ORM
ku. Jak już wcześniej wspomnieliśmy, robi-
my to tylko w celu zaprezentowania biblio- <?php defined('SYSPATH') or die('No direct script access.');
teki Archive, a zrezygnowanie z tej funkcjo- class Article_Model extends ORM {
nalności nie będzie miało wpływu na działa- function __construct($id = FALSE) {
nie aplikacji. parent::__construct($id);
Mamy już całą warstwę logiczną serwisu. }
Ostatnim krokiem jest stworzenie warstwy }
prezentacyjnej – widoku, który zostanie użyty
do wygenerowania wyjściowego kodu HTML. Listing 7. Metoda index kontrolera Article_Controller
Listing 4. przedstawia plik /application/views/
welcome.php (kod ma charakter podglądowy public function index() {
– wersja produkcyjna powinna zawierać m.in. // Określamy pierwszy artykuł listy zależnie od numeru strony
DOCTYPE). $pagestart = ($this->uri->segment(3, 1) - 1)*5;
W kodzie widoku nie ma znaczących różnic // Ładujemy model, zliczamy ilość artykułów oraz pobieramy treść kilku z nich
w stosunku do CI. Stosujemy pętlę, aby przejść $articles = new Article_Model();
przez kolejne elementy tablicy $feeds (które $count = $articles->find_all();
również są tablicami) przekazanej do widoku $articles = $articles->orderby('id','desc')->limit(5, $pagestart)->find_all();
w kontrolerze ($welcome->feeds = $feeds;). // Personalizujemy ustawienia biblioteki Pagination
Tym sposobem możemy przekazać dowolny $this->pagination = new Pagination(array(
typ danych. 'base_url' => 'article/',
Widok jest ostatnim ogniwem naszego mi- 'uri_segment' => 'index',
ni serwisu. Możemy teraz umieścić wszyst- 'total_items' => count($count),
kie pliki na serwerze i sprawdzić rezulta- 'items_per_page' => 5,
ty. Powinniśmy ujrzeć stronę zawierającą 'style' => 'digg',
pięć wiadomości pobranych z kanałów RSS. ));
Pierwsze załadowanie strony najprawdopo- // Ładujemy widoki i generujemy kod HTML
dobniej potrwa kilka sekund. Każde następ- $page = new View('article_layout');
ne – za sprawą buforowania danych - potrwa $content = new View('article_list');
nieporównywalnie krócej. $content->articles = $articles;
$page->content = $content;
Co warto wiedzieć o zmianach $page->render(TRUE);
Autorzy wprowadzili w Kohanie wiele }
zmian w stosunku do CodeIgnitera. Kilka
najważniejszych już poznaliśmy omawiając
przykład mini serwisu RSS: nowe nazew- W Sieci
nictwo kontrolerów czy modeli, inny spo-
sób ładowania zasobów, zmieniona struktu- • http://kohanaphp.com – Oficjalna strona frameworka Kohana (ang),
ra helperów (pełna obiektowość), czy ulep- • http://kohanaphp.pl – Oficjalne polskie wsparcie Kohany,
szony schemat ładowania ustawień konfigu- • http://kohanaphp.com/tutorials/remove_index.html – Przykłady plików .htaccess upiększają-
cych adresy URL (ang),
racyjnych. Przedstawimy teraz kilka innych • http://doc.kohanaphp.com/installation/migration – Opis migracji z CodeIgnitera (ang),
zmian, o których warto wiedzieć. • http://doc.kohanaphp.com/general/events – Lista zdarzeń standardowo dostępnych w Koha-
Jedną z nich jest usunięcie opcji automa- nie (ang),
tycznego ładowania bibliotek (autoload w • http://doc.kohanaphp.com/libraries/orm – Opis biblioteki ORM (ang),
CI). Krok ten może wydawać się niezrozu- • http://kohanaphp.com/tutorials.html – Tutoriale i video-tutoriale (ang),
• http://forumarchive.kohanaphp.com/index.php/board,10.0.html – Dodatkowe tutoriale i pora-
miały (to bardzo przydatna cecha). Auto-
dy napisane przez użytkowników Kohany (ang),
rzy zalecają jednak, aby automatycznego ła- • http://mootools.net/download – Najnowsza wersja mootools do pobrania (ang),
dowania dokonywać we własnym, „pośred- • http://clientside.cnet.com/wiki/mootorial – Prosta dokumentacja frameworka mootools.
nim” kontrolerze rozszerzającym (extends)

www.phpsolmag.org 31
Rozwiązania

przedstawia Rysunek 1. Warto wspomnieć o sy wykonujące działania specyficzne dla okre- W razie wątpliwości warto sprawdzić pod-
istnieniu dwóch głównych wyjątków od po- ślonego, zewnętrznego źródła danych. Sterow- ręcznik użytkownika dostępny na stronie pro-
wyższych reguł: plik config.php (może istnieć niki dotyczą warstwy bazy danych, sesji, cache, jektu, a jeszcze lepiej przejrzeć kod źródłowy
tylko w application/) oraz folder system/core/ czy archiwizacji. Kohana standardowo wypo- danej biblioteki.
(nie istnieje nigdzie indziej). sażona jest w kilka sterowników bazy danych Przykładem biblioteki, której sposób
Plik konfiguracyjny routes.php również do- (MySQL, PostgreSQL), buforowania (m. in. Fi- użycia zmienił się całkowicie jest Session.
czekał się istotnej zmiany. CodeIgniter umoż- le, SQLite) oraz sesji (Cookie, Database). Mo- Usunięto znane z CI funkcje userdata i
liwiał przekierowywanie wszystkich zapytań żemy oczywiście tworzyć własne sterowniki, set_userdata oraz dodano cały szereg no-
spełniających zadane kryteria określone za pamiętając o zachowaniu określonego API. wych jak: get, get_once, id, czy regenerate.
pomocą słów kluczowych :num i :any do jed- Cały kod Kohany został napisany od nowa, Oprócz tego wzbogacono tę bibliotekę w ob-
nego kontrolera. Kohana likwiduje oba słowa aczkolwiek biblioteki o nazwach znanych z sługę wiadomości flash. Możemy za jej po-
kluczowe na rzecz wyrażeń regularnych (oba CodeIgnitera mają bardzo zbliżoną struktu- mocą zapisać wiadomość, która zostanie za-
można zastąpić odpowiednio \d+ oraz .+). rę. Są co prawda większe lub mniejsze różni- chowana do następnego odświeżenia strony
Jedną z ważniejszych zmian jest także wpro- ce, które dla osób zaznajomionych z CI nie po- (np. w celu jej wyświetlenia), po czym biblio-
wadzenie sterowników (ang. drivers). Są to kla- winny stanowić problemu. teka automatycznie ją usunie.
Kohana nie posiada jeszcze niektórych bi-
Listing 8. Plik article_list.php bliotek dostępnych w CI jak: FTP, Email czy
XML-RPC. Funkcjonalność niektórych zastę-
<p><?=$this->pagination->create_links()?></p> pują helpery (np. Email), inne być może zo-
<p><?=html::anchor('/article/edit/', 'Dodaj nowy artykuł')?></p> staną dodane w przyszłości. Kohana jest jed-
<?php foreach($articles as $article): ?> nak wyposażona w możliwość dodawania
modułów, co znacznie rozszerza jej możliwo-
<h3><?=html::anchor('/article/view/'.$article->id, $article->title)?></h3> ści. Posiada również wiele innych nowości,
<p><?=text::limit_words($article->text, 15, '...')?></p> które są naszym następnym tematem.
<?php endforeach; ?>
Nowe znaczy lepsze
Listing 9. Metoda view kontrolera Article_Controller Framework Kohana poza znaczą ilością
public function view($id = 1) { zmian w stosunku do CodeIgnitera, wpro-
// Ładujemy bibliotekę sesji, aby sprawdzić uprawnienia użytkownika wadza również szereg nowości. Jedną z waż-
$this->session = new Session; niejszych jest wprowadzenie tzw. modułów,
if ($this->session->get('user_id')) { które są niczym innym jak małymi aplikacja-
$article = new Article_Model($id); mi (posiadają taki sam układ katalogów jak
// Komunikat o błędzie wyświetlany w razie braku artykułu folder application/) spełniającymi konkretne
if($article->id == '' ) zadania, które są na tyle ogólne, że można je
Event::run('system.404'); używać w wielu projektach.
$page = new View('article_layout'); Kohana udostępnia standardowo kilka
$content = new View('article_full'); przydatnych modułów (do pobrania na ofi-
$content->article = $article; cjalnej stronie projektu): m.in. Forge (ob-
$page->content = $content; sługa formularzy), Auth (autoryzacja użyt-
$page->render(TRUE); kownika), czy Media (kompresja, zarządza-
nie plikami CSS i JS). Nic nie stoi na prze-
} else { szkodzie, aby stworzyć własne moduły lub
// Przygotowujemy pola formularza logowania zmodyfikować te istniejące. Bardzo prawdo-
$form = new Forge(NULL, 'Logowanie'); podobne jest, że za pewien czas pojawią się
$form->input('username')->label('Login')->rules('required|length[4,32]'); moduły tworzone przez członków społecz-
$form->password('password')->label('Hasło')->rules('required|length[5,40]'); ności. Przykłady zastosowania wybranych
$form->submit('Zaloguj'); modułów czytelnik znajdzie w dalszej czę-
if ($form->validate()) { ści artykułu.
// Pobieranie loginu użytkownika Kolejną nowością, której próżno szukać
$user = ORM::factory('user', $form->username->value); w CI są zdarzenia (ang. events). Zdarzenia
// Próba logowania i wyświetlenie błędu w razie niepowodzenia składają się z unikalnej nazwy i funkcji (call-
$this->auth = new Auth; back), która zostanie wywołana, gdy zajdzie
if ($this->auth->login($user, $form->password->value)) { owe zdarzenie. Kohana definiuje kilka zda-
url::redirect('article/view/'.$id); rzeń, których nazwy zaczynają się od przed-
rostka system. Pełną listę wbudowanych zda-
} else { rzeń można znaleźć na stronie podanej w
$form->password->add_error('login_failed', 'Logowanie nieudane!'); ramce W Sieci.
} Istnieje oczywiście możliwość zdefinio-
} wania własnych zdarzeń. Metodą Event::
// Generowanie formularza add możemy zarówno podczepić funkcję do
echo $form->render(); istniejącego zdarzenia (pierwszym parame-
} trem jest jego nazwa, a drugim tablica zawie-
} rająca kolejno wskaźnik do kontrolera i na-
zwę metody do wywołania), jak i stworzyć

32 03/2008
Rozwiązania

własne. Z kolei metodą Event::run wywołu- Autorzy wyposażyli framework w kilka dwóch wariantów odpowiedzi serwera – au-
jemy wybrane zdarzenie, podając jako para- zupełnie nowych bibliotek. Jedną z nich jest toryzacja udana i nieudana. Nie ma jeszcze
metr jego nazwę. Można podczepić wiele od- Archive – użyliśmy jej w omawianym wcze- sterowników do polskich systemów płatno-
wołań do pojedynczego zdarzenia. śniej przykładzie. Jak sama nazwa wskazuje, ściowych.
Kohana została wyposażona w bibliotekę służy ona do archiwizowania określonych pli-
ORM (ang Object-Relational Mapping – Ma- ków bądź katalogów. Archiwum może zostać Krok dalej
powanie Obiektowo-Relacyjne). Pod tą ta- zapisane na dysku lub wysłane bezpośrednio Poznaliśmy już wszystkie najważniejsze no-
jemniczą nazwą kryje się narzędzie o dużych do przeglądarki użytkownika. wości i zmiany frameworka Kohana. Nadszedł
możliwościach. Możemy stworzyć model Inną ciekawą biblioteką jest Payment, któ- czas, aby przyjrzeć się niektórym bardziej za-
(rozszerzający bibliotekę ORM), dzięki któ- ra ma ułatwiać zarządzanie płatnościami w awansowanym zagadnieniom z bliska. W dal-
remu będziemy traktować określoną tabelę serwisie. Razem z nią autorzy dostarczają szej części artykułu przedstawimy jeszcze je-
bazy danych tak, jakby była obiektem. Model kilka sterowników do serwisów płatnościo- den, bardziej skomplikowany przykład ser-
sam będzie zajmował się wyszukiwaniem, ak- wych, m.in. Paypal, czy Authorize.net. wisu. Wyposażymy go w możliwość dodawa-
tualizowaniem czy usuwaniem danych. W Używanie biblioteki ogranicza się do prze- nia, modyfikacji i usuwania artykułów (wyko-
dalszej części artykułu zaprezentujemy kon- kazania kilku danych (jak numer karty kre- rzystamy do tego celu moduł Forge) oraz wy-
kretny przykład wykorzystujący ORM. dytowej, czy adres e-mail) oraz obsłużeniu móg autoryzacji użytkownika w celu obejrze-
nia pełnej wersji artykułu (Auth). Skorzystamy
Listing 10. Metoda edit kontrolera Article_Controller też z biblioteki ORM.
Jak już wcześniej wspomnieliśmy, modu-
public function edit($id = 0) { ły w Kohanie to niewielkie aplikacje wyko-
$form = new Forge(); nujące określone zadania. Wiele z nich ma
przykładowe kontrolery, przedstawiające
// Tworzymy formularz uzupełniając jego pola sposób działania i używania. Dzięki kaska-
$article = new Article_Model($id); dowości systemu plików możemy odwoły-
$form->input('title')->label('Tytul')->value($article->title); wać się do tych kontrolerów z poziomu prze-
$form->textarea('text')->label('Tekst')->value($article->text); glądarki tak, jakby znajdowały się w folderze
$form->submit('Zapisz'); /application/controllers/.
if($form->validate()) { Zanim to jednak nastąpi, musimy załado-
wać wybrane moduły. Dokonamy tego zmie-
// Aktualizujemy zawartość modelu niając opcję modules znajdującą, się w pliku
$article = new Article_Model($id); konfiguracyjnym config.php. Owa opcja jest
$article->title = $form->title->value; tablicą zawierającą adresy modułów, które
$article->text = $form->text->value; chcemy wczytać. W komentarzach znajdzie-
if($article->save()) my odpowiednie przykłady.
url::redirect('article/index/'); Po tych zmianach możemy sprawdzić do-
} else stępne kontrolery. Moduły Forge i Auth za-
echo $form->render(); wierają odpowiednio kontrolery forge_demo
} i auth – wpisując ich nazwy (tak jak w przy-
padku zwykłego kontrolera) w polu adresu
Listing 11. Metoda delete kontrolera Article_Controller przeglądarki możemy dokonać stosownych
public function delete($id = 0) { testów. Zalecamy również przyjrzenie się ko-
if($id > 0) { dom źródłowym opisywanych klas.
$article = new Article_Model($id); Nasz serwis będzie przechowywał artyku-
$article->delete(); ły w bazie danych, dlatego musimy skonfigu-
} rować opcje połączenia znajdujące się w pli-
url::redirect('article/index/'); ku database.php. Jego domyślna wersja jest
} umieszczona w katalogu /system/config/ – po-
winniśmy go skopiować do /application/config/
Listing 12. Plik main.js i zmienić element connection. Czytelnik za-
function loadArticle(url, id) { uważy, że Kohana przechowuje dane połącze-
// Sprawdzamy czy artykuł nie został już wczytany nia w inny niż CI, bardziej ogólny sposób.
if($('article_' + id).style.color != "darkblue") { Kolejnym etapem tworzenia serwisu jest
// Zmieniamy kolor czionki w celu późniejszego rozpoznania wstawienie odpowiednich tabel do bazy da-
$('article_' + id).style.color = "darkblue"; nych. Listing 5. przedstawia strukturę, któ-
// Tworzymy obiekt Ajax obsługujący żądanie podając adres URL rą wykorzystamy do przechowywania arty-
kułów. Moduł Auth wymaga kilku dodatko-
new Ajax(url + id + '/ajax/', { wych tabel, o czym czytelnik powinien się
method: 'post', przekonać, uruchamiając przykładowy kon-
update: 'article_' + id, troler auth.
onComplete: function(){new Fx.Style('article_'+ id,'opacity').start(0,1)}, Pełny kod SQL (jak i wszystkie inne pliki
}).request(); omawiane w artykule) zamieszczamy na pły-
} cie dołączonej do magazynu. Po stworzeniu
} struktury tabeli należy uzupełnić ją o kilka
przykładowych artykułów.

34 03/2008
Kohana

Właściwe programowanie zaczniemy tym Active Record . Kohana udostępnia funk- jednego schematu strony (jeden do przeglą-
razem od stworzenia modelu rozszerzającego cjonalność tej klasy pod pojęciem Query Bu- dania listy skróconych artykułów oraz dru-
klasę ORM. Do naszych potrzeb wystarczy, ilder. gi do czytania pełnej treści jednego z nich),
że będzie on definiować konstruktor wywo- Dodatkowo, w wyniku zgodności z PHP5, zastosowaliśmy dwa widoki, które składamy
łujący konstruktor rodzica. Listing 6. przed- możemy stosować method chaining, co umoż- w całość, przekazując do nich odpowiednie
stawia model Article. liwia nam wywołanie wielu poleceń w jednej zmienne.
Przy implementowaniu ORM należy pamię- linii kodu. Należy przy tym pamiętać, aby Ten pozorny nadmiar okazuje się zbawien-
tać o kilku zasadach: metoda find_all była ostatnią w łańcuchu ny przy projektach z większą ilością pod-
wywołań, gdyż dokonuje ona właściwego za- stron. Jeden z widoków (article_layout) peł-
• nazwa tabeli musi być zapisana w licz- pytania SQL. ni funkcję szablonu, w który „ubieramy” wła-
bie mnogiej (po angielsku) – u nas jest Kolejny blok kodu ładuje bibliotekę ściwą treść. Sam szablon składa się z podsta-
to articles, Pagination, dokonując przy tym pewnych wowych tagów HTML opisujących struk-
• nazwa modelu jest liczbą pojedynczą niezbędnych ustawień (m.in. liczba artyku- turę strony. Zawiera on tylko jedną zmien-
nazwy tabeli, z przyrostkiem _Model – łów wyświetlanych na stronie, którą określi- ną - $content – która służy do przekazania
w naszym przypadku Article _ Model, liśmy na 5). Należy pamiętać, że biblioteka właściwej zawartości. Listing 8. przedstawia
• tabela posiada pole id, które jest liczbą Pagination, podobnie jak jej odpowiednik zawartość widoku article_list.php (kod pliku
(int), ma flagę auto_increment, oraz jest znany z CI, dokonuje jedynie matematycz- article_layout.php jest bardzo prosty, dlatego
kluczem podstawowym (primary key) nego wyliczenia liczby odnośników oraz ich nie zamieszczamy go w artykule – jest oczy-
tabeli. wyświetlenia. Musimy we własnym zakresie wiście umieszczony na płycie).
zapewnić, że na jednej stronie zostanie wy- Warto zwrócić uwagę na użyte helpery. Me-
Dzięki spełnieniu tych zasad model może świetlonych pięć artykułów, a nie dziesięć, toda text::limit_words ogranicza przekaza-
mieć tak prostą budowę, jak przedstawio- czy dwadzieścia (w tym celu zastosowaliśmy ny tekst do piętnastu słów, dodając na jego
na na Listingu 6., a mimo to będzie w stanie metodę limit). końcu trzy kropki. O wiele bardziej użytecz-
wykonać wiele skomplikowanych czynności, Ostatnim etapem generowania strony jest na jest html::anchor, która generuje odno-
o czym przekonamy się niebawem. jej wyświetlenie. Pamiętając o tym, że ser- śnik HTML, dbając przy tym o poprawność
Następnym krokiem jest napisanie kon- wis ma umożliwić wyświetlenie więcej niż relatywnie podanego adresu.
trolera (w naszym przykładzie nazwiemy go
Article_Controller). Listing 13. Fragment metody view kontrolera Article_Controller
Z uwagi na fakt, że serwis będzie składał się z
kilku podstron, omówimy kolejno każdą z me- if($this->uri->segment(4) == 'ajax')
tod kontrolera wraz z odpowiednimi widoka- echo $article->text;
mi. Zacznijmy więc od metody index, którą
prezentuje Listing 7. else {
Zadaniem strony index jest wyświetla- $page = new View('article_layout');
nie listy dostępnych artykułów z odnośni- $content = new View('article_full');
kami do ich pełnej treści. Owa lista ma być $content->article = $article;
podzielona na podstrony, dlatego też dekla- $page->content = $content;
rujemy zmienną $pagestart, która na pod- $page->render(TRUE);
stawie trzeciego segmentu adresu URL (nu- }
mer podstrony), wylicza numer wiersza ta-
beli, od którego należy rozpocząć pobiera- Listing 14. Plik article_list.php
nie artykułów. Następnie ładujemy model <p><?=$this->pagination->create_links()?></p>
Article_Model i za pomocą metody find_ <p><?=html::anchor('/article/edit/', 'Dodaj nowy artykuł')?></p>
all zliczamy całkowitą liczbę artykułów do- <div id="list" style="opacity: 100;">
stępnych w bazie danych. <?php foreach($articles as $article):
Warto w tym miejscu zwrócić uwagę na ?>
sposób, w jaki wykonujemy czynność wiążą- <h3><?=html::anchor('/article/view/'.$article->id, $article->title)?></h3>
cą się z koniecznością połączenia z bazą da- <p id="article_<?=$article->id?>" onclick="loadArticle('<?='http://'.config::
nych, wysłania zapytania SQL zliczającego item('config.site_domain').'article/view/'?>', <?=$article-
liczbę wierszy oraz przetworzenia otrzyma- >id?>)"><?=text::limit_words($article->text, 15, '...')?>
nego wyniku. Wszystkie wymienione kroki </p>
są wykonywane automatycznie dzięki stan- <?php endforeach; ?>
dardowej implementacji biblioteki ORM, </div>
której potomkiem jest nasz model.
Kolejna linijka kodu również dokonuje po- Listing 15. Plik .htaccess upiększający URL-e
brania określonej liczby wierszy z bazy da- RewriteEngine On
nych, stosując pewne kryteria wyszukiwa- RewriteBase /kohana/
nia (sortowanie za pomocą metody orderby) RewriteCond $1 ^(application|system)
i ograniczenia liczby zwróconych wyników RewriteRule ^(.*)$ index.php/access_denied/$1 [PT,L]
(limit – chcemy otrzymać 5 artykułów, RewriteCond $1 ^(index\.php|robots\.txt|favicon\.ico|images|js|css)
poczynając od tego określonego zmienną RewriteRule ^(.*)$ - [PT,L]
$pagestart). RewriteRule ^(.*)$ index.php/$1 [PT,L]
Nazwy obu metod są znane użytkowni-
kom CodeIgnitera - dostępne były w klasie

www.phpsolmag.org 35
Rozwiązania

W tym miejscu możemy dokonać pierw- odpowiedzialną za wyświetlenie pełnej treści zie niepodania owego numeru, zmienna $id w
szego testu serwisu. Po wejściu na stronę ar- wybranego artykułu. Ustaliliśmy wcześniej, obu zapisach przyjmuje wartość 1.
ticle/ powinniśmy ujrzeć pięć najnowszych że do jej obejrzenia wymagana będzie autory- Do wykonania autoryzacji użytkownika
artykułów, które dodaliśmy do bazy danych zacja użytkownika. Przyjrzyjmy się Listingowi stosujemy bibliotekę Session. Sprawdzamy,
przy tworzeniu struktury tabeli articles. Wy- 9. przedstawiającemu kod nowej metody. czy element user_id istnieje, i na tej podsta-
branie któregokolwiek z dostępnych nume- Metoda view przyjmuje jako parametr wie wyświetlamy albo artykuł, albo formu-
rów stron również da zamierzony efekt. zmienną $id będącą numerem identyfikacyj- larz logowania. Jeśli użytkownik jest zalogo-
Po stworzeniu metody index kontrolera nym artykułu. Jest to równoważne zapisowi wany, ładujemy model Article, podając ja-
Article_Controller, czas na metodę view $id = $this->uri->segment(3, 1). W ra- ko parametr id żądanego artykułu. Prosimy
o zwrócenie uwagi na fakt, że w metodzie
index za pomocą modelu pobieraliśmy kil-
ka artykułów naraz, natomiast teraz ładuje-
KOHANA MODULES
my dane pojedynczego artykułu.
W sytuacji, gdy element user_id nie ist-
nieje, musimy wyświetlić formularz logowa-
nia. Tutaj swoje możliwości pokazuje mo-
APPLICATION
duł Forge, który zajmuje się wygenerowa-
controllers/ niem kodu HTML oraz walidacją formula-
welcome.php rza. W naszym przypadku wystarczą dwa po-
vivers/
la (username i password), do których przypi-
layout.php MODULE A sujemy zasady walidacji (znane z CI) oraz
pages/ przycisk Zaloguj.
welcome.php controllers/
Sama walidacja przebiega podobnie jak
welcome.php
products.php MODULE B w CodeIgniterze - tworzymy instrukcję wa-
runkową sprawdzającą wartość wyrażenia
vivers/
controllers/ $form->validate(), aby w przypadku wpro-
pages/
welcome.php
welcome.php
contact.php
wadzenia poprawnych danych dokonać pró-
products.php APPLICATION
by logowania.
error404.php
vivers/ Tu z kolei moduł Auth świetnie spełnia
controllers/
pages/
contact.php
welcome.php swoje zadanie - jeśli logowanie się powiedzie,
error404.php przekierowujemy (url::redirect) użytkow-
products.php
vivers/ nika z powrotem do article/view/id. W prze-
layout.php ciwnym przypadku dodajemy do formula-
pages/
rza komunikat o błędzie, a całość wysyłamy
error404.php
do przeglądarki.
Do wyświetlenia artykułu używamy wido-
ków article_layout.php oraz article_full.php.
MERGED
Oba są na tyle proste, że nie zamieszczamy ich
controllers/ kodu w artykule. Prosimy jednak pamiętać, aby
welcome.php oba pliki znalazły się w katalogu application/
products.php views/ przed próbą wyświetlenia strony (w
contact.php
error404.php przeciwnym wypadku zostanie wyświetlony
komunikat o błędzie).
vivers/ Aby przetestować tę część kodu, musimy
layout.php
pages/ stworzyć konto użytkownika. Moduł Auth
welcome.php dostarcza takiej funkcjonalności – wystar-
products.php czy, że skierujemy przeglądarkę na /auth/
contact.php
error404.php create/, gdzie założymy nowe konto. Teraz
możemy wrócić na /articles/view/id/, gdzie
id to numer artykułu, który chcemy prze-
czytać – po zalogowaniu się otrzymamy je-
go pełną treść.
Rysunek 1. Schemat przedstawiający kaskadowy system plików Samo wyświetlanie to jednak nie wszyst-
ko. Przydałaby się możliwość zarządzania ar-
tykułami (dodawanie, modyfikacja i usuwa-
nie). Nie będzie to dla nas trudne, gdyż wie-
Ładniejsze adresy URL
W celu wyeliminowania członu index.php z adresów URL musimy umieścić w głównym katalo- my już jak używać modułu Forge. Listing
gu Kohany plik .htaccess o zawartości przedstawionej na Listingu 15. Plik może wymagać drob- 10. przedstawia metodę edit, odpowiedzial-
nych modyfikacji, szczególnie gdy folder, w którym znajduje się framework, jest inny niż kohana/. ną za edycję istniejących artykułów, jak i do-
Dodatkowym, koniecznym krokiem jest zmiana ustawienia index _ page znajdującego się w pli- dawanie nowych.
ku application/config.php z index.php na pusty ciąg znaków. Aby obsłużyć próby bezpośrednie-
Kod jest dosyć prosty i sprowadza się do
go załadowania plików z folderów application lub system, musimy dodatkowo stworzyć prosty
kontroler Access _ denied _ Controller wyświetlający np. informację o braku dostępu. Inne wygenerowania formularza z dwoma pola-
przykłady plików .htaccess czytelnik znajdzie na stronie podanej w ramce W Sieci. mi (title i text) o wartościach odpowiadają-
cych wybranemu artykułowi, zweryfikowa-

36 03/2008
Kohana

nia poprawności wprowadzonych danych korzystali z CodeIgnitera wiedzą, że jest to tykułu, otaczając go odpowiednim kodem
(które zawsze będą poprawne, gdyż nie usta- duże ułatwienie. HTML, my natomiast potrzebujemy samej
liliśmy żadnych reguł) oraz wprowadzenia Dodatkową zaletą modułu Media jest treści. Zmiany nie są więc duże – musimy
zmian do bazy danych. możliwość aktywowania kompresji i pako- zmodyfikować blok kodu odpowiadający za
Warto wspomnieć o sposobie, w jaki ob- wania (usuwanie spacji, komentarzy itd.) wygenerowanie strony tak, jak przedstawio-
chodzimy się ze zmienną $id, której war- plików .css i .js. Dokonamy tego zmieniając no na Listingu 13.
tość jest pobierana z trzeciego segmentu ad- odpowiednie opcje, znajdujące się w pliku Dodaliśmy instrukcję warunkową, która
resu URL. Nasze działanie ogranicza się do /modules/media/config/media.php. sprawdza czy wartość czwartego segmentu
przypisania wartości 0 w przypadku bra- Aktywujmy więc moduł Media w pliku adresu URL (tuż za numerem strony) to sło-
ku owego segmentu. Resztą zajmie się kla- /application/config.php, a następnie przy- wo ajax. Jeśli tak, wysyłamy do przeglądarki
sa ORM, która sama zdecyduje, czy należy gotujmy odpowiednie foldery w katalogu samą treść artykułu, bez jakiegokolwiek ko-
dodać nowy artykuł, czy też zmodyfikować /application/views/. Stwórzmy folder media/ du HTML. W przeciwnym przypadku wy-
istniejący. , a w nim js/. Taki układ katalogów jest wy- świetlona zostanie cała strona, tak jak odby-
Ostatnią metodą tego stosunkowo rozbu- starczający do naszych potrzeb. wało się to przed zmianami. Możemy użyć
dowanego kontrolera jest delete, przedsta- W folderze application/views/media/js/ dowolnego ciągu znaków zamiast słówka
wiona na Listingu 11. Kod jest bardzo pro- umieśćmy kod źródłowy frameworka mooto- ajax - ważne, żeby był on identyczny z tym
sty, przytaczamy go jednak, aby wspomnieć ols (do ściągnięcia ze strony podanej w ram- w pliku main.js.
o wyrażeniu $article->delete(). To jed- ce W Sieci – podczas wybierania modułów Ostatnim miejscem zmian jest plik widoku
na ze standardowo dostępnych metod kla- koniecznie zaznaczmy Fx.Style oraz Ajax). article_list.php. Dodaliśmy dwa nowe argumen-
sy ORM, obok m. in. find_by, save, clear Dla ułatwienia zmieńmy nazwę pliku na mo- ty do paragrafu ze skrótem treści: id, gdyż uży-
czy as_array. Opis tych i pozostałych me- otools.js. Drugim plikiem, który tutaj umie- wamy go podczas podmiany tekstu i zmiany ko-
tod czytelnik znajdzie na stronie podanej w ścimy – będzie main.js wykonujący właści- loru czcionki oraz onclick, który wywoła funk-
ramce W Sieci. we żądanie AJAX – jego kod przedstawia cję loadArticle. Do tej ostatniej przekazujemy
Mając gotowe wszystkie metody kontro- Listing 12. adres URL (stosujemy helper config::item po-
lera, powinniśmy dokonać ogólnego testu Kod definiuje funkcję loadArticle przyj- bierając wartość opcji site_domain) oraz id. Peł-
serwisu. Możemy bez problemu przeglą- mującą dwa parametry (adres URL, z któ- ny kod pliku przedstawia Listing 14.
dać kolejne podstrony listy artykułów, doda- rego obiekt AJAX pobierze artykuł, oraz To już wszystkie zmiany wymagane do
wać nowe, jak i edytować czy usuwać istnie- id artykułu). Przed przystąpieniem do wy- wprowadzenia docelowej funkcjonalności.
jące. Do obejrzenia pełnej treści dowolnego konania żądania sprawdzamy kolor czcion- Możemy je przetestować otwierając stronę
artykułu wymagamy logowania – użytkow- ki skróconego opisu artykułu - jest to pro- /article/index/ i klikając na treść dowolnego z
nik zostanie automatycznie wylogowany po ste zabezpieczenie przed problemami zwią- artykułów. Po chwili skrót powinien zostać
okresie ustalonym w pliku /modules/auth/ zanymi z wielokrotnym kliknięciem tekstu. zastąpiony jego pełną wersją pobraną bezpo-
config/auth.php. Wszystkie dane są spraw- Dzięki temu po pobraniu artykułu skrypt średnio z serwera. Całości towarzyszy prosta
dzane pod kątem bezpieczeństwa i (w razie nie będzie wysyłał niepotrzebnych zapytań. animacja wejścia. Warto wspomnieć, że tak-
potrzeby) filtrowane. Mogliśmy rzecz jasna zastosować bardziej że przy tym działaniu jest sprawdzana auto-
wyszukaną metodę sprawdzania, np. zmia- ryzacja użytkownika, chociaż nie było to na-
A jak z AJAX-em nę klasy paragrafu zawierającego tekst, jed- szym bezpośrednim celem.
Kohana nie posiada jeszcze żadnego modu- nak z uwagi zachowanie czytelności i pro-
łu ułatwiającego implementowanie AJAX-a. stoty przykładu (nie używamy żadnych klas To dopiero początek
Autorzy słusznie uważają, że wprowadze- CSS) postanowiliśmy tego nie robić. Na podstawie dwóch przykładów przyswo-
nie wsparcia tej techniki w jądrze framewor- Przy tworzeniu obiektu AJAX ustalamy iliśmy większość zmian, które mogły oka-
ka jest niezgodne z przyjętą ideologią (za- kilka wymaganych wartości. Warto zwró- zać się kłopotliwe dla byłego użytkownika
chowanie maksymalnej prostoty budowy). cić uwagę na update, dzięki której obiekt frameworka CodeIgniter. Poznaliśmy rów-
Nie oznacza to bynajmniej oddzielania się AJAX po otrzymaniu rezultatu automatycz- nież te podstawowe, jak i nieco bardziej za-
od nowoczesnych rozwiązań - wsparcie dla nie uaktualni wartość kontenera o podanym awansowane aspekty programowania ser-
AJAX-a prędzej czy później powstanie w ra- id (u nas id każdego paragrafu zawierającego wisów z wykorzystaniem Kohany. Stworzy-
mach tzw. dodatków (ang. addons). skrócony opis będzie miało postać article_ liśmy dwa w pełni działające mini serwisy,
Niemniej do tego czasu musimy radzić so- id , gdzie id to numer artykułu). Funkcja których kod można w części lub całości wy-
bie sami. W ramach zaprezentowania ogól- przekazana do onComplete zostanie wyko- korzystać do dalszej nauki i eksperymento-
nego sposobu implementacji AJAX-a zmo- nana po zakończeniu całego żądania. Wywo- wania z frameworkiem. Na koniec przedsta-
dyfikujemy nieco nasz serwis z artykułami. łujemy w tym miejscu jedną metod frame- wiliśmy prosty przykład użycia frameworka
Wbudujemy możliwość szybkiego czytania worka mootools – Fx.Style – która dokona mootools w Kohanie.
całości artykułu poprzez kliknięcie w jego płynnej animacji na przekazanym elemen- Zachęcamy czytelnika do sprawdzenia za-
skróconą wersję. Za pomocą klasy Ajax fra- cie, zmieniając podany parametr (opacity, wartości płyty CD dołączonej do magazy-
meworka mootools pobierzemy pełną treść czyli przezroczystość). nu, na której zamieszczamy kody źródłowe
artykułu z serwera i wstawimy ją w odpo- Jest to tylko skrawek możliwości mooto- wszystkich plików omawianych w artykule.
wiednie miejsce, umilając to zdarzenie pro- ols, jednak w zupełności zaspokaja nasze po-
stą animacją. trzeby.
Kohana posiada moduł Media, którego Aby obiekt AJAX miał co pobierać z serwe- KAROL GUSAK
użycie jest zalecane przy wczytywaniu pli- ra, musimy wprowadzić drobne zmiany do Autor jest studentem Informatyki na Politechni-
ków takich jak obrazki, style CSS, czy skryp- kontrolera Article_Controller. Postanowi- ce Białostockiej. Od kilku lat tworzy hobbystycz-
ty JavaScript. Dzięki niemu możemy odwo- liśmy wykorzystać napisaną wcześniej meto- nie strony internetowe w PHP, a od pewnego czasu
ływać się do nich w postaci /media/css/styl.css dę view, której zadanie jest bardzo zbliżone również aplikacje w C++.
czy /media/obrazek.jpg. Czytelnicy, którzy do naszego. View wyświetla pełną treść ar- Kontakt z autorem: groadin@gmail.com

www.phpsolmag.org 37
Rozwiązania

SDO i SCA
Budujemy webservice

Stworzenie webservice'u przy użyciu PHP było do tej pory zadaniem


dość trudnym i wymagającym wykorzystania nie do końca dobrze
udokumentowanych narzędzi. Na szczęście pojawiło się światełko w
tunelu i dostajemy w swoje ręce biblioteki, które w znacznym stopniu
ułatwiają nam to zadanie.
i nie będzie zawierał w zasadzie niczego specjal-
Dowiesz się... Powinieneś wiedzieć... nego, ani trudnego. Zamieścimy w nim zapisa-
• Artykuł pokazuje jak, w dosyć prosty sposób, • Posiadać ogólne pojęcie o programowaniu ne na sztywno informacje, o które później bę-
stworzyć webservice, wykorzystując ekspery- obiektowym; dziemy wysyłać zapytania. W naszym przypad-
mentalne biblioteki. • Znać XML; ku będą to proste informacje pogodowe, miasto
• Znać architekturę typu klient – serwer. oraz temperatura powietrza. Żebyśmy dobrze
wiedzieli co się dzieje, będziemy wyświetlać na
ekranie, jakie zapytanie zostało przesłane.
dwie biblioteki ze sobą, w celu stworzenia pro- Gdybyśmy projektowali normalnej wielkości
stej aplikacji. W tym celu stworzymy klasę, któ- serwis z wieloma udostępnionymi metodami, wy-
Poziom trudności rą następnie opiszemy w taki sposób, aby bi- padałoby go ładnie zaprojektować, ale w naszym
blioteki potrafiły ją rozpoznać jako webservi- przypadku nie bardzo jest się nad czym zastana-
ce. Zanim jednak do tego przystąpimy, musimy wiać. Będziemy udostępniać tylko informacje o
zainstalować potrzebne, wymienione wyżej bi- temperaturze w kilku miastach, więc potrzebuje-

C
oraz częściej wykorzystujemy architek- blioteki. Dokładne informacje na ten temat za- my tylko jednej metody, którą pokażemy światu.
turę SOA (ang. Service Oriented Architec- mieszczono w Ramce Instalacja. Na Listingu 1. widać, jak prosta jest nasza klasa.
ture) w naszych systemach. Taki sposób Na Listingu 1. widać również, że nasza klasa nic
tworzenia oprogramowania polega na tym, aby Klasa webservice'u nie robi. Dlatego też musimy ją zaimplementować.
kilka webservice'ów (niekoniecznie własnych) po- Zaczniemy od stworzenia klasy, która będzie Zacznijmy używać tego, co udostępnia nam SDO.
łączyć w jedną, spójną całość. Jakiś czas temu po- opublikowana później jako nasz webservice. W Skrót ten rozwijany jest jako Service Data Object.
wstała biblioteka SCA, którą możemy łatwo do- artykule chcielibyśmy się skupić na pokazaniu Obiekty tego typu pozwalają łatwo operować na
instalować (patrz ramka Instalacja SCA), jeśli po- sposobu działania bibliotek SCA oraz SDO. Z danych zawartych w formacie XML, bez koniecz-
siadamy oczywiście uprawnienia administratora. tego też powodu nasz kod będzie bardzo prosty ności zastanawiania się skąd te dane pochodzą.
Dzięki tej bibliotece do PHP w końcu dołączono
porządne wsparcie dla tworzenia webservice'ów.
Dzięki modułowi SDO (Service Data Ob-
W Sieci
ject) możemy operować danymi niezależnie od • http://pl.php.net/manual/en/ref.sdo.php – dokumentacja SDO,
kodu, mogą to być informacje zawarte w pli- • http://pecl4win.php.net/ext.php/php_sdo.dll – biblioteka skompilowana dla Windows,
kach XML, dane wyciągnięte z relacyjnej bazy • http://www.w3schools.com/xml/ – podstawy XML-a w przystępny sposób,
danych lub właściwie skądkolwiek. W tym ar- • http://www.w3schools.com/schema/ – podstawy Xscheme.
tykule chcielibyśmy pokazać, jak połączyć te

Objaśnienia skrótów Instalacja


Abyśmy mogli korzystać z bibliotek, przedstawionych w tym artykule, musimy je zainstalować.
• SCA – Service Component Architecture Użyjemy w tym celu konsolowego narzędzia pecl. Jeśli pracujemy na systemie z rodziny Micro-
• SDO – Service Data Objects soft windows, to musimy prawdopodobnie przejść do katalogu gdzie, ono się znajduje (przykła-
• SOA – Service Oriented Architecture dowo: C:\xampp\php). Wpisujemy pecl install -B SCA_SDO. Parametr -B oznacza no build, czyli nie
• SOAP – Simple Object Access Protocol kompiluj i musimy go użyć podczas pracy z Windows. W przypadku wszelkich *nixów parametr
• PEAR – PHP Extension and Application ten jest zbędny.
Repository Ponieważ nie skompilowaliśmy biblioteki SDO pod Windows, musimy ją pobrać z internetu
• PECL – PHP Extension Community Library (patrz ramka W sieci. Gdy już mamy odpowiedni plik, php_sdo.dll lub sdo.so, musimy dopisać
• WSDL – Web Services Description Langu- to rozszerzenie do php.ini: extension=sdo.so (php _ sdo.dll w przypadku Windows). Mając
age otwarty plik php.ini warto sprawdzić również czy PEAR znajduje się w ścieżce przeszukiwań. Jeśli
• XML – Extensible Markup Language nie, nasz kod nie będzie mógł znaleźć odpowiednich plików SCA.

38 03/2008
SDO i SCA

Na Listingu 2. widzimy, jak wysłane miasta są nie prawidłowo rozpoznany i nasza klasa będzie ne po to, by jedna i druga strona (klient i ser-
przyjmowane i wyświetlane na ekranie. Więcej działać jako webservice. wer) wiedziały, z jakim rodzajem obiektu ma-
na temat typów miast i temperatury dowiemy się Przejdziemy teraz do omówienia schema- ją do czynienia.
później. W tej chwili przyjrzymy się tylko jak nimi tu typów, do których odwoływaliśmy się w ta- Na Listingu 4. widzimy definicje typu Ci-
operować oraz jak obiekt $temperatures jest two- gach @types. ties. W pierwszej linii wpisaliśmy jako prze-
rzony. Wywołaliśmy tylko jedną funkcję, mamy strzeń nazw dokładnie to samo, co w tagu
gotowy obiekt – na tym etapie jeszcze pusty. Mu- Schematy typów @types naszego opisu. Przestrzenie nazw ma-
simy go wypełnić danymi, o które zapytał klient. Klasę webservice'u mamy już gotową, ale jesz- ją na celu zawężenie widoczności zdefiniowa-
To również nie sprawia nam trudności, bo gotowy cze nie do końca sprawną, ponieważ potrzeb- nych w nich typów, klas i czegokolwiek co w
obiekt wyposażony jest w odpowiednią funkcjo- ne są nam jeszcze definicje typów. Zapiszemy je nich zamieścimy. Dlatego też ważne jest, aby-
nalność. Aby dodać nowy element do listy tempe- w plikach XScheme, zgodnie z tym, co mówią śmy się w tym miejscu nie pomylili, albo – co
ratur, musimy po prostu stworzyć element pod- tagi naszego opisu klasy. Są one nam potrzeb- gorsza – zapomnieli tego atrybutu. Naszym
rzędny i wypełnić go odpowiednimi danymi. Me-
toda createDataObject() wywołana na obiekcie do- Listing 2. Implementacja klasy WeatherService
daje element do jego struktury i zwraca referen-
cję do niego. W ten sposób, gdy go modyfikujemy, <?php
zmiany są widoczne od razu w obiekcie nadrzęd- class WeatherService {
nym. Nie zajmujemy się poszczególnymi parami function getTemperature($cities) {
miasto/temperatura, więc możemy używać cały echo "Miasta wysłane przez klienta:<br>";
czas tej samej zmiennej $pair. foreach($cities->city as $city) {
Naszą klasę chcemy opublikować jako we- echo $city->name . "<br>";
bservice, dlatego też musimy ją opisać zgodnie }
z założeniami SCA. Będzie to od nas wymagało echo "
dodania komentarzy identycznych z PHP Doc, <br>";
będziemy używać tylko innych znaczników. $temperatures = SCA::createDataObject('http://Weather', 'Temperatures');
Możemy je zobaczyć na Listingu 3. $pair = $temperatures->createDataObject('entry');
Najważniejszą linijką wśród wszystkich tych $pair->city = 'Kraków';
komentarzy jest pierwsza z nich – @service, $pair->temperature = 17;
która mówi, że ta klasa to webservice. Nato- $pair = $temperatures->createDataObject('entry');
miast @binding.soap użyliśmy po to, aby powie- $pair->city = 'Warszawa';
dzieć SCA, żeby używało SOAP do komunikacji $pair->temperature = 18;
z klientami. Kolejne 2 linijki komentarzy mówią, $pair = $temperatures->createDataObject('entry');
gdzie znajdziemy definicje typów, których użyli- $pair->city = 'Wrocław';
śmy w naszej klasie. Ostatnie dwie linijki przy- $pair->temperature = 20;
pominają nam już zupełnie PHP Doc, ponieważ return $temperatures;
użyliśmy nawet tych samych tagów, jednak ostat- }
ni element nie jest opcjonalny,a oznacza prze- }
strzeń nazw (namespace), w której znajdziemy ty- ?>
py Cities oraz Temperatures. Zauważmy również,
że dołączyliśmy bibliotekę SCA na samym po- Listing 3. Niezbędny opis klasy
czątku pliku. Dzięki tej operacji nasz opis zosta- <?php
include "SCA/SCA.php";
/**
* @service
* @binding.soap
*
* @types http://Weather CitiesTypes.xsd
* @types http://Weather TemperaturesTypes.xsd
*/

class WeatherService {
/**
Rysuner 1. Wynik działającego klienta * @param Cities $cities http://Weather
* @return Temperatures http://Weather

Listing 1. Deklaracja klasy WeatherService */

<?php function getTemperature($cities) {


class WeatherService { echo "Miasta wysłane przez klienta:<br>";
...
function getTemperature($cities) { return $temperatures;
} }
} }
?> ?>

www.phpsolmag.org 39
Rozwiązania

głównym elementem jest oczywiście Cities, który do miast w Listingu 2. Typ Temperatures zbudo- śmy w dokładnie ten sam sposób. Najpierw stwo-
zgodnie z tym, jak go opisaliśmy, zbudowany jest z waliśmy w podobny sposób. Umieściliśmy go w rzyliśmy sam obiekt, a następnie uzupełniliśmy
nieograniczonej sekwencji miast. W naszym przy- tej samej przestrzeni nazw, również jest sekwen- go parami miasto/temperatura. Kiedy będziemy
padku miasto to po prostu ciąg znaków. Struktu- cją mniejszego typu, który z kolei jest zbudowany tworzyć obiekt typu Cities, zobaczymy, w jaki
ra wygląda dokładnie tak, jak się odwoływaliśmy z dwóch elementów. Obiekt tego typu budowali- sposób jest on tworzony.

Listing 4. Definicja typu Cities Klasa klienta


Klient to już ostatni element naszej układan-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http:// ki, który potrzebujemy, aby przetestować naszą
Weather" elementFormDefault="qualified"> małą aplikację. Jest nam potrzebny kawałek ko-
<xs:complexType name="CityType"> du, który stworzy obiekt odpowiedniego typu,
<xs:sequence> a następnie wyśle go do webservice'u.
<xs:element name="name" type="xs:string"/> Na Listingu 6. widzimy, jak tworzone jest za-
</xs:sequence> pytanie. Zauważmy jak proste jest odwołanie
</xs:complexType> do webservice'u. Musieliśmy tylko dołączyć
<xs:element name="Cities"> SCA oraz wywołać metodę SCA::getService.
<xs:complexType> Stworzyliśmy lokalny webservice, dlatego też
<xs:sequence> jako parametr podaliśmy nazwę pliku. Stwo-
<xs:element name="city" type="ns1:CityType" maxOccurs="unbounded"/> rzyliśmy obiekt i dołączyliśmy do niego ele-
</xs:sequence> menty, zawierające nazwy miast, o które chce-
</xs:complexType> my zapytać.
</xs:element> Aby wysłać zapytanie do webservice'u po-
</xs:schema> trzebujemy tylko wywołać jego udostępnioną
funkcję ze zbudowanym wcześniej obiektem
Listing 5. Definicja typu Temperatures podanym jako parametr. Jako odpowiedź dosta-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http:// niemy to, co ta funkcja zwraca. Bez problemu
Weather" elementFormDefault="qualified"> możemy więc wyświetlić rezultat na ekranie.
<xs:complexType name="PairType">
<xs:sequence> Publikacja i test
<xs:element name="city" type="xs:string"/> Stworzyliśmy już wszystkie potrzebne elementy
<xs:element name="temperature" type="xs:float"/> i przyszła pora, żebyśmy je w końcu zobaczyli w
</xs:sequence> akcji. Publikacja polega na umieszczeniu plików
</xs:complexType> w miejscu, gdzie serwer wWWW będzie miał do
<xs:element name="Temperatures"> nich dostęp. Jeśli nasz serwer jest sprawny, to w za-
<xs:complexType> sadzie wszystko – webservice działa.
<xs:sequence> Jeśli wpiszemy w pole adresu naszej przeglądar-
<xs:element name="entry" type="ns1:PairType" maxOccurs="unbounded"/> ki adres serwisu z dodanym ?wsdl na końcu, przy-
</xs:sequence> kładowo http://localhost/WeatherService.php?wsdl,
</xs:complexType> będziemy mogli zobaczyć, w jaki sposób jest on
</xs:element> opisany. Ten plik jest ważnym elementem całości,
</xs:schema> ponieważ jeśli będziemy chcieli kiedyś udostęp-
nić światu, to właśnie dzięki temu plikowi można
Listing 6. Budowa zapytania stworzyć potrzebne klasy, nie tylko w PHP.
<?php Naszym ostatnim zadaniem jest wpisanie ad-
include "SCA/SCA.php"; resu klienta w przeglądarce. Najprawdopodob-
$weather = SCA::getService('WeatherService.php'); niej będzie to http://localhost/client.php. Powin-
$cities = $weather->createDataObject('http://Weather', 'Cities'); niśmy zobaczyć wynik taki jak na Rysunku 1.
$city = $cities->createDataObject('city');
$city->name = 'Warszawa'; Podsumowanie
$city = $cities->createDataObject('city'); Pokazaliśmy, że bez szczególnego wysiłku można
$city->name = 'Kraków'; stworzyć webservice. Wykorzystaliśmy do tego bi-
$city = $cities->createDataObject('city'); blioteki SCA oraz SDO. Wyglądają one dosyć in-
$city->name = 'Wrocław'; teresująco, jednak musimy pamiętać, że znajdują
... się one w fazie eksperymentalnej i jako takie mogą
się jeszcze zmieniać. Z tego samego powodu ciężko
Listing nr 7. Wysyłanie zapytania nam będzie przekonać administratorów firm ho-
... stingowych do ich instalacji.
$temperatures = $weather->getTemperature($cities);
echo "Otrzymane temperatury:<br>";
foreach($temperatures->entry as $pair) { MARCIN ZBIJOWSKI
echo $pair->city . ": " . $pair->temperature . "<br>"; Autor pracuje jako programista w branży finanso-
} wej. Od wielu lat interesuje się programowaniem,
?> nie tylko w PHP.
Kontakt z autorem: phpsol@zbijowski.com

40 03/2008
Prenumerata PRO
Więcej informacji: magdalena.sobis@software.com.pl tel.: 022 427-36-51

Firma Informatyczna Ciao GmbH


„Saulewicz” Ciao GmbH jest właścicielem wiodące-
Wdrażamy technologie internetowe w go portalu konsumenckiego w Europie –
oparciu o serwery linuxowe i rozwiąza- Ciao.com. Do nowo powstałego centrum
nia „Open Source”. Oferujemy aplikacje rozwoju oprogramowania we Wrocławiu
bazodaniowe pracujące w środowisku poszukujemy doświadczonych programi-
PHP. Szczególnie uwzględniamy specy- stów PHP. Chcesz dobrze zarabiać, pra-
ficzne zapotrzebowania dotyczące łatwo- cować w międzynarodowym środowisku i
ści obsługi. w przyjaznej atmosferze – dołącz do nas.
www.saulewicz.com.pl. www.ciao-group.com/careers_wroc-
law.php

Masz ciekawy e-pomysł? Kei.pl


Potrzebujesz pomocy! Kei.pl działa na rynku usług hostingowych
Zapewniamy profesjonalną i komplekso- od 2000 roku. Do naszych zadowolonych
wą obsługę w zakresie: stron interneto- Klientów z dumą możemy zaliczyć wie-
wych – systemów zarządzania treścią; le przedsiębiorstw sektora MSP, instytu-
sklepów internetowych – projektów gra- cji oraz osób prywatnych. W ofercie Kei.pl
ficznych; aplikacji internetowych – druko- znajdują się pakiety hostingowe, a także
wania off-setowego. usługi dla wymagających Użytkowników –
www.intersum.pl platformy e-Biznes oraz serwery fizyczne.
http://www.kei.pl

protHOST Agnat Sp. z o.o.


Rewelacyjny hosting o12 już od 49 zł Dostarcza pełen wachlarz usług zwią-
netto/rok (w tym cPanel PL). Rejestracja zanych ze stronami WWW. Serwis
domen od 1 zł netto. Webdesign i pozy- www.agnat.eu obsługuje kilkanaście ty-
cjonowanie. Wszystko czego potrzebu- sięcy Klientów z całej Polski oraz Unii
jesz. Europejskiej, wyposażając je w dome-
http://o12.pl ny internetowe, hosting, pozycjonowa-
nie, kreację stron WW W, kampanie re-
klamowo-promocyjne, oprogramowanie
i aplikacje niezbędne do prowadzenia
biznesu w sieci.

Hosting Jeśli chcesz aby Twoja wizytowka


Elastyczny dobór pakietów, pakiet POCZ-
TA – 40 zł, pakiet START (www, email, 10
pojawiła się w tym miejscu, napisz na adres:
domen, php 5, mysql, pgsql) – 150 zł, pa-
kiety KOMFORT, PROFIT, PROFITSSL, phpsolutions@phpsolmag.org
zarządzanie usługami przez cPanel. Reje-
stracja domen globalnych, krajowych, funk-
cjonalnych i regionalnych. Ceny od 50 zł. lub zadzwon:
http://www.lubman.pl
biuro@lubman.pl
+48 22 427 36 51
Rozwiązania

CRE Loaded
Czas na zmiany

W artykule tym opiszemy jak poprawnie skonfigurować nasz serwer


pod CRE Loaded oraz jak dokonać ewentualnej migracji naszego sklepu
internetowego z OsCommerce. Z artykułu mogą również skorzystać
administratorzy samego OsCommerce, gdyż opisuje on rozwiązania
pewnych problemów, które są wspólne dla obu systemów.
możliwość wyboru z poziomu panelu spo-
Dowiesz się... Powinieneś wiedzieć... sobu wyświetlania produktów (wiersze
• Jak poprawnie skonfigurować serwer pod CRE • Znać podstawy PHP i SQL. lub kolumny);
Loaded; • Tworzenie kont i zamówień z poziomu pa-
• Jak dokonać ewentualnej migracji naszego nelu administracji - szczególnie przydatne,
sklepu internetowego z OsCommerce. kiedy dopuszczamy możliwość przyjmo-
wania zamówień telefonicznych;
• Dokładne statystyki klientów - pokazuje
to myślę, że warto się zastanowić na wypróbowa- liczbę nowych klientów, liczbę zamówień,
niem tego systemu, lub - jeżeli mamy już istnieją- sprzedaży, dostawy, średnią sprzedaż;
Poziom trudności cy sklep – nad migracją z OsCommerce do CRE • Raport dziennej sprzedaży - raport pokazu-
Loaded... je liczbę sprzedaży, nazwę produktu, mo-
del, cenę i sumę;
Niektóre z funkcji • Możliwość wyłączenia działania sklepu na

C
RE Loaded jest udoskonaloną i rozsze- CRE Loaded Standard: czas np. konserwacji - można dostosować
rzoną wersją, bardzo obecnie popu- wygląd strony i komunikatu, jaki wyświe-
larnego, oprogramowania e-commer- • Bezpieczne połączenie - możliwość użycia tli się po wyłączeniu, możliwość określe-
ce, jakim jest OsCommerce. W porównaniu ze bezpiecznego połączenia (jeżeli serwer po- nia co klienci mogą w tym czasie widzieć
standardową wersją otrzymujemy szereg dodat- siada taką opcję); na stronie;
kowych opcji i modułów, które mają za zadanie • Administracja z poziomami dostępu - moż- • Kontroler Downloadu - daje możliwość
ułatwić zarządzanie sklepem, oraz wzbogacić je- liwość przypisania różnych praw dostępu sprzedaży produktów wirtualnych. np.
go funkcjonalność. Jednym z takich udogodnień różnym administratorom, logowanie, rese- oprogramowania. Możliwość określenia
jest moduł wspomagający zarządzanie boxami. towanie hasła, przypomnienie hasła; statusu zamówienia, liczby pobrań oraz
Dzięki niemu, bez zagłębiania się w kod, może- • Program Partnerski - zaktualizowany do czasu wygaśnięcia możliwości pobrania;
my ustawić sposób wyświetlania boxów (w lewej wersji 2.5a, dodane newsy partnerskie i • Import/Export z EXCELA - możliwość ak-
lub prawej kolumnie), ich pozycje, kolor czcion- newsletter partnerski. Duże możliwości tualizacji produktów i cen, atrybutów, opcji
ki, itp. Innym udogodnieniem jest możliwość konfiguracyjne; w programie EXCEL;
zdefiniowania meta tagów dla każdego dodawa- • Lista wszystkich produktów - wyświetla- • Kontroler Danych Meta - daje możliwość
nego produktu - dzięki czemu będzie łatwiej od- nie wszystkich produktów posortowa- przypisywania indywidualnych danych
naleźć go w wyszukiwarkach - oraz możliwość nych kategoriami; meta dla każdej strony sklepu z poziomu
dodawania wielu obrazków o różnych rozmia- • Kopiowanie atrybutów produktów - przy- panelu administracyjnego. Bardzo pozy-
rach dla danego produktu, ustawianie atrybu- śpiesza proces przypisywania cech dla pro- tywnie wpływa na pozycjonowanie sklepu;
tów, etc. Jeszcze inne możliwości to ulepszone duktów, daje możliwość kopiowania ukła- • Meta Tag Controller/ Generator - przypi-
dodawanie opisu produktu poprzez prosty edy- dów już użytych w innych produktach.; suje indywidualne dane meta dla stron ka-
tor typu WYSIWYG (ang. What You See Is What • Menadżer banerów - pozwala administro- tegorii oraz produktów;
You Get) – dzięki temu produkty może wprowa- wać banerami na stronie. Możliwość okre- • Tiny MCE (WYSIWYG) Editor in Admin
dzać osoba, która kompletnie nie zna HTML-a. ślenia ilości wyświetleń. Dokładne staty- - edytor WYSIWYG ułatwia umieszczanie
Podobnych udogodnień wzbogacających funk- styki wyświetleń i kliknięć; informacji na stronach sklepu osobom nie
cjonalność oraz ułatwiających pracę z systemem • System Templatek - daje możliwość zmia- znającym HTML-a;
jest bardzo wiele, do tych ciekawszych należy jesz- ny wyglądu witryny poprzez panel admi- • Sprzedaż wiązana - bardzo dobre narzędzie
cze np. możliwość szyfrowania panelu admini- nistracyjny. Możliwość włączania i ukry- pozwalające na zasugerowanie klientowi
stracji (nie tylko uwierzytelniania), co dodatkowo wania boxów, zmiana wyglądu całej witry- produktów związanych z wybranym przez
podnosi bezpieczeństwo naszego sklepu. Jeżeli są ny jednym kliknięciem; niego. Na karcie informacyjnej pod produk-
to opcje, których potrzebujemy w naszym sklepie • Wyświetlanie produktów w kolumnach - tem pojawiają się produkty powiązane.

42 03/2008
Rozwiązania

W wersji PRO I PRO B2B: określa, czy moduł sesji automatycznie roz- mi znacznika <? zamiast <?php, to konieczne bę-
pocznie sesję na początku każdego żądania. dzie włączenie:
• Edytor plików językowych - możliwość ła-
twej edycji plików językowych, jednocze- magic_quotes = Off short_open_tag = On
sna aktualizacja wszystkich języków;
• Multi menadżer produktów - przesuwa, gdy ta opcja jest włączona, wszystkie ' (poje- Jeżeli nie mamy dostępu do pliku php.ini, to ist-
kopiuje, lub usuwa produkty z wybranej dynczy cudzysłów), " (podwójny cudzysłów), nieje możliwość włączenia tych samych opcji za
kategorii jednym kliknięciem; \ (backslash) i znaki puste (NULL) są poprze- pomocą mechanizmu .htaccess lub bezpośred-
• Sub produkty - Subprodukty wyświetlają dzane automatycznie dodatkowym backsla- nio w kodzie PHP. Przykładowe włączenie opcji
się jako część produktu głównego. Sprze- sh'em. Ze względów bezpieczeństwa ta opcja display_error i wyłączenie session.auto_start:
dawca może w ten sposób określić inne jest domyślnie wyłączona.
opcje wysyłki i ceny dla produktu pocho- • W pliku .htaccess
dzącego np. od innego dostawcy lub z in- allow_url_fopen = On
nego magazynu. php_flag display_errors On
włączenie tej opcji pozwala na używanie ad- php_value session.auto_start: 0
W wersji B2B: resów HTTP i FTP w większości funkcji, któ-
re jako parametr przyjmują nazwę pliku. War- Z pozostałymi opcjami postępujemy analogicz-
• Indywidualne ceny dla klientów - Pozwala to jeszcze włączyć następujące opcje: nie, z tym że w miejscu gdzie należy ustawić
na tworzenie grup klientów oraz na usta- flagę On lub Off używamy dyrektywy php_
lanie indywidualnych warunków sprzeda- display_errors = On flag, a tam gdzie mamy ustawić jakąś wartość
ży dla danej grupy w zależności od ilości (czy to liczbową, łańcuch znaków, czy cokol-
kupowanych produktów. Dzięki temu nasz serwer będzie zwracał komu- wiek innego) używamy dyrektywy php_value.
nikaty o błędach. Podczas przenoszenia sklepu Plik .htaccess należy umieścić w głównym ka-
Konfiguracja PHP jest duże prawdopodobieństwo, że jakieś się po- talogu sklepu.
Domyślna konfiguracja PHP może nie pozwo- jawią. Jeśli nie włączymy tej opcji, możemy na-
lić na poprawne uruchomienie naszego skle- wet nie wiedzieć, że są. Później, kiedy nasz sklep • Bezpośrednio w kodzie PHP
pu internetowego. Jeżeli jesteśmy admini- będzie działał stabilnie, można ją wyłączyć.Je- ini _ set('display _ errors', true);
stratorami serwera, to musimy wyedytować żeli w naszych skryptach PHP używamy czasa- ini_set('session.auto_start', 0);
plik php.ini i włączyć w nim kilka potrzeb-
nych opcji:

register_globals = On

ustawienie tej opcji spowoduje, że do wszystkich


zmiennych przekazywanych do skryptu będzie
się można odwoływać bezpośrednio jak do zwy-
kłych zmiennych w postaci $nazwa_zmiennej.
Ze względów bezpieczeństwa zaleca się wyłącze-
nie tej opcji, ale CRE Loaded wymaga włączenia Rysunek 1. Edytor WYSIWYG w działaniu
register_globals. $HTTP_GET_VARS.

register_long_arrays = On // konieczne
tylko w PHP5

umożliwia dostęp do danych z formularza za


pomocą globalnej tablicy $HTTP_GET_VARS.
Pozostałe wartości powinny być ustawione
tak jak domyślnie, więc pozostaje nam tylko
sprawdzić czy tak jest w istocie:

file_uploads = On

pozwala na wysyłanie plików binarnych me-


todą POST do aplikacji PHP.

safe_mode = Off

wyłączenie tej opcji zmniejszy bezpieczeństwo


naszych skryptów. Gdy ta opcja jest włączona,
PHP sprawdza czy właścicielem pliku, na któ-
rym funkcja chce operować i właścicielem uru-
chamianego skryptu jest ten sam użytkownik.

session.auto_start = 0 Rysunek 2. Strona do exportowania bazy danych w phpMyAdmin

www.phpsolmag.org 43
Rozwiązania

Oczywiście umieszczanie ręcznie takiego wpi- Dobrym rozwiązaniem jest wrzucenie takiego czy mechanizm .htaccess. Niektóre z nich (di-
su w każdym pliku PHP mija się z celem. Najle- pliku do katalogu includes/local/. Dzięki temu sable_classes, disable_functions oraz expose_php)
piej ustawić te wartości np. w pliku includes/local/ oddzielimy pliki stworzone przez nas samych można zmienić jedynie poprzez plik php.ini.
configure.php (ten plik jest domyślnie inkludowany od tych istniejących domyślnie. Jednak ich zmiana należy raczej do rzadkości.
przez CRE loaded – jeżeli tylko istnieje) lub stwo- Inkludujemy go standardowo, gdzieś na po- Z kolei użycie mechanizmu .htaccess wyma-
rzyć plik o nazwie np. init.php i zainkludować czątku pliku application_top.php: ga odpowiedniej konfiguracji serwera apache.
go w pliku includes/application_top.php i admin/ W tym celu musimy w pliku httpd.conf usta-
includes/application_top.php. Nasz plik konfigura- <?php wić:dyrektywę AllowOverride na All na kata-
cyjny może wyglądać w następujący sposób: ... log główny (w którym znajduje się katalog z na-
require('includes/local/init.php'); szym sklepem internetowym), czyli np.
<?php ...
ini_set('display_errors', false); ?> <Directory "C:/Server/Apache2.2/htdocs">
ini_set('session.auto_start', 0); Options Indexes FollowSymLinks
// etc. Należy jednak zaznaczyć, że nie wszystkie AllowOverride All
?> opcje mogą być ustawione poprzez kod PHP, Order allow,deny
Allow from all

Listing 1. Edycja stałych w plikach includes/configure.php oraz admin/includes/configure.php </Directory>

define('HTTP_SERVER', 'http:///jakasdomena.pl'); // adres serwera HTTP Domyślna wartość “None” nie pozwala na ko-
rzystanie z .htaccess.
define('HTTPS_SERVER', ''); /* jeżeli mamy wyłączone szyfrowanie to nie
wpisujemy tu nic */ Włączanie modułów
define('ENABLE_SSL', false); // bezpieczne uwierzytelnianie Oprócz ustawienia zmiennych globalnych, po-
define('HTTP_COOKIE_DOMAIN', 'jakasdomena.pl'); /* domena w której będą przechowywane winniśmy włączyć kilka dodatkowych modułów.
pliki cookies */ W systemach Windows moduły należy włą-
define('HTTPS_COOKIE_DOMAIN', ''); // j.w., tylko z szyfrowaniem czyć jako rozszerzenia bezpośrednio w pliku
define('DIR_FS_CATALOG', 'C:/Server/Apache2.2/htdocs/nasz_sklep/'); /* absolutna php.ini.CRE Loaded wymaga jeszcze włącze-
ścieżka do katalogu głównego z naszym sklepem */ nia obsługi PCRE oraz zlib. Obecnie są one
define('DB_SERVER', 'sql.jakasdomena.pl); // adres serwera bazy danych wbudowane w PHP (dotyczy systemów Win-
define('DB_SERVER_USERNAME', 'user'); // login do bazy danych dows). Jeśli posiadamy starszą wersję PHP,
define('DB_SERVER_PASSWORD', 'password'); // hasło do bazy danych należy je również włączyć jako rozszerzenia.
define('DB_DATABASE', 'nasza_baza'); // nazwa bazy danych Na systemach typu UNIX, moduły powinny
// W pliku admin/includes/configure.php musimy dodatkowo ustawić następujące zmienne: być wkompilowane w PHP. Przykładowo, że-
define('ENABLE_SSL_CATALOG', 'false'); // bezpieczny panel admina by wkompilować w PHP moduł zlib oraz my-
define('DIR_FS_ADMIN', 'C:/Server/Apache2.2/htdocs/nasz_sklep/admin/'); sql, wpisujemy:
// absolutna ścieżka do panelu admina
define('DIR_FS_DOCUMENT_ROOT', 'C:/Server/Apache2.2/htdocs/nasz_sklep/'); /* ścieżka ./configure --with-zlib=<DIR> --with-
do katalogu głownego */ mysql=<DIR>

gdzie parametr =<DIR> jest opcjonalny. Z po-


zostałymi modułami postępujemy podobnie.

Konwersja bazy danych


z OsCommerce do CRE Loaded
OsCommerce Ms2 to CRE Loaded 6.2 SQL
Converter jest narzędziem pozwalającym prze-
nieść w dość skuteczny sposób istniejącą bazę da-
nych z OsCommerce do CRE Loaded. Skrypt zo-
stał napisany pod serwery linuxowe i uruchomie-
nie go na serwerze z Windows może wymagać
modyfikacji kodu. Warunkiem sprawnego działa-
nia konwertera jest posiadanie niezmodyfikowa-
nej bazy danych, co oznacza, że nie wprowadza-
liśmy żadnych poważnych zmian w oryginalnej
strukturze bazy. Jeśli dokonaliśmy drobnych mo-
dyfikacji, takich jak np. zmiana rozmiaru pola ty-
pu VARCHAR, to nie powinniśmy mieć proble-
mów z konwersją. Dodatkową rzeczą, o której mu-
simy pamiętać to odpowiednie ustawienie zmien-
nych orderspaymethods i ordersshipmethods, któ-
re domyślnie są ustawione na false. Jeżeli nasza ba-
za danych zawiera tabele orders_pay_methods lub or-
Rysunek 3. Komunikat informujący o zbyt dużej ilości danych, jakie chcemy wpisać do pola last_page_url ders_ship_methods to musimy ustawić te zmienne
tabeli whos_online na true. Przed dokonaniem jakiejkolwiek konwer-

44 03/2008
Rozwiązania

sji, musimy zrobić obowiązkowy backup na- metoda się nie sprawdzi. Dlatego dla dużych pli- oraz includes/functions/database.php i w funkcji
szej bazy danych z CRE Loaded, zakładamy ków najłatwiej to zrobić poprzez okienko SQL, tep_db_connect() dopisać co następuje:
bowiem, że struktura bazy istnieje. Zawsze które umożliwia nam wykonanie całego ciągu za- Funkcja tep_db_connect() dokonuje połączenia
istnieje możliwość, że coś się nie powiedzie, a pytań (wystarczy wkleić tam zawartość naszego z bazą danych. Zatem po nawiązaniu połączenia
wtedy możemy utracić nasze cenne dane. Je- pliku z zapytaniami SQL.) Zazwyczaj trzeba cier- musimy powiadomić MySql ,że chcemy aby do-
żeli wszystko jest już gotowe, możemy przy- pliwie poczekać, aż przeglądarka wczyta sobie te myślnym kodowaniem było latin2.
stąpić do konwersji. W tym celu kopiujemy kilka megabajtów zapytań.
plik convert.php np. do głównego katalogu Inne problemy
OsCommerce i uruchamiamy go w przeglą- Edycja plików configure.php Czasami może się zdarzyć, że pojawią się nie-
darce. Zaznaczamy wersję OsCommerce i po- Kolejną rzeczą, którą musimy zrobić, jest oczekiwane problemy, tak jak np. komunikat in-
dajemy ścieżkę do katalogu, w którym ma zo- edycja plików includes/configure.php oraz formujący o zbyt dużej ilości danych, jakie chce-
stać zapisany plik sql (np. /tmp). Skrypt wy- admin/includes/configure.php. Wartości, któ- my wpisać do pola last_page_url tabeli whos_on-
generuje nam plik SQL, który następnie mu- re należny zmienić przestawiono na Listin- line (zobacz Rys. 2.). Najprościej taki problem
simy skopiować do katalogu admin/backup z gu 1.: Z reguły szyfrowanie trochę spowal- rozwiązać zmieniając wartość pola last_page_url
systemu CRE Loaded i już przy pomocy pa- nia wczytywanie się strony, więc jeżeli nasz z VARCHAR(64) na VARCHAR(128). Uru-
nelu administracyjnego przywrócić nową sklep jest ciągle w fazie testowej (np. jeste- chamiamy więc w konsoli MySql'a i wpisujemy:
wersję bazy (Tools --> Backup My SQL --> Re- śmy w fazie dodawania produktów i opisów
store.) Gdy to zrobimy koniecznie trzeba usu- do nich, a sklep jest jeszcze nieaktywny), to mysql> use nasza_baza;
nąć plik convert.php z serwera, gdyż prze- można wyłączyć szyfrowanie dla modułu z mysql> ALTER TABLE whos_online MODIFY last_
chowywanie go dłużej niż jest to potrzebne katalogiem w celu jego szybszego działania page_url VARCHAR(128)
może być niebezpieczne. (oczywiście kosztem bezpieczeństwa.) Póź- NOT NULL;
niej, kiedy nasz sklep będzie w pełni gotowy,
Import/Export bazy możemy z powrotem włączyć szyfrowanie. Polecenie to zmieni definicję pola last_page_url
danych na inny serwer z tabeli whos_online (dzięki temu problem po-
Importu starej bazy danych na inny serwer mo- Problemy z kodowaniem MySQL winien zostać rozwiązany). Oczywiście tego sa-
żemy dokonać na kilka sposobów. Tutaj poda- Po przeniesieniu bazy danych na inny serwer, mego możemy dokonać poprzez phpMyAdmin.
my ten, który nie jest może najszybszy i najbar- może się zdarzyć, że nasz sklep przestał obsłu-
dziej efektowny, ale najprostszy i najbardziej giwać polskie znaki. Szczególnie, wtedy gdy in-
skuteczny. Najpierw musimy zrobić eksport ne jest kodowanie w bazie MySql, a inne w na- MICHAŁ WÓJTOWICZ
istniejącej bazy danych do pliku SQL. Najpro- szym sklepie internetowym. Autor pracuje w firmie A3A jako projektant stron in-
ściej użyć opcji export z phpMyAdmin - w tym Aby rozwiązać ten problem, należy wyedyto- ternetowych.
celu udostępniono nam całkiem ciekawe narzę- wać pliki admin/includes/functions/database.php Kontakt z autorem: michal@a3a.pl
dzie (zobacz Rys. 1.).
Po lewej stronie zaznaczamy nazwę bazy da- Listing 2. Funkcja obsługująca połączenie z bazą danych
nych, którą chcemy eksportować, a w liście rozwi-
janej wybieramy typ/wersję bazy, do której chce- function tep_db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME,
my przerzucić istniejącą bazę. Jeżeli nie wiemy, ja- $password = DB_SERVER_PASSWORD,
ką mamy wersję bazy, to sprawdzamy to wpisując $database = DB_DATABASE, $link = 'db_link') {
w konsoli np. (dla mysql): global $$link;

> mysql –version if (USE_PCONNECT == 'true') {


$$link = mysql_pconnect($server, $username, $password);
W innych przypadkach dowiemy się tego po- } else {
przez skrypt: $$link = mysql_connect($server, $username, $password); }

<?php if ($$link) mysql_select_db($database);


phpinfo();?> /* latin2 używamy dla kodowania iso-8859-2, jeżeli nasz sklep jest w utf-8,
,to zamiast latn2 należy wpisać utf8
Narzędzie to wygeneruje nam plik z zapytania- */
mi SQL. Teraz musimy tylko zaimportować go
naszej nowej bazy danych. W tym celu możemy mysql_query("SET NAMES 'latin2'", $$link);
użyć narzędzia import z phpMyAdmin, jednak return $$link;}
dla dużych plików (większych niż 2,048 KB) ta
Listing 3. Lista wszystkich rozszerzeń, jakich wymaga CRE Loaded
extension=php_curl.dll
W Sieci extension=php_exif.dll
• http://hostprogressive.com/support/ extension=php_gd2.dll
php_5_docs/ini.html#ini.list extension=php_mcrypt.dll
• http://www.creloaded.com/ extension=php_mysql.dll
extension=php_mbstring.dll // to jeżeli używamy phpMyAdmin
Pełna lista funkcji i modułów CRE Loaded:
Jeśli nasz serwer obsługuje SSL, to dobrze jest jeszcze włączyć openssl:
• http://www.creloaded.com/ extension=php_openssl.dll
pages.php?pID=4&CDpath=1_64_70

www.phpsolmag.org 45
Rozwiązania

Flash i bazy danych


PHP przy połączeniach aplikacji Flash z bazą danych

Wraz z rozwojem Internetu kreowała się potrzeba tworzenia atrakcyjniejszych


witryn WWW. Skutkiem tego było powstawanie nowych technologii i
rozbudowa już istniejących. Doprowadziło to między innymi do stworzenia
aplikacji Flash, która w owym czasie zdobyła popularność i wciąż zdobywa
coraz większą, wypierając wcześniejsze technologie np. DHTML.
nową warstwę i nadajmy w properties nazwę wczy-
Dowiesz się... Powinieneś wiedzieć... tywanie_wpisu.
• Nauczymy Cię łączenia aplikacji Flash z bazą • Powinieneś znać podstawy PHP, MySQL oraz Proponowany przez nas układ przedstawio-
danych. podstawy budowy aplikacji FLASH. ny jest na Rysunku 1.
Początek mamy już za sobą, teraz przejdziemy
do wykonania konstrukcji odpowiadającej za ko-
winno wystarczyć na podpis odwiedzającego nas munikację z PHP. Przesuwamy dotychczas stwo-
przybysza. Kolumna registration może pomieścić rzone elementy na listwę czasową o jedną pozy-
Poziom trudności 65535 znaków i będzie przechowywać treść wpi- cję w prawo, tak aby na początku nie było żad-
su. Datę wpisu przechowujemy jako DATE. nego elementu, i tworzymy nową warstwę Ac-
tions. Tam wstawmy skrypt przypisujący zmien-
Przygotowanie aplikacji Flash nej load_mesage wartość -1, co będzie informo-
Zacznijmy od przygotowania elementów graficz- wać nas, że aplikacja właśnie się uruchomiła. Na-

D
zieje się tak z kilku powodów. Po nych, nie zapominając o podstawowych funk- stępnie stwórzmy strukturę podobną do tej na Ry-
pierwsze, animacje Flash wyglądają w cjach, jakie mają być dostępne: pojedynczy odczyt sunku 2. Nie zapomnijmy przy tym o nadaniu ety-
każdej przeglądarce tak samo, po dru- wszystkich dokonanych wpisów w naszej księdze. kiet dla poszczególnych ramek.
gie to nie są tylko animacje. Rodowity produkt Narysujmy prostokąt, który jakoby będzie trzy- Na warstwie Action dla ramek opatrzonych
firmy Macromedia, obecnie przejętej przez Ado- mał pozostałe składniki w miejscu. Dodajmy do etykietami loading, checking i done (patrz Ry-
be, proponuje nam znacznie więcej, między in- tego napis Księga Gości informujący użytkowni- sunek 2.) wstawiamy odpowiednio kod taki jak
nymi możliwość komunikowania się z bazą da- ka, z czym ma do czynienia. Wstawmy też statycz- na Listingach 2., 3. i 4.
nych za pośrednictwem języków strony serwe- ne pola tekstowe: Treść, Data, Podpis, i literkę z, któ- Kluczowym elementem jest tu użycie funk-
ra (np. PHP). Wszystko to dzięki ActionScript, ra będzie łącznikiem między numerem aktualnie cji loadVariables. Wysyła ona wszystkie istnie-
który zamienia proste narzędzie do tworzenia wyświetlanego wpisu a ilością wszystkich wpisów. jące zmienne do wskazanego pliku, w naszym
ruchomych obrazów, w doskonale współpracu- Następnie wstawmy pięć dynamicznych pól tek- przypadku jest to plik wpisy.php, a także pobie-
jące środowisko programistyczne. stowych w odpowiednie miejsce na przygotowanej ra zmienne, odpowiednio sformatowane i wypi-
W tym artykule przedstawimy, jak krok po formie – przed lub obok istniejących już napisów sane na ekran. Kolejnym ważnym momentem
kroku pobrać informacje z bazy danych My- Treść, Data itp. W zakładce properties każdemu z jest chwila, w której rozpoznajemy, czy Flash po-
SQL i przesłać je do Flasha. Swoje poczynania nich nadajemy nazwę. Odpowiednio polom prze- brał już wszystkie dane. W tym celu sprawdzamy,
oprzemy o konkretne zastosowanie, stworzymy znaczonym na treść, datę, podpis, informacje, któ- czy zmienna load_ok równa się 1. Dlaczego? Po-
odczyt wiadomości z księgi gości we Flashu. ry wpis jest oglądany i ile jest wszystkich wpisów, nieważ to właśnie ta zmienna będzie znajdowała
przypisujemy nazwy tresc_wpisu, data_wpisu, pod- się na końcu skryptu PHP, gdzie przyjmie wartość
Przygotowanie pis_wpisu, nr_wpisu, ile_wpisow. Powstałe elemen- 1. Dalej to już tylko przypisanie odpowiednim
struktury bazy danych ty zapiszmy jako klip filmowy o nazwie movie_ksie- polom właściwych zmiennych. Pozostaje jeszcze
Na początku przygotujmy naszą bazę danych. ga1. Teraz stwórzmy przycisk z narysowaną strzał- oprogramowanie przycisków, które będą zmieniać
Stwórzmy tabelę o nazwie guest_book w taki sam ką. Oczywiście jest nam potrzebne przeglądanie wyświetlane wpisy, co nie powinno sprawić trud-
sposób jak na Listingu 1. Przy okazji możemy też wpisów w dwie strony, ale nie musimy robić do ności. Wystarczy, jeżeli pobierzemy z pola forma_
uzupełnić tabelę o kilka przykładowych danych. tego celu kolejnego przycisku. Buttony umieszcza-
Kolumna id jest unikalną liczbą dla każdego wpi- my na oddzielnej warstwie. Wstawmy z biblioteki
su. Uzupełniać się będzie automatycznie dzięki stworzony przycisk ze strzałką i obróćmy go o 180
W Sieci
poleceniu AUTO_INCREMENT wraz z dodaniem każ- stopni. Przy okazji nadajmy w zakładce properties • http://www.flashkit.com/,
dego nowego wpisu. Kolumna guest przechowy- nazwę dla klipu movie_ksiega1, niech będzie to for- • http://www.flashzone.pl/,
wać będzie podpis osoby, która wpisała się do na- ma_wpisu. Stwórzmy także napis informujący o • http://www.adobe.com/devnet/flash/
szej księgi. Ograniczamy ilość znaków, jaką moż- wczytywaniu danych i zapiszmy go w nowym kli- articles/learning_xml.html.
na wprowadzić w tej kolumnie, do 16 – tyle po- pie filmowym o nazwie wczytywanie, wstawmy na

46 3/2008
Flash i bazy danych

wpisu.nr_wpisu zawartość tekstową i odpowiednio


zwiększymy i zmniejszymy ją o jeden. Nie zapomi- Listing 2. Skrypt dla ramki oznaczonej etykietą loading
najmy jednak o skrajnych przypadkach. Nie może- if (load_mesage==-1) //jeżeli aplikacja została dopiero uruchomiona
my dopuścić do sytuacji, aby numer aktualnie wy- {
świetlanego wpisu był wyższy od liczby wszyst- load_number=-1 //wartość -1 oznaczać będzie wczytanie ostatniego dodanego wpisu
kich wpisów i mniejszy od zera. Całość rozwiąza- load_mesage=0 //żeby następnym razem tutaj nie trafić
nia dla przycisków back i next przedstawiają Listin- }
gi 5. i 6. Przed nami ostatnie zadanie, stworze- else //aplikacja byla już użyta przynajmniej raz
nie skryptu PHP. {
load_number=forma_wpisu.nr_wpisu.text; //pobieramy nr wpisu, który chcemy wczytać
PHP i przesłanie danych do Flasha }
Połączenie z bazą danych MySQL jest podsta- wczytywanie_wpisu._visible=true; //pokazujemy klip filmowy z napisem Trwa wczytywanie
wowym zagadnieniem związanym z progra- loadVariables("wpisy.php",this,"POST"); //funkcja uruchamiająca skrypt PHP, wysyła i
mowaniem w Internecie. Jest również bar- wczytuje zmienne
dzo dobrze znane każdemu, kto posiadł choć-
by skromny ułamek wiedzy związanej z PHP.
Dlatego w dalszej części przedstawimy, w jaki
sposób sformatować otrzymane z bazy dane,
tak aby poprawnie dotarły do aplikacji Flash.
Na początku skryptu nie zapomnijmy o wy-
korzystaniu zmiennej load_number wysłanej
przez Flash, żebyśmy wiedzieli, który wpis
chcemy uzyskać. Przekazywana jest ona me-
todą POST , a więc możemy się do niej odwołać
przez $_POST['load_number']. Po pobraniu
danych zapiszmy je w zmiennych o nazwach:
database_1 – dla treści wpisu, database_2
– dla daty wpisu, database_3 – dla autora
wpisu, database_4 – dla numeru aktualnie
pobieranego wpisu, oraz database_5 – dla ilo-
ści wszystkich wpisów. Teraz, aby Flash mógł
je odczytać, wystarczy wypisać zmienne na
ekran w sposób przedstawiony na Listingu 7.
Na sam koniec przypiszmy zmiennej load_ok
wartość równą 1, dzięki temu Flash rozpozna,
że skrypt się zakończył.
Teraz wykonana przez nas całość jest już
sprawna i gotowa do użycia. Pamiętajcie, że Rysunek 1. Projekt Księgi Gości
to jedynie prosty przykład, obrazujący isto-
tę połączenia Flasha z bazą danych przy wy- Podstawowe funkcje obiektu XML
korzystaniu PHP. Pokazaliśmy, jak pobrać in- Kilka podstawowych funkcji służących do przemieszczania się po strukturze drzewa XML:
formacje do Flasha, ale także sposób na doko-
nanie każdej innej operacji na serwerze przy • attributes – zwraca tablicę asocjacyjną zawierającą nazwy atrybutów i ich wartości,
pomocy PHP. Zauważcie, że przesłaliśmy do • childNodes – zwraca tablicę zawierającą referencje do węzłów potomnych,
• fi rstChild – zawiera referencję do pierwszego węzła potomnego,
skryptu PHP zmienną load_number i dokład- • lastChild – referencja do ostatniego węzła potomnego,
nie w takim sam sposób możemy przesłać każ- • nextSibling – zawiera referencję do sąsiedniego węzła, czyli do następnego węzła na tym
dą inną. Oczywiście w takie takiej pracy nie- samym poziomie,
jednokrotnie napotkamy na liczne trudności. • previousSibling – zawiera referencję do sąsiedniego węzła, do poprzedniego węzła na
Pierwszą z nich może być na przykład prze- tym samym poziomie,
• nodeName – zwraca nazwę tagu,
słanie tablicy z PHP do Flasha. Co sprytniej-
• nodeValue – zwraca wartość węzła tekstowego,
si stwierdzą, że to żaden problem, możemy • nodeType – zwraca liczbę określającą typ węzła,
• parentNode – zwraca rodzica,
Listing 1. Tworzenie tabeli w bazie danych • hasChildNodes – metoda, zwraca true jeśli węzeł ma potomstwo.
MySQL

CREATE TABLE guest_book (


Pomocna dłoń...
Aby połączyć się z bazą danych, użyj funkcji mysql _ connect([hostname [, username [,
id INT NOT NULL AUTO_INCREMENT PRIMARY password]]]);
KEY, Aby pobrać dane z tabeli guest_book, w bazie danych stwórz następujące zapytanie: SELECT *
guest VARCHAR(16) NOT NULL, FROM quest _ book WHERE id=$load _ number; Zakładamy, że id odpowiada numeracji wpi-
sów. Użyj też funkcji mysql _ fetch _ array(result _ id [. result _ type]); Żeby przekazać
registration TEXT NOT NULL,
tablicę danych z PHP do Flasha, użyj funkcji implode, a następnie – we Flashu – jej przeciwień-
data DATE NOT NULL
stwa, funkcji explode.
); Funkcja Number(expresion) we Flashu konwertuje podaną zmienną do liczby.

www.phpsolmag.org 47
Rozwiązania

przecież połączyć zmienne w jednym stringu nie rozłączyć już w naszej animacji. Taki spo- PHP i XML
za pomocą polecenia $dane = implode(";", sób jak najbardziej odniesie skutek i będzie na- a przesyłanie tablicy do Flasha
$tablica); i tak je przesłać po czym ponow- wet niezłym rozwiązaniem dla kilku może kil- Podstawowym zadaniem będzie stworzenie odpo-
kunastu wartości. Jednak w przypadku gdy wiedniej struktury dokumentu XML. Pierwszą
liczba przesyłanych danych wzrośnie do kilku- rzeczą jaką powinien wypisywać nasz skrypt PHP
set, końcowy użytkownik może długo pocze- jest nagłówek dokumentu w następującej postaci:
kać na dane. Przeczytajcie zatem dalszą część <?xml version='1.0' encoding='UTF-8?>. Po-
artykułu, w której opisujemy jak przesłać ta- wiedzmy, że głównym pojemnikiem naszego do-
Rysunek 2. Układ na linii czasowej blicę z PHP do Flasha. kumentu będzie znacznik <tablica> więc ta-
ki napis również musimy umieścić. Następnie
Listing 3. Skrypt dla ramki oznaczonej etykietą checking każdy z elementów tablicy wypisujemy pomię-
dzy znacznikami t (oczywiście nazwy znaczni-
if ( load_ok == 1) //Flash wczytał ostatnią zmienną ze skryptu PHP ków są dowolne) w następujący sposób: echo "<t
{ id=\"".$indeks_tabeli."\" >".$wartosc_z_
wczytywanie_wpisu._visible=false; //napis wczytywanie robi się niewidoczny tabeli."</t>"; i już na sam koniec zamykamy
gotoAndPlay('done');//przechodzimy do ramki oznaczonej etykietą done główny znacznik </tablica>. Tak przygotowany
} skrypt PHP wygeneruje dokument XML, przez
else co będziemy mogli go otworzyć i wykorzystać do
{ swoich celów we Flashu. Sam odczyt we Fashu
gotoAndPlay(9);//cofamy się o jedną ramkę i sprawdzamy ponownie jest dość prosty. Sprowadza się on do stworzenia
} obiektu XML x = new XML(); i wywołania funk-
cji x.load("skrypt_generujący_xml.php");.
Listing 4. Skrypt dla ramki oznaczonej etykietą done Istotnym jest abyśmy wyeliminowali białe zna-
//przypisujemy dynamicznym polom tekstowym zmienne pobrane z wygenerowanego pliku PHP ki z dokumentu, robimy to przypisując własno-
ści ignoreWhite wartość true. Samo przepisa-
forma_wpisu.tresc_wpisu.text=database_1; nie wartości z obiektu XML do tablicy możemy
forma_wpisu.data_wpisu.text=database_2; zrealizować za pomocą pętli. Przy każdej itera-
forma_wpisu.podpis_wpisu.text=database_3; cji dla wcześniej zadeklarowanej tablicy t = new
forma_wpisu.nr_wpisu.text=database_4; Array(); wykonujemy operację przypisania t[it
forma_wpisu.ile_wpisow.text=database_5; erator]=x.firstChild.childNodes[iterator
stop();//zatrzymujemy działanie skryptu ].firstChild.nodeValue;. Jak sami przyznacie
nie jest to trudne, jeżeli jednak macie pewne wąt-
Listing 5. Skrypt dla przycisku back pliwości proponujemy zapoznanie się z materia-
on (release) {//skrypt umieszczony wewnątrz uruchamia się po kliknięciu i puszczeniu łami na stronie http://www.flashzone.pl/item/473/
lewego klawisza myszy Flash-i-XML-cz--1/ gdzie przedstawiane zagadnie-
if (Number(forma_wpisu.nr_wpisu.text)-1>0)//sprawdzamy, czy nie zeszliśmy poniżej 0 nie zostało opisane nad wyraz szczegółowo.
{
forma_wpisu.nr_wpisu.text=Number(forma_wpisu.nr_wpisu.text)-1; //obniżamy nr Podsumowanie
aktualnie wyświetlanego wpisu Pokazaliśmy, że Flash daje nam nieograniczone
gotoAndPlay('loading'); //uruchamiamy ponownie skrypt możliwości kontrolowania zasobów wszystkich
} baz danych, które współpracują z PHP, z poziomu
} pliku swf. Zatem nic nie stoi na przeszkodzie aby
stworzyć systemy rejestracji, logowania czy wysy-
Listing 6. Skrypt dla przycisku next łania e-maili, a nawet całych serwisów opartych w
on (release) { całości o technologię Flash, takich jak strona http:
//www.hondaracingf1.com. Należy jednak pamię-
if (Number(forma_wpisu.nr_wpisu.text)-1<database_5-1) //sprawdzamy, czy nie tać, że technologia Flash niesie ze sobą pewne nie-
przekroczyliśmy ilości wszystkich wpisów dogodności zarówno dla użytkownika jak i dla pro-
{ gramisty. Wielu internautów blokuje flash play-
forma_wpisu.nr_wpisu.text=Number(forma_wpisu.nr_wpisu.text)+1; //zwiększamy numer er`a aby pozbyć się natarczywych reklam, które
aktualnie wyświetlanego wpisu o 1 są plagą współczesnego internetu. Jako programi-
gotoAndPlay('loading'); //uruchamiamy skrypt ponownie ści z pewnością będziemy mieli problemy z prawi-
} dłowym wy pozycjonowaniem witryny stworzonej
} wyłącznie we Flashu, dlatego z reguły takie witry-
ny należą do znanych marek, które nie martwią się
Listing 7. Wypisanie zmiennych na ekran w sposób możliwy do odczytu przez aplikację Flash o pozycję w wyszukiwarce. Najrozsądniejszym roz-
echo ”&database_1=” . urlencode($database_1); wiązaniem jest w takim przypadku przygotowanie
echo ”&database_2=” . urlencode($database_2); dwóch wersji interfejsu.
echo ”&database_3=” . urlencode($database_3);
echo ”&database_4=” . urlencode($database_4);
echo ”&database_5=” . urlencode($database_5); TOMASZ ROSZKO
$load_ok=1; Autor jest studentem informatyki na Uniwersyte-
echo ”&load_ok=” . urlencode($load_ok); cie w Białymstoku.
Kontakt z autorem: tomaszroszko@gmail.com

48 3/2008
Technika

Joomla!
Przydatne dodatki

Dla Joomla! istnieje wiele użytecznych dodatków – w tym artykule pojawią


się trzy z nich – które zwiększają już i tak duże możliwości tego systemu a
za pomocą niewielkiej ilości kodu php możemy jeszcze lepiej dopasować
je do swoich potrzeb.

numer magazynu a kategorie w sekcji


Dowiesz się... Powinieneś wiedzieć... będą widoczne w menu jako jego spis
• Jak dopasować system do własnych potrzeb • Umiejętność zainstalowania systemu Joomla! treści,
za pomocą dostępnych komponentów; oraz dodatkowych komponentów; • nazwa sekcji to numer czasopisma li-
• Jak umieścić własny skrypt PHP za pomocą • Umiejętność tworzenia sekcji, kategorii i arty- cząc od pierwszego wydania (np. 64).
Add PHP; kułów w Joomla!; Według nazwy sekcji będą pobierane
• Jak dodawać ogłoszenia za pomocą kompo- • Podstawowa wiedza z zakresu PHP. dane z bazy więc nie może się ona po-
nentu JA. wtarzać. Ta liczba również określi któ-
ry numer jest najnowszy (największa
trzebujemy. Można w ten sposób również liczba).
wstawić do artykułu zawartość pliku teksto- • tytuł to podpis który wyświetli się pod
Poziom trudności wego (w ten sam sposób, podając nazwę pli- czasopismem (np. 1(64)/2008),
ku txt zamiast php) – jest to przydatna moż- • do sekcji przypisać można też obrazek
liwość jeśli do wielu artykułów wstawiamy – okładkę magazynu która wyświe-
wspólny fragment tekstu; można go wtedy tli się na stronie głównej gdzie będzie

W
pierwszej części artykułu poka- umieścić w zewnętrznym pliku i załączyć w można wybrać dany numer. Żeby ob-
żemy na praktycznym przykła- podany sposób, późniejsze zmiany dla tego razki pojawiły się na liście rozwijanej
dzie jak skorzystać z możliwo- wspólnego fragmentu będą dokonywane tyl- obok pola Grafika należy je umieścić
ści umieszczenia w treści artykułu własnego ko w jednym pliku. na serwerze w katalogu images/stories
kodu php, za pomocą dodatku Add PHP. (Rysunek 2.)
Przykład zastosowania
Run Digital Add PHP – strona czasopisma Do sekcji przypisujemy kategorie. Tytuł ka-
RD Add PHP to dodatek (bot) umożliwiają- Magazyn Twój Ogród to darmowa gazetka, tegorii to pozycja w spisie treści danego wy-
cy wstawienie do artykułu kodu PHP, który która chce również udostępniać swoje treści dania i wyświetlana będzie jako link w me-
zostanie wykonany. na stronie internetowej. Odwiedzający ma- nu. Po kliknięciu w ten link pokażą się ar-
Dodatek instalujemy wybierając z menu ją mieć możliwość przeglądania aktualnego tykuły z danej pozycji.
Instalatory –> Boty. Po wczytaniu plik bę- numeru i wszystkich poprzednich nume- Dodajemy artykuły wybierając dla każde-
dzie widoczny na liście Zainstalowane boty. rów wraz z całą ich zawartością. go odpowiednią sekcję (numer magazynu) i
Przed użyciem musimy go jeszcze opubliko- Możemy więc przygotować prosty skrypt kategorię (temat). Przygotowanie skryptu:
wać wybierając z menu Boty –> Boty witryna php który pobierze z bazy danych informa-
i Publikacja. cje o dotychczas wydanych numerach i wy- • Zadaniem naszego skryptu będzie wy-
Użycie tego dodatku jest bardzo proste świetli ich okładki oraz numery jako lin- świetlenie okładek wydanych magazy-
– wystarczy w treści wybranego artykułu ki – po kliknięciu w wybrany numer poka- nów i oraz ich numerów jako linków
wstawić nazwę pliku z kodem w postaci: że się jego spis treści jako kolejne pozycje w które wyświetlą spis treści danego nu-
menu – one z kolei prowadzić będą do arty- meru (Listing 1.)
{rdaddphp file=sciezka/plik.php} kułów w danym numerze.
Skrypt ten wstawimy do powitalnego ar- Musimy teraz utworzyć artykuł lub mate-
w miejscu gdzie ma być widoczny rezultat tykułu na stronie głównej. Domyślnie może- riał statyczny który wyświetli na stronie
działania kodu. my też wyświetlić w menu spis treści aktu- głównej rezultat działania naszego skryp-
Podany plik może zawierać dowolny alnego numeru (Rysunek 1.) Przygotowanie tu. Możemy umieścić w nim dowolne tre-
skrypt php który zostanie wykonany w treści w serwisie: ści (Rysunek. 3) a w miejscu gdzie mają wy-
chwili wyświetlenia artykułu Może to być świetlić się okładki wstawiamy:
nasz własny licznik, formularz, galeria czy • Wykorzystamy sekcje i kategorie do po-
zapytanie do bazy danych – cokolwiek po- grupowania treści. Sekcja określi dany {rdaddphp file=skrypty/sekcje.php}

50 03/2008
Joomla!

Po utworzeniu materiału umieszczamy go


jako pierwszą pozycję w menu (Menu –>
mainmenu) żeby wyświetlił się jako strona
startowa oraz żeby umożliwić odwiedza-
jącym powrót do strony z wyborem maga-
zynu (Rysunek 4.). Zostało nam jeszcze do
przygotowania wyświetlanie spisu treści da-
nego numeru – po kliknięciu w link pod
wybranym numerem następuje przekaza-
nie informacji o numerze sekcji (czyli o nu-
merze danego magazynu którego spis treści
ma się pokazać). Możemy zrobić to na kil-
ka sposobów – ponieważ w przypadku tego
serwisu w menu z lewej strony zawsze wy-
świetlamy jakiś spis treści możemy po pro-
stu wstawić skrypt w naszym pliku strony
– index.php z katalogu aktualnego szablo-
nu (templates –> katalog z szablonem). Od-
najdujemy w nim wpis:
Rysunek 2. Nowa sekcja – grudniowy numer magazynu

<?php mosLoadModules ('left'); ?>

Który wyświetla moduły przypisane do ob-


szaru left (jak np. nasze menu główne). Pod
nim wstawiamy skrypt wyświetlający linki
do artykułów z danego numeru:

<? include ('skrypty/spis.php'); ?>

Z bazy danych pobierane są informacje o


kategoriach w podanej sekcji i zostają wy-
świetlone jako linki do artykułów z kate-
gorii (task=blogcategory).
Jeśli sekcja nie została podana wyświetla
się spis treści z ostatniego numeru (katego-
rie z sekcji o najwyższym numerze w na-
zwie). Skrypt widoczny na Listingu 2.
Artykuły wyświetlane są w sposób do-
myślny (Rysunek 5.)
Jeśli chcemy określić swój sposób wyświe-
tlania treści (ilość kolumn, kolejność arty-
kułów itd.) możemy w menu głównym (Me-
nu –> mainmenu) utworzyć przykładowy
link do artykułów w sekcji dla którego okre- Rysunek 3. Przykład artykułu z wstawionym kodem php

Rysunek 1. Pierwsza strona magazynu Twój


Ogród – z lewej spis treści aktualnego numeru,
obok okładki i linki do poprzednich numerów Rysunek 4. Łącze do materiału który wyświetli się na stronie głównej w menu głównym

www.phpsolmag.org 51
Technika

ślimy wszystkie te ustawienia – link ten nie Ulepszamy galerię Żeby dodać link do galerii zdjęć jako pozycję
będzie opublikowany (Rysunek 6.) ale mo- W tej części artykułu zaprezentujemy kom- w menu wybieramy Menu –> mainmenu, Dodaj,
żemy wykorzystać go jako wzór w naszym ponent PonyGallery który umożliwi nam Komponent, podajemy nazwę (np. Galeria) i wska-
skrypcie (plik spis.php), w miejscu gdzie szybkie stworzenie galerii zdjęć na naszej zujemy na liście komponentów PonyGallery.
wstawiamy linki do artykułów, podając jego stronie. Pokażemy również jak stworzyć Po wczytaniu zdjęć możemy zobaczyć naszą ga-
identyfikator (ID pozycji menu): możliwość wypisania kategorii naszych lerię na stronie (Rysunek 8.). Sposób wyświetlania
zdjęć w postaci linków tekstowych. zdjęć na stronie oraz informacje jakie są przy tym
echo"<a href=\"$mosConfig_live_site?option=com widoczne możemy określić w części administracyj-
_content&task=blogcategory&id=$id_k&Itemid=3\ PonyGallery nej za pomocą Configuration Managera PonyGalle-
" class= Komponent instalujemy wybierając z menu Insta- ry. Na stronie wyświetlają się nazwy kategorii wraz
\"mainlevel\">$title_k</a><br />"; latory –> Komponenty. Po wczytaniu pliku Pony- z przypisanymi im obrazkami. Po kliknięciu w da-
Gallery będzie widoczny w menu Komponenty. ną kategorię możemy zobaczyć umieszczone w
Artykuły będą teraz wyświetlane w sposób ja- Możemy teraz tworzyć kategorie zdjęć, niej zdjęcia (Rysunek 9.).
ki określiliśmy w naszym wzorze (Rysunek 7.) wczytywać pliki, zmieniać ich tytuły, opisy,
Skrypt można łatwo dostosować do własnych przydział do kategorii itd. Miniaturkę dla Dodajemy linki w menu
potrzeb, określając jakie treści mają być widocz- kategorii można wybrać z listy po wczyta- Do wyboru galerii możemy wrócić klikając przy-
ne na stronie oraz sposób ich wyświetlania. niu zdjęć do danej kategorii. cisk wstecz jeśli jednak mamy duży wybór zdjęć w
wielu kategoriach może przydać się nam ich spis
w postaci linków zawsze widocznych na stronie.
Rezultat ten możemy osiągnąć w podobny spo-
sób co w poprzednim przykładzie – tworzymy od-
powiedni skrypt i umieszczamy go tam gdzie ma
być widoczny – w artykule lub w danym menu.
Wstawienie skryptu w menu bocznym: W pliku
index.php z katalogu aktualnego szablonu (templa-
tes –> katalog z szablonem) odnajdujemy wpis:

<?php mosLoadModules ('left'); ?>

Który wyświetla moduły przypisane do ob-


szaru left (jak np. nasze menu główne). Pod
nim wstawiamy skrypt wyświetlający linki
do kategorii naszych zdjęć:

<? include ('skrypty/linki.php'); ?>

Rysunek 5. Domyślny sposób wyświetlania artykułów

Rysunek 7. Artykuły wyświetlane w sposób określony


za pomocą jednej pozycji w menu głównym

Rysunek 8. Kategorie zdjęć stworzone a pomocą


Rysunek 6. Przykładowa pozycja w menu z zapisanymi ustawieniami dotyczącymi wyświetlania artykułów PonyGallery

52 03/2008
Joomla!

Mając już linki widoczne w menu możemy leżności od wyboru odwiedzającego (gale- Komponent instalujemy wybierając z menu In-
usunąć link Galeria wyłączając publikację ria – treści). stalatory –> Komponenty. Po wczytaniu pliku JA
tej pozycji (Menu –> mainmenu). Rezultat Submit będzie widoczny w menu Komponenty.
widoczny jest na Rysunku 10. Zawartość Dodajemy ogłoszenia Żeby dodać link umożliwiający dodawanie
pliku linki.php przedstawia Listing 3 Ostatnim prezentowanym przez nas w tym ogłoszeń jako pozycję w menu wybieramy Me-
Skrypt można dalej rozbudowywać – do- artykule dodatkiem jest komponent JA Sub- nu –> mainmenu, Dodaj, Komponent, podajemy
dając opcję wyświetlania linków do podka- mit umożliwiający dodawanie ogłoszeń na nazwę (np. Dodaj ogłoszenie) i wskazujemy na
tegorii lub zmieniając zawartość menu w za- stronie. liście komponentów JA Submit (Rysunek 11.).
Widok formularza dodawania ogłoszeń na
stronie przedstawia Rysunek 12.
W Sieci
Ogłoszenia mogą być dodawane w udostęp-
• Polskie Centrum Joomla! – http://www.joomla.pl nionych przez nas kategoriach (można je okre-
• Strona z której można pobrać RD Add PHP – http://www.run-digital.com (dodatek można ślić w ustawieniach komponentu JA Submit
również pobrać ze strony joomla.pl) (menu Komponenty –> JA Submit –> Ustawie-
• PonyGallery – strona projektu – http://www.taher-zadeh.com (komponent można również
nia) Dodane ogłoszenia widoczne są w części
pobrać ze strony joomla.pl)
• Strona JA Submit – http://www.joomlart.com administracyjnej jako artykuły w danej kate-
gorii i tam możemy je opublikować lub usu-
nąć. Po opublikowaniu ogłoszenie pojawi się
Listing 1. Skrypt wyświetlający okładki magazynów oraz linki do spisu treści (plik sekcje.php) na stronie jako artykuł.

//połączenie z bazą danych nawiązane w osobnym pliku i zapisane w zmiennej $connect Modyfikujemy komponent
require('connect.php'); Pliki komponentu znajdują się w katalo-
//tabela sekcje gu components/com_ja_submit. Plik ja_sub-
$tablename="jos_sections";
//wczytanie danych opublikowanych sekcji
$query="select id, title, image from $tablename where published='1'";
$result=mysql_query($query, $connect);
if(!$result) error_message(sql_error());

//wyświetlenie na stronie okładek z linkami -- po trzy w jednym rzędzie:


?>
<div style="padding-left: 10px; padding-top: 10px; display: block; height: 250px;
margin-top: 10px;">
<?
$licz=0;
while($query_data=mysql_fetch_array($result))
{
if (($licz!=0)&&(($licz % 3)= =0)) Rysunek 9. Widok wybranej kategorii
{
?>
<div style="padding-top: 25px; display: block; height: 250px; margin-top: 10px;
clear:both">
<?
}
$id_s=$query_data["id"];
$title_s=$query_data["title"];
$image_s=$query_data["image"];
?>
<div style="display: block; float: left; text-align: left; padding-left: 20px;">
<?
//okładki
echo"<img src=\"images/stories/$image_s\" border=\"0\" alt=\"$title\"> <br /><br Rysunek 10. Linki do kategorii zdjęć widoczne w
/>"; lewym menu
//numery jako linki -- przekazanie informacji o identyfikatorze sekcji
echo"<a href=\"$mosConfig_live_site?sekcja=$id_s\"><strong>Numer:</strong> $title_
s</a>";
Informacje
?> o wersjach użytych w artykule:
</div>
• Joomla 1.0.13 JIE iso
<?
$licz++; Dodatki:
}
• RD Add PHP 4.5.2
echo"</div>"; • Pony Gallery ML 2.4.1
?> • JA Submit 2.1 pl.

www.phpsolmag.org 53
Technika

Listing 2. Skrypt wyświetlający linki do artykułów z wybranego numeru magazynu (spis.php)

<? else
//funkcja wypisuje kategorie z danej sekcji jako linki do listy {
artykułów //jest id kategorii, wyświetlana jest lista artykułów lub
function links($sekcja, $connect) wybrany artykuł
{ if(($id_kat)&&($option= ='com_content')&&(($task= ='blogcat
//tabela kategorii egory')||($task= ='view')))
$tablename="jos_categories"; {
$query="select id, title from $tablename where published='1' require('connect.php');
AND section='$sekcja'"; if($task= ='view')
$result=mysql_query($query, $connect); {
if(!$result) error_message(sql_error()); //sprawdź sekcję wyświetlanego artykułu
$id_art=$_GET["id"];
while($query_data=mysql_fetch_array($result)) //tabela artykułów
{ $tablename="jos_content";
$id_k=$query_data["id"]; $query="select sectionid, catid from $tablename where
$title_k=$query_data["title"]; id='$id_art'";
$result=mysql_query($query, $connect);
//link do listy artykułów z danej kategorii if(!$result) error_message(sql_error());
echo"<a href=\"$mosConfig_live_site?option=com_content $dane=mysql_fetch_row($result);
&task=blogcategory&id=$id_k\" class=\ $id_sekcji=$dane[0];
"mainlevel\">$title_k</a><br />"; $id_kategori=$dane[1];
} }
} else
//funkcja sprawdza najnowszy numer magazynu {
function pokaz_ost() //sprawdź sekcję danej kategorii
{ //tabela kategorii
require('connect.php'); $tablename="jos_categories";
//tabela sekcji $query="select section from $tablename where id='$id_
$tablename="jos_sections"; kat'";
$result=mysql_query($query, $connect);
$query="SELECT MAX(name) AS name FROM $tablename"; if(!$result) error_message(sql_error());
$result=mysql_query($query, $connect); $dane=mysql_fetch_row($result);
if(!$result) error_message(sql_error()); $id_sekcji=$dane[0];
}
$dane=mysql_fetch_row($result); //tabela sekcji
$nazwa_sekcji=$dane[0]; $tablename="jos_sections";
$query="select title from $tablename where id='$id_sekcji'";
$query="SELECT id from $tablename where name='$nazwa_ $result=mysql_query($query, $connect);
sekcji'"; if(!$result) error_message(sql_error());
$result=mysql_query($query, $connect); $dane=mysql_fetch_row($result);
if(!$result) error_message(sql_error()); $tytul_s=$dane[0];
$dane=mysql_fetch_row($result); //brak sekcji i kategorii, pokaż spis najnowszego numeru
$id_sekcji=$dane[0]; if(($id_sekcji= =0)&&($id_kategori= =0))
{
//pokaż spis treści pokaz_ost();
links($id_sekcji, $connect); }
} else
//nr sekcji z linku na stronie głównej {
$sekcja=$_GET["sekcja"]; //pokaz spis treści danego numeru
//dane z linku w menu bocznym links($id_sekcji, $connect);
$id_kat=$_GET["id"]; }
$option=$_GET["option"]; }
$task=$_GET["task"]; //pierwsza strona, spis streści dla najnowszego numeru
//pokaż spis treści wybranego numeru else
if($sekcja) {
{ pokaz_ost();
//pokaż spis treści }
links($sekcja, $connect); }
} ?>
//brak sekcji

54 03/2008
Joomla!

Listing 3. Skrypt wyświetlający w menu linki tekstowe do kategorii zdjęć (linki.php)

<?
//połączenie z bazą danych nawiązane w osobnym pliku i zapisane w zmiennej $connect
include ("connect.php");

//tabela z kategoriami zdjęć


$tablename='jos_ponygallery_catg';
$query="SELECT * FROM $tablename WHERE published = '1' AND parent = 0";
$odp=mysql_query ($query, $connect);
while($query_data=mysql_fetch_array($odp))
{
//identyfikator kategorii
$cid=$query_data["cid"];
//nazwa kategorii
$name=$query_data["name"];
//link
echo"<a href=\"index.php?option=com_ponygallery&func=viewcategory&catid=$cid\">$name</a><br><br>";
}
?>

Listing 4. Przykładowy fragment wyświetla pole Imię i nazwisko


<?
/*
<tr><td><label for="created_by_alias"><?php echo _H_FULLNAME; ?>*</label>:</td>
<td><input class="inputbox" type="text" name="created_by_alias" id="created_by_alias" size="50" maxlength="50" value="<?php echo
$my->name; ?>" style="width:200px;" /></td></tr>
*/
?>

Listing 5. Kod wyświetlający w formularzu dodawania ogłoszeń nowe pola umożliwiające wstawienie daty rozpoczęcia i zakończenia ogłoszenia. (plik ja_
submit.html.php)
<?
<tr>
<td colspan="2" align="left" style="vertical-align: top;">
<div style="height: 50px; padding-top: 20px;">
Data rozpoczęcia ogłoszenia:
<input class="inputbox" type="text" name="publish_up" id="publish_up" size="17" maxlength="19" value="<?php echo $row->publish_up;
?>" />
<input type="reset" class="button" value="kalendarz" onclick="return showCalendar('publish_up', 'y-mm-dd');" />
</div>
</td>
</tr>
<tr>
<td colspan="2" align="left" style="vertical-align: top;">
<div style="height: 50px;">
Data zakończenia ogłoszenia:
<input class="inputbox" type="text" name="publish_down" id="publish_down" size="17" maxlength="19" value="<?php echo $row->publish_
down; ?>" />
<input type="reset" class="button" value="kalendarz" onclick="return showCalendar('publish_down', 'y-mm-dd');" />
</div>
</td>
</tr>
?>

Listing 6. W pliku index.php z katalogu aktualnego szablonu (templates –> katalog z szablonem) w części head wstawiamy linki
<link rel="stylesheet" type="text/css" href="<?php echo $mosConfig_live_site;?>/includes/js/calendar/calendar-mos.css" />

<script language="javascript" type="text/javascript" src="<?php echo $mosConfig_live_site;?>/includes/js/calendar/calendar_mini.js"></


script>
<script language="javascript" type="text/javascript" src="<?php echo $mosConfig_live_site;?>/includes/js/calendar/lang/calendar-
pl.js"></script>

www.phpsolmag.org 55
Technika

Rysunek 11. Dodanie linku do komponentu JA Submit w menu głównym


Rysunek 13. Wygląd formularza dodawania
ogłoszeń po wprowadzeniu zmian

mit.html.php wyświetla formularz widoczny


na stronie – możemy tutaj ukryć pola któ-
rych nie chcemy wyświetlać (np. imię i na-
zwisko czy możliwość dodawania grafiki).
Umieszczając go w komentarzu powodujemy
że nie będzie on widoczny na stronie. Musi-
my jeszcze uwzględnić tą zmianę w funkcji
submitbutton która sprawdza czy wszystkie
wymagane pola są wypełnione. Bierzemy w
komentarz odpowiedni jej fragment:

/*
else if ( form.created_by_alias.value = =
"" ) {
alert ( "<?php echo _H_ENTER_NAME; ?>" );}*/

Instrukcję dodawania ogłoszeń, która jest wi-


doczna nad formularzem możemy zmodyfiko-
wać zmieniając tekst w pliku polish.php (w ka-
talogu components/com_ja_submit/language).
Na koniec pokażemy jak dodać dwa nowe
pola do formularza tak żeby dodający ogłosze-
nia sami mogli zadecydować o dacie rozpoczę-
cia i zakończenia ogłoszenia (administrator
ma dostęp do tych pól w edycji artykułu). W
pliku ja_submit.html.php w miejscu gdzie ma-
ją być widoczne nowe pola wklejamy kod sko-
piowany z części administracyjnej (Listing 5).
Ostatnia część to wyświetlenie kalendarza
po kliknięciu w przycisk. Skrypty kalendarza
znajdują się w katalogu includes/js/calendar
musimy więc wstawić do nich link w części
head naszej strony. Wstawione daty będą wi-
doczne w części administracyjnej w edycji ar-
tykułu jako pola Rozpocznij i Zakończ. Zmody-
fikowany formularz przedstawia Rysunek 13.

MAGDALENA MARYAŃSKA
Autorka pracuje na Politechnice Krakowskiej ja-
ko webmaster.
Rysunek 12. Formularz dodawania ogłoszeń na stronie Kontakt: mmaryanska@interia.pl

56 03/2008
Joomla!

www.phpsolmag.org 57
Technika

PHP i Oracle
Obsługa bazy danych serwera Oracle z poziomu skryptów PHP

Większość programistów, także języka PHP, do przechowywania informacji


wykorzystuje bazy danych. Na rynku IT znajduje się wiele firm oferujących
usługi serwerów DB. Najpopularniejsze z nich, zwłaszcza dla programistów
aplikacji webowych to MySQL i PostgreSQL.

i kilka razy zapytanie, które powinno zwró-


Dowiesz się... Powinienes wiedzieć... cić potrzebne dla nas informacje. Jeśli do te-
• Artykuł zawiera podstawowe informacje na • Wymagana jest znajomość przynajmniej w go wszystkiego codziennie musimy wyko-
temat serwera baz danych firmy Oracle, opis stopniu średniozaawansowanym obsługi sys- nywać jeszcze inne, bardziej skomplikowa-
instalacji i konfiguracji potrzebnej do połącze- temu Linux oraz znajomość podstaw progra- ne raporty dla kilku innych pracowników,
nia z parserem PHP, a także podstawy pisania mowania w języku PHP. wykonywana praca może stać się dla nas na-
skryptów do obsługi bazy danych Oracle. prawdę mało przyjemna.
W tym właśnie momencie warto pomy-
śleć o napisaniu własnej prostej aplikacji w
fejsem dla klienta, gdyż takie aplikacje pisa- języku PHP, która może codziennie wyko-
ne są najczęściej w języku Java, lecz wiedza nywać za nas różne zadania. Wystarczy jed-
Poziom trudności w tej dziedzinie może ułatwić nam codzien- no kliknięcie i po chwili wszystko, czego po-
nie powtarzającą się pracę. Załóżmy, iż po- trzebujemy, pojawia się na naszym ekranie.
siadamy prostą relację między dwiema tabe- Do napisanego skryptu można również do-
lami jak na Rysunku 1. pisać interfejs WWW dla pracowników, któ-

O
ba wymienione serwery sprawdza- Naszym zadaniem jest codzienne spraw- rzy sami będą mogli w prosty i przejrzysty
ją się bardzo dobrze dla niewiel- dzanie logowań kilkunastu klientów o wy- sposób znaleźć odpowiednie dla nich infor-
kich, jak i tych potężnych witryn branych nazwach użytkownika (kln_uzyt- macje. Aplikacje tego typu potrafią bardzo
internetowych. Oczywiście są wykorzysty- kownik). ułatwić codzienną pracę i pozwolić na zaję-
wane do przechowywania informacji nie Jeśli posiadamy jakiś program ułatwia- cie się innymi problemami w firmie.
tylko na potrzeby WWW, ale też i wielu in- jący zarządzanie informacjami w bazie da-
nych aplikacji. nych, taki jak np. Toad firmy Quest Softwa- Nauka Oracle
Duże przedsiębiorstwa takie jak banki, re, będzie nam na pewno znacznie łatwiej, Niestety, nie każdy ma możliwość programo-
korporacje itp., dają zazwyczaj możliwość jednak trzeba będzie najpierw filtrować ta- wania aplikacji z wykorzystaniem bazy da-
dostępu do nowych rozwiązań IT i związa- belę klienci w celu znalezienia id klienta, nych Oracle w swojej pracy. W takim razie, czy
nych z nimi możliwościami rozwoju. Jed- a następnie tabelę sesje, gdzie będzie moż- mamy inną możliwość nauki pisania skryptów
nak, czy w tak dużej firmie spotkamy się z na znaleźć szukane przez nas informacje. z wykorzystaniem serwera DB Oracle? Oczy-
serwerami baz danych takimi jak MySQL i Oczywiście można to zrobić szybciej, pisząc wiście! Oracle, udostępnia darmową wersję
PostgreSQL? Być może, ale najprawdopo- proste zapytanie SELECT, które ułatwi ca- serwera baz danych oznaczoną XE.
dobniej nie będą to środowiska produkcyj- łą sprawę. I tak codziennie logujemy się do W niniejszym artykule posłużymy się wer-
ne, a raczej serwery na potrzeby wewnętrz- serwera DB i wykonujemy raz, a może nawet sją 10gXE. Wyraz darmowa oznacza w tym
nych aplikacji wspierających obsługę firmy.
Niezawodność, wsparcie techniczne i wy-
dajność liczą się tutaj najbardziej, dlatego
najprawdopodobniej w większości przypad- klienci sesje
ków, spotkamy się z rozwiązaniami serwe-
rów baz danych firmy Oracle. kln_id ses_id
kln_uzytkownik ses_kln_id
Oracle jest największym dostawcą rozwią- kln_imie ses_ip
zań bazodanowych, szczególnie w obszarze ... ...
firm. Posiada wiele możliwości, rozwiązań,
narzędzi wspierających itp. Najprawdopo-
dobniej nie staniemy przed problemem na-
pisania aplikacji w języku PHP z obsługą ba-
zy danych Oracle wraz z graficznym inter- Rysunek 1. Relacja między dwiema tabelami klienci oraz sesje

58 03/2008
PHP i Oracle

przypadku ograniczenia, tzn. wykorzystanie php5-dev na php4-dev ). Po dokonaniu insta- który również znajduje się w menu starto-
pamięci RAM do 1GB oraz jednego proceso- lacji w/w pakietów (serwera i klienta Orac- wym naszego OS (Run SQL Command Li-
ra, wielkość bazy danych (instancji) do 4GB le oraz pakietu rozwojowego PHP), uru- ne). Następnie logujemy się do naszego ser-
i ograniczona liczba opcji dodatkowych. chamiamy instancję serwera DB, wybiera- wera DB na użytkownika sys z uprawnienia-
Na potrzeby nauki pisania skryptów PHP jąc z menu start (będę używał nazwy me- mi sysdba, wykonując następujące polecenie
w połączeniu z bazą danych Oracle, wersja nu start, w przypadku systemów Linux na- connect sys as sysdba , system poprosi nas
10gXE jest w pełni wystarczająca. Do tego zwa menu jest zależna od używanego środo- o podanie hasła, które zostało wprowadzo-
wszystkiego będzie jeszcze potrzebny klient wiska graficznego, np.: menu KDE, menu ne podczas instalacji serwera Oracle (WAŻ-
serwera Oracle, który udostępnia potrzebne GNOME) systemu operacyjnego Start Da- NE!!! Aby móc się zalogować do serwera DB,
biblioteki systemowe do połączenia z serwe- tabase. Po uruchomieniu instancji serwera, należy uruchomić SQL*Plus z uprawnienia-
rem DB. uruchamiamy SQL* Plus (wiersz poleceń), mi użytkownika oracle w systemie Linux).
Jeżeli chodzi o wymagania systemowe, to
myślę, że na dzień dzisiejszy większość de- Listing 1. Tworzenie nowego użytkownika
veloperów posiada komputery, które wypo-
sażone są w przynajmniej 256MB (zalecane create user student identified by student default tablespace users quota 50M on users;
512MB) pamięci RAM i 1.6GB wolnej prze-
strzeni na twardym dysku. Wersja instala- Listing 2. Struktura tabeli klienci
cyjna jest dostępna zarówno dla systemu Li- create table klienci
nux, jak i Microsoft Windows. (
W przypadku systemu Linux wymaga- kln_id int,
na jest odpowiednia konfiguracja systemu kln_imie varchar(30),
przed zainstalowaniem serwera Oracle, nie kln_nazwisko varchar(50),
są to operacje skomplikowane i nie powinno kln_ulica varchar(100),
się ich pomijać. Wersje instalacyjne dla Li- kln_kod_pocztowy varchar(6),
nuxa dostępne są w dwóch pakietach: .rpm kln_miasto varchar(50)
lub .deb. Dokładne informacje na temat wy- );
magań instalacyjnych dla systemu Linux
znajdują się na stronie firmy Oracle, z któ- Listinig 3. Zawartość pliku tnsnames.ora
rymi należy się zapoznać przed przystąpie- XE =
niem do instalacji (http://www.oracle.com/ (DESCRIPTION =
pls/xe102/xe102.homepage). (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
W przypadku systemu Windows sprawa (CONNECT_DATA =
jest znacznie uproszczona. Wystarczy ścią- (SERVER = DEDICATED)
gnąć wersję instalacyjną przeznaczoną dla (SERVICE_NAME = XE)
systemu firmy Microsoft i uruchomić in- )
stalator. Ewentualne zmiany, jakich moż- )
na dokonać podczas instalacji to podanie
katalogu, w którym serwer Oracle ma zo- Listing 4. Skrypt PHP nazwiązujący połączenie z serwerem DB
stać zainstalowany. Po zainstalowaniu ser- <?
wera DB w wersji 10gXE, należy zainstalo- $tns = "
wać klienta serwera Oracle, którego biblio- (DESCRIPTION =
teki są niezbędne do prawidłowego komuni- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
kowania się pomiędzy skryptami PHP a ser- (CONNECT_DATA =
werem Oracle. (SERVER = DEDICATED)
(SERVICE_NAME = XE)
Przygotowanie )
serwera Oracle oraz PHP )
Być może część osób czytających ten arty- ";
kuł nie miała jeszcze styczności z serwerem $db_username = "student";
Oracle, dlatego zaczniemy od instalacji te- $db_password = "student";
go serwera na systemie operacyjnym Linux $conn = oci_connect($db_username, $db_password, $tns);
(dystrybucja Debian) oraz stworzenia użyt- if (!$conn) {
kownika, który posłuży nam do logowania $e = oci_error(
się do bazy danych, a następnie nadamy mu );
odpowiednie uprawnienia. echo htmlentities($e['message']
Do pliku /etc/apt/sources.list dodajemy );
wpis: deb http://oss.oracle.com/debian exit(
unstable main non-free . Zapisujemy zmia- );
ny i wykonujemy polecenie: apt-get update }
a nastepnie: apt-get install oracle-xe- else
client oracle-xe-universal . Następnie echo "Nawiązano połączenie z serwerem Oracle.<br />";
instalujemy pakiet rozwojowy dla PHP po- oci_close($conn);
leceniem: apt-get install php5-dev (je- ?>
żeli posiadasz PHP w wersji 4, zmień wpis

www.phpsolmag.org 59
Technika

Po zalogowaniu do serwera, przystępujemy z hasłem student, dostępne miejsce dla te- table to student; . Nasz nowy użytkow-
do utworzenia użytkownika następującym go użytkownika wynosi 50MB w przestrze- nik student posiada uprawnienia do nawią-
poleceniem (Listing 1.) ni tabel o nazwie users. Następnie nadamy zania połączenia oraz tworzenia tabeli. Na-
Po wykonaniu powyższej komendy zosta- mu uprawnienia do nawiązania połączenia stępnie rozłączamy się z serwerem polece-
nie utworzony użytkownik o nazwie student oraz tworzenia tabeli grant connect, create niem disconnect i łączymy się ponownie,
ale już jako użytkownik student connect
Listing 5. Wprowadzenie danych do tabeli klienci student . Po zalogowaniu tworzymy tabelę
klienci – Listing 2.
(…)echo "Nawiązano połączenie z serwerem Oracle.<br />"; Gdy tabela zostanie już utworzona, roz-
$sql = " łączamy się poleceniem disconnect i zamy-
insert into klienci ( kamy SQL*Plus. W ten sposób przygotowa-
kln_id, liśmy konto użytkownika student oraz tabe-
kln_imie, lę klienci. Kolejnym krokiem będzie przygo-
kln_nazwisko, towanie parsera PHP do możliwości korzy-
kln_ulica, stania z funkcji obsługujących bazę danych
kln_kod_pocztowy, Oracle.
kln_miasto Konfiguracja jest bardzo prosta. W syste-
) mie Linux ustawiamy zmienną środowiska
Values ( systemu, wydając polecenie z linii komend:
1, export ORACLE_HOME="/usr/lib/oracle/
‘Jan’, xe/app/oracle/product/10.2.0/client" .
‘Kowalski’, Następnie używając polecenia pecl, insta-
‘Wiosenna 8’, lujemy bibliotekę oci8, wpisując w wierszu
’11-111’, poleceń: pecl install oci8 i dodajemy
‘Kraków’ wpis do pliku php.ini extension=oci8.so
) lub innego pliku, w którym są załączone ze-
"; wnętrzne biblioteki.
$statement = oci_parse($conn, $sql); PHP w wersji dla systemu Windows naj-
if(oci_execute($statement)) prawdopodobniej będzie już zawierał bi-
echo "Wprowadzono wierszy: ".oci_num_rows($statment)."<br />"; bliotekę oci8, w przeciwnym wypadku nale-
else { ży odwiedzić stronę http://pecl4win.php.net,
$e = oci_error(); ściągnąć bibliotekę php_oci8.dll i dopisać ją
echo htmlentities($e['message'] do pliku z ładowanymi modułami (standar-
); dowo php.ini) w podobny sposób jak w syste-
exit(); mie Linux, czyli extension=oci8.dll. Aby
} upewnić się, iż nasza biblioteka została po-
oci_free_statement($statement); prawnie dodana do PHP i jest przez niego
oci_close($conn);(…) widoczna, należy z linii komend wydać po-
lecenie php –m (wyświetlenie wszystkich za-
Listing 6. Wyświetlenie danych ładowanych modułów – wymagany restart
(…)echo "Nawiązano połączenie z serwerem Oracle.<br />"; serwera Apache).
$sql = "select * from klienci"; Jeżeli w zwróconym wyniku na liście zała-
$statement = oci_parse($conn, $sql); dowanych modułów znajdziemy oci8 ozna-
if(!oci_execute($statement, OCI_DEFAULT)) { cza to, iż nasz moduł jest rozpoznawany
$e = oci_error(); przez PHP.
echo htmlentities($e['message']
); Piszemy pierwszy skrypt
exit(); Jeżeli środowisko PHP działa poprawnie,
} możemy przejść do napisania pierwszego
$rows = oci_fetch_all($statement,$results); skryptu, którego zadaniem będzie nawiąza-
if($rows > 0) { nie połączenia z bazą danych Oracle. Zanim
echo "<table>"; zaczniemy pisać skrypt, należy znaleźć plik
for($i=0;$i<=$rows;$i++) { o nazwie tnsnames.ora, w którym znajdują
echo "<tr>"; się informacje związane z połączeniami do
foreach($results as $data) danej instancji np. nazwa hosta, protokół,
echo "<td>".$data."</td>"; port itp. Plik ten powinien znajdować się
echo "</tr>"; w katalogu domowym serwera Oracle, np.:
} /usr/lib/oracle/xe/app/oracle/product/10.2.0/
echo "</table>"; server/network/admin (jeżeli korzystamy z
} serwera dostępnego na innej stacji robo-
else czej, to plik tnsnames.ora powinien znajdo-
echo "Brak rekordów"; wać się w katalogu klienta Oracle). Z pli-
oci_free_statement($statement); (…) ku będzie potrzebny wpis podobny do te-
go z Listingu 3.

60 03/2008
PHP i Oracle

A zatem otwieramy edytor PHP i wpisujemy która zlicza ilość wierszy (w tym przypadku do- wprowadzona nowa funkcja oci_fetch_all(),
kod z Listingu 4. danych do tabeli) oraz oci_free_statement(), która zwrócone wiersze z instrukcji $statement
Jeśli wszystko mamy dobrze skonfigurowane, która zwalnia wszelkie zasoby związane z przy- wstawia do tablicy $results, dodatkowo zwraca
to po wykonaniu skryptu z Listingu 4. powinni- gotowaną wcześniej instrukcją. wartość typu integer – ilość wierszy. Dalej poja-
śmy zobaczyć informację: Nawiązano połączenie W powyższym przykładzie, funkcja oci_ wiają się już tylko pętle for oraz foreach, które
z serwerem Oracle, w przeciwnym wypadku zo- execute() nie zawiera dodatkowego argumentu pomagają w wygodny sposób zwrócić zawartość
stanie zwrócony błąd. Krótko o skrypcie. Pierw- – wykonywania funkcji, który bez podania dru- tablicy $results.
sza zmienna $tns zawiera niezbędne informa- giej wartości jest ustawiany domyślnie na OCI_
cje potrzebne do nawiązania połączenia z bazą COMMIT_ON_SUCCESS (w przypadku powodze- Czy to koniec?
danych. Kolejne dwie zmienne $db_username nia zatwierdź transakcję). Oznacza to, iż wpro- Tak, ale dotyczy to niniejszego artykułu. Jeżeli
oraz $db_password zawierają login i hasło, przy wadzona przez nas instrukcja (insert) zostanie chodzi o PHP, to jest to zaledwie namiastka, po-
pomocy których nastąpi zalogowanie do serwe- zatwierdzona i będzie widoczna dla wszystkich czątek oferowanych przez PHP funkcji i możli-
ra DB. zalogowanych do serwera DB. wości obsługi serwera baz danych firmy Oracle.
W kolejnej linijce znajduje się funkcja oci_ Jeżeli nie chcielibyśmy zatwierdzać transak- Prócz tego jest wiele bibliotek napisanych w PHP
connect(), która odpowiada za nawiązanie połą- cji automatycznie, należy dodać drugi argument do obsługi różnych serwerów baz, np.: ADOdb,
czenia z serwerem Oracle i zwraca identyfikator funkcji OCI_DEFAULT – w tym trybie wszelkie która prócz obsługi serwerów takich jak MySQL,
połączenia. Dalej sprawdzamy, czy połączenie zmiany dokonane przez nas w skrypcie (trans- PostgreSQL, Firebird, Informix, DB2, LDAP itp.
zostało nawiązane poprawnie. Jeżeli niepopraw- akcji), będą musiały być jawnie zatwierdzone obsługuje również Oracle. Warto więc zastano-
nie, zostanie wywołana funkcja oci_error(), za pomocą funkcji oci_commit() lub wycofa- wić się nad ich zastosowaniem.
która zwróci ostatni znaleziony błąd, w przeciw- ne poprzez funkcję oci_rollback(), natomiast Polecam również zapoznanie się z pozostały-
nym wypadku otrzymamy komunikat o nawią- gdy transakcja nie zostanie jawnie zatwierdzona mi funkcjami PHP dla Oracle, które możemy
zaniu połączenia. Ostatnia linijka zamyka połą- lub anulowana to wprowadzone przez nas da- znaleźć oczywiście w dokumentacji technicznej
czenie do serwera Oracle. ne zostaną wycofane (rollback) wraz z zakoń- PHP z wieloma przykładami i szczegółami ich
Posiadamy tabelę o nazwie klienci, która ak- czeniem połączenia lub zakończeniem działa- działania. Ze strony Zenda można ściągnąć
tualnie jest pusta, dlatego też wprowadzimy do nia skryptu. Dlatego należy pamiętać o zasto- Zend Core for Oracle. Jest to zestaw biblio-
niej przykładowe dane, na których będziemy sowaniu funkcji oci_commit(), która zatwier- tek pomocnych w realizacji połączenia mię-
mogli pracować. Do naszego skryptu dopisuje- dzi aktywną transakcję, tak jak jest to pokaza- dzy PHP, a Oracle – przydatny dla osób po-
my linijki kodu z Listingu 5. ne poniżej: czątkujących. Należy być ostrożnym pod-
W tym przypadku powinien zostać wprowa- czas instalacji w/w aplikacji, gdyż dokonuje
dzony jeden wiersz do naszej tabeli klienci i za- (…)oci_execute($statement); ona zmian w plikach konfiguracyjnych ser-
kończony informacją: Wprowadzono wierszy: oci_commit($conn);(…) wera Apache oraz parsera PHP.
1. W powyższym dodatku do naszego skryp-
tu wprowadziłem cztery nowe funkcje: oci_ Wprowadziliśmy już jeden rekord do tabeli
parse(), której zadaniem jest przygotowanie klienci, proponuję wprowadzić jeszcze kilka,
zapytania (zwrócony identyfikator wyrażenia gdyż teraz zajmiemy się ich pobieraniem oraz MACIEJ MALETA
jest używany najczęściej w kombinacji funk- wyświetleniem. Autor zajmuje się programowaniem w języku PHP
cji oci_execute() oraz oci_bind_by_name()), Zmodyfikujemy trochę nasz pierwszy skrypt, od 2001 r. Napisał książkę PHP od podstaw. Aktu-
oci_execute() – wykonuje przygotowaną in- dodając odpowiednie linie kodu z Listingu 6. alnie jest starszym specjalistą w banku BPH, pełni
strukcję (w tym przypadku jest to wprowadze- Po wykonaniu skryptu powinniśmy zobaczyć funkcję administratora aplikacji.
nie nowego wiersza do tabeli), oci_num_rows(), wynik w postaci entej ilości rekordów. Została Kontakt z autorem: mapetenator@gmail.com

R E K L A M A

www.phpsolmag.org 61
Technika

Nie tylko WWW


Monitorowanie serwisów

PHP to obecnie znacznie więcej niż prosty język skryptowy wspomagający


generowanie dynamicznych stron WWW. Jest pełnoprawnym językiem
programowania, a programy w nim napisane można uruchamiać nie tylko
jako skrypty wykonywane przez serwer WWW. Czasami z powodzeniem
może zastąpić programy pisane w C lub w Perl.

Dowiesz się... Powinieneś wiedzieć... kładnie odpowiada zaprezentowanemu pro-


• Jak uruchomić program w php z poziomu linii • Powinieneś znać podstawy programowania w gramowi w PHP. Możemy go skompilować ko-
poleceń; php. mendą gcc -o simple simple.c, a po uruchomie-
• Jak korzystać z crona w Linuksie; niu otrzymamy na ekranie dokładnie taki sam
• Jak korzystać z przekazywania zmiennych do wynik jak w przypadku programu w PHP. Ar-
programu. gumenty przekazujemy wpisując je w linii ko-
mend, za nazwą wywoływanego programu.
Pamiętajmy przy tym, że system za znacznik
na stronę, generują wykresy. Zmiana dotyczy następnego argumentu uznaje spację, w przy-
też wyświetlania wyników. Podstawowym padku, gdy chcemy przekazać do programu
znacznikiem końca linii jest '\n'. Gdy wy- ciąg znaków zawierający spację, musimy ten
Poziom trudności świetlamy coś na ekranie, na końcu linii wsta- ciąg umieścić w cudzysłowach.
wiamy właśnie ten znacznik. Musimy też pa-
miętać, że między linijką #!/usr/bin/php, a <? Listing 1. Prosty skrypt prezentujący
nie może być wolnych linii. Wszystkie te li- zmienne argc i argv

C
zasami zachodzi potrzeba monitoro- nie zostaną wyświetlone na ekranie.
wania jakiegoś serwisu WWW, czy Istnieją dwie bardzo ważne zmienne, któ- #!/usr/bin/php
też innych usług działających w sie- re można wykorzystać tylko przy urucha- <?
ci. Można skorzystać oczywiście z płatnych mianiu programów z poziomu CLI: $argc printf("Liczba podanych argumentów %d\
serwisów monitorujących, ale znacznie le- i $argv[]. Zmienna $argc przechowuje licz- n",$argc);
piej, gdy mamy dostęp do serwera z cronem, bę argumentów podanych w linii poleceń, print_r($argv);
napisać własny skrypt, który będzie monito- a $argv[] jest tablicą zawierającą wszystkie ?>
rował daną usługę. wpisane argumenty. Jako argument 0 wy-
Do uruchomienia własnego serwisu bę- stępuje zawsze nazwa programu. Na Listin- Listing 2. Zapisywanie kolejnych
argumentów
dziemy potrzebować serwera z zainstalowa- gu 1. przedstawiony jest najprostszy moż-
nym PHPCLI (ang. PHP Command Line In- liwy program prezentujący wykorzystanie #include <stdio.h>
terface) oraz dostępu do crona. Do pisania tych zmiennych. Jeśli wpiszemy po nazwie #include <stdlib.h>
skryptu wystarczy ulubiony edytor, w któ- programu jakiekolwiek zmienne zostaną one int main(int argc, char *argv[]){
rym tworzymy skrypty PHP, może to być za- wyświetlone na ekranie. Wywołanie komen- int counter;
równo vi, notepad, jak i środowisko typu Qu- dy ./simple_script.php skrypt wyświetli printf("Liczba podanych argumentów
anta czy Kdevelop. na ekranie komunikat: Liczba podanych argu- %d\n",argc);
Gdy piszemy program dla PHP CLI, musi- mentów 2
my pamiętać o kilku różnicach między pro- printf("Array\n");
gramami prezentującymi wyniki na stronach Array printf("(\n");
WWW, a programami wykonywanymi z po- ( for(counter=0;counter<argc;counter
ziomu linii poleceń. Skrypty wykonywane na [0] => ./simple.php ++){
serwerze nie podlegają ograniczeniom cza- [1] => skrypt printf("[%d] => %s\n",counter,argv[
sowym jak skrypty wywoływane przez Apa- ) counter]);
che. Pozwala to tworzyć programy, których }
wykonanie trwa znacznie dłużej. Szczegól- Zawsze elementem z indeksem [0] jest nazwa printf(")\n");
nie jest to przydatne przy tworzeniu progra- wykonywanego pliku. Potem kolejno w tablicy return EXIT_SUCCESS;
mów, które wykonują np. prace konserwacyj- zapisywane są kolejne argumenty. Na Listingu }
ne na bazie danych, obliczają statystyki wejść 2. przedstawiony jest program w C, który do-

62 03/2008
Nie tylko WWW

W programie wykorzystaliśmy funkcję te funkcje. Dzięki czemu łatwiej nam będzie wiedniki w języku C. Wystarczy czasami tyl-
printf zamiast popularniejszych echo, print. przerobić później program na język C. W ra- ko zmodyfikować zapis zmiennych usuwając
Na Listingu 3. dodatkowo wykorzystamy zie potrzeby, gdy wydajność PHP okaże się znak '$', żeby odpowiednia linijka kodu dała
funkcję sprintf. Są to funkcje wykorzystywa- zbyt niska, będziemy mieli mniej pracy przy się skompilować. Mimo że operator '.' jest wy-
ne w standardowej bibliotece języka C. Pisząc stworzeniu programu o większej wydajno- godniejszy w użyciu, stosujemy sprintf.
programy dla command line warto stosować ści. Większość funkcji PHP ma swoje odpo- Gdy mamy już podstawową wiedzę o uru-

Listing 3. Prosty skrypt monitorujący działanie serwisu WWW

#!/usr/bin/php
<?
// definiujemy zmienne poczatkowe
$marker=0;
/*
Jeśli mniej argumentów niż 3 wyświetlamy informację o poprawnym wywołaniu programu
i kończymy program
*/
if($argc!=3){
printf("Instrukcja:\n");
printf("php_monitor service poszukiwany_ciag\n");
printf("przykład php_monitor www.phpsolmag.org phpsolmag.org\n");
exit();
}
// Pobieramy ze zmiennej adres strony
$url=sprintf("http://%s",$argv[1]);
/* Otwieramy polaczenie z wybranym serwisem */
if(!$fp=fopen($url,"r")){
printf("Nie można połączyć sieęz hostem\n");
exit();
}
// Wczytujemy stronę i sprawdzamy czy wystąpił poszukiwany ciąg znaków
do{
$content=fread($fp,8192);
if(eregi($argv[2],$content)){
$marker=1;
}
} while(!feof($fp) && !$marker);
// wyświetlenie wyniku działania programu
if($marker){
printf("Serwis %s działa\n",$argv[1]);
}else{
printf("Serwis %s nie działa\n", $argv[1]);
}
?>

Listing 4. Zapisywanie statystyki dostępności serwisu


<?
function stats_save($monitor_status, $serwis)
{

if(!$log_file=fopen("/var/log/stats_log","w+")){
printf("Nie można otworzyć pliku\n");
return;
}

$log_desc=sprintf("%s serwis $serwis niedostępny",date("Y-m-d H:i:s"),$serwis);


if($monitor_status){
fwrite($log_file,$log_desc,strlen($log_desc));
}
fclose($log_file);
return;
}
?>

www.phpsolmag.org 63
Technika

chamianiu programów z poziomu CLI, może- stępności serwera przez ping, czy też na- żych serwisów, z plikiem index.php o wiel-
my przystąpić do pisania programu monitoru- wet przez sprawdzenie, czy serwer WWW kości kilkudziesięciu kilobajtów lub więk-
jącego serwis WWW. Program taki jest bar- nasłuchuje na określonym porcie. W przy- szych - nawet lepiej jak tak zrobimy. Za-
dzo prosty do napisania, żeby był uniwer- padku stron generowanych całkowicie dyna- miast ściągać olbrzymie ilości danych ścią-
salny, wykorzystamy przekazywanie para- micznie musimy znaleźć element, który jest gamy mały plik.
metrów. Jednym programem będziemy mo- stały i przy każdym wyświetleniu strony po- Sam program jest bardzo prosty. Na po-
gli monitorować wiele serwisów zmieniając zostaje taki sam. czątku sprawdzamy, czy została podana od-
tylko parametry. Zwykle strona ma element stały, może to powiednia liczba argumentów. Jeśli nie, wy-
Monitoring działa w oparciu o spraw- być tytuł strony, adres kontaktowy, możemy świetlamy informację, o składni jaką nale-
dzenie czy na pobranej stronie jest podany nawet skorzystać z elementów ukrytych ta- ży stosować przy uruchamianiu programu.
przez nas ciąg znaków. Pozwoli to nie tyl- kich jak fragment java script. Dzięki temu osoba, która dopiero pierwszy
ko monitorować dostępność samego serwera Nic nie stoi na przeszkodzie, żeby w ra- raz korzysta z programu, może szybko zo-
WWW, ale także tego czy poprawnie działa- zie czego stworzyć osobny plik i umieścić go rientować jak poprawnie go uruchomić. Na-
ją skrypty, a nawet baza danych. na serwerze. Zamiast odczytywać zawartość stępnie pobieramy z tablicy argumentów in-
Pobieranie ciągu znaków jest znacznie całej strony, sprawdzamy czy wyświetla się teresujące nas dwa elementy, adres monito-
pewniejszą metodą niż sprawdzanie do- nasz plik testowy. W przypadku bardzo du- rowanego serwera i ciąg znaków, który powi-
nien wystąpić na stronie.
Uruchamianie skryptów PHP z poziomu command line Przez funkcję fopen pobieramy stronę i
Korzystanie z PHP CLI wymaga dostępu do konsoli serwera. Niewiele serwisów oferuje tzw. konta sprawdzamy czy istnieje podany w parame-
shell pozwalające bezpośrednio uruchamiać programy. Zastępczym rozwiązaniem jest dodanie na- trze ciąg znaków. Na Listingu 3. jest pro-
szego skryptu do crona. Jeśli nawet serwis hostingowy nie oferuje takiej funkcjonalności, to można gram, który realizuje taką funkcjonalność.
spytać się usługodawcy czy istnieje taka możliwość. Jeśli nasz skrypt nie będzie zbyt obciążający dla Komunikat informuje o dostępności stro-
serwera, możemy otrzymać zgodę, na i administrator serwera doda nasz skrypt do zadań systemo-
ny. Zamiast wypisywania komunikatu mo-
wych. Możemy też poprosić znajomego administratora sieci osiedlowej, często jest tam router opar-
ty o system Linux lub BSD, na którym można uruchomić taki skrypt. Jeśli mamy dostęp do konsoli, żemy zapisać wyniki sprawdzenia w pliku
skrypty możemy uruchamiać na dwa sposoby, pierwszym jest wywołanie jawne pliku z kodem php: lub w bazie danych, na podstawie takich za-
pisów możemy nawet stworzyć statystkę do-
php own _ script.php stępności serwisu.
Na Listingu 4. przedstawiliśmy prostą
Druga metoda to utworzenie pliku wykonywalnego. Na początku takiego pliku umieszczamy w
przypadku Linuxa/UNIXA1 linijkę: funkcję pozwalającą zapisywać do pliku
błędy w funkcjonowaniu monitorowane-
#!/usr/bin/php -q go serwisu. Wystarczy do kodu na Listin-
dla Windows:
#!C:\php\php.exe -q
gu 3. dołączyć komendą include plik z na-
szą funkcją i zamienić wyświetlanie komu-
Dalej tworzymy zwykły skrypt ograniczony znacznikami <? i ?>. Skrypt wywołujemy, podając nikatu z błędem na linię function stats_sa-
jego nazwę. Jeśli skrypt nie został umieszczony w katalogach znajdujących się w ścieżkach przeszukiwa- ve(1, $argv[1]);, żeby nasz skrypt zapisywał
nia, musimy albo podać pełną ścieżkę do skryptu, czyli np. /home/katalog_domowy/skrypt.php lub sko- do pliku wszystkie problemy z wyświetle-
rzystać z zapisu . /skrypt.php. ./ oznacza w systemach Unices2 bieżący katalog. W przypadku urucha-
niem serwisu.
miania pliku przez wywołanie PHP możemy wykorzystać opcję -c, która pozwala skorzystać z in-
nego pliku php.ini niż domyślny. Gdy mamy już gotowy skrypt, musimy za-
dbać o to by skrypt wywoływany był cyklicz-
nie. Najlepszym narzędziem do tego jest
cron. Za pomocą crona możemy zdefinio-
Korzystanie z demona cron wać jak często chcemy monitorować serwis,
Cron jest standardowym mechanizmem w systemach z rodziny *NIX, pozwala uruchamiać dowolne
najmniejszą jednostką czasu, jaką możemy
programy o wyznaczonej porze. Z poziomu użytkownika możemy ustawić crona, wydając komendę
crontab -e. Domyślnym edytorem dla crontaba jest vi. Dodajemy po prostu nową linijkę w formacie: wykorzystać jest jedna minuta. Cron nie po-
zwala uruchamiać programów częściej niż
* * * * * uzytkownik /usr/bin/php -c php.ini /home/uzytkownik/nasz_skrypt.php > /dev/null 2>&1 co minutę. Najrzadziej możemy urucha-
miać program raz na rok.
Pierwsze pięć pól oznacza czas uruchomienia skryptu: W ten prosty sposób napisaliśmy program
monitorujący dowolny serwis. Oczywiście
• minuty 0-59
• godzina 0-23 na tym nie kończą się możliwości php-cli.
• dzień miesiąca 1-31 Jest to tylko jeden z przykładów wykorzy-
• miesiąc 1-12 stania skryptów PHP jako pełnowartościo-
• dzień tygodnia 1-7 lub wych programów, a nie jedynie narzędzi
wspomagających dynamiczne generowanie
Zamiast godzin można wpisać gwiazdkę, co oznacza dowolną godzinę. Np. zapis 30 * * * * nakazuje cro-
nowi uruchomić nasz skrypt co godzinę, 0:30, 1:30 itd. Natomiast zapis 0 0 * * * będzie uruchamiał nasz stron WWW.
skrypt codziennie o północy. Oprócz tego można stosować bardziej złożone zapisy. */5 * * * * oznacza,
że program ma być wykonywany co pięć minut, 0 1-6 * * *, wykonywanie o każdej pełnej godzinie od 1:
00 w nocy do 6:00 rano. 0 1,6,9,11 * * * uruchamia nasz program o 1:00, 6:00, 9:00, 11:00. Można łączyć
też wpisy, np. 0 1-3,21-23 pozwoli nam wykonać program o 1:00, 2:00,3:00 oraz o 21:00,22:00,23:00. Za- PIOTR KARKUCIŃSKI
pis > /dev/null 2>&1 przekierowuje wszystkie komunikaty, które pojawiają się na ekranie o komuni-
Autor jest administratorem sieci w firmie Active
katy błędów do specjalnego pliku /dev/null. Jest to plik specjalny w *NIX-ach, czarna dziura, do której co-
kolwiek zapiszemy, zniknie. W przypadku wywoływanie programu z crona nie ma potrzeby wyświetla- 24 sp. z o.o.. Zajmuje się utrzymywaniem sieci i
nia czegokolwiek na ekranie, a zbyt dużo komunikatów może spowodować przepełnienie bufora ko- programowaniem systemów wspomagających
munikatów i w efekcie problemy z działaniem programu tak wywołanego. pracę serwerów i sieci.
kontakt z autorem: piotr.karkucinski@active24.pl

64 03/2008
Nie tylko WWW

www.phpsolmag.org 65
Narzędzia

Asido
Jeszcze nigdy nie było to tak proste!

Obojętne, czy tworzysz zaawansowane strony na zlecenie, czy jesteś mniej


doświadczonym programistą, docenisz z pewnością rozwiązania, które pozwolą
zaoszczędzić Twój czas. Wszak maksyma B. Franklina czas to pieniądz nie straciła
na wartości od setek lat. W artykule przedstawię jedno z takich udogodnień,
klasę Asido, która w prosty sposób pozwala manipulować grafiką.
hacków. Aby mieć do nich dostęp, zamiast
Dowiesz się... Powinieneś wiedzieć... powyższych, powinieneś użyć jednej z po-
• Jak biegle posługiwać się klasą Asido w swo- • Powinieneś znać podstawy programowania niższych linii (dokładny opis działania znaj-
ich własnych projektach. obiektowego w PHP 5. duje się w ramce):

asido::driver('gd_hack');
nocześnie, ten niezbyt skomplikowany, jakby asido::driver('imagick_ext_hack');
nie było, przykład ilustruje dokładnie to, co asido::driver('imagick_shell_hack');
Poziom trudności konieczne dla skorzystania z tejże klasy.
Pierwszym z czterech niezbędnych ele- Trzecim nieodzownym elementem jest utwo-
mentów, jakie muszą się znaleźć w Twoim rzenie samego obrazu, który poddamy ob-
kodzie, jest dołączenie głównej klasy Asido róbce. W tym celu musisz wywołać metodę

N
ajistotniejszą kwestią jest takie zor- do skryptu. Możesz zastosować do tego stan- asido::image(), która zwraca instancję klasy
ganizowanie pracy, aby zrobić ją dardowe polecenie include('class.asido Asido _ Image. Jej konstruktor:
dobrze i się przy tym nie narobić. .php'). Pamiętaj, iż najlepiej jest utworzyć
Niestety los nie zawsze nam sprzyja i w trak- osobny katalog na pliki wchodzące w skład Asido_Image Asido_Image ([string $source
cie realizacji zlecenia możemy natknąć się całego Asido. Inną istotną kwestią jest to, iż = null], [string
na przeszkody, o których wcześniej nie wie- nie powinieneś zmieniać nazw plików wcho- $destination = null])
dzieliśmy. W takich momentach przydatna dzących w jego skład. Być może wydadzą Ci
jest elastyczność narzędzi, z którymi zwykli- się one zbyt długie, ale z pewnością pomogą podobnie jak sama metoda przyjmuje dwa ar-
śmy pracować na co dzień. Przykładem tego zorientować się w kodzie, gdy powrócisz do gumenty. Jako pierwszą powinieneś przeka-
może być konieczność wykorzystania innej niego po jakimś czasie. zać ($source) nazwę już istniejącego pliku,
niż GD biblioteki graficznej, z którą współ- Drugim fragmentem, którego nie możesz który chcesz poddać późniejszym manipula-
pracuje PHP. Z pewnością dla znacznej czę- pominąć jest, wybór biblioteki graficznej, z ja- cjom. W następnej kolejności ($destination)
ści programistów użycie pakietu takiego jak ką Asido ma współpracować przy obróbce ob- wskaż Asido miejsce, w którym ma zapisać ob-
ImageMagick wiązałoby się z wertowaniem razów: raz przy wywołaniu metody save(). Zwróć
dokumentacji, co spowolniłoby proces two- uwagę, że w powyższym przykładnie użyli-
rzenia właściwej aplikacji. Choć pouczające, • asido::driver('gd'); – włączenie obsłu- śmy różnych formatów dla pliku źródłowego i
nie byłoby to zbyt efektywne. Właśnie takim gi GD (GD2) wynikowego. Nie jest to błędem, wszystko bę-
rozumowaniem kierują się twórcy klas, bę- • asido::driver('magick _ wand'); – włą- dzie działać poprawnie. Asido spełni nasze ży-
dących pośrednikami pomiędzy różnymi bi- czenie obsługi MagickWand czenie, zapisując obraz w formacie png.
bliotekami, a interfejsem używanym przez • asido::driver('imagick _ ext'); – włą- Ostatnim etapem tworzenia zmodyfikowa-
programistę. W efekcie powstają narzędzia, czenie obsługi rozszerzenia Imagick nej wersji obrazu jest jego zapisanie. Na razie,
dzięki którym nie potrzeba na nowo odkry- • asido::driver('imagick _ shell'); – Asido nie oferuje bezpośredniego przesyłania
wać Ameryki. Oto Asido! włączenie obsługi Imagick poprzez po- efektów swej pracy do przeglądarki, konieczny
włokę jest ich zapis do pliku wynikowego. Odbywa się
(Naprawdę) szybki start to poprzez użycie metody save() obiektu kla-
W listingu pierwszym znajdziesz kod, któ- W swoim projekcie umieść jedną z powyż- sy Asido_Image:
ry obraca zadany obraz oraz dodaje do nie- szych linii. Szczegółowe wymagania odno-
go znak wodny. Całość zajęła jedynie 6 li- szące się do poszczególnych pakietów znaj- $image->save(ASIDO_OVERWRITE_ENABLED);
nii kodu! To wszystko dzięki wykorzystaniu dziesz w drugiej ramce. Ponieważ niektóre
Asido. Z pewnością przyjmiesz z zadowole- operacje nie są dostępne wprost z powyż- Domyślną flagą przy zapisywaniu jest ASIDO _
niem informację, że każdą inną operację mo- szych bibliotek, konieczne jest użycie spe- OVERWRITE _ DISABLED (możemy, aczkolwiek
żesz wykonać w równie prosty sposób. Jed- cjalnie przygotowanych przez twórcę Asido nie musimy jej wpisywać, wystarczy wywo-

66 03/2008
Asido

łanie save()), co zgodnie z nazwą oznacza, iż wszystkie górne położenia są reprezentowa- metod klasy Asido) zamieszczamy w tabeli o nu-
próba nadpisania istniejącego pliku zakończy ne poprzez stałe ASIDO_WATERMARK_TOP_LEFT, merze jeden. Dodatkowo, na płycie CD dołączo-
się niepowodzeniem, a samo Asido wygeneru- ASIDO_WATERMARK_TOP_CENTER oraz ASIDO_ nej do czasopisma znajdziesz oficjalne przykłady
je informację o błędzie. WATERMARK_TOP_RIGHT. Aby uzyskać znak zaczerpnięte z dokumentacji Asido z komenta-
umieszczony w połowie wysokości obrazka, na- rzami przetłumaczonymi na język polski.
Do zapamiętania leży zamienić w tych trzech stałych sformuło- Kolejnym istotnym szczegółem jest fakt,
Zanim przejdziemy dalej, pozwól, że przedtem wanie TOP na MIDDLE. Analogicznie, możesz wpisać iż nie musisz za każdym razem podawać sta-
podsumujemy krótko nasze dokonania. Pozwo- zamiast TOP wyraz BOTTOM, w efekcie czego znak po- łej ASIDO_RESIZE_PROPORTIONAL – jest ona
li to bezboleśnie przejść do omówienia bardziej jawi się na dole obrazka. Istnieje jeszcze jedna moż- przyjmowana za argument domyślny. Pozosta-
zaawansowanych przykładów. liwość, a mianowicie ASIDO_WATERMARK_TILE. Po- łe dwie stałe, którymi możesz się posłużyć to
woduje ona cykliczne nanoszenie znaku wodnego ASIDO_RESIZE_STRETCH oraz ASIDO_RESIZE_
• W kodzie nigdzie nie jest tworzony obiekt tak, aby pokrył on całą dostępną powierzchnię. Nie FIT. Pierwsza spowoduje efekt identyczny z
klasy asido, choć korzystamy z jej metod. jest to zbyt często stosowane rozwiązanie. Przykład wywołaniem metody asido::stretch(), dru-
Konieczne jest zatem użycie operatora możesz zobaczyć na rysunku drugim. ga zaś asido::fit(). Ponownie, ich znaczenie
określającego przestrzeń nazw, do jakiej Asido oferuje jeszcze jeden komplet stałych słu- znajdziesz w tabeli pierwszej oraz w załączo-
się odnosimy ( asido:: ). żących do umiejscowienia znaku wodnego. Mo- nych na płycie przykładach.
• Jedynym tworzonym obiektem jest sa- żesz użyć kierunków świata wyrażonych w ję-
ma grafika, czyli instancja klasy Asido _ zyku angielskim. Obowiązują przy tym zwy- Obsługa błędów
Image zwracana przez funkcję asido:: kłe reguły dotyczące kolejności ich wymienia- Obecnie dostępna do ściągnięcia wersja Asi-
image(). nia. Przykładowo, prawy górny róg będzie na- do nie posiada wbudowanej obsługi wyjątków.
• O formacie pliku wynikowego decyduje zwany ASIDO_WATERMARK_NORTH_EAST, zaś dolny Co więcej, zaimplementowany w niej mecha-
rozszerzenie pliku wpisane przy inicjaliza- po prostu ASIDO_WATERMARK_SOUTH. Aby umiej- nizm obsługi błędów pozostawia wiele do
cji obiektu zawierającego grafikę (istnieje scowić znak wodny na środku, użyj stałej ASIDO_ życzenia. W pewnym sensie jest to zgodne z
jeszcze jedna metoda [asido::convert()], WATERMARK_CENTER. ideą, jaką kierował się twórca: Asido ma mani-
o której napiszę w dalszej części).
Pozostałe możliwości
Jeszcze o znakach wodnych Jeżeli kiedykolwiek chciałeś zmienić wymiary ob-
Przedstawione powyżej użycie metody asido: razka, zachowując jego proporcje, zapewne zasta-
:watermark(), pomimo swej prostoty działało nawiałeś się, w jaki sposób to zrobić, aby uniknąć
wyśmienicie. Jednakże można sobie wyobra- karkołomnego sondowania mającego określić, czy
zić, że chcielibyśmy umieścić znak wodny w le- jest on szerszy, czy wyższy. W Asido ten problem
wym górnym rogu zamiast prawym dolnym. W nie istnieje. Co więcej, istnieje kilka metod obsłu-
dodatku, nie bylibyśmy pewni, na jak duże ob- gujących takie operacje. Najbardziej ogólna nazywa
razki będziemy nanosić taki znak. Aby nie był się po prostu resize(). Aby proporcjonalnie zmie- Rysunek 1. Efekt pracy skryptu z listingu pierwszego
on większy od samej grafiki, musielibyśmy go nić wymiar obrazka, tak aby dłuższy jego bok wy-
jakoś automatycznie przeskalować zachowu- nosił 400 pikseli, powinieneś użyć:
jąc określone proporcje. Dzięki Asido nie jest
to trudne, jedynie co musimy zrobić, to wydać asido::resize( $image, 400, 400, ASIDO_
dokładnie takie polecenia, o jakich mówiliśmy: RESIZE_PROPORTIONAL);

asido::watermark($image, 'watermark.png', Pierwsza z liczb określa szerokość, druga wy-


ASIDO_WATERMARK_TOP_LEFT, sokość. Ciekawostką jest fakt, iż polecenie:
ASIDO_WATERMARK_SCALABLE_ENABLED, 0.66);
asido::resize( $image, 0, 400);
Jest to najbardziej rozbudowane wywołanie
tej metody. Pierwsza stała umieszcza znak w również dokona proporcjonalnego dopasowania,
odpowiednim narożniku. Kolejna, ASIDO _ uwzględniając jedynie wysokość grafiki. Dzia- Rysunek 2. Zastosowanie stałej ASIDO_
WATERMARK _ SCALABLE _ ENABLED, pozwa- łanie to jest identyczne z wywołaniem metody WATERMARK_TILE zaciemnia całkowicie pierwotny
la Asido dokonać skalowania znaku wodne- asido::height(). Jej opis (a także pozostałych obraz
go, o ile jest on większy niż obraz przypo-
rządkowany obiektowi $image. Liczba 0.66
decyduje o proporcji, jaka zostanie zachowa-
3 (a nawet więcej) razy TAK! Dla Asido
Najważniejszymi argumentami przemawiającymi za używaniem Asido są:
na przy skalowaniu, jest to liczba z przedzia-
łu od zera do jeden. Zapamiętaj, że skalowa- • Znaczne możliwości, klasa ta potrafi przycinać, skalować, obracać o zadany kąt obrazki. Nie sprawia
nie takie jest domyślnie włączone, zaś współ- jej problemu dodanie znaku wodnego, zmiana typu grafiki oraz zapis w skali szarości.
czynnik skalowania jest umieszczony w sta- • Fakt, iż obsługuje wiele bibliotek graficznych współpracujących z PHP. Są to GD (GD2), Magick
Wand, Image Magick. Dzięki temu Twoje oprogramowanie staje się bardziej niezależne od usług
łej ASIDO _ WATERMARK _ SCALABLE _ FACTOR i hostingowych.
wynosi 0.25. • Obsługa grafiki w wielu formatach. Ich rodzaj zależy od użytej biblioteki, jednak wszystkie wspiera-
Asido umożliwia umieszczenie znaku wod- ją najpopularniejsze, czyli gif, jpeg i png.
nego w każdym z rogów obrazka oraz na je- • Klasa Asido wspiera projekt migracji oprogramowania do wersji piątej PHP o nazwie GoPHP5. Wią-
go osiach pionowej i poziomej. W tym ce- że się to z faktem, iż wersja czwarta straci niedługo wsparcie ze strony twórców języka. Choć bieżą-
ca wersja klasy współpracuje dobrze z najnowszą wersją tego języka, dopiero kolejna wersja Asido
lu powinieneś posłużyć się stałymi, których
ma w pełni wykorzystywać jego obiektowe możliwości.
nazwy są konstruowane analogicznie w sto- • Wykorzystanie licencji LGPL, która umożliwia włączenie Asido do zamkniętego oprogramowania.
sunku do tej przedstawionej powyżej. I tak,

www.phpsolmag.org 67
Narzędzia

pulować już istniejącą grafiką. W efekcie jed- jemy błędu w działaniu klasy. W celu uwzględ- prac. Wynika to z ambitnych planów za-
nak najlepiej jest samemu zadbać o odpowied- nieniu tego efektu możesz usunąć ten plik ręcz- wodowych autora. Z drugiej jednak strony, po-
nią kontrolę działania klasy. Możesz to zrobić nie, korzystając z funkcji delete($destination). mimo tego, że Asido znajduje się w zasadzie w
w sposób podobny do tego przedstawionego Pamiętaj, aby dokonać tego przed wywołaniem stanie rozwoju alpha, kod jest na tyle stabilny, że
na listingu drugim. metody $image->save().
Użyliśmy w nim operatora @ w celu wytłu-
mienia standardowych błędów zwracanych Przyszłość Asido
przez Asido. Zadbaliśmy za to sami o sprawdze- Twórca biblioteki Asido jasno określił ce-
nie, czy istnieją pliki, którymi będziemy chcieli le przyświecające przy rozwijaniu projek-
się posłużyć. W razie kłopotów rzucony będzie tu. Główny nacisk ma zostać położony na
standardowy wyjątek, który wyświetli jedynie poprawę obsługi błędów oraz rozszerzenie
stosowny komunikat. Nie jest to metoda ideal- listy obsługiwanych bibliotek graficznych.
na, ponieważ o ile wcześniej istniał plik, na któ- Niestety, pomimo tych ambitnych planów
ry wskazuje zmienna $destination, nie wykry- nie został wyznaczony żaden terminarz

W Sieci
• http://asido.info/ – strona domowa projektu Asido
• http://sourceforge.net/projects/asido/ – strona Asido na SourceForge
• http://www.opensource.org/licenses/lgpl-license.php – tekst licencji LGPL
• http://gophp5.org/ – strona projektu GoPHP5
Rysunek 3. Efekt pracy skryptu z listingu drugiego

Tabela 1. Spis najważniejszych metod klasy Asido. Metody oznaczone w opisie gwiazdką (*) mogą wymagać użycia hacka bądź drivera

Wywołanie metody Opis Dopuszczalne stałe / Uwagi


asido::watermark($image, Nanosi w określonym (przez pierwszą stałą) miejscu ASIDO _ WATERMARK _ TOP _ LEFT,
'watermark.png', ASIDO _ WATERMARK _ znak wodny; dokładny opis w artykule. ASIDO _ WATERMARK _ CENTER, ASIDO _
CENTER, ASIDO _ WATERMARK _ SCALABLE _ WATERMARK _ BOTTOM _ RIGHT, etc.
ENABLED);
asido::resize($image , 500, 500, Zmienia wymiary grafiki zachowując proporcje; dłuż- ASIDO_RESIZE_PROPORTIONAL, ASIDO_RESI-
ASIDO _ RESIZE _ PROPORTIONAL); szy bok będzie miał w tym przypadku 500px. ZE_STRETCH, ASIDO_RESIZE_FIT.
asido::width($image, 500); Zmienia proporcjonalnie wymiary grafiki; szerokość Tożsame z użyciem:
ustawia na 500px. asido::resize($image , 500, 0);
asido::height($image, 500); Zmienia proporcjonalnie wymiary grafiki; wysokość Tożsame z użyciem:
ustawia na 500px. asido::resize($image , 0, 500);
asido::stretch($image, 450, 550); Dokładnie dopasowuje grafikę do wskazanej szero- Tożsame z użyciem:
kości (450px) i wysokości (550px). asido::resize($image , 450, 550,
ASIDO _ RESIZE _ STRETCH);
asido::fit($image, 450, 550); Dopasowuje grafikę do zadanej szerokości (450px) i Tożsame z użyciem:
wysokości (550px) - jedynie gdy jest ona większa. W asido::resize($image , 450, 550,
przeciwnym razie nie wywołuje żadnego efektu. ASIDO _ RESIZE _ FIT);
asido::frame($image, 200, 300, asido:: Dopasuje grafikę metodą asido::fit() i automatycz- Trzy kolejne liczby w metodzie
color(0, 0, 0)); nie umieszcza ją na tle o zadanej szerokości (200px) i asido::color(0, 0, 0)
wysokości (300px), wypełnionego uprzednio zdekla- odpowiadają składowym koloru zapisanym w
rowanym kolorem. standardzie RGB.

asido::convert($image, 'image/gif'); Wymusza konwersję typu grafiki, niezależnie od roz- Drugi argument to typ MIME; dostępne stałe:
szerzenia wskazanego przy tworzeniu obiektu klasy ASIDO _ MIME _ JPEG, ASIDO _ MIME _ GIF,
Asido _ Image. ASIDO _ MIME _ PNG.

asido::crop($image, 0, 10, 200, 300); Wycina z grafiki obszar o zadanej szerokości (200px)
i wysokości (300px), którego lewy górny róg ma
współrzędne (0px, 10px).
asido::copy($image, 'copy.png', 15, Kopiuje na grafikę fragment wskazanego nazwą pli- Wskazany obraz musi mieć typ obsługiwany
15); ku obrazu (copy.png) umiejscawiając jego lewy gór- przez aktualnie używanego drivera.
ny róg w punkcie (15px, 15px).
asido::rotate($image, 30, asido:: (*) Obraca grafikę o zadany (30 stopni) kąt; tło zosta- Trzy kolejne liczby w metodzie
color(0, 0, 0)); je wypełnione wskazanym (asido::Color(0, 0, asido::color(0, 0, 0)
0)) kolorem. odpowiadają składowym koloru zapisanym w
standardzie RGB.
asido::flop($image); (*) Obraca lustrzanie grafikę w poziomie.
asido::fl ip($image); (*) Obraca lustrzanie grafikę w pionie.
asido::greyscale($image); (*) Zmienia kolorową grafikę na odcienie szarości.
asido::is _ format _ supported('image/ Sprawdza, czy dany typ MIME jest obsługiwany
gif') przez aktualnie używany driver.

68 03/2008
Asido

nie planuje on znacznych zmian w jego struktu- nak w najbliższym czasie. Niestety, różni- gim powodem jest, wspomniany już wcze-
rze. Warto jeszcze wspomnieć o jednej rzeczy ce pomiędzy poszczególnymi środowiska- śniej, napięty terminarz twórcy. W związku
– twórca rozważa dodanie do Asido funkcji mi graficznymi pod tym względem są spo- z tym, jak zapewnił autor Asido w korespon-
obsługujących napisy. Nie stanie się to jed- re, co wydłuża proces tworzenia kodu. Dru- dencji e-mailowej, nie odrzuci on żadnej po-
mocnej dłoni.
Drivery i hacki Podsumowanie
Główną siłą Asido jest to, że oferuje ono jedno wspólne API (ang. Application Programming In-
terface), niezależnie od środowiska, w jakim samo pracuje. Zostało to osiągnięte poprzez użycie Chociaż Asido z całą pewnością nie jest po-
tzw. driverów. Ich wybór determinuje pracę samej klasy, jednakże wyniki będą zawsze identycz- zbawione wad, wydaje się ono być na obec-
ne. Masz do wyboru szereg driverów: ną chwilę bardzo rozsądnym rozwiąza-
niem. Konkurencyjny pakiet PEAR o na-
• gd – używa GD; do jego użycia wymagane jest załadowane rozszerzenie php_gd.dll (gd.so),
zwie Image_Transform jest ciągle w fazie
co możesz sprawdzić używając funkcji phpinfo(),
• magick _ wand – używa ImageMagick MagickWand API; jest ono polecanym i jednocześnie produkcyjnej i nic nie wskazuje na to, aby
najczęściej stosowanym API tej biblioteki w PHP. Aby go użyć, powinieneś mieć załadowane stan ten miał w najbliższej przyszłości ulec
rozszerzenie php_magickwand.dll (magickwand.so), zmianie. Brak wyraźnej alternatywy, ale
• imagick _ ext – również używa ImageMagick; jest ono starszym API, jednak dalej można je przede wszystkim jednak prostota i wyjąt-
spotkać w paczce PHP. Wymaga rozszerzenia php_imagick.dll (imagick.so) kowa funkcjonalność Asido przemawiają
• imagick _ shell – kolejny driver używający ImageMagick; tym razem dostęp do biblioteki
odbywa się poprzez powłokę systemu (shell). znacząco za jej użyciem. Wybór należy do
Ciebie, ale pamiętaj, że czas poświęcony na
Ponieważ zdarza się, iż wyżej wymienione środowiska nie obsługują natywnie jakiejś operacji, po- zapoznanie się z tą klasą na pewno nie pój-
wstały drivery, które nazywa się hackami. Starają się one nadrobić takie braki, jednak choć oferu- dzie na marne!
ją pełną funkcjonalność, nie są tak szybkie jak rozwiązania dedykowane poszczególnym bibliote-
kom. Z tego względu, o ile nie jest to konieczne, staraj się ich unikać. W Asido możesz użyć nastę-
pujących hacków:
PRZEMYSŁAW BAŃKA
• gd _ hack – rozszerzenie drivera gd ; dodaje możliwość lustrzanego odbicia w pionie i pozio- Przemysław Bańka jest studentem fizyki kompute-
mie, a także zapis w odcieniach szarości, rowej na Uniwersytecie Jagiellońskim. Od dawna
• imagick _ ext _ hack – rozszerzenie drivera imagick _ ext; wprowadza możliwość decy- jest samoukiem, którego pasją jest tworzenie stron
dowania o kolorze tła przy obrocie grafiki o kąt inny niż wielokrotność kąta prostego,
WWW opartych o PHP. Dlatego pragnie dzielić się z
• imagick _ shell _ hack – rozszerzenie drivera imagick _ shell o tej samej funkcjonalno-
ści co powyżej wymieniona. innymi swoją wiedzą i zainteresowaniami.
Kontakt z autorem: przemek.banka@gmail.com

Listing 1. Pierwszy kontakt z Asido

<?php

include('class.asido.php'); // dołączenie klasy


asido::driver('gd'); // wskazanie, której biblioteki graficznej chcemy użyć
$image = asido::image('zrodlo.jpg','nazwa_pliku_wynikowego.png'); // stworzenie obrazu, którym będziemy manipulować
asido::rotate($image, 90); // obrót obrazu o 90 stopni zgodnie z ruchem wskazówek zegara
asido::watermark($image, 'znak_wodny.png'); // dodanie znaku wodnego
$image->save(ASIDO_OVERWRITE_ENABLED); // zapis obrazu z poleceniem nadpisania, o ile byłoby to konieczne?>

Listing 2. Własna obsługa błędów w Asido


<?php
include('class.asido.php'); // dołączenie klasy

asido::driver('gd'); // wskazanie, której biblioteki graficznej chcemy użyć

$source = 'example.png';
$destination = 'temp/result.jpg';
$watermark = 'znak_wodny.png';
try {
if ( !is_readable($source)) throw new Exception('Brak dostępu do pliku źródłowego!');
if ( !is_readable($watermark) ) throw new Exception('Brak dostępu do pliku znaku wodnego!');
$image = @asido::image($source, $destination); // stworzenie obrazu, którym będziemy manipulować
asido::rotate($image, 45, asido::color(0,255,0)); // obrót obrazu o 45 stopni, tło zielone
asido::watermark($image, $watermark, ASIDO_WATERMARK_TOP_LEFT); // dodanie znaku wodnego w gornym lewym rogu
asido::grayscale($image); // zmiana kolorów na odcienie szarości
asido::convert($image, ASIDO_MIME_PNG); // rozmyśliliśmy się i chcemy, aby rezultat zapisano jako plik png zamiast jpg
@$image->save(ASIDO_OVERWRITE_ENABLED); // zapis obrazu z poleceniem nadpisania, o ile byłoby to konieczne
if( !file_exists($destination) ) throw new Exception('Operacja zakończyła się niepowodzeniem!');}
catch (Exception $e) {
echo 'Wystąpił nieoczekiwany błąd: '.$e->getmessage();}?>

www.phpsolmag.org 69
Testy konsumenckie

Testy konsumenckie
Szablony stron WWW

W najnowszych testach konsumenckich prezentujemy trzy firmy: bbSoft


WebDesign, szablon24.pl i RevolWeb wraz z opiniami ich klientów.
Tematem przewodnim jest tym razem tworzenie szablonów stron WWW.
mieszczeń biurowych, kamienic, biur oraz oczysz- efekty codziennej pracy bbSoft i z pełną odpowie-
czania pomieszczeń po remontach budowlanych. dzialnością polecam ich jako rzetelną firmę. Z pew-
Strona internetowa jest ważnym elementem w nością sprosta ona wielu ambitnym zadaniom i bę-
strategii marketingowej naszej firmy. Rozpoczyna- dzie w stanie spełnić oczekiwania najbardziej wy-
jąc działalność gospodarczą wiedzieliśmy, że pro- magających korporacji. Pracownicy bbSoft to oso-
fesjonalna, trafiająca do odbiorcy strona interneto- by energiczne, komunikatywne i łatwo nawiązują-
wa będzie najlepszą reklamą Caribu Group. Przy- ce kontakty interpersonalne. Znakomicie potrafią
jęliśmy podejście minimalistyczne. Zależało nam się dostosować do zaproponowanych rozwiązań i
na tym, by strona była czysta, klarowna i przejrzy- pracami nad serwisem. Sumienność, duże zaanga-
sta – miała być przecież wizytówką naszej firmy żowanie i praca nad usługą (systematycznie, a jed-
– firmy sprzątającej. Tak też się stało. Poszukiwa- nocześnie dokładnie) = 100% satysfakcji klienta,
nia firmy, która wykonałaby taką witrynę dopro- w tym wypadku Caribu Group – Cleaning. Cały
wadziły nas do bbSoft. Na spotkaniu z przedstawi- system sprawnie funkcjonuje już od ponad 6 mie-
cielem bbSoft poznaliśmy szczegóły oferty tworze- sięcy. Cieszy nas możliwość dodawania własnych
nia serwisów internetowych dla firm. Po przesłaniu podstron, referencji, szybki dostęp do panelu ob-
wszystkich niezbędnych informacji dotyczących sługi strony internetowej, a także możliwość posia-
Patryk Wolanowski - Quinault naszej witryny, konsultacjach z bbSoft co do treści dania 3 bezpłatnych kont pocztowych.
– strona została wykonana w błyskawicznym tem- W przyszłości planujemy poszerzać wachlarz
Caribu Group – Cleaning pie. Jesteśmy zadowoleni z usług bbSoft, ogrom- naszych usług, mając obok siebie pewnego part-
nym plusem jest roczny darmowy hosting, świetny nera, jakim jest bbSoft już dziś wiemy, że kolejne

F
irma Caribu Group-Cleaning powstała na kontakt, doradztwo oraz 24h pomoc techniczna. etapy prac nad naszą witryną powierzymy profe-
początku 2007 roku. Świadczymy usługi Jako osoba bezpośrednio odpowiedzialna za przed- sjonalistom.
Ocena: 
w zakresie kompleksowego sprzątania po- sięwzięcie miałem okazję na bieżąco obserwować

szampony oraz płyny hamulcowe. W obecnej for- współpraca przebiegała wzorowo, a przedstawione
mie istnieje już od 1996 r. z siedzibą w Skorogosz- nam rozwiązania spełniały nasze wszystkie oczeki-
czy. Produkty naszej firmy można znaleźć na tere- wania. Uzyskaliśmy dostęp do ponad 200 projek-
nie całego kraju oraz w państwach Unii Europej- tów stron WWW, które mogliśmy zmieniać wedle
skiej. Przez ostanie kilka miesięcy wprowadziliśmy własnych potrzeb, a wszystkie nasze propozycje by-
na rynek kilka nowych produktów, miedzy inny- ły wprowadzane w ciągu kilku godzin. Podczas pro-
mi: płyn do chłodnic Glidex Plus, płyn hamulcowy jektowania naszej strony na bieżąco mogliśmy mo-
DOT 4, szampon samochodowy oraz płyn do my- nitorować postęp prac. Pracownicy bbSoft udzie-
cia silników i narzędzi. Po przystąpieniu Polski do lali nam wszelkich informacji dotyczących projek-
Unii Europejskiej pozyskaliśmy nowych klientów, tu oraz doradzali nam we wszystkich etapach bu-
do których trafia cześć naszych produktów. dowy nowej witryny. Prace nad stroną zostały za-
Aby sprostać wyzwaniom nowopowstałego kończone w określonym wcześniej terminie, a fir-
rynku zbytu, postanowiliśmy przebudować na- ma bbSoft udzieliła nam gwarancji na naszą stronę
szą stronę internetową, umieścić nowe produkty oraz umożliwiła bezpłatne wnoszenie poprawek
oraz wzbogacić o nowe wersje językowe. Do firmy przez pierwsze 3 miesiące. Od momentu ukaza-
bbSoft trafiliśmy poprzez wyszukiwarkę interneto- nia się strony w wynikach wyszukiwarek interne-
Stanisław Marciniak wą, gdzie z kilku ofert, jakie udało nam się zebrać towych, nasza firma odnotowała znaczny wzrost
oferta firmy bbSoft wydała nam się najbardziej zainteresowania oferowanymi produktami, co za-
Chemia-Bomar atrakcyjna. Po pierwszym spotkaniu z przedstawi- owocowało zwiększoną sprzedażą. Obecnie prze-
cielem firmy uznaliśmy, że nasz wybór był słuszny. projektowanie naszej strony zakończyło się pełnym

F
irma Chemia-Bomar zajmuje się produk- Na spotkaniu przedstawiono nam profesjonalną sukcesem, a korzyści wynikające ze zmiany są nie
cją akcesoriów samochodowych takich jak ofertę wykonania nowej strony internetowej, usta- do ocenienia.
Ocena: 
płyny do chłodnic, płyny do spryskiwaczy, liliśmy również wszystkie warunki. Od początku

70 03/2008
Szablony stron WWW

munikacyjnych, a w szczególności projektowa- Firma bbSoft WebDesign zaproponowała bar-


nia, kosztorysowania i budowy sieci telekomu- dzo krótki termin realizacji przedsięwzięcia. Kon-
nikacyjnych światłowodowych oraz moderni- takt z firmą podczas trwania realizacji zlecenia na-
zacji istniejących sieci przewodowych. wiązywaliśmy wyłącznie za pomocą poczty elek-
Oferujemy również sprzedaż, montaż oraz tronicznej oraz telefonu, co pozwoliło na zaosz-
uruchomienie nowoczesnych systemów teleko- czędzenie czasu. Firma bbSoft WebDesign może
munikacyjnych (central telef. systemów przewo- poszczycić się profesjonalnym doradztwem oraz
dowych, bezprzewodowych itp.), wraz z obsługą indywidualnym podejściem do każdego klienta,
gwarancyjną i pogwarancyjną. Najliczniejszą gru- dzięki temu otrzymaliśmy dokładnie to, co chcie-
pę naszych usługobiorców stanowią małe i średnie liśmy. Ponadto właściciel firmy Pan Zbigniew Tra-
przedsiębiorstwa oraz indywidualni użytkownicy. wiński stwarza przemiłą atmosferę, pomimo nie-
Do niedawna reklama i informacje dotyczące ustannego nękania pytaniami ze strony naszych
naszej działalności rozpowszechniana była w for- pracowników . bbSoft to firma godna polecenia,
mie tradycyjnej (katalogi, ulotki, plakaty itp.). Idąc ze 100% odpowiedzialnością możemy to potwier-
jednak z postępem czasu i wychodząc naprzeciw dzić. Zasługuje na ocenę 5 gwiazdek.
potencjalnym klientom, poszukującym usług oraz Strona internetowa natomiast znacznie po-
Zygmunt Boczar produktów w Internecie, niezbędne stało się dla szerzyła nasze kontakty biznesowe, co przełoży-
nas posiadanie własnej strony internetowej. ło się oczywiście na zwiększenie obrotów firmy.
Telesystem s.c. WROCŁAW
Po wielu kontaktach z różnymi firmami zaj- Dała nam również możliwość zaprezentowa-
mującymi się tworzeniem stron, trafiliśmy na nia naszych produktów i usług odbiorcom z ca-

T
elesystem s.c. WROCŁAW od 1989 r. firmę bbSoft WebDesign, która od samego po- łego świata.
prowadzi działalność w zakresie świad- czątku w sposób bardzo profesjonalny zapre-
Ocena: 
czenia kompleksowych usług teleko- zentowała swoje usługi.

wej porady przed ostatecznym podjęciem decyzji. alizacji klient może skorzystać z szeregu do-
Spotkania osobiste nie są jednak konieczne. datkowych, nieodpłatnych usług, które no-
Obsługujemy firmy z całej Polski oraz kra- ta bene są bardzo istotnym elementem cało-
jów Unii Europejskiej. Kontaktujemy się z ni- ści. Klient otrzymuje usługę hostingu wraz
mi głównie telefonicznie lub za pośrednictwem z kontami poczty elektronicznej, pośred-
poczty elektronicznej. W dzisiejszych czasach nictwo w żmudnych formalnościach zwią-
posiadanie strony internetowej nie jest już luksu- zanych z rejestracją domeny oraz zgłoszenie
sem. Każda firma powinna posiadać własny ser- wykonanego serwisu do 5 najpopularniej-
wis, bez względu na to czy jest to typowa strona szych polskich wyszukiwarek internetowych
informacyjna opisująca własne produkty bądź oraz około 200 katalogów i wyszukiwarek za-
usługi, czy też rozbudowany serwis z możliwo- granicznych.
ścią przeglądania szczegółowej oferty, składania Ważnym elementem współczesnego serwisu
zamówień, a nawet możliwością płatności karta- internetowego jest zgodność ze standardami sie-
mi kredytowymi bądź przelewami Online. ciowymi W3C. Wiele stron WWW nie spełnia
Wychodząc naprzeciw oczekiwaniom naszych tych standardów, przez co wyświetlane są nie-
Ustosunkowanie przyszłych klientów, zawsze przed podjęciem osta- poprawnie w niektórych przeglądarkach inter-
Zbigniew Trawiński
tecznych decyzji, przygotowywana jest szczegóło- netowych oraz są źle indeksowane przez wyszu-
właściciel bbSoft WebDesign, http://www.bbsoft.pl
wa oferta realizacyjna, zawierająca pełny plan wy- kiwarki internetowe. Jest to istotne zwłaszcza w
konania, wymagane systemy skryptowe oraz kosz- przypadku serwisów wykonanych w kilku wer-

F
irma bbSoft WebDesign istnieje na rynku torys wraz z przewidywanym terminem realizacji. sjach językowych.
internetowym od 2004 roku. Świadczymy Poprzez takie podejście do klienta, stwarzamy po- Z punktu widzenia klienta, posiadanie ser-
usługi głównie w zakresie projektowania czucie bezpieczeństwa; klient otrzymuje pełen za- wisu spełniającego standard W3C to: popraw-
i wykonywania stron internetowych, w tym roz- kres informacji bez zbędnego ryzyka i zobowiązań ność składni programistycznej i poprawne wy-
budowanych serwisów branżowych z bazami pro- przed podjęciem decyzji. Po zawarciu umowy re- świetlanie się strony w najpopularniejszych
duktowymi oraz dodatkowymi usługami typu re- alizacyjnej klient koncentruje się jedynie na przy- przeglądarkach internetowych oraz poprawna
jestracja domen oraz usługami hostingu. Każdy z gotowaniu materiałów tekstowych oraz zdjęć, któ- interpretacja zawartości serwisu przez robo-
klientów, który zwróci się do nas, zostaje dokład- re będą zamieszczone na poszczególnych stronach ty indeksujące – co ma bezpośredni wpływ na
nie wysłuchany; oceniamy wymagania i oczekiwa- serwisu. Dodatkowym elementem serwisu może pozycję w wynikach i ilość potencjalnych klien-
nia dotyczące przyszłej realizacji. Na podstawie za- być zestaw systemów skryptowych takich jak: sys- tów, którzy mogą trafić do takiej firmy.
branych informacji zostaje sporządzona oferta re- tem do samodzielnej edycji stron bez znajomo- Na przełomie kilku ostatnich lat odnotowu-
alizacyjna z pełnym kosztorysem; zazwyczaj rów- ści technik programowania, systemy formularzy jemy ciągły wzrost zainteresowania stronami
nież świadczymy doradztwo informatyczne, pro- bądź zapytań ofertowych, forum, system newsów, internetowymi. Każda firma chce zaistnieć w
ponujemy pewne i sprawdzone rozwiązania in- newsletter, kalkulatory wyceny, system prezentacji sieci, która jest ogromnym medium pozwala-
formatyczne, tak aby przyszła realizacja serwisu produktów w formie galerii zdjęć itp. jącym trafić do potencjalnych odbiorców przez
WWW przebiegała płynnie i bez zakłóceń, jedno- W zasadzie nie ma szczególnych ograni- 24 godziny na dobę oraz stwarza nieograniczo-
cześnie aby spełniała ustalone standardy sieciowe. czeń co do tego, co powinna zawierać stro- ne możliwości zaprezentowania własnych pro-
W późniejszej fazie zawsze istnieje możliwość spo- na internetowa. Serwis może być wieloję- duktów bądź usług. Przyjęło się mówić, iż jeśli
tkania się z konsultantem i omówienia szczegółów zyczny – możemy go przetłumaczyć na po- nie można znaleźć czegoś w internecie oznacza
realizacyjnych osobiście oraz zaczerpnięcia facho- nad 40 języków świata. Na zakończenie re- to, że to nie istnieje...

www.phpsolmag.org 71
Testy konsumenckie

ku układała się bardzo dobrze. Nigdy nie by- Po wstępnym opisie tego, co bym chciał poka-
ło żadnych konfliktów, a problemy jakie nie- zano mi kilka szablonów zbliżonych do mo-
jednokrotnie nas spotykały, udawało nam ich wyobrażeń. Spodobał mi się jeden z pro-
się szybko i bezboleśnie rozwiązać. Jestem jektów, ale zażyczyłem sobie kilku zmian
zdania, że najważniejszym aspektem dobrej – koloru tła, położenia menu i boksów oraz
współpracy jest zdolność skutecznego poro- kilku mniejszych szczegółów. Nie było z
zumiewania się – czego Piotrowi można tyl- tym żadnego problemu. Piotrek raz na kil-
ko pozazdrościć. ka dni przesyłał mi obrazek z moją stroną po
Myślę, że można teraz przejść do konkre- zleconych wcześniej poprawkach, a ja żąda-
tów. Mój wybór padł na Revolweb, jak moż- łem następnych. Takich sesji poprawkowych
na się łatwo domyślić, ze względu na nasze nad moją stroną było kilka – w końcu osta-
dobre relacje, ale nie tylko. Samo dogady- tecznie zdecydowałem, że to jest to i Piotrek
Mariusz Barczyk
wanie się nie wystarczy do efektywnej pra- pociął grafikę do kodu HTML. Otrzymałem
IntegraDesign cy, co najwyżej do wspólnego wypadu na pi- wiec gotowy szablon HTML strony (a wła-
wo. Oferta, jaką przedstawiła mi firma była ściwie kilka jego wersji, o różnym układzie
po prostu atrakcyjna, ale o tym za moment. boksów) gotowy do wklejania treści. Jestem
Miałem nie lada problem ze znalezieniem bardzo zadowolony, szczególnie że cena te-

W
itam, nazywam się Mariusz Bar- kogoś, kto wykonałby dla mnie szablon mo- go projektu nie była wysoka. Proszę zoba-
czyk i pracuję w firmie Integra- jej strony. Podejrzewam, że było to spowodo- czyć finalne dzieło: www.integradesign.org
Design. Osobiście zajmuję się wane tym, że nie do końca sam wiedziałem Chyląc się ku końcowi, chciałbym dodać,
programowaniem w językach sieciowych, czego chcę, a jednocześnie wiedziałem, że że to na pewno nie był nasz ostatni wspólny
głównie w PHP. Zacznę może trochę para- musi być to coś wyjątkowego. projekt. Raczej nie będę szukał alternatywy
doksalnie od mojej wady, gdyż jest ona bar- Konkurencja po prostu nie trafiała w mo- dla tej firmy, stosując analogie do piłkarskie-
dzo ważnym elementem mojej współpracy z je gusta. Przyznam, że nie jestem łatwym go powiedzenia zwycięskiego składu się nie
firmą RevolWeb i znajomości z Piotrem Sa- klientem, bo z jednej strony nie potrafię so- zmienia. Trochę to wszystko brzmi jak same
dowskim. Mam na myśli tutaj mój komplet- bie wyobrazić jak miałby wyglądać gotowy ochy i achy, ale na moje szczęście to szczera
ny brak wyobraźni, nazwijmy to graficznej. produkt, a z drugiej wymagam czegoś kon- prawda. Spotkanie z Revolweb oceniam na
Z pomocą przyszedł mi właśnie Piotr, któ- kretnego (stylu, podejścia) co jest trudne do 5 gwiazdek.
rego poznałem przy okazji tworzenia jed- opisania słowami, przez co sporo projektów Pozdrawiam, Mariusz Barczyk.
nego z projektów społecznościowych. Moja odpadało. Bardzo spodobało mi się podej-
Ocena: 
współpraca z Revolweb od samego począt- ście firmy Revolweb do mojego zamówienia.

szych potraw, a wiadomo że bardzo pomoc- zytówką restauracji KONKRET pod adre-
na w takim rodzaju usług jest komunikacja sem www.konkretniezjesz.pl (zapraszam!).
z klientami – m.in. strona internetowa – w Pozostaje mi jeszcze dopracować treść, opi-
dzisiejszych czasach chyba nawet ważniejsza sy menu i inne szczegóły.
niż telefon. Specjalistą w HTML-u nie jestem, więc
Mam wykształcenie informatyczne, podczas pracy nad szablonem kontaktowa-
więc potrafię stworzyć stronę internetową łem się kilka razy z RevolWeb z pytaniami
– potrzebowałem jednak grafiki i projek- technicznymi dotyczącymi ułożenia treści.
tu HTML. Pomoc była szybka i bezproblemowa – i to
Niestety nie mam również doświadcze- już po dokonaniu płatności!
nia w tematach użyteczności i marketingu, Dodatkowo bezpłatnie obiecano mi po-
a chciałem, żeby po wejściu na moją stronę móc we wstępnej promocji strony w Inter-
klient prawie automatycznie zamawiał piz- necie.
zę lub inne danie. Z takimi firmami jak RevolWeb warto
Muszę przyznać, że zaoszczędziłem sporą współpracować. Z samego szablonu (czy-
kwotę zamawiając tylko chwytającą klientów li tego, co w Revolweb zamówiłem) jestem
grafikę oraz szablon i samodzielnie składa- bardzo zadowolony – jest dokładnie taki, ja-
Piotr Mazur jąc resztę witryny. ki powinien być.
Firmę RevolWeb znalazłem przez wyszu- Obsługa dotycząca mojego zlecenia w fir-
Pizzeria Konkret
kiwarkę – zajrzałem na ich stronę i spodoba- mie RevolWeb była bardzo dobra, bez żad-
ły mi się zamieszczone tam projekty. nych zastrzeżeń. Gdybym miał ponownie

P
izzeria Konkret to nowa restauracja Skontaktowałem się z przedstawicielem i zwrócić się z jakimś zamówieniem do spe-
w Jeleniej Górze, ulokowana przy opisałem dokładnie moje zamówienie – no- cjalistów od stron internetowych (lub pro-
głównej arterii miasta. Jako punkt ga- woczesny i kolorowy szablon graficzny stro- jektów graficznych, bo projektują tam rów-
stronomiczny w takim miejscu mamy sporą ny restauracji. Po kilku dniach otrzymałem nież ulotki, wizytówki, plakaty itp. – wiem,
konkurencję, więc aby się przebić serwujemy dwa projekty, z których wybrałem moim że teraz im robię reklamę, ale należy im
konkretne, sprawdzone dania (co nie zna- zdaniem ładniejszy. się!), to na 100% zadzwoniłbym do Revol-
czy, że jest ich mało), które można zdalnie Po dokonaniu poprawek i po kilku dniach Web. Bezapelacyjnie pięć gwiazdek na pięć
zamawiać do domu. potrzebnych na przeróbkę grafiki do doku- możliwych.
Założyliśmy, że większość zysków będzie mentu HTML – dostałem szablon WWW,
Ocena: 
pochodziła właśnie z usługi dowożenia na- który już niedługo będzie w Internecie wi-

72 03/2008
Szablony stron WWW

wy takiego serwisu, przedstawionymi przez róże witryny, a tym samym zachęci ich do korzystania
firmy webmasterskie, zdecydowaliśmy się złożyć z naszych usług. Następnie przyszła kolej na opra-
zamówienie w firmie Revolweb. cowanie i stworzenie systemu, dzięki któremu
Firmę polecił nam nasz znajomy, który zamówił możemy teraz samodzielnie zarządzać ofertami
w firmie Piotra Sadowskiego projekt graficzny stro- na stronie. Tutaj również otrzymaliśmy fachową
ny, i był z niego bardzo zadowolony. pomoc dotyczącą wyboru funkcji i cech, które te-
Na skorzystanie z usług firmy Revolweb zde- raz posiada ów system – dzięki temu administra-
cydowaliśmy się ze względu na kilka ważnych dla cja jest łatwa i szybka, nawet dla laika. Po stworze-
nas cech współpracy: firma (z pomocą firm part- niu systemu, strona zaistniała w Internecie – za-
nerskich) zobowiązała się do zadbania o wszystkie praszamy na: www.matan.com.pl. Strona stworzo-
etapy konstrukcji i wdrożenia witryny: stworzenie na dla nas przez Revolweb spełnia wszystkie wy-
wyglądu strony, stworzenie systemu administra- magania, jakie przed nią stawiamy – jest łatwa w
cyjnego obsługi online, obsługę domen, maili, ho- obsłudze, przejrzysta i zawiera cechy ułatwiają-
sting i promocję (pozycjonowanie). Taki komplek- ce wyszukiwanie ofert. Dzięki stworzeniu witry-
sowy pakiet usług jest automatycznie tańszy, co ny udało nam się zdobyć nowych partnerów oraz
Katarzyna Hurko ograniczyło dodatkowe koszta mojej firmy, zwią- znacznie rozszerzyć grono dotychczasowych klien-
zane z utrzymaniem strony internetowej. Ponad- tów korzystających z naszych usług.
MATAN Nieruchomości
to wszelkie zmiany i poprawki konsultowaliśmy z Uważam, że firma Revolweb Piotra Sadow-
jedną, bardzo kompetentną osobą, która była od- skiego wywiązała się w pełni ze swojego zada-

M
am przyjemność przedstawić Państwu powiedzialna tylko za witrynę MATAN. W związ- nia. Konsultacje, projektowanie i prace prze-
witrynę mojej firmy, która znajduje się ku z tym kontakt był rzeczowy i bardzo produk- biegały bardzo sprawnie – nietrudno zauwa-
pod adresem www.matan.com.pl. tywny. Drugim ważnym elementem była moż- żyć duże doświadczenie i profesjonalizm osób
MATAN Nieruchomości jest relatywnie młodą, liwość wyboru wyglądu witryny spośród kilku pracujących w tej firmie. Bardzo podoba mi się
szybko rozwijającą się agencją nieruchomości dzia- przedstawionych projektów i gwarantowana moż- również sposób współpracy, podczas spotkań
łającą na terenie Wrocławia i miejscowości przyle- liwość nielimitowanej ilości poprawek, nawet po dzięki pełnej organizacji nie umknął nam ża-
gających. Rynek nieruchomości jest bardzo aktyw- zamknięciu etapu projektowania witryny. den ważny szczegół dotyczący projektu.
ny i dynamiczny – ze względu na to, jak również Już kilka dni po podpisaniu umowy, przedsta- Firma Revolweb zjednała sobie naszą sympatię
dlatego, że nasza agencja potrzebuje ciągłego roz- wiono nam wstępne projekty strony MATAN. i zaufanie. Z całą pewnością mogę powiedzieć, że
woju – zdecydowaliśmy się na stworzenie firmo- Wybraliśmy jeden z nich, z pewnymi zastrzeże- realizację kolejnej witryny zleciłbym firmie Revol-
wej witryny internetowej, będącej jednoczenie ka- niami poprawek, które zostały zrealizowane bez web. Firmie Revolweb daję pięć gwiazdek.
talogiem wprowadzanych przez nas na rynek ofert żadnego problemu. Zdecydowaliśmy także, że za-
nieruchomości, dostępnych dla każdego. Po wstęp- mieścimy animowaną, interaktywną mapkę Wro-
Ocena: 
nym zapoznaniu się z ofertami dotyczącymi budo- cławia, co ułatwi klientom korzystanie z naszej

niekonwencjonalnym, także tym wymagają- od nas oczekuje – dzięki temu minimalizu-


cym współpracy z wieloma innymi firmami i jemy ilość późniejszych poprawek, zmniejsza-
organizacjami. my całkowity czas trwania produkcji, zwięk-
Nasza firma jest relatywnie młoda, ale ma- szamy zadowolenie zleceniodawcy, a nasze ce-
my spore doświadczenie – każda osoba pra- ny są atrakcyjne.
cująca w RevolWeb ma za sobą co najmniej Kontakt z klientem bardzo ułatwia także de-
kilka lat wykonywania różnych zadań w swo- dykowanie jednej osoby z RevolWeb do prowa-
jej branży, każda prezentuje sobą pewną wie- dzenia jednego i tylko jednego projektu. Bran-
dzę i autorytet. To właśnie suma naszych do- ża, w której działamy, pozwala nam zetknąć
świadczeń dała nam możliwość opracowa- się z bardzo różnorodnymi klientami. Często
nia oryginalnej i skutecznej ścieżki prowadze- jest tak, że musimy się wiele nauczyć, zanim
nia zleceniodawcy od momentu pierwsze- zasiądziemy do pracy. Przykładowo zaprojek-
go kontaktu do zakończenia projektu (a na- towanie użytecznej, zarówno dla zleceniodaw-
wet dalej). cy, jak i dla gości serwisu, w funkcjonalności
Podstawą naszej filozofii kontaktu z klien- strony www.matan.com.pl, wymagało dokład-
tem jest świadomość tego, że zwykle klient nego zapoznania się z dość specyficzną usłu-
doskonale wie, czego chce – często jednak gą na rynku, jaką jest handel nieruchomościa-
Ustosunkowanie
ma kłopoty z wyrażeniem swoich życzeń i su- mi. Pani Katarzyna Hurko bardzo nam pomo-
Piotr Sadowski
RevolWeb gestii, nie znając terminologii ani fachowych gła w stworzeniu tej witryny poprzez precyzyj-
określeń. Naszym zadaniem, na każdym eta- ne uwagi i sugestie, jakich nam udzielała pod-
pie współpracy, jest jak najbardziej ułatwić czas projektowania serwisu. Zresztą nadal pra-

R
evolWeb to firma zajmująca się pro- zleceniodawcy opis swojego zamówienia. cujemy nad szczegółami strony agencji nieru-
jektowaniem witryn internetowych, Opracowaliśmy więc różne wersje specjal- chomości pani Hurko – okazuje się bowiem,
szablonów stron, systemów admini- nych ankiet i formularzy (ciągle udoskonala- że wiele niedociągnięć wychodzi w praniu,
stracji, wszelkiej grafiki na potrzeby internetu nych), które wyłapują gust i zapotrzebowanie czyli w fazie użytkowania serwisu. Takich po-
oraz różnego rodzaju publikacji. Oferujemy klienta. Analiza wyników tych formularzy, a prawek nie jest dużo i są one drobne, ale uwa-
także szereg pokrewnych usług, jak hosting także jak najbardziej dokładne poznanie spe- żamy je za ważne.
lub pozycjonowanie. Z przyjemnością stawia- cyfiki branży klienta, pozwala nam z dużym Podczas współpracy z Panem Mariuszem
my również czoła wyzwaniom i zamówieniom przybliżeniem projektować to, czego Klient Barczykiem reprezentującym IntegraDesign,

www.phpsolmag.org 73
Testy konsumenckie

mieliśmy spore ułatwienie. Pan Barczyk bo- Konkretniezjesz.pl było dla nas wyzwaniem można duże zadowolenie, co nas – pracowni-
wiem posiadał już stronę swojej firmy przed – należało połączyć styl nawiązujący do przy- ków Revolweb – bardzo cieszy. Da się zauwa-
współpracą z nami i doskonale wiedział, cze- jemnych zapachów i smaków serwowanych żyć, że nasz sposób postępowania i współpra-
go jej brakuje – co uzupełnić, co zmienić, a przez restaurację dań, z nowoczesną formą cy ze zleceniodawcami daje oczekiwane re-
co usunąć. Stworzony przez nas od nowa sza- strony WWW. Postawiliśmy na obrazy i ilu- zultaty. Jednak zdajemy sobie sprawę, że stać
blon strony www.integradesign.org, w efek- stracje. Obie zaprezentowane przez nas pro- nas na więcej – rynek witryn internetowych
cie jest bardzo dobrze dopasowany do po- pozycje szablonów spotkały się z uznaniem, oraz grafiki internetowej jest potężny (i stale
trzeb gości strony, jednocześnie zachowuje a Pan Piotr Mazur wahał się jedynie pomię- rośnie), ale konkurencja nie śpi. Staramy się
bardzo atrakcyjną formę, na czym także za- dzy jedną, a drugą propozycją wyglądu. Osta- uzyskać u klientów zaufanie i poczucie do-
leżało naszemu klientowi. Współpraca z In- tecznie wybrany szablon nie był poddawany brze wykonanej roboty, po zakończeniu i od-
tegraDesign nie skończyła się na jednym pro- prawie żadnym poprawkom, co pozwoliło za- daniu projektu.
jekcie – okazało się, że doskonale wychodzi kończyć projekt grafiki bardzo szybko. Aktu- Z pewnością, w przyszłości dokonamy jesz-
współpraca Revolweb oraz Integradesign alnie szablon www.konkretniezjesz.pl jest wy- cze wielu zmian i poprawek naszej ścieżki pro-
przy wspólnym projektowaniu witryn i sys- pełniany treścią – prawdopodobnie w chwi- wadzenia zleceń, która jak sądzimy, jest w du-
temów administracyjnych, co z pewnością li publikacji tego artykułu będzie online. W żej mierze odpowiedzialna za sprawną realiza-
w przyszłości zaowocuje wieloma wspólny- opublikowanych na łamach PHP Solutions cję powierzanych zadań.
mi projektami. wypowiedziach naszych klientów, odczuć

granicami. Długoletnia współpraca z podwyko- nie lub dostosowanie do konkretnego systemu


nawcami, producentami, a także mediami pozwo- CMS, jednakże dzięki niskiemu kosztowi grafiki,
liła nam nawiązać szerokie kontakty (także mię- i tak jesteśmy w stanie zaoferować klientowi bar-
dzynarodowe), dzięki którym nasze usługi zyskały dzo dobrą cenę końcową. Moją uwagę na Szablo-
na jakości, a ceny pozostały wciąż atrakcyjne. n24.pl przyciągnęły przede wszystkim korzystne
Nasza agencja reklamowa od dawna poszu- stawki cenowe, logiczny układ oraz ciekawa szata
kiwała partnera, który w szybki i pewny sposób graficzna. Również profesjonalne i indywidualne
dostarczyłby nam profesjonalnej grafikę na stro- podejście do klienta, pozwoliło mi nabrać dużego
Tomasz Miś
ny internetowe naszych klientów. Dzisiaj, kiedy zaufania do zespołu Szablon24.pl.
tak dużo zdolnych projektantów graficznych wy- Na minus zapisałbym brak możliwości płace-
http://easolution.pl jechało za granicę, zdobycie dobrego projektu gra- nia za pomocą standardowych przelewów ban-
ficznego w dobrej cenie jest bardzo trudne. Sza- kowych. Na plus błyskawiczną realizację zlecenia

A
gencja easolution z główną siedzibą w blon24.pl razem ze zbiorem ponad 5000 szablo- – praktycznie w przeciągu 10 minut otrzymałem
Rzeszowie działa na rynku interneto- nów w całym szeregu kategorii, typów i stylów da- szablon złożony z plików źródłowych w formacie
wym od 2002 roku. Oferujemy przede je nam ogromne możliwości realizowania projek- plików Adobe Photoshop (psd) oraz Macrome-
wszystkim przeprowadzanie profesjonalnych tów graficznych dla naszych klientów. Cena sza- dia Flash (fla). Kilkakrotnie korzystałem z szablo-
kampanii reklamowych w sieci internetowej, pro- blonów jest również bardzo atrakcyjna. Za goto- nów umieszczonych na Szablon24.pl i na pewno
mocji nowych produktów, nowej marki firmy , czy wy wzór szablonu zwykłej lub wykonanej w tech- nasza współpraca będzie dalej trwać. Serwis oce-
zmianę strategii przedsiębiorstwa. Od ponad 5 lat nologii Flash strony WWW nie zapłacimy wię- niam na 5.
grono naszych klientów ciągle się powiększa. Wy- cej niż 170 złotych. Oczywiście dochodzą potem
Ocena: 
konaliśmy ponad 180 profesjonalnych serwisów i koszty adaptacji projektu do potrzeb klienta – do-
kampanii reklamowych na terenie Polski i poza jej danie logotypu, zmiana tekstów i zdjęć na stro-

dą zmianę dokonywaną na stronie. Nie by- niach ekspertów szablon24.pl w zakresie in-
ły to duże pieniądze, ale było to dla nas bar- ternetu, użyteczności, dostarczanych roz-
dzo uciążliwe. W końcu mieliśmy napraw- wiązań. Są one zawsze użytkowo nienaganne
dę dosyć. Każdy kto ma dziś stronę funkcjo- i nie sprawiają trudności w obsłudze.
nalną, łatwą w użyciu, z szerokim wachla- Dla nas jako fundacji ważna jest również
rzem możliwości, stał kiedyś przed dylema- cena, która przy jakości produktu jest bar-
tem: kogo wybrać, kto spełni moje oczekiwa- dzo przystępna.
na, która firma będzie moim partnerem na Z całą pewnością będziemy dalej polegali
długi czas. na firmie szablon24.pl. Jest to jedynie moja
Kiedy spotkałem się z reprezentantami opinia, ale jestem pewien, że podobnej opi-
Jose Antonio Contreras Nieves szablon24.pl, wiedziałem od razu, że mi do- nii są zaprzyjaźnione fundacje i firmy, któ-
brze doradzą. Nie wiem dlaczego, ale takie rym szablon24.pl poleciliśmy i wiem, że
http://fislem.eu/
miałem odczucie. Czasami tak jest, że ko- współpraca układa się bardzo podobnie jak
muś się ufa, a jak się okazało tej firmie mo- w naszym przypadku. Wam również pole-

N
asza fundacja współpracuje z fir- gę zaufać. Takie wrażenie sprawiają jedynie cam tę firmę, zaufajcie im i zostawcie wasze
mą Creaciones Virtuales od po- prawdziwi profesjonaliści. To zapoczątkowa- problemy ze stronami internetowymi w do-
nad roku. ło współpracę, z której naprawdę jesteśmy brych rękach.
Między innymi stworzyli dla nas portal, szalenie zadowoleni.
z którego jesteśmy dumni. Nasz poprzed- Usługi stoją na wysokim poziomie. Mo-
Ocena: 
ni usługodawca kazał sobie płacić za każ- gę się przyznać, że w pełni polegamy na opi-

74 03/2008
Szablony stron WWW

tówka. Zanim zleciliśmy wykonanie strony po- jest na pewno w pewnej mierze mniejsza ela-
święconej zajęciom informatycznym analizo- styczność zastosowanych rozwiązań.
waliśmy wiele ofert, ale to właśnie po rozmo- Jednak z drugiej strony nieporównywal-
wie telefonicznej z pracownikiem szablon24.pl nie większym plusem jest proponowane
mieliśmy bardzo dobre przeczucia, które po- przez Szablon24.pl rozwiązanie oparte o
twierdziły się w bardzo profesjonalnym przygo- CMS Joomla. Tym plusem jest bardzo ko-
towaniu propozycji. rzystna cena.
Chciałem zwrócić uwagę na profesjonal- Dodatkowo bogactwo rożnych bibliotek i
ną, szybką, bezproblemową a zarazem bar- darmowych lub tanich a w pełni profesjonal-
dzo milą współprace z szablon24.pl. Bar- nych rozwiązań daje nam możliwość dalsze-
dzo ważne były dla nas porady i konsulta- go rozwoju. Nawet jeśli nie znajdziemy goto-
prof. WWSHE dr Karol Sroka
cje, które pomogły nam samym zdefiniować wych, już przygotowanych rozwiązań, wie-
http://www.wwshe.edu.pl nasze prawdziwe potrzeby, w rezultacie cze- my, że szablon24.pl może przygotować dla
go nasza strona jest teraz bardziej przyjazna nas w krótkim czasie w pełni profesjonal-
dla czytelników i ma większe możliwości po- ne moduły, które będziemy mogli zainsta-

W
ostatnim okresie Wielkopolska zycjonowania. lować w Joomli. Pod tym względem czuje-
Wyższa Szkoła Humanistyczno - To wszystko oznacza, że firma szablon24.pl my się bezpieczni. Z czystym sercem pole-
Ekonomiczna w Jarocinie rozwi- ma naprawdę doskonałych fachowców z du- cam firmę szablon24.pl, oceniam ja na 5, a
ja się bardzo prężnie i z każdym dniem potrze- żym doświadczeniem, znających się na swo- co do współpracy to na pewno skorzystamy
bujemy coraz bardziej efektywnych rozwiązań. jej pracy. jeszcze nie raz.
Bardzo ważnym elementem jest dla nas strona Jeśli chodzi o plusy i minusy przyjęte-
internetowa, jako narzędzie komunikacji z na- go rozwiązania, to jedynym minusem w po-
Ocena: 
szymi studentami, jak również jako nasza wizy- równaniu z rozwojem strony na zamówienie

Są to takie kwestie jak: grafika strony, niego pozycjonowania. Można śmiało po-
logo, łatwy, stabilny i dający wiele możli- wiedzieć, że robimy wszystko, aby klient
wości system CMS, być może dodatkowe był dumny ze swojej strony, i aby dowie-
oprogramowanie i oczywiście pozycjono- działo się o tym jak najwięcej ludzi dzięki
wanie w wyszukiwarkach. Nie każdy ma pozycjonowaniu.
ochotę lub czas na kreowanie swojej stro- Nasza współpraca z Wielkopolską Wyż-
ny od podstaw. Minęły już czasy kiedy kto- szą Szkołą Humanistyczno - Ekonomicz-
kolwiek znający HTML mógł postawić swo- ną w Jarocinie zaczęła się od telefonu Pa-
ją stronę w dwa dni. na Profesora Karola Sroki, który potrzebo-
Dziś strona internetowa jest daleko bar- wał stworzyć stronę internetową prezentu-
dziej skomplikowana i nasza firma ma na jącą zajęcia z Informatyki.
celu właśnie ułatwienie kreowania wize- Jest to klasyczny przykład strony, w któ-
runku w Internecie. rej należało położyć nacisk na treść. Szyb-
Szablon24.pl to projekt skierowany do ko znaleźliśmy najlepsze rozwiązanie i w
osób zajmujących się profesjonalnie wytwa- przeciągu dwóch tygodni uczelnia miała
rzaniem stron internetowych, jak również swój nowy serwis.
do osób nie związanych z ich produkcją. Ciekawą współpracą okazało się two-
Poprzez sprzedaż szablonów stron rzenie serwisu dla FISLEM. Tutaj klient
WWW dajemy ludziom i firmom bogatą i miał wiele elementów graficznych, które
nowoczesną stronę z naprawdę profesjonal- trzeba było wpleść w serwis. Po znalezie-
nym interfejsem i nowoczesną grafiką. niu szablonu pomogliśmy uzyskać pożą-
Wiele razy słyszałem od moich klientów dany efekt.
moja obecna strona jest ładna, ale brakuje jej Strona prezentuje się czysto a pracowni-
tego czegoś.... Zawsze im odpowiadam – roz- cy z łatwością dodają, czy modyfikują arty-
wiązaniem są szablony. I rzeczywiście, dzię- kuły na stronie.
Ustosunkowanie ki bogactwu i różnorodności klienci mogą Jesteśmy bardzo dumni z takich ocen na-
Łukasz Łagowski odnaleźć między tysiącami rożnych szablo- szych klientów, co dodaje nam energii i po-
Szablon24.pl nów to, co najlepiej oddaje ich poczucie gu- woduje, że chcemy z każdym dniem posze-
stu i smaku. rzać naszą ofertę i ulepszać nasz serwis.
Ponieważ sama grafika to nie wszystko i Zanim zdecydujesz się na rozmowę z na-
nie wszyscy umieją sami przygotować sza- mi, zapraszamy na naszą stronę i zachęca-

K
ażdy, kto spotkał się kiedyś ze stro- blon na swoją stronę, zajmujemy się rów- my do wybrania kilku najbardziej Ci od-
ną internetową od kuchni wie, że nież dostosowaniem szablonów do syste- powiadających szablonów. Razem na pew-
jej profesjonalne wytworzenie nie mu CMS – najczęściej jest to CMS Joom- no uda nam się określić Twoje prawdziwe
jest kwestią kilku kliknięć w jakimś pro- la! Chodzi tu o pocięcie szablonów dosto- potrzeby.
stym, czy nawet zaawansowanym edyto- sowanie ich do szczegółowych wymogów
rze. Wie również, jak wiele czynników skła- klienta, zaimplementowanie modułów, a
da się na w pełni profesjonalny image firmy nierzadko również pomagamy formatować
w Internecie. teksty lub przystosowywać je do odpowied-

www.phpsolmag.org 75
Wywiad

Wywiad z
Danielem
Dryzkiem
Daniel Dryzek – Dyrektor PHP Solutions: Czy trudno było rozwinąć PS: Czy nie uważa Pan, że jesteśmy nieco
działalność usług hostingowych oraz jak w tyle w stosunku do analogicznych ofert
Zarządzający Active 24 to się wszystko w Pana przypadku roz- zagranicznych ?
poczęło? DD: Wręcz przeciwnie – oferty polskich usłu-
Polska Daniel Dryzek: 6.12.2000 roku została za- godawców są często znacznie lepsze od za-
rejestrowana domena domeny.org, która granicznych ofert. Rodzime oferty mogą
1 stycznia 2002 roku dała podstawę funk- mieć ewentualnie mniejszą ilość transferu do
cjonowania firmie Cybernetix. wykorzystania (np. w porównaniu z ofertami
Pierwsza oferta: 119 zł netto za domenę z USA) – wynika to jednak, ze znacznie niż-
com, net lub org wraz z serwerem 20MB szych cen łącz internetowych, jednak wraz ze
– 10MB na email i 10MB na www. Brak My- spadkiem cen łącz w Polsce, ta różnica rów-
SQL-a. Na początku serwis nie obsługiwał nież zaniknie. Jakość obsługi w polskich fir-
domen .pl, które miały inne warunki reje- mach również oceniam bardzo wysoko. Je-
stracji – nie było wtedy jeszcze programu dyny mankament, jaki dostrzegam na na-
partnerskiego NASK i domeny .pl można szym rynku domen i hostingu, to wciąż zbyt
było rejestrować tylko u źródła, były też mała konkurencja. Na dojrzałych rynkach
znacznie wyższe ceny niż obecnie – 200 klient ma zdecydowanie więcej firm do wy-
zł za rozszerzenie .pl i 150 zł netto za do- boru – w naszym kraju jest może 10 liczących
menę .com.pl. Na początku w ofercie tyl- się firm, z których klient może wybierać.
ko jeden serwer, potem oferta została roz-
budowana, by na koniec znów zmaleć do PS: Jak na obecnym rynku firma próbu-
2 serwerów podstawowych. Od sierpnia je sobie radzić z konkurencyjnymi oferta-
Grupa ACTIVE 24 jest 2005 roku jesteśmy częścią grupy ACTI- mi, ponieważ wiadomo, że firm hostingo-
VE 24 – firmy hostingowej operującej w wych powstaje coraz więcej i kuszą coraz
jedną z największych 15 krajach Europy – obsługujemy blisko to korzystniejszymi ofertami?
700 000 tys domen dla ponad 300 000 DD: Był taki czas, że powstawało bardzo du-
w Europie firm klientów. żo firm, które świadczyły usługi bardzo tanio,
Początki działalności na pewno nie by- ale szybko upadały, bo nie mogły zapewnić
oferujących ły łatwe. W 2002 roku panowały zupełnie odpowiedniej jakości. Teraz liczy się profe-
inne realia niż obecnie. Ceny łącz inter- sjonalna i szybka pomoc techniczna, nieza-
rejestrację domen netowych były horrendalne, profesjonal- wodne serwery i usługi z nimi związane. Bar-
ny sprzęt serwerowy również należał do dzo pomaga doświadczenie i zespół, który
i hosting. ACTIVE bardzo drogich. Początki to również zdo- tworzy ACTIVE 24 Polska – tego nie da się
bywanie doświadczenia – często meto- wypracować w miesiąc czy nawet rok – jest
24 posiada swoje dą prób i błędów. Gdybym przeniósł się w to bardzo duża przewaga konkurencyjna na
czasie do 2002 roku, sporo rzeczy zrobił- rynku. Znaczenie ma też oczywiście marka,
oddziały w 15 bym inaczej. zaufanie klientów. Bardzo dużo osób kupu-
je nasze usługi właśnie z polecenia.
krajach w Europie, PS: Jak ocenia Pan polski rynek hostingu ?
DD: Polski rynek notuje bardzo prężny roz- PS: Czy firma Active 24 dysponuje swoimi
gdzie świadczy wój w ostatnich latach. Nasz rynek jest jed- serwerami, czy też dzierżawi je za granicą ?
nym z najbardziej rozwojowych rynków na DD: Nasze serwery zawsze były umieszczone w
usługi dla 300 000 świecie. Mierzony przyrostem polskich do- Polsce, co różni nas od wielu innych firm, które
men – 40% w ciągu ostatniego roku, w tym zaczynały w tanich serwerowniach poza grani-
Klientów i obługuje roku mamy szansę podwoić ilość polskich cami naszego kraju. Obecnie nasze serwery są
domen sprzed roku – to najlepiej świadczy o kolokowane w Warszawie w firmie ATM S.A. –
700 000 domen dynamice i ogromnych perspektywach tego spółce giełdowej , która od wielu lat specjalizu-
rynku – nawet na tle innych zachodnioeuro- je się w wysokiej jakości usługach telekomuni-
internetowych. pejskich rynków. kacyjnych. Serwerownia, którą wynajmujemy,

76 03/08
Wywiad

jest jedną z najnowocześniejszych w Polsce. Nie tów hostingowych, które zawierają domeny, poszczególnych składników hostingu dosto-
ustępuje również podobnym serwerowniom w będą mogły potanieć. sowanego do potrzeb oczywiście jest możli-
krajach Europy Zachodniej czy USA. W styczniu wprowadziliśmy natomiast do we. Jednak z punktu widzenia klienta takie
naszej oferty promocję hostingu podobną rozwiązanie wcale nie byłoby ekonomiczne.
PS: Firma Active 24 uruchomiło ciekawą do promocji innych liderów rynku. Oferuje- Taniej jest po prostu sprzedać i utrzymywać
usługę testowania domen. Klient może my hosting ACTIVE HOME i ACTIVE BUSINESS serwery o tych samych parametrach niż ob-
sprawdzić opłacalność swojej przyszłej w promocyjnych cenach – za pierwsze 6 mie- sługiwać kilka lub kilkanaście tysięcy serwe-
domeny. Czy uważacie Państwo, że 14 dni sięcy każdy klient, który nie skorzystał jeszcze rów o zupełnie innych parametrach każdy.
testu pozwolą to stwierdzić? Czy należy z promocji, może zakupić te serwery za kwoty
traktować to bardziej jako ciekawostkę? odpowiednio 9.90 zł i 19.90 zł netto. Promocja PS: Dlaczego wprowadzono ograniczenie
DD: Jak najbardziej – 14 dni to wystarczający cieszy się bardzo dużym zainteresowaniem i na domeny obsługiwane wyłącznie przez
czas, żeby zbadać atrakcyjność domeny. Przez na pewno będzie kontynuowana. Active 24 ?
2 tygodnie abonent domeny zdąży zareje- DD: Główna przyczyna limitowania ilości
strować domenę i dodać ją na tzw. parking PS: Jeśli chodzi o hosting, to oferujecie Pań- domen zewnętrznych, które można podpiąć
(NameDrive, Sedo) lub umieścić stronę na ser- stwo praktycznie dwa pakiety. Czy ten mo- pod usługę hostingową to względy tech-
werze i zmierzyć statystyki odwiedzin. Usługa del oferty się sprawdza? Czy nie planujecie niczne. Kiedy domena nie znajduje się u nas,
jest w Polsce bardzo młoda, dlatego wszyst- Państwo bardziej zróżnicować oferty? mamy mniejsze możliwości konfiguracyjne
kie jej zastosowania nie zostały jeszcze odkry- DD: Lata doświadczeń pokazały, że klien- – nie możemy też np. zapobiec wygaśnięciu
te przez klientów. Jestem jednak pewny, że z ci lubią jasne i przejrzyste oferty. Zbyt du- domeny, jeśli nie zostanie opłacona przez
czasem jej popularność będzie rosła. ża ilość pakietów hostingowych nie ułatwia naszego klienta w firmie, w której utrzymu-
wyboru. Lepiej zaoferować dwa rodzaje ser- je domenę. W przypadku kiedy zarówno do-
PS: Czy promocja 'dożywotni hosting werów, które spełnią wymagania większości mena, jak i serwer obsługiwane są w naszej
dla twojej domeny' nie jest de facto no- klientów i zaoferować je dodatkowo w bar- firmie, możemy wziąć pełną odpowiedzial-
wą usługą owiniętą w plakietkę promo- dzo atrakcyjnej cenie. Model niewielkiej ilo- ność za działanie usługi klienta, która najczę-
cji? Czy to nie konkurencja wymusiła na ści serwerów sprawdza się, nie otrzymujemy ściej składa się właśnie z serwera wirtualne-
Active 24 taki ruch cenowy, by nie zosta- też zapytań od klientów z prośbami o więk- go i domeny. Jeśli domena jest u zewnętrz-
wać w tyle? sze zróżnicowanie. nego providera, to nie zawsze możliwa jest
DD: Oczywiście konkurencja działa na nas szybka reakcja i naprawienie problemu (np.
stymulująco. Jednak nasza oferta znacznie PS: Przeglądając ofertę Active 24 i nie wygasłej bądź źle skonfigurowanej dome-
się różni od ofert naszej konkurencji. Usłu- można znaleźć informacji dotyczących ny), bo konieczny jest kontakt z działem
ga jest bardzo korzystna cenowo nie tylko personalizacji hostingu. Obecnie można technicznym zewnętrznej firmy.
przez pierwszy okres abonamentowy, ale wybierać wśród hostingu innych firm i ma
również przez kolejne. Przykładowo dome- się z góry wybrane ich parametry, a gdyby PS: Jak wygląda ochrona antyspamowa w
na .pl wraz z Dożywotnim Hostingiem o po- klient chciał tylko dostęp do PHP i MySql Active 24?
jemności 1000MB na strony www i email to ? Czy widzi Pan możliwość indywidualne- DD: Korzystamy z wielopoziomowej ochro-
koszt 49 zł netto za pierwszy rok i 114 zł net- go dobrania zestawu usług w hostingu, a ny antyspamowej, przy zalewie spamem jest
to za kolejne lata. Różnica w cenie za pierw- tym samym negocjacji ceny. to konieczne. Pierwszą linią obrony są usta-
szy i kolejny rok wynika głównie z różnicy ce- DD: Na to pytanie w pewnym stopniu od- wienia serwera pocztowego. Sprawdzane
ny domeny .pl, jaką mamy w NASK. Obecnie powiedziałem w pytaniu poprzednim. Tech- są takie elementy jak poprawność domeny
rejestracja na pierwszy rok kosztuje nas tylko nicznie możliwość dowolnego wybierania nadawcy, odpowiednie przedstawienie się
10 zł, jednak już kolejne lata to wydatek 60
zł netto. Jeśli ceny przedłużeń domen spad-
ną – również ceny przedłużeń naszych pakie-

www.phpsolmag.org 77
Wywiad

serwera wysyłającego oraz serwery spraw- przez naszych klientów. Przyczyniły się do potrzebowanie, to oczywiście dostosujemy
dzane są w publicznych czarnych list. Dzię- tego szczególnie znaczne obniżki cen tych się do ich potrzeb.
ki tym zabezpieczeniom odrzucane dzien- domen, które rozpoczęły się już w zeszłym Jeden z problemów wprowadzania no-
nie jest ponad 1 mln prób wysłania spamu roku. Coraz więcej osób korzystających z wych technologii, czy też środowisk do usług
na nasze serwery. Po zaakceptowaniu po- Sieci wpisuje adres z polskimi ogonkami, hostingowych to wydajność – jeśli serwe-
łączenia nadchodzące listy są sprawdzane dlatego jeśli wszystkim klientom, którzy ry zaczną obsługiwać wszystkie języki opro-
przez oprogramowanie antywirusowe, któ- rejestrują domeny, które w poprawnej pi- gramowania, zaczną robić się mało wydajne.
re zabezpiecza użytkowników przed wirusa- sowni zawierają również ogonki doradza- Wymagałoby to partycjonowania serwerów
mi, Bazy wirusów są uaktualniane na bieżąco my, aby rejestrowali również wersję IDN, w zależności od przeznaczenia, co prowadzi
kilka razy dziennie. Ostatnim ogniwem łań- czyli ze znakami diakrytycznymi. W prze- do zmniejszenia efektowności i zwiększenia
cucha jest sprawdzanie wiadomości filtrami ciwnym wypadku część odwiedzających ceny dla klienta. Dlatego nigdy nie jest to ła-
bayesowskimi. Pozwalają one wyłapać spam ich strony może nie trafić na właściwy ser- twa decyzja, jednak staramy się wychodzić
na podstawie cech charakterystycznych, fraz wis, a to równa się utracie klientów i przy- naprzeciw nowym trendom i potrzebom.
i wyrazów występujących w spamie. Listy chodów.
oznaczone jako spam trafiają do specjalne- PS: Czym Pana zdaniem hosting Active
go folderu w katalogu użytkownika. PS: Czy w najbliższym czasie firma Active 24 wyróżnia się wśród innych tego rodza-
24 ma zamiar wprowadzić możliwość ho- ju usług?
PS: Od pewnego czasu można rejestrować stingowania stron napisanych w Ruby On DD: ACTIVE 24 to sprawdzona i doceniona
domeny z polskimi znakami diakrytycz- Rails lub Pythonie? marka na światowym rynku hostingu i obsłu-
nymi. Jak szerokie jest to zjawisko obser- DD: Python – planowany jest na pierwszy gi domen. Kilkaset tysięcy klientów i utrzy-
wowane z poziomu rejestratora domen? kwartał 2008. mywanych domen najlepiej świadczy o ja-
DD: Domeny z polskimi znakami dia- Ruby - raczej nie, a co najmniej nieszybko. kości naszych usług i przystępnej cenie, któ-
krytycznymi są coraz częściej wybierane Jeśli jednak rynek i klienci będą zgłaszali za- rą zawsze staramy się utrzymywać na możli-
wie najniższym poziomie – nie zapominając
nigdy o jakości, wydajności serwerów i ich
bezpieczeństwie. ACTIVE 24 to również wie-
loletnie doświadczenie całego naszego ze-
społu – obecni i przyszli klienci zawsze mo-
gą liczyć na szybką i fachową pomoc nasze-
go Biura Obsługi Klienta, a w sprawach o naj-
wyższym stopniu skomplikowania pomogą
również nasi administratorzy.
Właśnie fachową i szybką pomocą tech-
niczną chcielibyśmy się zawsze wyróżniać na
tle naszych konkurentów. Szybkie i bezawa-
ryjne serwery to standard w profesjonalnych
usługach hostingowych.

PS: Jakie są plany na przyszłość firmy Ac-


tive 24?
DD: ACTIVE 24 będzie poszerzał swoją ofertę
domen z innych krajów – głównie europej-
skich. Już teraz coraz więcej klientów pyta o
możliwość rejestracji domen francuskich .fr,
niemieckich .de czy hiszpańskich .es.
Ponadto ACTIVE 24 stara się również pro-
mować ideę domen internetowych jako in-
westycji czy też wartościowych aktywów. Do-
meny coraz częściej bowiem stają się przed-
miotem wtórnego handlu. W styczniu 2008
roku w Warszawie odbyła się konferencja Do-
main names secondary market in Poland, któ-
rej głównym organizatorem był NASK – kra-
jowy rejestr domen, natomiast ACTIVE 24
był współorganizatorem tej międzynarodo-
wej konferencji. Spotkała się ona z bardzo do-
brym odbiorem i dużym zainteresowaniem
– w sumie odwiedziło ją ponad 150 osób z
wielu krajów Europy. Nasza firma zawsze bę-
dzie starała się wspierać takie idee i pomagać
w rozwoju rynku domen w Polsce.

PS: Dziękuję za rozmowę


DD: Również bardzo dziękuję!

78 03/08
Recenzja

PHP i MySQL Księga przykładów

Autorzy: Ellie Quigley, Marko Gargenta


Wydawnictwo: Helion
ISBN: 978-83-246-1020-4
Ocena: 5

PHP i MySQL Księga przykładów jest doskonałą pozycją dla osób, które stępnym i łatwym do zrozumienia językiem. Książka poza siedemna-
chcą nabyć umiejętności tworzenia dynamicznych aplikacji interneto- stoma rozdziałami dotyczącymi bogato przedstawionej składni, możli-
wych w języku PHP. Skierowana jest przede wszystkim do osób począt- wości oraz przykładów wykorzystania PHP i MySQL, zawiera również
kujących, właściwie niemających jeszcze żadnej wiedzy na temat pro- pięć tzw. dodatków. Możemy się z nich dowiedzieć jak stworzyć gale-
gramowania w tym języku. Książka rozpoczyna się wprowadzeniem rię sztuki z bazą autorów i dzieł, jak wysyłać wiadomość email poprzez
czytelnika do środowiska PHP – jak pobrać, zainstalować oraz skonfi- skrypt PHP oraz jak operować funkcjami związanymi z datą i czasem.
gurować PHP oraz bazę MySQL. Dokładny opis jest bardzo pomocny Dużym plusem jest poruszanie tematów, na które każdy początkujący
i pozwala zaoszczędzić wiele czasu i nerwów młodemu programiście. programista na potrzeby sieci powinien zwrócić szczególną uwagę m.in.
Bardzo przydatnymi dla początkujących mogą być informacje, na jakiej bezpieczeństwo aplikacji WWW. Dzięki szczegółowemu przedstawie-
zasadzie działają dynamiczne aplikacje WWW. Książka podzielona jest niu wielu zagadnień, pozycja osiągnęła ponad 900 stron. Książka zawie-
na rozdziały, w każdym kolejnym dowiadujemy się o nowych funkcjach ra płytę CD, na której znajdziemy wszystkie przykłady opisywane przez
i możliwościach wykorzystania. Całość jest odpowiednio stopniowana, autora, oczywiście odpowiednio podzielone na rozdziały.
tak aby każdy mógł zrozumieć kolejne tematy. Na pochwałę zasługuje Słowem podsumowania: bardzo dobra pozycja dla osób stawiających
bardzo dobry sposób objaśniania listingów oraz ilustracje kodu poprzez pierwsze kroki w programowaniu dynamicznych witryn interneto-
zrzuty ekranu, dzięki którym każdy laik dokładnie zrozumie które po- wych za pomocą języka PHP w oparciu o bazy danych MySQL.
lecenie jest odpowiedzialne za jaki efekt. Wszystko napisane jest przy- Zrecenzował: Tomasz Kostro

Skalowalne witryny internetowe

Autor: Cal Henderson


Wydawnictwo: Helion
ISBN: 978-83-246-0723-5
Ocena: 5

Książka pod tytułem Skalowalne witryny internetowe jest kolejną pozy- rozdziałów zostaje nam przedstawione znaczenie skalowalności, dzięki
cją z serii wydawniczej O'Reilly. Książki tego wydawnictwa zawsze cha- temu możemy się przekonać, jak często mamy o niej niepełne lub na-
rakteryzują się wysokim poziomem merytorycznym. Tak też jest i w wet mylne pojęcie. Na koniec autor porusza tematykę interfejsów API,
tym przypadku. Chęć utrzymania przez autora odpowiedniego pozio- udostępnianych użytkownikom naszego serwisu lub aplikacji. Zwra-
mu, ogranicza grupę odbiorców do osób, które są w stanie swobodnie ca on przy tej okazji uwagę na konieczność optymalizacji oraz zabez-
programować oraz posiadają odpowiednie doświadczenie w projekto- pieczenia również tych kanałów wymiany danych. Cała książka zawie-
waniu i tworzeniu dynamicznych witryn lub aplikacji internetowych. ra wiele informacji, których próżno szukać w innych pozycjach oscylu-
Dzięki takiemu podejściu, mamy możliwość poznania tego, czym się jących wokół tej tematyki. Nawet jeżeli znajdziemy podobną, to może-
zajmujemy od trochę innej strony, bez konieczności brnięcia po raz set- my być pewni, że informacje zostały przekazane w niej w inny sposób.
ny przez składnię języka. W książce poruszona jest m.in. tematyka i18n, Skalowalne witryny internetowe to książką, w której wszystkie informa-
L10n oraz Unicode. Dowiemy się, dlaczego i na co należy uważać stosu- cje mają na celu przedstawienie nam zarówno dobrych, jak złych efek-
jąc UTF-8. Dużo miejsca poświęcono również bezpieczeństwu – wła- tów każdego działania. Autor dołożył starań, abyśmy poznali tajniki
ściwie tematyka ta powtarza się w niemal każdym rozdziale, zarówno wiedzy, umożliwiające tworzenie bezpiecznych i maksymalnie wydaj-
tym poświęconym integralności danych, jak i poczcie elektronicznej. W nych aplikacji. Książka ta niewątpliwie jest warta polecenia, szczególnie
książce tej, znajdziemy również oddzielny rozdział poświęcony tematy- osobom które tworzą aplikacje mające z założenia pracować na ogrom-
ce wąskiego gardła aplikacji. Wiedza w nim zawarta przyda się z pewno- nych ilościach danych oraz mają być odwiedzane przez ogromne ilości
ścią każdemu projektantowi, jak i programiście. W jednym z ostatnich użytkowników.
Zrecenzował: Łukasz Skowroński

79
www.buyitpress.com

Zaprenumeruj swoje ulubione magazyny


i zamów archiwalne numery!

Gwarantujemy:
- preferencyjne ceny
- bezpieczną płatność on-line
- szybką realizację Twojego zamówienia
Bezpieczna prenumerata on-line wszystkich tytułów Wydawnictwa Software!
Zamówienie prenumeraty

Prosimy wypełnić czytelnie i przesłać faksem na numer: (22) 244 24 59 lub listownie na adres: Software-Wydawnictwo Sp. z o.o.,
Bokserska 1, 02-682 Warszawa, e-mail: pren@software.com.pl. Przyjmujemy też zamówienia telefoniczne: (22) 427 36 79

Imię i nazwisko............................................................................................ ID kontrahenta..........................................................................................

Nazwa firmy................................................................................................. Numer NIP firmy.......................................................................................

Dokładny adres....................................................................................................................................................................................................................

Telefon (wraz z numerem kierunkowym)................................................... Faks (wraz z numerem kierunkowym) ....................................................

E-mail (niezbędny do wysłania faktury)............................................................................................................................................................................


automatyczne przedłużenie prenumeraty

Ilość Od numeru Opłata


Tytuł Ilość
numerów
zamawianych
prenumerat
pisma lub
miesiąca
w zł
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

Linux+DVD (2 płyty DVD)


Miesięcznik o systemie Linux
113 199/1791

Linux+Extra! (od 1 do 7 płyt CD lub DVD)


Numery specjalne z najpopularniejszymi dystrybucjami Linuksa
8 232/1982

PHP Solutions (1 płyta CD)


Dwumiesięcznik o zastosowaniach języka PHP
6 135

hakin9 - jak się obronić (1 płyta CD)


Miesięcznik o bezpieczeństwie i hakingu
113 1991/219

.psd (2 płyty CD)


Miesięcznik użytkowników programu Adobe Photoshop
113 199

.psd numery specjalne


(.psd Extra + .psd Starter Kit)
6 140

3DFX
Dwumiesięcznik miłośników grafiki trójwymiarowej
6 140

Suma

Jeżeli chcesz zapłacić kartą kredytową, wejdź na


stronę naszego sklepu internetowego:
1
Cena prenumeraty rocznej dla osób prywatnych
2
Cena prenumeraty rocznej dla osób prenumerujących już Software Developer’s Journal lub Linux+
3
W lipcu i sierpniu ukazuje się jeden wakacyjny numer www.buyitpress.com
W następnym numerze PHP Solutions 4/2008 (27)

W sprzedaży od czerwca

ROZWIĄZANIA UWAGA! NOWE TESTY KONSUMENCKIE


 Cykliczna optymalizacja MySQL  Outsourceing IT

 Dynamiczne załączanie treści strony

NEWSY
NOWE ARTYKUŁY W DZIAŁACH  eZ publish

 dla początkujących  Xoops

 rozwiązania  Joomla

 kasa dla webmastera  jQuery

I wiele innych artykułów, których nie możesz przeoczyć!

Redakcja zastrzega sobie możliwość zmiany zawartości pisma.

You might also like