Professional Documents
Culture Documents
AKTUALNOŚCI 6
Krzysztof Trynkiewicz
DLA ZAAWANSOWANYCH
Ankiety w stylu rankingowym
z użyciem AJAX-a 26
Patrycja Wądołowska Krzysztof Trynkiewicz
patrycja.wadolowska@software.com.pl Krzysztof prezentuje, w jaki sposób stworzyć an-
kiety w stylu rankingowym przy pomocy techno-
logii AJAX. Ciekawy interfejs, oparty na CSS i
JavaScript, pozwoli Ci uatrakcyjnić wygląd Two-
jej strony internetowej.
Nasz magazyn ukazuje się w dwóch językach!
polskim francuskim ASwing + AMFPHP
czyli przepis na szybkie GUI 30
Rafał Malinowski
Rafał pokazuje, jak szybko i łatwo stworzyć GUI
dla aplikacji PHP-owej. Dowiesz się też, o pro-
stym sposobie przesyłania danych pomiędzy
PHP a Flashem. To artykuł dla wszystkich, któ-
rzy chcą ulepszyć swoją PHP-ową aplikację.
NARZĘDZIA
Pytania dotyczące Strona WWW/Forum
PHP5 WebServices vs MS .NET prenumeraty strona www: www.phpsolmag.org
vs Java vs Java Mobile tel. (22) 887 14 44 Tu znajdą Państwo informacje
– interoperability pełną parą! 52 e-mail: pren@software.com.pl dotyczące aktualnych i przyszłych
Software Wydawnictwo Sp. z o.o. numerów magazynu PHP Solutions.
Łukasz Budnik dział prenumeraty
Łukasz uczy pisania własnych usług sieciowych ul. Bokserska 1 Forum: www.phpsolmag.org/newforum
02-682 Warszawa Zachęcamy do dyskusji na naszym
oraz rozszerzania domyślnych klas PHP5 klien-
forum. Czekamy na propozycje
ta i serwera SOAP. Po przeczytaniu artykułu nie CD tematów, które chcieliby Państwo
będziesz miał też problemu z zabezpieczaniem tel. (22) 887 14 44
znaleźć w najbliższym numerze pisma.
swoich usług z rozszerzeniem WS Security En- e-mail: cd@software.com.pl
Zapraszamy także do wymiany
Software Wydawnictwo Sp. z o.o.
hancements i HTTPS. poglądów z innymi fanami PHP.
Defekty CD/DVD
ul. Bokserska 1 Cena
KASA DLA WEBMASTERA 02-682 Warszawa Prenumerata: 135 zł
Przelew na konto nr:
Jak zarobić na stronie www? Zamówienia 46 1440 1299 0000 0000 0391 8238
Poradnik dla przedsiębiorczych /Numery archiwalne Nordea Bank Polska S.A.
tel. (22) 887 14 44
webmasterów. 66 II Oddział w Warszawie
e-mail: pren@software.com.pl
Paweł Grzesiak sklep on-line: www.buyitpress.com
W dzisiajszych czasach istnieje wiele źródeł, Kontakt z redakcją
z których właściciel strony interentowej może e-mail: redakcja@phpsolmag.org
czerpać zyski. Autor w artykule prezentuje me- Software Wydawnictwo Sp. z o.o.
tody zarobkowania i zwraca szczególną uwagę Redakcja PHP Solutions
ul. Bokserska 1
na ich opłacalność. Dowiesz się, w co warto za-
02-682 Warszawa
inwestować.
TESTY KONSUMENCKIE PHP Solutions jest wydawany przez Software-Wydawnictwo Sp. z o.o.
Cyber rzeczywistość Dołączoną do magazynu płytę CD przetestowano programem AntiVirenKit firmy G DATA Software Sp. z o.o.
– cyber uzależnienie 79
Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu nośnikach informacje
i programy były poprawne, jednakże nie bierze odpowiedzialności za efekty wykorzystania ich; nie gwarantuje
Łukasz Skowroński także poprawnego działania programów shareware, freeware i public domain.
Uszkodzone podczas wysyłki płyty wymienia redakcja.
Wszystkie znaki firmowe zawarte w piśmie są własnością odpowiednich firm
i zostały użyte wyłącznie w celach informacyjnych.
ZAPOWIEDZI 82 Redakcja używa systemu automatycznego składu
Do tworzenia wykresów i diagramów wykorzystano program firmy
Zapowiedzi artykułów, które planujemy w na- Osoby zainteresowane współpracą prosimy o kontakt: cooperation@software.com.pl
stępnym wydaniu naszego pisma.
Druk: ArtDruk
Wysokość nakładu obejmuje również dodruki. Redakcja nie udziela pomocy technicznej w instalowaniu
i użytkowaniu programów zamieszczonych na płytach CD-ROM dostarczonych razem z pismem.
Sprzedaż aktualnych lub archiwalnych numerów pisma po innej cenie niż wydrukowana na okładce
– bez zgody wydawcy – jest działaniem na jego szkodę i skutkuje odpowiedzialnością sądową.
Piąta doroczna
konferencja eZ Systems
Wiele razy na łamach PHP Solutions poruszali-
śmy zagadnienia związane z rozwiązaniami fir-
my eZ Systems. Obecnie trwają przygotowania
do piątej już konferencji, która odbędzie się w
Skien, w Norwegii w dniach 6-8 czerwca 2007.
PHP Solutions patronowało także poprzednim
edycjom konferencji. Serdecznie zapraszamy!
http://ez.no/community
P
zagnieżdżone zapytania SELECT. Tego typu
HP Unit w wersji 3 wprowadziło za- Dokumentacja projektu jest obszerna i
zapytania nie są często stosowane, jednak
awansowaną obsługę pakietu XDe- czytelna, znajdziemy w niej informacje o wykorzystuje je się przy znacznej ilości ata-
bug. Umożliwia on śledzenie błędów, implementowaniu XDebug do PHP Unit. ków SQL Injection. Zabezpieczenie zostało
wprowadzone do projektu Suhosin, opisane-
wyświetlając informacje o funkcji zawie- Podobne treści znajdziemy także na go szerzej w tym wydaniu aktualności, war-
rającej błąd, parametry do niej przesy- stronach PHP Unit. W efekcie otrzyma- to jednak zastanowić się, czy podobne roz-
wiązanie nie znajdzie zastosowania i w na-
łane (także do funkcji własnych), nazwę my potężne narzędzie, pomocne w de- szych projektach.
pliku, w której rezyduje, oraz numery bugowaniu naszych projektów. XDebug http://blog.php-security.org/archives/67-Heuri-
stic-SQL-Injection-Detection-for-Suhosin.html
wierszów. Dodatkowo, otrzymamy infor- jest rozwijany od 2002. Aktualizacje nie
macje o alokacji pamięci, możliwych nie- są częste, jednak zawsze wnoszą no- Seagull Framework 0.6.1
skończonych rekursjach, będziemy tak- we funkcjonalności. Na temat PHP Unit Po kilku miesiącach przerwy, nowej wersji do-
czekał się słynny framework Seagull. Uspraw-
że mogli wyprofilować swój skrypt. XDe- pisaliśmy obszernie w PHP Solutions niono system raportowania błędów, doda-
bug jest dostępny dla platformy Linux, 1/2006 (12). no możliwość podawania argumentów do za-
pytań CLI, wprowadzono prefixy dla baz da-
posiada także binaria dla Windows. Ist-
nych, dodano element CAPTCHA dla komenta-
nieją osobne pakiety dla PHP 4 i 5. Li- http://xdebug.org rzy i wiele innych funkcjonalności. W PHP Solu-
cencja jest oparta o PHP License 3.0. http://phpunit.de tions 4/2005 (10) zamieściliśmy obszerny arty-
kuł na temat tworzenia portalu opartego na tym
rozwiązaniu.
http://seagullproject.org
kiem PHP i HTML. Przystępny inter- ciu PHP i HTML nie jest już tak skom- PhpGroupWare
fejs sprawia, że staje się on łatwy dla plikowane.
HITY
PONADTO Programy komercyjne:
- DzPHP Editor 4.1 o wartości 49$
- PHP/Java Bridge 3.2.1 - Captcha Magic 1.0 o wartości 19.95$
- Eclipse-SDK 3.1.2 oraz 3.2.1 - PHP Magic (Trial)
- PHPEclipse 1.1.8
- PHPmyvisits 2.3 E-BOOKS
- Stato 0.7
- phpGroupWare - Introduction to Programming Using Java
- The Java Language Specification
- Thinking in Java
na naszej stronie internetowej pod adresem www.phpsolmag.org/pl
Szybkie i przyjemne
programowanie z Code Igniter
Stopień trudności: lll
Piotr Maliński
B
y szybko i bezboleśnie opano- }
wać obsługę prezentowanego tu- $obiekt = new Klasa();
taj frameworka musisz znać pod- echo $obiekt->funkcja();
stawy programowania obiektowego. Mu-
sisz wiedzieć, co to jest klasa, metoda i Klasę definiujemy stosując słowo "class"
obiekt oraz oczywiście musisz znać pod- i podając po nim nazwę klasy. Nawiasy
stawy samego języka. Pomocne mogą klamrowe określają zawartość klasy. Klasa
być artykuły poświęcone PHP na wikibo- zawiera "funkcje", które nazywa się meto-
oks, które dokładnie opisują zagadnienia dami. Metody definiuje się jak funkcje.
programowania obiektowego. Klasy to w Klasy natomiast wywoływane są ina-
W SIECI bardzo dużym uproszczeniu zbiór funkcji. czej niż funkcje. Pierwszym etapem jest
Oto przykładowa klasa: stworzenie obiektu klasy:
Nowy obiekt tworzy się stosując słowo (np. operacje na bazie danych), (np. sza- • wykorzystuje wzorzec MVC Model-
"new", po którym podajemy nazwę kla- blony) interfejsu użytkownika i logiki ste- Widok-Kontroler przy tworzeniu apli-
sy (tak jakby była to funkcja). Zmienna rowania („pozostały” kod aplikacji) w taki kacji, lecz nie narzuca go,
($obiekt w przykładzie), do której przy- sposób, aby modyfikacje jednego kompo- • lekki i wydajny; komponenty frame-
piszemy stworzony obiekt, będzie miała nentu minimalnie wpływały na pozostałe. worka mają postać wtyczek, które
dostęp do wszystkich metod, które wy- O sile MVC przekonamy się, gdy rozpocz- można ładować w razie potrzeby,
wołujemy: $obiekt->NAZWAMETODY();. niemy pracę z Code Igniterem. • automatycznie generuje przyjazne
W funkcjach zmienne wewnątrz nie wyszukiwarkom URLe dla stworzo-
są dostępne na zewnątrz i na odwrót, Co to jest Code Igniter? nych kontrolerów,
chyba że daną zmienną określi się ja- Code Igniter to framework PHP rozwija- • jest bardzo dobrze udokumentowany
ko globalną, podobnie w klasach. Sto- ny przez firmę pMachine i rozprowadza- i posiada liczne grono użytkowników.
sowanie zmiennych globalnych nie jest ny na liberalnej licencji zbliżonej do licen-
zalecane, szczegóły podam przy oma- cji Apache/BSD. Code Igniter, w skrócie CI nie jest narzędziem tak rozbudowanym
wianiu wzorca MVC. Klasy mają dodat- CI, jest bardzo prostym lecz funkcjonal- jak np. Prado. Nie oferuje takich opcji jak:
kową zmienną wewnętrzną - $this-> nym narzędziem. Oto jego krótka charak-
określa ona zmienne dostępne global- terystyka: • pełna abstrakcja baz danych (wspiera
nie wewnątrz klasy. Zazwyczaj takie tylko podstawowe operacje),
zmienne ustawiane są w konstruktorze • wymaga PHP w wersji nie starszej niż • rozbudowane moduły takie jak system
(automatycznie wykonywanej przy two- 4.3.2, działa również pod PHP 5, uprawnień i użytkowników,
rzeniu obiektu metodzie), a potem wy-
korzystywane przez poszczególne me-
Listing 1. Przykładowy model nowości
tody.
class News extends Model
Co to jest {
function News()
Framework MVC? {
Mianem frameworka określa narzędzie parent::Model();
stanowiące podstawę do tworzenia apli- }
kacji. Framework zawiera elementy uła- function get_news()
twiające i przyśpieszające tworzenie apli- {
// Wszystkie newsy sortowane malejąco po news_id
kacji. W przypadku PHP framework za-
$this->db->orderby("news_id", "desc");
pewni nam obsługę szablonów, połączeń return $this->db->get('news');
z bazami danych, obsługę formularzy i }
wiele więcej. Naszą aplikacją może być function add_news($data)
galeria czy system artykułów. Tworzenie {
// dodanie newsa
takiego skryptu od zera wiązałoby się z
return $this->db->insert('news', $data);
napisaniem kodu odpowiedzialnego za }
wymienione powyżej czynności, a dopie- function update_news($id, $data)
ro w drugiej kolejności z napisaniem kodu {
samej aplikacji. // zmiana newsa o podanym numerze news_id
$this->db->where('news_id', $id);
MVC (ang. Model-View-Controller) to
return $this->db->update('news', $data);
wzorzec programistyczny – pewien sche- }
mat, wg którego tworzy się aplikacje. Ce- function delete_news($id)
lem takich wzorców jest uporządkowanie {
kodu w jasny i klarowny sposób, zapew- // skasowanie newsa o podanym news_od
$this->db->where('news_id', $id);
niając jego czytelność, nie tylko dla auto-
return $this->db->delete('news');
ra kodu. Wzorzec MVC jest dość popu- }
larny i charakteryzuje się rozdzieleniem }
komponentów aplikacji, tj. modelu danych
Mimo to jest to bardzo dobry produkt ze ne dotyczące bazy danych, routes.php ko drugi parametr podać tablicę z dany-
względu na łatwość i przyjemność pracy, określa m. in. domyślny kontroler. mi. By przypisać widok do zmiennej, a nie
a braki można uzupełnić własnymi biblio- wyświetlić go, wystarczy jako trzeci argu-
tekami i pomocnikami. Odnośniki ment podać wartość True:
CI używa przyjaznego wyszukiwarkom
Instalacja i konfiguracja i ludziom mapowania adresów URL i $widok = $this->load->view(
Pobieramy archiwum z frameworkiem ze zmiennych. Oto przykładowe odnośni- 'nazwa_widoku', array('dane' =>
strony projektu i rozpakowujemy go do ki: http://www.strona.pl/index.php/klasa/ $zmienna), True);
pustego katalogu i przesyłamy na ser- metoda/; http://www.strona.pl/index.php/
wer. Jeżeli teraz otworzymy w przeglą- klasa/metoda/parametr/ .... Witaj Świecie w CI
darce URL prowadzący do katalogu z Gdzie klasa oznacza klasę kontro- W katalogu controllers stwórz plik
frameworkiem to zobaczymy powitalną lera jaka ma być wywołana, metoda – test.php o kodzie:
wiadomość. Możemy przystąpić do two- nazwę wybranej metody tejże klasy,
rzenia własnej aplikacji. a parametry, których może być wiele, <?php
przekazywane są do metody. class Test extends Controller
Struktura frameworka {
Główny katalog Code Igniter zawiera Kontrolery function index()
plik index.php odpowiedzialny za wy- Kontroler to klasa umieszczona w pli- {
świetlanie kontrolerów naszej aplikacji. ku o nazwie takiej jak nazwa klasy, echo 'Test CI';
W katalogu system znajdziemy katalo- umieszczonym w katalogu controllers. }
gi: application, cache, codeigniter, dri- Nazwa zawierać możne znaki alfanu- }
vers fonts, helpers, init, language, libra- meryczne (cyfry i litery) oraz znaki pod- ?>
ries, logs, plugins, scaffolding. W kata- kreślenia. Nazwa klasy jest używana w
logu language umieszcza się pliki z tłu- linkach URL do jej wywoływania. Przy- Otwórz plik config/routes.php i zmień
maczeniami interfejsu frameworka. Nas kładowy odnośnik: http://localhost/html/ wartość
głównie będzie interesował katalog ap- ci/index.php/form
plication jako, że to w nim zawarty bę- Wywoła klasę o nazwie "Form". Kla- $route['default_controller']
dzie cały kod naszych aplikacji. W kata- sa ta powinna znajdować się w pliku
logu tym znajdziemy: "form.php". na nazwę kontrolera - „test”. Teraz głów-
Nazwa pliku musi zaczynać się z na strona frameworka wyświetli tekst
• config - katalog zawierający pliki kon- małej litery, nazwa klasy - z dużej. Me- „Test CI”. Stworzyliśmy pierwszą prostą
figuracyjne, tody klasy kontrolera są automatycznie aplikację. Stworzyliśmy prosty kontroler
• controllers – katalog przechowujący dostępne poprzez system odnośników i ustawiliśmy go jako domyślny. Metoda
kontrolery, CI, za wyjątkiem metod zaczynających index jest domyślnie wywoływaną meto-
• errors – obsługa błędów (np. 404 – się od znaku podkreślenia. dą kontrolera i jak każda inna dostępna
brak strony), jest również pod odnośnikami:
• models – katalog zawierający modele Widoki
• views – katalog z widokami. Widok to niejako szablon strony lub jej index.php/test/index
elementu (np. nagłówek, szablon newsa index.php/test
Konfiguracja itp.). Widok wywoływany jest przez kon-
Podstawowa konfiguracja ogranicza się troler, który wypełnia go danymi i wysyła Modele
do edycji pliku config/config.php i poda- do przeglądarki. Widoki umieszczamy w Modele to klasy PHP zawierające meto-
nia ścieżki URL do naszej instalacji fra- katalogu views. W kontrolerach dany sza- dy operujące na danych w bazie danych.
meworka jako wartość $config['base _ blon ładujemy poleceniem: Przykładowo model "Artykuły" posiadał-
url']. Pozostałe pliki konfiguracyjne bę- by metody typu "dodaj", "zmień", "usuń".
dą interesować nas w dalszej części ar- $this->load->view('nazwa_widoku'); Modele zapisuje się w katalogu models.
tykułu. autoload.php określa, jakie biblio- Nazwy modeli muszą zaczynać się z
teki i pomocniki mają być automatycznie Co wyświetli zawartość widoku. By prze- Dużej litery, nazwy plików - z małej. Co-
ładowane, database.php zawiera da- kazać wartości do widoku wystarczy ja- de Igniter nie wymusza stosowania mo-
deli, można operować na bazie danych
Listing 2. Tabela dla modelu nowości również w kontrolerach, lecz warto z
nich korzystać. Szkielet modelu:
CREATE TABLE `news` (
`news_id` smallint(5) unsigned NOT NULL auto_increment,
class Nazwa_modelu extends Model {
`news_title` varchar(255) default NULL,
function Nazwa_modelu()
`news_text` text,
`news_date` int(10) unsigned NOT NULL, {
PRIMARY KEY (`news_id`) parent::Model();
) ENGINE=MyISAM AUTO_INCREMENT=1 ; }
}
Mamy zwykłą klasę dziedziczącą z kla- Metoda ta pobierze wszystkie wpisy z po- Pobieranie określonych kolumn
sy "Model". Tworząc konstruktor musi- danej tabeli. Można też, jako drugi para-
my dodać: metr, podać limit wyników (LIMIT) lub też $this->db->select('pole, pole2, pole3');
Limit i Ofset (np. pobierze 10 wyników,
parent::Model(); ale nie 10 pierwszych tylko zaczynając od Pozwala na pobranie wartości tylko z
5 (ofset to 5). określonych pól podanych jako argument.
By załadować w Kontrolerze model sto- Podajemy nazwy pól oddzielone przecin-
sujemy: Warunek WHERE kami.
Ograniczanie ilości wyników Łączenie tabel – JOIN mać wyniki musimy wykonać na uchwy-
cie metodę result() zwracającą wyniki
$this->db->limit(Limit); $this->db->select('*'); w postaci obiektu lub result _ array() w
$this->db->from('tabela1'); postaci tablicy.
Dodawanie wpisu $this->db->join('tabela2',
'tabela2.pole = tabela1.pole'); Formularze
$dane = array('pole' => wartość, $query = $this->db->get(); Code Igniter posiada pomocnik (ang.
'pole2' => wartość); helper) do obsługi formularzy. By za-
$this->db->insert('tabela', $dane); Pozwala połączyć wyniki z dwóch zależ- ładować go w autoload.php dodajemy
nych tabel. Przykładowy model dla modu- „form” do tablicy $autoload['helper']
Metoda insert dodaje wpis do bazy da- łu nowości przedstawia Listing 1. lub też ładujemy go bezpośrednio w
nych. Przyjmuje ona jako parametr nazwę kontrolerze:
tabeli oraz tablicę asocjacyjną lub obiekt Wykonywanie zapytań SQL
z danymi. Tablica jako klucze musi za- $this->load->helper('form');
wierać nazwy pól, a jako ich wartości – te $query = $this->db->query(
wartości, które mają być dodane do bazy. 'Zapytanie SQL'); Otwarcie Formularza
Otrzymamy: • required: pole jest wymagane, musi Opcje można łączyć za pomocą znaku |
mieć jakąś wartość,
<select name="nazwa"> • valid _ email: pole musi zawierać po- $rules['username'] = "required|
<option value="small">Small Shirt prawny adres email, min_length[5]|max_length[12]";
</option> • numeric: pole musi zawierać same
<option value="med">Medium Shirt liczby, Możemy dodać dodatkowo do parametrów :
</option> • alpha _ dash: pole może zawierać je-
<option value="large">Large Shirt dynie znaki alfanumeryczne, podkre- • xss _ clean: oczyszcza dane ze "zło-
</option> ślenia i myślniki, śliwego" kodu (ataki XSS),
<option value="xlarge">Extra Large Shirt • alpha _ numeric: pole może zawierać • prep _ for _ form : zamienia znaki
</option> jedynie znaki alfanumeryczne, HTML na znaki specjalne przez co
</select> • alpha: pole może zawierać jedynie li- można je wyświetlać bez problemu w
tery, formularzach,
Checkbox • exact _ length[*]: wartość pola mu- • prep _ url: doda http:// do linków jeże-
si mieć określoną długość exact_ li brakuje,
form_checkbox('nazwa', 'wartość') length[6] - 6 znaków, • strip _ image _ tags: usunie tagi IMG
• max _ length[*], min_length[*]: war- zostawiając czyste linki URI.
Co zwróci kod checkboxa. By był zazna-
czony, jako trzeci parametr wystarczy Listing 5. Zmodyfikowany kontroler wyszukiwarki Flickr
ustawić wartość logiczną True.
<?PHP
Radio
class Flickr extends Controller
{
form_radio('nazwa', 'wartość') private $api_key;
foreach($x->photos->photo as $res)
$this->input->post('nazwa Pola');
{
$r[] = array('id' => (int)$res['id'], 'title' =>(string)$res['title'],
Walidacja Formularzy 'owner' => (string)$res['owner'], 'secret' =>
Code Igniter oferuje również bibliotekę (string)$res['secret'], 'server' => (int)$res['server']);
do walidacji m.in. formularzy. Wystar- }
$ret['img'] = $r;
czy w autoload.php dodać dla tablicy
return $ret;
libraries wartość „validation”. Listing 3 }
przedstawia przykładowy kontroler wy- }
korzystujący pomocnik form i bibliote-
kę validation.
W
ebmaster, projektant i progra- SEO i standardy W3C
mista WWW odpowiedzą, że Search Engine Optimization (SEO), czyli
standardy służą każdemu in- optymalizacja stron WWW dla wyszukiwa-
ternaucie. Dokładniej służą temu, aby rek internetowych, jest jednym z elementów
wszystkie przeglądarki poprawnie wyświe- pozwalających promować serwisy WWW.
tlały stronę spełniającą wytyczne W3C. Optymalizacja może stanowić część szer-
Standardy mają zapewnić długoterminowe szej strategii marketingowej w internecie
bezpieczeństwo. Nowa wersja przeglądar- – Search Engine Maketing (SEM). Dla ko-
ki lub nowa technologia nie powinny spo- mercyjnych przedsięwzięć kwestia optyma-
wodować konieczności zmiany witryny. lizacji dla wyszukiwarek jest bezsporna, po-
Wcześniej zwróciłem jednak uwagę, że zwala bowiem skutecznie dotrzeć do poten-
„czytelnikami” stron WWW nie są jedynie in- cjalnych zainteresowanych z informacją o
ternauci korzystający z przeglądarek interne-
towych. Innym ważnym odbiorcą treści pu- Co należy wiedzieć...
blikowanych w internecie są wyszukiwarki. Czym są standardy i technologie WWW:
Systemy wyszukiwawcze starają się prze- XHTML, CSS, WCAG, RSS; podstawy
czytać jak najwięcej stron WWW, a następ- XHTML; znajomość podstaw budowy
serwisów WWW.
nie zindeksować i uporządkować ze wzglę-
du na ich treść. Takie zadanie wymaga bar-
Co obiecujemy...
dzo dobrego zrozumienia struktury danych. Optymalizacja stron WWW dla wyszuki-
Zgodnie z powyższym można posta- warek (SEO). Dowiesz się, jaki jest zwią-
wić tezę, że wspierając standardy W3C, zek pomiędzy standardami W3C i SEO.
optymalizujemy strony dla wyszukiwarek Nauczysz się też podstaw optymalizacji
dla wyszukiwarek.
internetowych.
produktach lub usługach. SEO ma ogrom- cy pełną wbudowaną funkcjonalność po- Uzyskujemy dzięki temu adres postaci:
ne znaczenie dla witryn WWW, a zwłasz- trzebną do zarządzania informacją z bar- http://www.domena.com/content/view/
cza przedsięwzięć komercyjnych. Świadomi dzo elastycznym systemem szablonów, full/66 w miejsce przykładowego ad-
tego faktu projektanci potrafili zaimplemen- • Content Management Framework (CMF) resu pozbawionego translacji: http://
tować wsparcie dla SEO w budowanych – wzorzec projektowy dla różnorodnych www.domena.com/index.php?id_kat=
przez siebie systemach zarządzania treścią. systemów informacyjnych; jest otwarty, news&art=123&SessID=123jkls8je3k-
Standardy W3C zapewniają wsparcie SEO, elastyczny, rozszerzalny, skalowalny, a s905lpswas23we89d9ei.
ponieważ promują: przede wszystkim wspiera standardy. • Translacja z adresowania systemo-
wego do “nice urls” (automatyczna),
• oddzielenie treści od formy jej prezen- eZ Publish wykorzystuje takie standardy i czyli zamiana parametrów systemo-
tacji (wykorzystanie XHTML dla opisu protokoły jak: XHTML, CSS, WCAG, RSS, wych na czytelne dla człowieka fra-
treści, CSS dla formatowania), Open Document, SOAP, WebDav. zy. Translacja odbywa się na podsta-
• właściwe wykorzystanie języka opisu Najbardziej istotne z punktu widze- wie nazw kolejnych obiektów w ścież-
strony (brak błędów składni w XHTML nia systemu WCM są standardy kreowa- ce do przeglądanego dokumentu.
ułatwia systemom wyszukiwawczym po- ne przez W3C, czyli XHTML, CSS oraz Przykładowo, zamiana adresu: http://
prawnie interpretować treść dokumentu), WCAG. Zgodność z nimi zapewnia rów- www.domena.com/content/view/full/66
• stosowanie właściwej struktury doku- nież pomoc w optymalizowaniu serwisów na “nice url”: http://www.domena.com/
mentu (XHTML udostępnia znaczni- dla systemów wyszukiwawczych. oferta/uslugi/seo. W efekcie takiej zamia-
ki dla podstawowych jednostek infor- ny systemy wyszukiwawcze otrzymują
macyjnych dokumentu: nagłówki, listy, Wbudowane dodatkową informację (słowa kluczowe)
paragrafy, odnośniki, grafiki itd.), wsparcie dla SEO na temat zawartości dokumentu.
• wykorzystanie metainformacji (XHTML eZ Publish posiada mechanizm “przyja- • Translacja manualna dokonywana
pozwala na zdefiniowanie: tytułu, opi- znego adresowania”, który podzielić moż- przez administratora serwisu. Dzięki
su zawartości, słów kluczowych, usta- na na 3 poziomy: odpowiedniej funkcjonalności eZ Pu-
wień języka itp.), blish administrator może samodziel-
• dostępność treści stron (wskazania • Adresowanie systemowe (automa- nie dokonać konwersji adresu. Taka
Web Content Accessibility Guidlines tyczne), czyli zapisywanie adresów funkcja nie jest wykonywana często,
– WCAG – promują np. dodawanie URL pozbawionych znaków innych niż jednak może znacznie skrócić adres
alternatywnych opisów dla obiektów alfanumeryczne oraz znaków podkre- oraz podkreślić słowa kluczowe. Funk-
osadzanych, typu obrazki i multime- ślenia. Podstawową zaletą tej transla- cja jest również przydatna w sytuacji,
dia oraz alternatywnych bloków <no- cji jest pozbycie się znaków charakte- kiedy adres URL powinien być łatwy
script> i <noframes>). rystycznych dla przesyłania parame- do zapamiętania (np. trzeba go podać
trów w żądaniu GET protokołu HTTP. słownie lub zamieścić na plakacie).
Dla systemu Web Content Management
(WCM) wspieranie standardów siecio-
wych oraz SEO to podstawowe wymaga-
nia. W jaki sposób system może wspie-
rać optymalizację? Jest przynajmniej kil-
ka możliwości:
eZ Publish i standardy
eZ Publish przedstawiany jest jako:
• Content Management System (CMS) Rysunek 1. Narzędzie translacji adresów URL dostępne z poziomu panelu administra-
– system zarządzania treścią zawierają- cyjnego eZ Publish
Szablony oparte
na blokach <div>
W przeszłości układ strony WWW two-
rzony był przy użyciu zagnieżdżonych ta-
bel, co pozwalało na bardzo wygodne roz-
mieszczanie elementów na stronie, jednak
powodowało kilka istotnych problemów.
Oto najważniejsze z nich:
• elementy formatowania pomieszane z wiedniego interpretowania jego zawarto- Dynamiczna mapa nie jest już nowo-
treścią strony (np. wstawienie instruk- ści przez wyszukiwarki. Format zapisane- ścią w systemach typu WCM. Jest ona
cji dla CSS bezpośrednio w znaczniku go dokumentu XHTML 2.0 jest następnie cenna, ponieważ wiarygodnie odzwier-
HTML lub „tworzenie nagłówka” z ko- konwertowany na zgodny z XHTML 1.0 ciedla strukturę serwisu, a przez to do-
mórki tabeli przez odwołanie do odpo- przy wykorzystaniu szablonów systemu. brze opisuje jego zawartość. Dodatkowo,
wiedniej klasy zdefiniowanej w CSS), Wysokiej jakości formatowanie zgod- nazwy działów i dokumentów są wysoko
• skomplikowana interpretacja – kod ne z XHTML jest kluczowe dla SEO. Po- oceniane, ponieważ mają formę nagłów-
źródłowy HTML był zwykle dużo więk- zwalając redaktorom serwisu na dowol- ków i odnośników.
szy i często składał się z wielokrotnie ność (wstawianie niepoprawnego kodu eZ publish umożliwia generowanie ma-
zagnieżdżonych tabel. HTML) niszczy się efekt pracy włożonej w py serwisu lub jego dowolnej gałęzi. Jeżeli
tworzenie zgodnych ze standardami sza- zatem tworzymy stronę z kilkoma rozbudo-
Ponieważ podstawowym celem stawia- blonów stron. wanymi działami lub nawet kilka serwisów
nym CMS jest oddzielenie warstw: treści i WWW opartych na jednej instancji systemu
prezentacji, szablony wzorcowe w eZ Pu- Dostępność CMS, możliwe jest niezależne generowanie
blish skonstruowane są bez użycia tabel, Wskazówki WCAG służą dostosowa- map dla działów lub serwisów.
a oparte na blokach <div>. Taka konstruk- niu treści dostępnych na stronach WWW Mapa strony generuje się automa-
cja pozwala zamknąć stronę WWW w czy- użytkownikom starszym, niepełnospraw- tycznie po odwołaniu do adresu: http://
stej formie dokumentu XML. nym oraz interpretację przez urządze- www.domena.pl/content/view/sitemap/x,
Zalety takiego rozwiązania są istotne, nia mobilne. Podobnie, jak inne standar- gdzie “x” oznacza numer węzła w drze-
ponieważ niwelują wady stylu tabelarycz- dy kreowane przez W3C, daje on również wie struktury zawartości. Przykładowy kod
nego, oferując w zamian: silny oręż do optymalizacji dla wyszukiwa- strony związany bezpośrednio z mapą
rek. Jedną z reguł, którą powinny spełniać może posiadać następującą formę:
• oddzielenie treści (zamkniętej w for- witryny zgodne z WCAG, jest konieczność
macie XHTML) od formy (formatowa- opisywania grafik. <h1><a href=”/”>Mapa strony Domena.com
nie w CSS), Mówi się, że jeden obraz znaczy wię- </a></h1>
• czystą konstrukcję dokumentu (widać, cej niż tysiąc słów. Prawdopodobnie dla- <h2><a href=”/dzial_pierwszy”>
gdzie jest tytuł, nagłówki listy i paragrafy) tego wyszukiwarki traktują opisy alterna- Dział pierwszy</a></h2>
• możliwość prostej integracji – importu tywne bardzo poważnie. Nie są w stanie <ul>
lub eksportu danych, zinterpretować treści ilustracji inaczej niż <li><h3><a href="/
• lekką stronę z treścią – mniejszy roz- przez opis, który został do niego dodany. dzial_pierwszy/folder_x">
miar dokumentu, Także w tym zakresie eZ publish udo- Folder X</a></li>
• przenośność pomiędzy przeglądarka- stępnia wygodne narzędzia redaktorskie. <li><h3><a href="/
mi (również urządzeń mobilnych z ma- Dodanie obrazka i opisanie go pozwoli dzial_pierwszy/
łymi ekranami). wygenerować kod XHTML z opisem alter- folder_y">Folder Y</a></li>
natywnym, czyli znacznik postaci: </ul>
Znaczniki treści formatowanych <h2><a href=”/dzial_drugi”>
Większość nowoczesnych systemów <img src="ilustracja.png" Dział drugi</a></h2>
WCM udostępnia redaktorowi wbudowa- alt="Alternatywny opis dla ilustracji" /> <ul>
ną aplikację – edytor online, który pozwa- <li><h3><a href="/
la formatować treść stron WWW. Ważne Mapa strony dzial_drugi/folder_a">
jest, aby zapisywana po sformatowaniu Dla procesu indeksowania stron WWW Folder A</a></li>
treść była również zgodna ze standarda- niezwykle istotne jest wewnętrzne linko- <li><h3><a href="/
mi W3C. Generowanie kodu zawierające- wanie, czyli powiązania pomiędzy strona- dzial_drugi/folder_b">
go wpisane formatowanie CSS lub znacz- mi serwisu. Stąd dla wyszukiwarek klu- Folder B</a></li>
niki <FONT> jest niedopuszczalne. czową rolę odgrywają strony-bramy, czy- <li><h3><a href="/
eZ Publish posiada własne dedykowa- li strony zawierające dużą liczbę odnośni- dzial_drugi/folder_c">
ne rozwiązanie wyróżniające się zgodno- ków wewnętrznych. Najpopularniejszym Folder C</a></li>
ścią ze standardem, za który obrano kre- przykładem takiej strony jest „Mapa ser- </ul>
owany przez W3C XHTML 2. Z pozoru wisu”.
podstawowe formatowanie tekstu jako na-
główków, paragrafów, list punktów stano-
wi jeden z kluczowych elementów odpo-
RSS dostarczonymi przez eZ Publish „w pu- Dla systemu WCM, którego głównym
Nowoczesne systemy wyszukiwawcze dełku”, można wzbogacić go o nową zadaniem jest oddzielenie treści od pre-
cenią wysoko aktualne treści, dlatego dla funkcjonalność. Rozszerzalność syste- zentacji, generowanie dowolnego formatu
procesu SEO ważna jest częsta aktuali- mu oraz możliwość modyfikacji to rów- dokumentu nie powinno stanowić proble-
zacja zawartości. Blogi oraz wszelkiego nież cechy ważne dla programistów roz- mu. System eZ Publish pozwala budować
typu serwisy dostępne w formie RSS sta- wiązań bazujących na WWW. Dzięki szablony w dowolnym standardzie zgod-
nowią cenne źródło bieżącej informacji. nim można zaimplementować ulepszo- nym z XML. W domyślnej wersji system
Dodatkową zaletą witryn WWW, udo- ną obsługę znaczników <meta>, albo pracuje z XHTML 1.0 Transitional. Można
stępniających subskrypcję RSS, jest moż- Google Sitemaps. jednak opracować własny format.
liwość publikowania skrótów wiadomości w Specjalnie dla potrzeb Google Site-
innych serwisach. W takich sytuacjach stro- Metatagi maps udostępniona została wtyczka do
na otrzymuje to, co w przypadku rankingu Google jasno informuje o całkowi- systemu, pozwalająca generować doku-
Google jest najważniejsze – odnośniki do tym ignorowaniu zawartości tagów me- menty w takim właśnie formacie.
własnej treści z zewnętrznych witryn. ta “keywords”. Musimy jednak pamię- Rozszerzenie można pobrać ze stro-
Możliwość importu i eksportu kana- tać, że inne mechanizmy wyszukiwaw- ny społeczności: http://ez.no/community/
łów RSS jest jedną z podstawowych funk- cze niekoniecznie postępują w ten sam contribs/template_plugins/googlesite-
cjonalności eZ Publish. Wykorzystując na- sposób. Jeśli nawet metatagi nie stano- maps_extension
rzędzia dostępne w panelu administracyj- wią podstawy opisu informacji zawartych
nym, automatyzujemy generowanie RSS na stronie, to stanowią część opisu jego Podsumowanie
dla eksportu oraz importu. zawartość. Jednym z celów, jaki chcemy osiągnąć przy
Import, czyli pobieranie informacji z Warto zatem w przypadku, gdy SEO budowie strony WWW, jest dotarcie do sze-
obcej lokalizacji, pozwala wzbogacić ser- jest dla nas bardzo ważne, skonstruować rokiego grona zainteresowanych prezento-
wis o: mechanizm obsługi dla osób redagują- waną tematyką odbiorców. Pragniemy, aby
cych treść. W przypadku eZ Publish zada- planowana grupa docelowa wiedziała o je-
• częstą aktualizację, nie jest proste i polega na: go istnieniu. Często nie możemy sobie po-
• wartościowe treści związane z tema- zwolić, żeby było inaczej. Najlepszym przy-
tem witryny (wzmocnienie słów klu- • rozszerzeniu klasy Artykuł, czyli do- kładem jest sklep internetowy.
czowych), daniu nowych atrybutów – pól teksto- SEO to nie pozycjonowanie, ale opty-
• odnośniki zewnętrzne do cennych źró- wych o nazwach: „Słowa kluczowe” malizacja – pomaganie wyszukiwarce
deł informacji (wartościowe źródła mo- oraz “Description”, w odpowiedniej interpretacji zawartości
gą wzmacniać wiarygodność strony). • dodaniu krótkiego skryptu szablo- wszystkich stron serwisu WWW.
nowego, który wyświetli zawartość Mając zamiar wykorzystać system
Eksport, czyli udostępnianie własnych treści: wypełnionych pól w znacznikach CMS, gotowe narzędzie zapewniają-
<meta name=”description”> i <meta ce podstawową funkcjonalność zarzą-
• wzbogaca rozwiązanie o nowy kanał name=”keywords”> niezależnie dla każ- dzania treścią, należy zwrócić uwagę,
komunikacyjny, dej strony. czy respektowane są w nim standar-
• pozwala uzyskać odnośniki do naszej dy W3C. Jeśli tak jest, uzyskamy także
strony, które pochodzą z innych witryn. Google Sitemap wsparcie dla procesu SEO.
W Google opracowano technikę wspie- Wbudowana konwersja adresów URL
Samodzielne rającą proces indeksowania witryn. Go- pozwalająca uzyskać przyjazne odnośni-
rozszerzenie wsparcia SEO ogle Sitemaps to dokumenty XML o spe- ki, staje się normą. Należy jednak zwró-
Poza wymienionymi wyżej przykładami cyficznej składni, odzwierciedlające struk- cić uwagę na inne elementy optymalizacji,
wsparcia SEO przez systemy WCM, a turę serwisu. a przede wszystkim odpowiednie dostoso-
wanie do standardów sieciowych. Czytelny
dokument jest sprzymierzeńcem SEO. n
O autorze
Juliusz Całyniuk zajmuje się zarządze-
niem projektami oraz relacjami z klienta-
mi i partnerami WebStyle Systems. Od
siedmiu lat jest związany z oprogramo-
waniem dla platformy LAMP. Współtwo-
rzy serwis polskiej grupy użytkowników
systemu eZ Publish.
Kontakt:
Rysunek 7. Funkcjonalność eksportu i importu RSS w panelu administracyjnym juliusz.calyniuk@ws-webstyle.com
eZ Publish
Główna strona firmy gdaq.pl multimedia zajmu- Strona zajmująca się różnymi zagadnieniami z Strona jest polską bazą tutoriali, zawierającą
jącej się kreowaniem wizerunku firm poprzez działu IT. Prezentuje m.in. newsy, artykuły oraz różnorodne teksty o tematyce informatycznej.
projektowanie stron, hosting, e-marketing etc. pliki do ściągnięcia i forum. www.webtutorials.pl
www.gdaq.pl www.huntersq2.boo.pl
Misją serwisu jest dostarczanie rzetelnych in- Portal w całości poświęcony językowi PHP. Strona, na której znajdziesz profesjonalne sza-
formacji z zakresu szeroko pojętej informatyki. Można tu znaleźć m.in. recenzje, artykuły oraz blony stron www. Ponadto prezentuje tutoriale,
Strona zawiera newsy m.in. z działów: progra- newsy poświęcone temu zagdnieniu. artykuły i porady dla webmasterów.
mowania, bezpieczeństwa oraz Internetu. www.php.pl www.d4u.pl
www.itnews.icx.pl
To serwis branży IT, oferujący m.in. newsy, ar- Serwis dla początkujących, jak i zaawansowa- Główna strona studentów Politechniki War-
tykuły, recenzje książek i magazynów oraz fo- nych webmasterów. Zawiera gotowe szablony szawskiej.
rum. Strona obejmuje również patronat nad stron oraz posegregowane skrypty PHP i Ja- www.polibuda.info
projektami IT. vaScript.
www.webhat.pl www.szablonypro.com
Dla zaawansowanych
W
dobie społeczności Inter- osobne pole na wybór oceny, jednak
netu istotne jest, by znać wynik będzie uzyskany kosztem wielu
opinie jego użytkowników kliknięć Internauty – a więc często je-
na wszelkie tematy. Na wielu witry- go frustracji. Takiej sytuacji nie ryzyku-
nach spotykamy więc ankiety, w któ- ją webmasterzy, tworząc ankiety z jed-
rych oceniamy pewne zachowania, sy- ną możliwą odpowiedzią. Od 2005 ro-
tuacje, zdarzenia, czy też informuje- ku, kiedy to rozpowszechniła się tech-
my o naszych upodobaniach. Na pew- nologia AJAX, zadanie to stało się nie-
no jednak każdy z nas trafił na ankie- mal trywialnie proste. Nieznajomość
tę, która zmusiła go do refleksji – jeże- nowej technologii, niechęć do języka
li bowiem mamy do wyboru dwie nie- JavaScript i obawy o niekompatybil-
mal równoważne możliwości, wybranie ności przeglądarek powodują jednak,
W SIECI jednej, oznacza dyskredytację drugiej. że w Internecie niemal niemożliwe jest
Ten mankament powoduje, że ankiety spotkanie ankiet hierarchicznych. Re-
w Internecie nie odzwierciedlają ide-
• http://prototype.conio.net/ alnie gustów ankietowanych. Idealna
– framework AJAX-owy,
• http://script.aculo.us/
ankieta powinna więc pozwalać nam Co należy wiedzieć…
– pakiet Script.Aculo.Us, na udzielenie kredytu nie tylko jednej Przydatna będzie znajomość podstaw
• http://www.sergiopereira. technologii AJAX.
opcji. Jakkolwiek taki stan rzeczy wy-
com/articles/prototype.js.
html – obszerny opis daje się oczywisty w życiu codzien-
Prototype, nym. Tak, jest to trudne zadanie do Co obiecujemy…
• http://ajax.eldoras.com Dowiesz się, jak tworzyć ankiety w sty-
– witryna projektu ankiet
zrealizowania przy pomocy formularzy
lu rankingowym przy pomocy technolo-
AJAX-owych Autora. dostępnych w HTML. Możemy wpraw-
gii AJAX.
dzie obok każdej z pozycji umieścić
wolucja nadeszła jednak wraz z opra- ny jest banalnie proste i skuteczne. Na języka CSS (reprezentowanym przez
cowanym przez Sama Stephensona bazie tego wspaniałego skryptu stwo- identyfikatory) efektów pojawiania się,
frameworkiem Prototype dla języka Ja- rzono także zestaw graficznych udo- ukrywania, przenoszenia i wielu in-
vaScript. Dzięki niemu, tworzenie po- godnień w języku JavaScript – Scrip- nych, kompatybilnych z większością
łączeń AJAX-owych ze skryptem PHP taculous. Stosując ten pakiet, otrzyma- nowoczesnych przeglądarek. Stosując
bez konieczności przeładowania stro- my możliwość nadawania elementom wszystkie te udogodnienia, możemy
stworzyć efektowny oraz efektywny
system rankingowy.
Listing 1. Wygląd ogólny ankiety w kodzie HTML
CSS zostały zdefiniowane tak, by an- nić witryna po pobraniu wyników zapy- Zliczamy głosy
kieta wyglądała odpowiednio, mimo że tania AJAX. Nam wystarczy jednak ta Nasz system ankiet jest już niemal goto-
użyjemy do jej prezentacji listy HTML. jedna – jeśli zależy nam na transferze, wy. Musimy jeszcze dopisać kod odpo-
Biorąc pod uwagę dostępność, nale- możemy pokusić się o wycięcie nieuży- wiedzialny za zliczanie głosów i ich wy-
żałoby stworzyć formularz HTML dla wanych fragmentów kodu z pliku proto- świetlanie. Zadanie może sprawić trudno-
osób z wyłączoną obsługą JavaScript, type.js. Do wyjaśnienia pozostała jesz- ści jedynie przy zagadnieniu rozkodowy-
który dzięki niemu byłby ukrywany, cze zmienna pars. Wiąże się ona z pa- wania przesłanego w zmiennej rates łań-
jednak nie jest to w gestii tego artyku- kietem Scriptaculous, którego funkcja cucha. Listing 5. pokazuje, jak tego doko-
łu. Możliwości wyboru zostały wpisane Sortable.serialize() zwraca ciąg zna- namy. Najpierw, zamienimy go na tablicę,
do tablicy, a następnie wyświetlone za ków w stylu tego z zapytań GET, które- z której pozbędziemy się zbędnego wy-
pomocą pętli. Wygląd ankiety został go składowymi są numery pozycji z na- miaru (categories). Następnie przetwo-
przedstawiony na Rysunku 1. szej listy, przypisane jako kolejne ele- rzymy ją w pętli, przypisując kolejnym po-
menty tablicy, o nazwie będącej iden- zycjom (istotna jest tu kolejność w tablicy
Prototype w praktyce tyfikatorem listy. W naszym przypad- $options) ich kolejność ustaloną przez
Po kodzie naszego przycisku można ku, dla niezmienionej kolejności pól, użytkownika (przy czym niższa liczba
poznać, że aktywuje on funkcję Sub- funkcja ta zwróci następujący ciąg: oznacza wyższą pozycję). Wszystko, co
mitForm z parametrem będącym iden- categories[]=1&categories[]=2&catego pozostało do zrobienia, to wpisanie wyni-
tyfikatorem listy naszej ankiety. Funk- ries[]=3&... itd. Kłopot w tym, że jeżeli ków do bazy danych (zapewne będziemy
cja ta (Listing 2.) będzie zdefiniowa- prześlemy taki ciąg znaków bezpośred- odejmować wybraną kolejność od ilości
na wewnątrz znacznika head. Będzie nio jako zbiór parametrów, otrzymamy wyborów, by uzyskać wyższą notę dla po-
to główny silnik naszej aplikacji: jej za- w PHP tablicę z jedynie jednym – ostat- zycji wyżej notowanej w hierarchii) przez
daniem będzie połączenie się z pli- nim – elementem. Musimy więc cały sumowanie oraz wypisanie aktualnych wy-
kiem rate.php z parametrami określo- ciąg znaków eskejpować i przypisać do ników. Tę część pracy pozostawiamy czy-
nymi w zmiennej pars (o nich za chwi- jednej zmiennej (rates), którą będziemy telnikowi, wymaga bowiem jedynie użycia
lę). Do wykonania połączenia wykorzy- rozkodowywać na właściwą tablicę po prostych zapytań do bazy oraz kilku lini-
stamy klasę AjaxUpdater frameworka stronie serwera. Pozostało nam jesz- jek kodu CSS odpowiednio formatujące-
Prototype. Jak można się spodziewać, cze przypisanie odpowiednich efektów go wyniki (nie zapomnijmy go uwzględnić
wywołuje ona witrynę z danymi para- wizualnych do naszej listy. Uzyskamy już w pliku index.php!). By otrzymać wy-
metrami, przekazując je przy pomo- to, stosując funkcję Sortable.create() niki własnego głosowania względem po-
cy określonej metody, zaś to, co zosta- pakietu Scriptaculous. Jej kod, widocz- zycji w tablicy $options, wystarczy użyć
nie odesłane, trafi do znacznika o iden- ny na Listingu 3, musimy umieścić po kodu zaprezentowanego na Listingu 5.
tyfikatorze target, zastępując już obec- kodzie listy, bowiem będzie on ją mo- Porównując wartości $item['order _ id']
ny tam kod (w naszym wypadku ankie- dyfikował – musi więc być już widocz- z indeksami tablicy $options, otrzymamy
ta zostanie zastąpiona jej wynikami). na. Najlepiej kod ten wkleić zaraz przed listę dostępnych wyborów.
Prototype oferuje także szereg innych znacznikiem kończącym body. Pełen
klas i funkcji, które pomagają w pre- kod pliku index.php, w odpowiedniej ko- Co dalej?
cyzyjnym określeniu, jak ma się zmie- lejności, widoczny jest na Listingu 4. Jak pokazaliśmy, stworzenie efektownej
i efektywnej ankiety przy pomocy frame-
Listing 2. Funkcja wysyłająca ankietę worka Prototype, zestawu Scriptaculous
oraz PHP jest łatwe i intuicyjne. Jako za-
<script type="text/javascript" language="javascript"> danie domowe pozostawiamy połączenie
// <![CDATA[
wyników z bazą danych. Czytelnicy, któ-
function SubmitForm(someid){
var url = 'rate.php';
rzy gustują w rozwiązaniach AJAX-owych,
var pars = 'rates='+escape(Sortable.serialize(someid)); zapewne zechcą użyć dodatku Behavio-
var target = 'container'; ur (http://www.bennolan.com/behaviour/).
var myAjax = new Ajax.Updater(target, url, {method: 'post', Został on stworzony przez Bena Nolana,
parameters: pars});
który słusznie zauważył, że wprowadzając
}
dodatkowe parametry do znaczników (np.
// ]]> onClick w naszym "przycisku"), ponow-
</script> nie zanieczyszczamy kod, który powinien
być zgodny z wytycznymi XML. Behavio-
Listing 3. Funkcja przypisująca efekty wizualne do listy ur pozwala na przypisanie elementom za-
<script type="text/javascript" language="javascript"> chowań JavaScript za pomocą ich identy-
// <![CDATA[ fikatorów. W ten sposób dołączamy kolejny
Sortable.create('categories',{dropOnEmpty:true,handle:'handle', plik w nagłówku witryny, jednak oczyszcza-
constraint:false}); my sam kod HTML. Czytelnicy pragnący
zastosować ten typ ankiety powinni pamię-
// ]]>
tać, by wartości głosów były odpowiednio
sprawdzane pod kątem zgodności w pliku
ASwing + AMFPHP,
czyli przepis na szybkie GUI
Stopień trudności: lll
Rafał Malinowski
C
elem artykułu jest przedsta- • część druga wprowadza do podstaw
wienie zalet tworzenia inter- OOP w ActionScript 2.0,
fejsu użytkownika we Flash-u. • część trzecia przedstawia ASwing
Chcemy pokazać, jak łatwo i przyjem- – narzędzie do tworzenia GUI z do-
nie da się tworzyć GUI dla aplikacji na- stępnych graficznych komponentów,
pisanych w PHP. Będziemy do tego ce- • część czwarta zaznajamia z AMFPHP
lu używać biblioteki ASwing, która po- – zapewniającym wydajną komunika-
zwala na budowę aplikacji z gotowych cję Flash-a z PHP-em.
graficznych komponentów. Przekaże-
my wiedzę, która każdemu początkują- Na samym końcu, w oparciu o to, co zo-
cemu programiście pozwoli na zbudo- stało przedstawione, napiszemy bardziej
wanie RIA, wykorzystując w zaawan- zaawansowaną aplikację typu klient-ser-
sowany sposób PHP-owy serwer apli-
kacji. Artykuł podzieliliśmy na cztery
tematyczne części. W każdej Czytelnik Co należy wiedzieć...
znajdzie konkretny, bardzo uproszczo- Przydatna będzie znajomość zasad pro-
gramowania obiektowego.
ny, ale działający przykład, zgodnie z
formułą HelloWorld, czyli bez dodatko-
wych upiększaczy. Co obiecujemy...
I tak: Dowiesz się, jak szybko i łatwo stworzyć
w GUI dla Twojej PHP-owej aplikacji, jak
w prosty sposób przesyłać dane między
• część pierwsza dotyczy procesu two- PHP a Flash-em. Nauczysz się też pod-
rzenia aplikacji Flash-owych w opar- staw programowania w ActionScript 2.0.
ciu o darmowe narzędzia,
wer, która będzie już wymagała od Czy- nym programem zapewniającym kompa- skompiluje program do postaci Hello-
telnika nieco samodzielnej pracy. tybilność z Flash Player-em, w wersjach World.swf. Tak przygotowany plik mo-
do 8 włącznie i do tego jest to jeszcze żemy otworzyć w przeglądarce interne-
Hello World – MTASC program pisany w konwencji opensour- towej z zainstalowanym FlashPlayer-em.
Na początek, prosty przykład pokazujący ce. Jak widać, same plusy. Przeglądarka, otwierając plik o rozsze-
podstawy działania kompilatora MTASC, Przyjrzymy się podstawowej składni rzeniu .swf, przekaże jego obsługę do
którego będziemy używać do tworze- kompilującej kod programu do pliku .swf: FlashPlayer-a, który powinien pokazać
nia aplikacji Flash-owych. MTASC (http:// nam w przeglądarce napis Hello World !
www.mtasc.org/) jest kompilatorem pli- mtasc (pliki .as z kodem programu) -swf Jeśli mamy problemy z kompilacją
ków .as wywoływanym z linii poleceń. (nazwa pliku swf) programu, znaczy to, że popełniliśmy ja-
Jego zadaniem jest zamiana kodu kiś błąd podczas pisania.
zrozumiałego dla człowieka na kod ma- W celu przetestowania MTASC na- Możliwe błędy podczas kompilacji to
szynowy, dający się uruchomić w prze- piszemy prosty program w języku przede wszystkim błędy występujące w
glądarce przy pomocy Flash Player-a, ActionScript 2.0. Tworzymy nowy plik w składni kodu. W takim przypadku kompi-
czyli popularnie nazywanego SWF lub naszym ulubionym edytorze tekstowym lator zwraca dokładne informacje na te-
MovieClip. MTASC wywoływany jest z li- i nazywamy go HelloWorld.as, a na- mat umiejscowienia błędu:
nii poleceń, można go więc zintegrować stępnie wpisujemy kawałek kodu przed-
z różnymi edytorami plików tekstowych stawiony na Listingu 1. nazwa pliku : numer linii : numer znaku
czy programów automatyzujących pro- Po zapisaniu pliku, komenda: w linii : komunikat błędu.
ces kompilacji (np.: Ant) – my w dalszej
części artykułu pokażemy, jak zintegro- mtasc HelloWorld.as -swf HelloWorld.swf Kod, w którym nie zamknęlibyśmy klam-
wać go z Eclipse 3.1. MTASC jest potęż- -main -header 800:600:20 ry kończącej definicję klasy HelloWorld
spowodowałby komunikat błędu nastę-
pującej postaci:
Listing 1. Plik HelloWorld.as
poczyna swoje działanie od wywoła- MovieClip-ów. MovieClip-y tworzą struk- da np. po dwie kropki i kreskę. Wszyst-
nia metody statycznej main(mc:Movie- turę drzewiastą, czyli każdy MC ma swo- kie akcje, które wywołamy na wskaza-
Clip), (parametr -main). MovieClip (MC) jego rodzica i może mieć wiele dzieci. W nym MovieClip-ie dotyczyć będą rów-
to pojedynczy obiekt widziany na sce- uproszczeniu, wygląda to więc tak, że nież elementów, które on posiada. Czyli,
nie (czyli w przeglądarce), który jest mamy np. niebieskie tło, które posiada jeśli teraz sprawimy, by jedno kółko prze-
jednocześnie pojemnikiem dla innych na sobie dwa kółka, a każde kółko posia- stało być widzialne, to elementy, które są
do niego przyczepione (dwie kropki i kre-
seczka) też przestaną być widzialne. Jak
Listing 2. Plik ASBasic.as – podstawy składni w ActionScript każde drzewo, tak i to posiada swój ko-
// do skompilowania klasy potrzebne są : rzeń, czyli MovieClip leżący najniżej.
// definicje klas z pakietu mx.data W metodzie main jako parametr mc prze-
import mx.data.*; kazywana jest referencja do _ root, czyli
//definicja klasy mx.controls.Button głównego MovieClip-a na scenie.
import mx.controls.Button;
Dostając referencje do _ root – Movie-
// definicja klasy ASBasic rozszerza def. klasy MovieClip
// ASBasic należeć bedzie do pakietu(ang.:package) : „org.me” Clipa leżącego na samym dole sceny, mo-
class org.me.ASBasic extends MovieClip { żemy osadzić na scenie dowolny obiekt i
// zmienna w AS poprzedzona musi byc słowem kluczowym "var" będzie on widzialny. W naszym przypad-
// AS pozwala na określenie typu zmiennych „:Button” ku jest to TextField, czyli pole tekstowe.
public var button:Button;
Metoda createTextField tworzy nową in-
// kwalifikatora dostępu protected w AS nie występuje
// protected var pProtected; stancję TextField, nadając jej nazwę „my-
// typowanie zmiennych nie jest konieczne Text” i ustawiając głębokość osadzenia na
public var object; poziomie 1. Głębokość osadzenia Movie-
/** Clip-a na scenie to poprostu kolejność, w
* Konstructor – nazwa methody musi być taka jak nazwa klasy
jakiej będą rysowane elementy na ekra-
*/
public function ASBasic(name:String) { nie. Jeśli więc jeden obiekt rysowany bę-
// wywołanie konstruktora klasy dziedziczonej dzie wczesniej, a drugi później, to ten dru-
super(); gi może zasłonić pierwszy. Sytuacja taka
// $this->param zamieniamy na this.param pojawia się, gdy więcej MovieClip-ów na-
this.button = new Button();
leży do jednego MovieClip-a i ważna sta-
// try, catch, finally działa identycznie jak w PHP
try { je się ich kolejność. Kolejne parametry
this.setName(name); metody createTextField to współrzędne
} x i y (100, 200) oraz wysokość i szerokość
catch (e:Error){ pola tekstowego (300,400). Nazwa jaką
this.setName("Basic example");
ustaliliśmy dla tworzonego obiektu („my-
}
finally { Text”), jest potrzebna, by w kolejnych kro-
} kach operować na jego właściwościach,
} czyli między innymi przypisać do para-
// metoda w AS tak jak w PHP poprzedzona musi być metru text wartość HelloWorld (mc.my-
// słowem kluczowym „function”
Text.text = "Hello World !";), co jest
public function add(p1:Number,p2:Number) : Number {
var sum : Number = p1 + p2; równoznaczne z wypełnieniem pola tek-
return sum; stowego tekstem HelloWorld.
}
private var name:String; Przygotowujemy
public function getName() : String {
return this.name;
narzędzia do pracy
} Oczywiste jest, że na dłuższą metę pro-
public function setName(name:String) : Void { gramowanie w notatniku staje się meczą-
if (name !== null) { ce. Nawet, jeśli używamy edytora teksto-
this.name = name; wego, który koloruje nam kod, to podpo-
}
wiadanie składni i wykrywanie błędów
else {
throw new Error("Name can not be null!"); semantycznych jest niezastąpioną po-
} mocą dla każdego, a zwłaszcza począt-
} kującego programisty. Skupimy się te-
public function addStrings(s1:String,s2:String) : String { raz na przygotowaniu środowiska pra-
// dodawanie String-ow w AS
cy tak, aby programowanie w Action-
// używamy operatora „+”
var sum:String = " " + s1 + s2; Script-cie stało się naprawdę przyjemne.
return sum; Do tego celu użyjemy IDE Eclipse (http:/
} /www.eclipse.org). Dostępne są jeszcze
} inne edytory wspomagające pracę z Ac-
tionScript-em. Wartym wspomnienia jest
przykład Se|Py (http://www.sephiroth.it/ na liście FDT (lub/i ASDT) i klikamy „Windows” -> „Preferences”
python/sepy.php), ale Eclipse jest na- „Finish”.
rzędziem znanym większości programi- Aby zainstalować Flashout (który po- Rysunek 1. przedstawia to, co powin-
stów PHP, stąd nasz wybór padł właśnie trzebny będzie dla tych, którzy wybrali niśmy zobaczyć. Powinniśmy usta-
na niego. Eclipse wymaga zainstalowanej ASDT), ściągamy ze strony projektu pa- wić tu ścieżkę do kompilatora MTASC
wirtualnej machiny Java. Mamy tu dowol- kiet instalacyjny. Po rozpakowaniu, prze- (parametr MTASC dla obu wtyczek),
ność w wyborze wersji Javy, ale propo- grywamy znajdujący się w środku kata- oraz ścieżkę do bibliotek Action-
nujemy zainstalować wersję 5, którą bę- log plugin do odpowiedniego (też plugin) Script-a (FDT – „Core Libraries”, ASDT
dzie w przyszłości wymagana przez roz- w folderze macierzystym Eclipse. „Core path”). Core Libraries to zbiór
szerzenie Flashout. Po ściągnięciu Ec- podstawowych dla Flash-a bibliotek,
lipse, koniecznie w wersji 3.1.x (my bę- Konfiguracja Eclipse które dostajemy wraz z MTASC w ka-
dziemy pracować na 3.1.2) przechodzi- Po zainstalowaniu, FDT (czy ASDT) wy- talogu /std.
my do instalacji rozszerzeń wspomagają- maga skonfigurowania. Z menu Eclipse Wtyczki Flashout nie trzeba konfigu-
cych pracę w języku ActionScript. Do wy- wybieramy: rować.
boru mamy:
„Help”->”Software Updates”->
”Find and install...”
Następnie:
ActionScript 2.0 (AS2) nizować kod zgodnie z zasadami OOP Niestety, możliwości, jakie daje nam AS2
– podstawy (Obiect Oriented Programming), czyli w nie są duże i polegają w głównej mie-
ActionScript 2.0 należy do rodziny ję- postaci klas zapisywanych w oddzielnych rze na wyświetlaniu komunikatów o sta-
zyków skryptowych implementujących plikach. nie wykonywania algorytmu w miejscach
standard ECMA-262. Do rodziny tej W AS2 definicja klasy i nazwa pliku, w uznanych przez nas za krytyczne dla pi-
należy między innymi JavaScript czy którym definicja jest zapisana muszą się sanej aplikacji. Czyli, nie różni się to w ni-
JScript, stąd też osoby znające JS do- pokrywać, czyli klasę ASBasic zapisujemy czym od metody stosowanej w progra-
strzegą na pewno duże podobieństwo w pliku ASBasic.as. Dodatkowo w AS2 mowaniu w PHP, prócz tego, że w AS2
AS2 do tego języka. Porównując AS2 pojawia się nowe dla programistów PHP zamiast funkcji echo() stosujemy trace()
do JS zauważyć należy jedną podsta- pojęcie tzw. pakietu (ang. Package). Pa- (print _ r() nie posiada swojego odpo-
wową różnicę, jaka występuję pomię- kage określa przestrzeń nazw, w obrę- wiednika w AS2 – ale istnieją metody,
dzy tymi językami. JS (w dużym uprosz- bie której nazwa klasy musi być unikalna. aby uzyskać podobny efekt. Stosowa-
czeniu) operuje na danych odzwiercie- Od strony systemu plików struktura pakie- nie metody trace() jest utrudnione, gdy
dlających strukturę znaczników XML- tów zapisywana jest w postaci drzewa ka- programujemy używając MTASC: jej ko-
owych opisujących wygląd strony – do- talogów. Definicja klasy org.me.ASBasic munikaty bowiem nie są wtedy widziane,
brym przykładem będzie tu znacznik zapisana jest więc w pliku ASBasic.as w wyrzuca ona bowiem tekst do wydzielo-
<DIV>. W AS2 występuje podobna struk- katalogu org/me/. Dzięki takiemu podej- nego okna dialogowego jedynie, gdy pro-
tura danych, odzwierciedla ona jednak ściu, nie musimy stosować instrukcji inc- gramujemy używając Adobe Flash IDE.
drzewo MovieClip-ów – czyli np. anima- lude(file _ path); a wystarczy nam import Okno dostępne jest tylko podczas uru-
cji. Tu i tu mamy więc warstwy, przezro- my.package.ClassName; który jednoznacz- chamiania MovieClip-a z poziomu Flash
czystości, współrzędne, ale w AS2 do- nie wskaże definicję klasy ClassName w IDE i jest niedostępne dla programistów
tyczą one innego typu obiektów. Innymi pliku o nazwie ClassName.as w katalogu używających MTASC. Dlatego, aby zo-
słowy MovieClipy to coś takiego jak war- my/package/. baczyć prosty wynik działania meto-
stwy <div> w JS. Dla tych, którzy znają podstawy pro- dy trace() trzeba trochę gimnastyki, co
Dla programistów PHP naukę Action- gramowania obiektowego, definicja kla- zniechęca wielu początkujących. Same-
Script najlepiej rozpocząć od przedstawie- sy ASBasic przedstawiona na Listingu 2. mu należy bowiem zadbać o to, gdzie i w
nia przykładowego kodu. Listing 2 przed- powinna być zrozumiała. Dodatkowe ko- jaki sposób wyświetlane będą przez nią
stawia definicję klasy ASBasic. AS2 jest mentarze powinny wyjaśnić pozostałe komunikaty. Przedstawimy teraz scena-
językiem obiektowym. Istnieje możliwość niejasności. riusz, jak szybko zobaczyć wynik dzia-
programowania w AS2 metodą procedu- łania metody trace(). Jeśli pracujemy z
ralną – program zapisany jest w postaci Debugowanie MTASC, służy do tego następujący para-
luźno rozsianych funkcji czyli procedury, Gdy chcemy nauczyć się jeździć na nar- metr kompilacji:
ale metoda ta wykorzystywana jest głów- tach, czeka nas lekcja wstawania i upa-
nie w pracy z Flash IDE, gdzie graficz- dania. Tak też jest i w programowaniu. - trace nazwa_metody_statycznej
ny interfejs pozwala na zarządzanie po- Zanim więc zaczniemy tworzyć większe
szczególnymi grupami procedur. Przy du- programy, przyjrzymy się możliwościom Sprawia on, że każde wywołanie me-
żych projektach wskazane jest, aby orga- debugowania kodu napisanego w AS2. tody trace() napotkane przez kompila-
tor zostanie zamienione na wywołanie
wskazanej przez nas metody. Zaletą te-
go rozwiązania jest nie tylko to, że z po-
ziomu samego kompilatora możemy ste-
rować, czy i gdzie powinny pojawić sie
generowane komunikaty, ale także to,
że MTASC wzbogaca wywołanie funkcji
zastępującej trace() dodatkowymi trze-
ma parametrami, które określają dokład-
nie miejsce wywołania metody trace():
z Rysunku 4.
������������� ���������������
����������������
������
�������������
������
�������������
���� �������������� �������� ��������� �������������� ������
�������������
������
�������������
������������� �������
���������� ���������
������������ ���������
-trace org.webservicesware.sock4log. Przed uruchomieniem MovieClipa na- Wynik działania kodu widoczny jest na
Tracer.log leży jeszcze uruchomić program na- Rysunku 5. Każda zmiana pola teksto-
słuchujący komunikaty wysyłane przez wego wywołuje akcję onChange() i w
Zmieniamy odpowiednio kod naszego naszą aplikację. Robimy to komendą: efekcie wysyła komunikat do programu
programu tak, by inicjował nowy me- Sock4Log, który prezentuje go nam na
chanizm logowania i wywoływał po- java -jar „Sock4Log.jar” ekranie.
jedynczą metodę trace(); (Listing 3).
śnie takim komponentem. Używamy me- wchodzące w jej skład komponenty. War-
tody append, aby dodać Component do to przejrzeć, jakie jeszcze możliwości da-
naszego okna. je nam ASwing.
Na Listingu 5 przedstawiamy już nieco
bardziej skomplikowany przykład. Na po- Komunikacja Flash
czątku tworzymy kolejno dwa pola JLabel, z otoczeniem
jeden JButton i jedno pole typu Jtext- Twórcy technologii Flash położyli bardzo
Field, w którym można będzie wpisywać duży nacisk na to, by ich produkt był w
tekst z klawiatury. Po dodaniu wszystkich stanie komunikować się ze światem ze-
elementów do tworzonego okna, należy wnętrznym w sposób prosty i ustanda-
ustalić, jak ma reagować nasz program na ryzowany. Firma Macromedia (a teraz
zdarzenie naciśnięcia przycisku: służy do Adobe – będziemy używać obu nazw
Rysunek 7. ASwing – okna programów tego metoda, jaką posiada klasa JButton : firm, ponieważ w Internecie wciąż wię-
akcje na te wysyłane przez otoczenie ko- addEventListener(); cej informacji na temat Flash-a znajdzie-
munikaty. Metoda ta dodaje słuchacza (ang. my wyszukując po nazwie Macromedia
Aby rozpocząć pracę z ASwing, na- Listener), czyli referencję do obiektu, Flash) wyposażyła ActionScript w sze-
leży ściągnąć ostatnie wydanie biblio- który będzie powiadamiany o zdarze- reg bibliotek, pozwalających na komuni-
tek ASwing ze strony www.aswing.org (w niach, jakie wywołuje nasz JButton. W kację z otoczeniem w ustandaryzowany
czasie pisania artykułu była to wersja ba- naszym przypadku, interesuje nas zda- sposób. I tak, do komunikacji ze świa-
ta 1). Następnie musimy dodać biblioteki rzenie kliknięcia, czyli Component.ON _ tem zewnętrznym do wyboru mamy:
do naszego projektu. W tym celu klikamy RELEASE . Dodatkowo, ustawiamy jesz-
prawym przyciskiem myszki na nazwę cze, jaką metodę chcemy, by urucho- • FlashRemoting – pozwala na komu-
projektu w oknie Flash Explorer i wybie- mił JButton na naszym obiekcie, gdy zo- nikację Flash-a z serwerem aplikacji
ramy z listy Properties. Następnie w uka- stanie wywołane zdarzenie, ustawiamy używając do tego standardu Action
zującym się oknie wybieramy: Flash więc actionPerformed. Całość ostatecz- Message Format (AMF), który po-
Properties -> Add Linked Libraries... -> nie ma postać: zwala na serializację i deserializację
Add... i, jeśli wykonujemy tę operację po obiektów przesyłanych między ma-
raz pierwszy, klikamy na New.... Wypeł- convertTemp.addEventListener szynami,
niamy parametry wymagane do stworze- (Component.ON_RELEASE, • XMLSocket – pozwala na komunika-
nia nowej pozycji na liście bibliotek: Na- actionPerformed, this); cję z serwerem używając do tego po-
me -> ASwing – beta1, Location -> ścież- łączenia socketowego,
ka do katalogu ze źródłami ASwing. Teraz wystarczy wykonać operację na • LoadVars – odpowiednik AJAX-owe-
Klikamy na przycisk OK i nowa biblio- własnościach text obiektów JTextField i go XMLHttpRequest. Pozwala na po-
teka powinna pojawić się na naszej liście. udało się nam stworzyć program konwer- bieranie z serwera danych używając
Wybieramy ją, klikamy przycisk OK i mo- tujący temperaturę w stopniach Celsjusza do tego protokołu HTTP. Ten typ ko-
żemy zacząć kodować. na Fahrenheita. munikacji wykorzystywany jest, gdy
Przykłady, które wybraliśmy do za- Wraz z biblioteką ASwing dostajemy chcemy porozumieć się z serwerem
prezentowana działania podstaw ASwing szereg przykładów tego jak wykorzystać przy pomocy standardu XML-RPC,
zostały oparte o tutorial Swing na stronie
http://java.sun.com/docs/books/tutorial/
Listing 6. HelloWorld AmfPHP – przykładowy serwis
uiswing/, tak, aby przedstawić wspólne
części obu bibliotek i jeszcze raz zapro- <?php
ponować naukę ASwing w oparciu o do- class HelloWorldService
kumentację Swing-a. {
function __construct()
Najlepiej będzie rozpocząć naukę od
{
kompilacji i uruchomienia programów (Li- $this->methodTable = array
sting 4 i 5, Rysunek 7). Są one bardzo (
proste i właściwie wystarczy spojrzeć na "say" => array
kod, by wiedzieć, co się w nich dzieje. (
"access" => "remote",
W pierwszym przykładzie (Listing nr 4),
"description" => "Pings back a message"
tworzymy pojedyncze okno z tekstem )
„Hello World”. To, co w tym przykładzie );
jest istotne to fakt, że nie wystarczy stwo- }
rzyć instancji klasy JFrame – odpowiedni- function say($sMessage)
{
ka okna – ale trzeba jeszcze ustawić jego
return 'You said: ' . $sMessage;
visiblity na true. (frame.setVisible(true);). }
Jframe jest klasą dziedziczącą klasę }
Container, oznacza to, że można do niej ?>
dodawać Componenty. Jlabel jest wła-
który powinien znaleźć się gdzieś w oko- Ściągamy plik Gdispatcher.as z http:// • Krok 3: Wywołujemy metodę say()
licach: \Documents and Settings\user_ www.gskinner.com/blog/archives/2003/ serwera aplikacji. Ponieważ wywo-
name\Ustawienia lokalne\Dane aplikacji\ 09/code_gdispatche.html i przegrywamy łanie jest asynchroniczne, czyli nie
Macromedia\Flash 8\en\Configuration\ go do katalogu std/ w macierzystym fol- wiemy, kiedy przyjdzie i czy w ogó-
Classes\ do katalogu MTASC_ROOT/ derze MTASC. le przyjdzie odpowiedź serwera,
std/mx/, gdzie MTASC_ROOT to katalog wywołanie zdalnej metody zwraca je-
domowy naszego kompilatora MTASC. • Krok 3. Przegrać katalog mx/, w którym dynie tzw. PendingCall – obiekt, któ-
Unix-owych użytkowników (lub tych, któ- poprawialiśmy pliki, do katalogu std/ . ry przechowuje informację o toczącej
rzy nie posiadają Flash IDE) czeka trochę się, wywołanej akcji,
dłuższa droga. Należy bowiem: Dopiero teraz możemy przejść do próby • Krok 4: Ustalamy, jaka ma być reakcja
połączenia z serwerem aplikacji. na odpowiedź serwera aplikacji. Two-
• Krok 1. Ściągnąć plik flashremoting _ rząc nowy obiekt RelayResponder
comp_sourcecode.zip – który zawie- Amf-AS – wprowadzenie ustalamy, że przy zakończeniu po-
ra kod źródłowy (dostępny w tym sa- Tworzymy nowy projekt i nową klasę, naz- myślnym akcji należy wywołać meto-
mym miejscu, co Flash Remoting – wijmy ją AmfPhpClient, w pliku AmfPhp- dę say_result na obiekcie this, a przy
patrz wyżej), Client.as. Listing 7. przedstawia przykład zakończeniu błędnym – metodę say _
• Krok 2. Dokonać poprawek w kodzie klasy komunikującej się z naszym serwisem. result, również na obiekcie this,
tak, by można było go kompilować W konstruktorze klasy tworzymy dwa po- • Krok 5: W chwili, gdy serwer aplikacji
przy pomocy MTASC: la tekstowe tfReq i tfResp, które odpowied- przekaże odpowiedź wywołanej przez
nio przechowują tekst do wysłania i pokazu- nas metody, Service przekazuje infor-
plik: mx.remoting.debug.GlobalLocalCon- ją tekst odebrany z serwera. Typ pierwsze- macje o zakończeniu oczekiwania na
nection go pola ustawiamy na „input” tak, by mogło odpowiedź do ustawionego przez nas
linia 93 – zmieniamy z : var suc:Boolean być edytowane. Inicjujemy też obiekt klasy PendingCall, który to, w zależności od
= true; na : var suc = true; Log, który będzie informował nas o szcze- tego, jaki był wynik operacji, przekaże
plik: mx.remoting.NetServiceProxy.as gółach operacji na poziomie Log.DEBUG – odpowiedź do odpowiednio wcześniej
linia 60 – zmieniamy z : client czyli najniższym. Metoda onChange(), którą ustawionych metod naszej klasy.
na : this.client nadpisujemy w obiekcie tfReq, będzie roz-
linia 72 – zmieniamy z : serviceName poczynała proces komunikacji z serwerem W ten sposób możemy przejąć odpo-
na : this.servicename aplikacji po każdej zmianie treści pola tek- wiedź z serwera i wyświetlić ją na ekra-
linia 73 – zmieniamy z : nc stowego, wysyłając do serwera aktualną je- nie. Listing 8. przedstawia wykaz komu-
na : this.nc (w obu miejsach) go wartość. Sam proces komunikacji z ser- nikatów, jakie dostaliśmy podczas wyko-
linia 74 – dodaj średnik : ; za klamrą za- werem aplikacji wygląda tak: nywania tej operacji: komunikaty rozpo-
mykającą funkcję var f=function... czynające się od AmfPhpClient-Logger->>
plik: mx.remoting.debug.commands. • Krok 1: Metoda OnChange rozpoczyna zostały wygenerowane przez instancję
GetConfig działanie w momencie zmiany treści klasy Log.
dodaj konstruktor: public function pola i wywołuje metodę naszej kla-
GetConfig() {super();} sy say(s:String), gdzie s = wartość Podsumowanie
usuń wywołanie : super(); z metody tekstu pola, Doprowadziliśmy do powstania serwera
GetConfigCommand() • Krok 2: Inicjowana jest instancja kla- aplikacji, zdolnego do komunikacji z Flash-
plik: mx.remoting.RecordSet.as sy Serwice, która będzie obsługiwać em oraz tzw. grubego klienta (ang. fat
wszystkie wywołania konkretnego ser- client), czyli aplikacji Flash-owej, w której
linia 51 – zmieniamy z : „ mx.events.Event- wisu serwera aplikacji. Kolejne para- ASwing jest w stanie przedstawić w dowol-
Dispatcher.initialize( this );” na : metry konstruktora określają adres ser- ny sposób dane odebrane z serwera. Przy
„GDispatcher.initialize( this );” wera, ewentualny loger, nazwę serwi- odrobinie chęci, przedstawiony szkielet
linia 404 – zmieniamy z : return na : re- su. O pozostałych dwóch parametrach można rozbudować i stworzyć okienkową
turn null na razie nie będziemy nic pisać, aplikację prezentowaną po stronie klienta
w dowolnej przeglądarce internetowej. n
Listing 8. Odpowiedź z serwera aplikacji
S
łysząc kombinację słów „ba- wraz z ich reprezentacją koloru w wido-
za danych” oraz “przeglądarka”, ku strukturalnym (patrz Rysunek 1):
na myśl przychodzi nam zazwy-
czaj phpMyAdmin lub podobne jemu na- • możliwość wyboru bazy danych z me-
W SIECI rzędzie. Wygląd (ang. layout) tych apli- nu rozwijanego (pomarańczowy),
kacji jest w większości przypadków bar- • wyświetlanie nazw i ilości wierszy
dzo do siebie zbliżony: w górnym lewym tabel w zaznaczonej bazie danych
• http://www.gnope.org
– pakiet PHP5 + Gtk2 dla
rogu mamy menu rozwijane z możliwo- (zielony),
Windows, ścią wyboru bazy danych, na której bę- • wyświetlanie zawartości (wierszy) za-
• http://gtk.php.net dziemy pracować, zaś poniżej wyświetla- znaczonej tabeli (fioletowy),
– strona główna projektu
PHP-Gtk2 wraz ne są jej tabele. • numeracja i sortowanie, nawigacja
z repozytorium, Cała zawartość prawej części apli- wierszy za pomocą przycisków w to-
• http://cweiske.de/files/
download/phpgtk2/ kacji jest przeznaczona na wyświetla- olbarze (niebieski).
DatabaseBrowser.tar.bz2 nie zawartości i struktury aktualnie za-
– pełen kod aplikacji
zbudowanej w tym artykule,
znaczonej tabeli. Często zawiera także
• http://pear.php.net/package/ elementy nawigacyjne, pozwalające na Co należy wiedzieć...
MDB2 zmianę struktury, właściwości czy za- Przydatna będzie znajomość podstaw
– pakiet MDB2 dla PEAR, PHP-Gtk oraz podstawowych zapytań
• http://pear.php.net/package/ wartości tabeli.
SQL.
Gtk2_ExceptionDump Ponieważ takie rozmieszczenie jest
– pakiet Gtk_ExceptionDump
dla PEAR, popularne i dobrze znane większości Co obiecujemy...
• http://pear.php.net/package/ użytkowników, nasza przeglądarka ba- Dowiesz się, jakie nowe funkcje przynosi
Structures_Form_Gtk2 druga wersja PHP-Gtk. Zbudujesz prze-
zy danych będzie także miała taki wy-
– pakiet Structures_Form_Gtk2 glądarkę baz danych z funkcją sortowa-
dla PEAR. gląd. Oto lista wszystkich funkcjonalno- nia i podziału na strony.
ści, które omówimy w ramach artykułu,
Na Rysunku 1. pokazaliśmy, jakie wid- Prawa strona naszej aplikacji jest aczej szybko zgubimy się we własnym
gety GTK+ zostaną użyte oraz, w jaki podobnie zamknięta w GtkVBox. Prze- kodzie. Ta metoda pozwala także na
sposób będą zagnieżdżone. trzymujący element GtkTreeView, będzie łatwe przystosowanie kodu do ponow-
Ponieważ GtkWindow może mieć pokazywał wszystkie wiersze. Będzie nego użycia, ponieważ wystarczy za-
jedynie jeden element potomny, a my on także zawierał element GtkToolbar z łączyć klasę i zainicjować ją komendą
potrzebujemy użyć kilku widgetów, sko- przyciskami nawigacyjnymi, usprawnia- new MyClassName() – bez porówna-
rzystamy z GtkContainer. GtkHPaned jącymi poruszanie się po liście: pierw- nia jest to mniej kodu, niż w przypad-
z kolei idealnie będzie pasował do na- sza i ostatnia strona, odśwież, następna ku wycinania i kopiowania kodu każdej
szych wymagań: dzieli bowiem okno i ostatnia strona. funkcji (co z kolei utrudnia znalezienie
na dwie sekcje, których rozmiar może Kilka słów na temat stylu kodo- i korektę błędów).
zmieniać użytkownik. wania i używania klas: z doświadcze-
Dla lewego panelu użyjemy kla- nia wiem, że bardzo pomocne okazu- Podłączamy się do bazy
sycznego GtkVBox, w którym zagnieź- je się rozszerzanie klas głównych wid- Wykonanie połączenia do bazy danych,
dzimy nasze rozwijane menu (Gtk- getów Gtk, tworząc własne klasy i osa- używając MDB2 jest relatywnie proste:
ComboBox ze specjalnym GtkListStore dzając je według kolejności zagnież- wystarczy stworzyć cią DSN (ang. Data
funkcjonującym jako jego model), oraz dżenia. To może powiększyć ilość linii Source Name), który odpowiada nasze-
dla listy tabel – także GtkTreeView kodu przy małych projektach, jednak mu środowisku, i wywołać metodę sin-
z odpowiednim GtkListStore jako mo- jest absolutnie niezbędne przy budo- gleton klasy MDB2:
delem. waniu wielkoskalowych projektów – in-
require_once 'MDB2.php';
$dsn = 'mysql://username:
password@hostname/databasename';
$mdb2 = MDB2::singleton($dsn, array());
Agencja Interaktywna
Prenumerata PRO
– br-design.pl
Kreowanie oraz obsługa serwisów interne-
towych, programowanie aplikacji interneto-
wych według indywidualnych potrzeb klienta,
realizacja projektów graficznych i prezentacji
multimedialnych.
www.br-design.pl
protHOST
Rewelacyjny hosting o12 już od 49 zł netto/rok
(w tym cPanel PL). Rejestracja domen od 1 zł
netto. Webdesign i pozycjonowanie. Wszystko
czego potrzebujesz.
http://o12.pl
Hosting
Elastyczny dobór pakietów, pakiet POCZTA
– 40 zł, pakiet START (www, email, 10 domen,
php 5, mysql, pgsql) – 150 zł, pakiety KOM-
FORT, PROFIT, PROFITSSL, zarządzanie przez
cPanel. Rejestracja domen globalnych, krajowych,
funkcjonalnych i regionalnych. Ceny od 50 zł.
www: http://www.lubman.pl,
e-mail: biuro@lubman.pl,
cjalizować widgetu GtkListStore z usta- zodanowego. Wszystko więc, co musi- DESCRIBE, otrzymamy w wyniku na-
loną odgórnie ilością elementów Gtk:: my zrobić, to ustalić ilość kolumn w ta- zwy kolumn i ich liczbę.
TYPE_STRING, lecz musimy robić to dy- beli, ich tytuły, zaś później stworzymy Problem pierwszy został już wielo-
namicznie. Poza tym, kolumny baz da- odpowiednią ilość widgetów GtkTree- krotnie dostrzeżony przez dewelope-
nych SQL nie posiadają typów STRING, ViewColumns, by wyświetlić nasze da- rów PHP-Gtk2, czego skutkiem jest im-
lecz szeroki zakres innych typów: INT o ne. Używając oświadczenia SQL-owego plementacja metody set_column_types()
różnych długościach, a także VARCHAR,
SHORT/MEDIUM/LONG TEXT, ENUM Listing 4. Model przechowujący nasze dane
oraz inne.
Mimo, że nie jest to optymalne roz- class DatabaseBrowser_TableModel extends GtkListStore
{
wiązanie, możemy użyć Gtk::TYPE_
protected $nPageSize = 20;
STRING dla każdej kolumny, nieza- public function __construct($strDatabase, $strTable, $arTypes)
leżnie od typu danych, które zawiera- {
ła będąc w bazie danych. Takie podej- $this->strDatabase = $strDatabase;
ście ma jednak pewne poważne wady: $this->strTable = $strTable;
parent::__construct();
nasz model zużywa więcej pamięci, niż
$this->set_column_types($arTypes);
jest to konieczne, przechowując przy $this->update('refresh');
tym wszystkie dane w jednym modelu, }
włącznie z wielkimi BLOBami, które za- public function navigate($strAction)
pewne nie powinny mieć takiego prze- {
switch ($strAction) {
znaczenia. Przeglądanie tabeli z takimi
case 'first':
elementami może być bardzo powolne. $this->nCurrentPage = 0;
Z drugiej strony, mapowanie bazy break;
danych w taki sposób ma – w celach case 'back':
demonstracyjnych artykułu – niepod- if ($this->nCurrentPage > 0) {
--$this->nCurrentPage;
ważalną zaletę: jest bardzo łatwe w im-
}
plementacji, bowiem omija nas koniecz- break;
ność mapowania typów z SQL do Gtk, ...
które dodatkowo różniłoby się w zależ- }
ności od typu używanego systemu ba- $this->update();
}
...
public function update()
{
$this->clear();
$this->nRows = DatabaseBrowser::$mdb2->queryOne(
Rysunek 3. Pole wyboru bazy danych
'SELECT COUNT(*) FROM ' . $this->strTable);
DatabaseBrowser::$mdb2->setLimit($this->nPageSize,
$this->nCurrentPage * $this->nPageSize);
$arData = DatabaseBrowser::$mdb2->queryAll(
'SELECT * FROM ' . $this->strTable . $this->strOrder);
foreach ($arData as $arRow) {
$this->append($arRow);
}
}
...
public static function getTableStructure($strDatabase, $strTable)
{
$arData = DatabaseBrowser::$mdb2->queryAll('DESCRIBE ' .
$strDatabase . '.' . $strTable);
$arStructure = array();
foreach ($arData as $arColumnDef) {
$strColumnName = $arColumnDef[0];
$arStructure[$strColumnName] = Gtk::TYPE_STRING;
}
return $arStructure;
}
}
$col->set_clickable(true);
$col->connect('clicked', array($this, 'onClickedHeader'), $strColumnName);
Rysunek 4. Tabele w bazie danych
widgetu GtkListStore, która pobiera tabli- mięci, czasu na przekazanie danych ny rezultat w około dziesięciu liniach ko-
cę typów Gtk. z serwera do aplikacji, zaś sam użyt- du, widocznych na Listingu 3.
By zaimplementować solucje obu pro- kownik na pewno nie będzie zachwy- Następnie, jak widać na Listingu 4,
blemów, najpierw musimy stworzyć sta- cony, widząc miliony wierszy. Dewelo- tworzymy klasę DatabaseBrowser_Table,
tyczną metodę getTableStructure, któ- perzy GTK+ zauważyli potrzebę wpro- rozszerzając GtkTreeView oraz klasę Da-
ra wykonuje zapytanie "DESCRIBE $ta- wadzenia przycisków nawigacyjnych, tabaseBrowser_TableModel, będącą roz-
blename" do bazy danych i zwraca tabli- dodali więc kilka elementów zwanych szerzeniem GtkListStore, ponieważ jest
cę asocjacyjną. Nazwy kolumn są uży- Stock Items, które wykonują pożąda- to nasz główny silnik przeglądarki, któ-
wane jako klucze, zaś typy Gtk::TYPE_ ne przez nas zadania: Gtk::STOCK_ ry powinien umieć wypełniać się dany-
STRING jako wartości. Dzięki temu, mo- GOTO_FIRST, Gtk::STOCK_GO_BACK, mi, gdy zajdzie taka potrzeba. Kieruje-
żemy używać tej tablicy tak dla tworzenia Gtk::STOCK_REFRESH, Gtk::STOCK_ my komendy nawigacyjne, przekazywa-
GtkTreeViewColumn, jak przekazywać ją GO_FORWARD i Gtk::STOCK_GOTO_ ne przez przyciski, do metody navigate(),
do set_column_types() bez dodatkowych LAST. Przekazanie każdego z tych ele- po prostu zmieniając wewnętrzną zmien-
modyfikacji. mentów do konstruktora new_from_ ną nCurrentPage klasy i wywołując funk-
Kolejnym dobrym pomysłem jest po- stock() widgetu GtkToolButton's powo- cję update().
dział wyników na strony. Mimo, że GtkLi- duje, że otrzymamy menu z przyciskami update() używa naszego obiektu
stStore może przechowywać dowolną oznaczonymi odpowiednim tekstem i iko- MDB2 do wykonania zapytania SELECT
ilość wierszy, przetrzymywanie wszyst- nami. Używając metody insert($btn, -1) po użyciu setLimit(), który precyzuje,
kich danych może zająć za dużo pa- widgetu GtkToolbar, otrzymamy pożąda- które rekordy chcemy pobrać dla aktu-
alnie wyświetlanej strony. Następnie, ta-
blice zwrócone przez metodę queryAll()
są przekazywane bezpośrednio do me-
tody append() modelu. Efekt naszej pra-
cy jest widoczny na Rysunku 5.
Dodajemy sortowanie
Jedna z funkcjonalności, oferowanych
przez tabele i często oczekiwanych, to
możliwość sortowania wierszy przez
kliknięcie na nazwę określonej kolum-
ny. GtkTreeViewColumn posiada wbu-
dowane funkcje wspomagające sorto-
wanie. Nagłówki mogą zostać skonfi-
gurowane jako klikalne, zaś dodatkowo
automatycznie będą dodawane strzał-
ki, sygnalizujące aktualny układ, we-
if ($column->get_sort_order() == Gtk::SORT_ASCENDING) {
$column->set_sort_order(Gtk::SORT_DESCENDING);
$strOrder = 'DESC';
} else {
$column->set_sort_order(Gtk::SORT_ASCENDING);
$strOrder = 'ASC';
}
$this->model->setOrder($strColumnName . ' ' . $strOrder);
$this->model->update();
}
Rysunek 6. Sortowanie tabeli wg ilości
pobrań
dług którego posortowana jest tabe- pie sortowania do zapytania SQL wy- Do aplikacji można dodać wiele przydat-
la. Łącznikiem, między modelem da- korzystywanego przez metodę update(). nych funkcjonalności:
nych obecnych w aplikacji z przedsta- Osiągniemy to, używając prostej meto-
wianymi użytkownikowi, jest GtkTree- dy setOrder(). Rezultaty widać na Ry- • obsługa zakładek, by umożliwić prze-
ModelSort. sunku 6. glądanie wielu tabel jednocześnie,
Sortowanie danych jest tym, czego • wyświetlanie widoku struktury tabeli,
zazwyczaj potrzebują użytkownicy. Nam Konkluzja • używanie różnych typów danych w
jednak zwykłe sortowanie nie wystarczy, Stworzyliśmy prosty, intuicyjny i niezależ- modelu, w celu usprawnienia prędko-
bowiem objęte by nim były jedynie aktu- ny system przeglądania bazy danych w ści i efektywności działania aplikacji,
alnie wczytane wiersze. Użytkownik bę- 300 liniach kodu używając Gtk2 oraz pa- • dodanie pola tekstowego, pozwalają-
dzie oczekiwał, że kliknięcie na nagłówek kietu MDB2 z repozytorium PEAR. Ob- cego na wprowadzenie własnych za-
reprezentujący nazwy kolumn spowoduje sługuje on podział danych na strony i sor- pytań SQL z możliwością wyszukiwa-
wyświetlenie wszystkich nazw zaczyna- towanie, będąc bardzo łatwym w rozsze- nia wartości,
jących się na “A” na pierwszych stronach, rzaniu. • możliwość edycji wierszy dzięki wyświe-
czego nie osiągnęlibyśmy stosując sorto- Przeglądarki można użyć jako pod- tlaniu danych rekordów w innym oknie,
wanie lokalne. stawy do budowy własnego edytora baz przy użyciu Structures_Form_Gtk2.
Bazy danych mają wbudowane funk- danych, do którego zapewne przydatny
cje sortujące, więc najłatwiej będzie nam okaże się pakiet Structures_Form_Gtk2 Zapraszamy do wypróbowania nowych
z tych dogodności skorzystać. Musimy dostępny w repozytorium PEAR (patrz możliwości PHP-Gtk2! n
zidentyfikować kliknięcia na nagłówkach ramka “W Sieci”), idealnie nadający się
kolumn i wygenerować odpowiednie za- do manipulacji danymi, o dynamicznie
pytanie SQL z “ORDER BY ” dla danej określanej liczbie pól.
kolumny. Pełny kod przeglądarki bazy danych, O autorze
Przy tworzeniu naszych kolumn Gtk- którą zbudowaliśmy, jest zamieszczo-
TreeViewColumn, każda z nich otrzyma ny na CD oraz w Internecie (patrz ramka Christian Weiske jest studentem infor-
dwa nowe wiersze widoczne na Listingu “W Sieci”). matyki na uniwersytecie w Leipzigu, w
Niemczech. Jest członkiem zespołu roz-
5. W funkcji onClickedHeader() wykona-
wijającego i dokumentującego projekt
my sortowanie (Listing 6). Co dalej? PHP-Gtk2, jak również autorem wielu
Wszystko, czego jeszcze potrze- W tym artykule omówiliśmy jedynie pod- pakietów PEAR.
bujemy, to przekazanie informacji o ty- stawy wyświetlania danych z bazy SQL.
R E K L A M A
GtkComboBox, ponieważ nie posiada Ostatnie zadanie, to umożliwie- Po połączeniu kodu, otrzymujemy
on odpowiedniego konstruktora, który nie przewijania listy, co staje się trywial- aplikację widoczną na Rysunku 4.
mógłby ustawić wszystkie kolumny. ne przy użyciu widgeta GtkScrolledWin-
Użyjemy więc następujących kompo- dow. Miejmy na uwadze, że GtkTreeView, Pokazujemy dane
nentów: w odróżnieniu od wielu innych widge- Zmapowanie zawartości całej tabeli z ba-
tów, posiada swój własny system wido- zy danych do jednego widgetu GtkList-
• GtkTreeView jako główny widget, ma- ku. Oznacza to, że jeśli będziemy przewi- Store jest możliwe, acz nie trywialne.
jący dostęp do modelu Database- jać zawartość widgetu, tytuły kolumn bę- Będziemy musieli zmierzyć się z dwoma
Browser_TableList, dą zawsze widoczne. Dodatkowo, upew- problemami:
• GtkTreeViewColumn, wyświetlający nijmy się, że paski przewijania nie będą Po pierwsze, lista kolumn każdej ta-
zawartość kolumn, widoczne, jeśli nie są konieczne. To za- beli nie jest znana podczas progra-
• GtkCellRendererText, by narysować danie spełni proste odwołanie do set_ mowania naszej przeglądarki baz da-
nazwy tabel w wierszach, policy. nych. Oznacza to, że nie możemy zaini-
• GtkScrolledWindow, by wyświetlone
zostały suwaki na wypadek, gdyby li- Listing 3. Tworzymy menu nawigacyjne
sta tabel nie mieściła się w oknie.
$this->tbl = new DatabaseBrowser_Table($strDatabase, $strTable);
W
PHP5 pojawił się bardzo inte- Można powiedzieć, że Web Services to
resujący moduł SOAP. SOAP nowa wersja CORBA.
(ang. Simple Object Access SOAP jest to protokół, poprzez który
Protocol) zapewnia nam możliwość two- realizowane są wszystkie operacje Web
rzenia własnych oraz wywoływania zdal- Services. SOAP bazuje na XML, jest
nych usług sieciowych, rozsianych po więc bardzo prostym protokołem, do któ-
całym Internecie. Implementacja SOAP rego obsługi wystarczy nam zwykły par-
w PHP5 nie zawiera wszystkich rozsze-
rzeń protokołu SOAP, ale sami możemy
Co należy wiedzieć...
je dopisać, ponieważ zarówno klasy ser- Powinieneś posiadać dobrą znajomość
werów, jak i klientów, możemy rozsze- PHP5, znać ogólne zasady współpracy i
rzyć (klasy nie są typu final). projektowania systemów rozproszonych
na różnych systemach. Mile widziana
znajomość podstaw SOAP i WSDL.
Web Services,
protokół SOAP Co obiecujemy...
Ale zacznijmy od początku. Web Servi- Nauczysz się pisać własne usługi siecio-
ces to systemy, które są projektowane we, dowiesz się, jak rozszerzyć domyśl-
tak, aby komputery o różnych architek- ne klasy PHP5 klienta i serwera SAOP.
Nauczysz się zabezpieczać swoje usługi
turach, różnych systemach operacyj-
z rozszerzeniem WS Security Enhance-
nych działające w rozproszonym środo- ments i HTTPS. Nauczysz się, jak mapo-
wisku mogły wywoływać zdalnie swoje wać złożone obiekty i przesyłać je pomię-
pewne operacje poprzez sieć Internet. dzy różnymi platformami technologiczny-
mi. Dowiesz się, jak połączyć się z usłu-
Najczęściej wykorzystują one jako war-
gami sieciowym MS .NET, Jakarta AXIS.
stwę transportową HTTP (lub HTTPS).
Rysunek 2. Jeśli przeglądając usługę przez przeglądarkę zobaczymy błąd przewrot- <wsdl:message name="Pobierz
nie znaczy to, że usługa działa, tylko nie ma danych POST ArtykulResponse">
<wsdl:part name="Pobierz
ArtykulReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="Pobierz
ArtykulRequest">
<wsdl:part name="id" type="xsd:int"/>
</wsdl:message>
Rysunek 3. Każda usługa powinna przedstawić się podając swój WSDL po doda- <wsdl:portType name="Proste Operacje">
niu ?wsdl do adresu usługi <wsdl:operation name="PobierzArtykul">
<wsdl:input message="impl:Pobierz
ArtykulRequest" name="PobierzArtykul
Request"/>
<wsdl:output message="impl:Pobierz
ArtykulResponse"name="PobierzArtykul
Response"/>
</wsdl:operation>
</wsdl:portType>
Listing 7. Pełny kod klienta PHP5 łączącego się z usługą sieciową, wraz ze śle-
dzeniem wywołań i obsługą zdalnych wyjątków
require_once ('Strings.inc.php');
$client = new SoapClient(
'http://t:81/soap/article/ProsteOperacjeWS.php?wsdl',
array('trace' => 1, 'exceptions' => 1)
);
try {
echo '<pre>';
var_dump(Strings::ConvertFromUTFToISO($client->
PobierzNajnowszyArtykul()));
$id = 1212;
var_dump(Strings::ConvertFromUTFToISO($client->PobierzArtykul($id)));
$artykuly = $client->Pobierz10Najnowszych();
for($i = 0; $i < count($artykuly); $i++) {
$artykuly[$i] = Strings::ConvertFromUTFToIso($artykuly[$i]);
}
var_dump($artykuly);
} catch (SoapFault $e) {
echo $e->getMessage();
// wyswietlmy zawartosc XML po ludzku
echo wordwrap(htmlentities($client->__getLastRequest()));
echo wordwrap(htmlentities($client->__getLastResponse()));
}
echo '</pre>';
<wsdl:port binding="impl:
ProsteOperacjeSoapBinding"
name="ProsteOperacje">
<wsdlsoap:address location=
"http://t:81/soap/article/
ProsteOperacjeWS.php"/>
</wsdl:port>
</wsdl:service>
Załóżmy, że mamy klasę Proste- readfile('ProsteOperacje.wsdl'); Jak widzimy, użyłem tu ponownie funk-
Operacje, taką jak pokazana na Listingu 4, die(); cji konwertującej. Wszystko, co jest wy-
którą chcemy udostępnić jako usługę sie- } syłane SOAP musi być w UTF-8, więk-
ciową. Normalnie, wszystkie artykuły po- szość stron polskojęzycznych używa jed-
winny być wyciągane z bazy danych, ale Teraz jeśli w przeglądarce podamy adres: nak kodowania ISO-8859-2, użyłem więc
my w przykładzie użyjemy danych wpro- http://t:81/soap/article/ProsteOperacjeWS. prostej funkcji konwertującej polskie zna-
wadzonych na sztywno. Listing 6 prezen- php?wsdl zobaczymy definicję WSDL na- ki diakrytyczne z UTF-8 do ISO.
tuje jak powinien wyglądać plik ProsteOpe- szej usługi tak, jak jest to pokazane na Ry- Jeśli spojrzymy na Listing 5, za-
racjeWS.php. W tym momencie, jeśli połą- sunku 3. uważymy, że SoapClient posiada rów-
czymy się z naszą usługą np. przez prze- nież drugi argument, który domyślnie jest
glądarkę WWW, dostaniemy komunikat, Pierwsza usługa Web NULL. Są to opcje, bardzo przydatne np.
że nie znaleziono danych POST (wiado- Service PHP5 – klient podczas testowania. Jeśli włączymy fla-
mości SOAP wrzucane są w ciało wiado- Aby przetestować naszą usługę, należy na- gę trace, będziemy mieli do dyspozycji
mości HTTP a zatem muszą używać meto- pisać klienta. Napisać klienta podobnie jak dwie metody:
dy POST) – zobacz Rysunek 2. Wiele silni- serwer jest bardzo prosto, a nawet prościej,
ków Web Services próbuje w momencie łą- bo nie musimy tworzyć żadnego WSDL. Aby $client->__getLastRequest();
czenia się do usługi pobrać WSDL automa- wykonać dowolną metodę zdalną w wersji $client->__getLastResponse();
tycznie. Przyjęło się, że WSDL powinien być minimalistycznej potrzebujemy 2 linii:
zwracany zawsze, jeśli QUERY_STRING jest które zwracają odpowiednio: ostatnie żą-
równy '?wsdl', zatem dopiszmy na samym $client = new SoapClient('http:// danie wysłane do serwera i ostatnią odpo-
początku pliku ProsteOperacjeWS.php: t:81/soap/article/ProsteOperacjeWS. wiedź. Jeśli włączymy flagę exceptions,
php?wsdl'); PHP5 będzie reagował na wyjątki, które zo-
if (0 == strcmp($_SERVER var_dump(Strings::ConvertFromUTFToISO stały wyrzucone na zdalnej maszynie, dlate-
['QUERY_STRING'], '?wsdl')) { ($client->PobierzNajnowszyArtykul()) go też na Listingu dodałem blok try/catch
header('Content-type: text/xml'); ); wokół wywołania metod na obiekcie $client.
Wynik naszego pierwszego zdalnego wywo-
Listing 9. Przykładowa usługa sieciowa napisana w C# łania przedstawiony jest na Rysunku 4.
R E K L A M A
Narzędzia SOAP w PHP5
Listing 20. Łączenie z usługą Listing 21. Szkielet klienta przy zastosowaniu metody
AddWSSEHeader
ers.ProsteOperacjeServiceWse proxy=
new ers.ProsteOperacjeServiceWse(); class ExtendedSoapClient extends SoapClient {
tamy dokument DOM XML (nie ma tego niej, za pomocą API DOM XML, pobrać od- stępnie do katalogu Web References i po-
w powyższym szkielecie, nie ma także po- powiednie wartości. Praktyczna uwaga: dla prawmy MS, dopisując do każdego http://
kazanej weryfikacji, czy dane POST wpro- hasła należy sprawdzić jeszcze atrybut Ty- kluczowe 's' czyli https://. Używam testowe-
wadzone nie są puste, czy żądanie jest po- pe, aby dowiedzieć się, czy hasło jet skró- go certyfikatu serwera, który sam stworzy-
prawnym dokumentem XML), przekażemy tem SHA1 czy PlainText. Sam kod jest pro- łem, muszę więc przekonać MS, że jest on
później przez referencję dokument do meto- sty i przedstawia go Listing 18. Pełny kod wartościowy (inaczej nie będę mógł się po-
dy prywatnej CheckCredentials. W tej meto- serwera umieściłem na Listingu 19. łączyć z serwerem SOAP): najprościej jest
dzie pobierzemy elementy <Username> oraz Aby mieć pewność, że poprawnie zaim- otworzyć w IE stronę: https://ers:4433/soap/
<Password> elementu <UsernameToken> we- plementowaliśmy to rozszerzenie, stwórz- article/ProsteOperacjeWSSecExt.php?wsdl
wnątrz <Security> w nagłówku koperty. Ko- my projekt np. w MS .NET. W przypadku lub dowolną z serwera ers:4433 i po prostu
perta ta została przedstawiona na Rysunku VS 2003 musimy mieć doinstalowany pakiet zainstalować certyfikat. Po zainstalowaniu i
1. Samo pobranie użytkownika i jego hasła WS Security Enhancements 2.0 w wersji dla włączeniu WS SE 2.0, po wygenerowaniu
jest sprawą banalną, wystarczy wyszukać developerów. Dodajemy Web Reference referencji do usługi sieciowej będziemy mie-
element Username z przestrzeni nazw http: jak poprzednio, podajemy adres do WSDL li do dyspozycji dwa obiekty służące do wy-
//docs.oasis-open.org/wss/2004/01/oasis- czyli: https://ers:4433/soap/article/ProsteOp woływania zdalnych usług. Pierwszy z nich
200401-wss-wssecurity-secext-1.0.xsd, póź- eracjeWSSecExt.php?wsdl, przejdźmy na- o nazwie usługi z końcówką 'Service', jak
dotychczas, oraz drugi obiekt – z końców-
ką 'ServiceWse', który posiada dodatkowe,
rozszerzające bezpieczeństwo, metody. To
wszystko. Możemy już bez problemu połą-
czyć się z naszą usługą pisząc to co prezen-
tuje Listing 20. Efekt pokazany jest na Ry-
sunku 11.
Implementujemy SOAP
Security Enhancements
plus HTTPS – klient
Napisanie klienta w PHP5 łączącego się z
naszą usługą jest proste. Musimy udostęp-
nić publiczne metody, służące do ustawienia
użytkownika i jego hasła, następnie musi-
my nadpisać metodę __doRequest i napisać
własną prywatną metodę AddWSSEHeader,
która będzie generowała odpowiednie na-
Rysunek 11. Klient MS .NET łączący się po HTTPS do naszej usługi WS Security główki WS SE. Szkielet klienta wygląda tak
Enhancements jak na Listingu 21. Pełny kod klienta umie-
Listing 22. Kod klienta SOAP wspierającego WS Security Enhancements i łączącego się z usługą po HTTPS
class ExtendedSoapClient extends SoapClient { envelope/', 'Body');
private $Username; $body = $body->item(0);
private $Password; $header = $soapEnvelope->
function __construct($wsdl, $options = null) { insertBefore($header, $body);
parent::__construct($wsdl, $options); }
} else {
function __doRequest $header = $nodes->item(0);
($request, $location, $action, $version) { }
$dom = new DOMDocument('1.0'); // tworzę właściwy element Security
try { $security = $domDocument->createElementNS
$dom->loadXML($request); ('http://docs.oasis-open.org/wss/2004/01/
} catch (DOMException $e) { oasis-200401-wss-wssecurity-
die('Dokument nie jest prawidłowy: secext-1.0.xsd', 'wsse:Security');
' . $e->code); // w nim element UsernameToken
} $usernameToken = $domDocument->createElementNS('http://
// dodaję nagłowek WSSE Security Header docs.oasis-open.org/wss/2004/01/oasis-200401-
$this->AddWSSEHeader($dom); wss-wssecurity-secext-1.0.xsd', 'UsernameToken');
// musimy recznie dodac https, bo inaczej nici... // w nim Username
// PHP tez sobie do konca nie radzi z HTTPS $username = $domDocument->createElementNS
$location = 'https://vega.eti.pg.gda.pl/~xh/soap_ssl/ ('http://docs.oasis-open.org/wss/2004/01/
ProsteOperacjeWSSecExt.php'; oasis-200401-wss-wssecurity-secext-1.0.xsd',
// doRequest do klasy nadrzędnej SoapClient 'Username');
return parent::__doRequest($dom->saveXML(), $usernameText = $domDocument->createTextNode
$location, $action, $version); ($this->Username);
} // załóżmy, że Password zawsze będzie PlainText
public function SetUsername ($username) { $password = $domDocument->createElementNS
$this->Username = $username; ('http://docs.oasis-open.org/wss/2004/01/
} oasis-200401-wss-wssecurity-secext-1.0.xsd',
public function SetPassword ($password) { 'Password');
$this->Password = $password; $passwordText = $domDocument->
} createTextNode($this->Password);
private function AddWSSEHeader ($domDocument) { $type = $domDocument->createAttribute('Type');
$soapEnvelope = $domDocument-> $type->value = 'http://docs.oasis-open.org/wss/2004/01/
documentElement; oasis-200401-wss-username-token-profile-
// pobieram nagłówek 1.0#PasswordText';
$nodes = $domDocument->getElementsByTagNameNS // podpinam wszystkie elementy do dokumentu żądania
('http://schemas.xmlsoap.org/ $username->appendChild($usernameText);
soap/envelope/', 'Header'); $password->appendChild($type);
// jeśli go nie ma muszę go stworzyć $password->appendChild($passwordText);
if ($nodes->length == 0) { $usernameToken->appendChild($username);
$header = $domDocument-> $usernameToken->appendChild($password);
createElementNS $security->appendChild($usernameToken);
('http://schemas.xmlsoap.org/ $header->appendChild($security);
soap/envelope/', 'Header'); }
$body = $domDocument->
getElementsByTagNameNS ('http://schemas.xmlsoap.org/soap/ }
ściłem na Listingu 22. Aby jednak wywołać 'https://ers:4433/soap/article/ cej, możemy korzystać z różnych rozsze-
taką zdalną zabezpieczoną usługę, musi- ProsteOperacjeWSSecExt.php?wsdl', rzeń standardu WS Security Enhance-
my stworzyć odpowiedni certyfikat. Konia z array('trace' => 1, 'exceptions' ments, które możemy z łatwością w kilka
rzędem temu, kto wyczyta w dokumentacji => 1, 'local_cert' => 'cert.pem' chwil zaimplementować. n
PHP5, jak to zrobić. Certyfikat, jaki jest po- )
trzebny, aby móc łączyć się po HTTPS do );
usług sieciowych to połączenie klucza pry- $artykuly = $client->
watnego i certyfikatu w jednym! Wystarczy Pobierz10Najnowszych();
O autorze
połączyć oba te pliki w jeden i zapisać jako Łukasz Budnik jest studentem V ro-
np. cert.pem Wywołanie takiej metody jest Podsumowanie ku Informatyki na Politechnice Gdańskiej,
uczestniczy w projektach nad rozwijaniem
już banalne, sprowadza się jedynie to 3 lo- Nauczyliśmy się dziś, jak współpracować
systemów zbierania i analizy danych w po-
gicznych linii: z innymi platformami technologicznymi. staci XML, jest rówież administratorem
Teraz śmiało możemy współtworzyć sys- serwisu www.komputery-internet.net.
require_once ( temy rozproszone na bazie Web Servi-
Kontakt:
'ExtendedSoapClient.inc.php'); ces komunikujących się z takimi giganta-
lukasz.budnik@komputery-internet.net
$client = new ExtendedSoapClient( mi jak MS .NET, J2EE, Java Mobile. Wię-
P
rzez kilka ostatnich lat zaszło w które oferują przede wszystkim intere-
sieci wiele pozytywnych zmian. sujące treści lub usługi internetowe. Fi-
Nie boimy się już płacić za to- nansowe możliwości wielu tych serwi-
W SIECI wary i usługi. Coraz chętniej korzysta- sów zmieniły się odkąd użytkownicy są
my więc ze sklepów internetowych. Ich bardziej skorzy do płacenia za warto-
korzyści odkrywa coraz więcej osób, nie ściową treść. W polskiej sieci trend pła-
• Ad.net, http://www.adnet.pl/ tylko dlatego, że są szybszą metodą na cenia za korzystanie ze stron interne-
• AdClick, http://www.adclick.pl/
• ARBOmedia,
zakupienie dokładnie tego, co potrzebu- towych stał się masowy i nieunikniony.
http://www.arbomedia.pl/ jemy. Zakupy w sieci są także tańszą al- Wszystko to za sprawą fatalnej kondy-
• IDMnet, http://www.idmnet.pl/
ternatywą pozyskiwania dóbr, bo kosz- cji rynku reklamowego nastawionego ra-
• phpAdsNew,
http://www.phpadsnew.com/ ty prowadzenia sprzedaży przez Inter- czej na duże przedsięwzięcia, typu por-
• phpPgAds, net są znacząco niższe. Niewątpliwie, tale, niż pojedyncze serwisy. W dodatku
http://www.phppgads.com/
• http://www.google.pl/adsense/ istotny wpływ na popularność płacenia portale prowadzą sprzedaż reklam sa-
• OnetKontekst, http:// przez internet miały serwisy aukcyjne. modzielnie, stąd brak tu prowizji należ-
kontekst.onet.pl/
• Adkontekst, http://adkontekst.wp.pl/
Zaufanie, jakim darzymy najpopularniej- nych sieciom reklamowym. Choć i we-
• AdPortal, http://www.adportal.pl/ szy serwis aukcyjny, Allegro.pl świadczy wnętrzna sprzedaż reklam przez portale
• AllPay.pl, http://www.allpay.pl/
dobitnie o ogromnym postępie, jaki do- to tylko kropla w morzu ich potrzeb. Ta
• CashBill, http://www.cashbill.pl/
• Ebill.pl, http://www.ebill.pl/ konał się w świadomości użytkowników forma aktywności może być jedynie do-
• Wapacz, http://www.wapacz.pl/ sieci. Omawiane zjawisko, niczym na- datkiem w ogólnym rozrachunku rodzi-
• Wapster.pl, http://www.wapster.pl/
mobilepay/ czynia połączone odbija się na byt wła- mych portali. Zarabia się w najróżniej-
• AllPay.pl, http://www.allpay.pl/ ścicieli wszelkiego rodzaju serwisów in- szy sposób, np. wprowadzając opłaty
• Platnosci.pl, http://www.platnosci.pl/
• Przelewy24.pl, http://
ternetowych. Mowa tu oczywiście o ser- za szybszą indeksację witryny w porta-
www.przelewy24.pl/ wisach nie nastawionych bezpośred- lowym katalogu, czy wyszukiwarce. Są
nio na sprzedaż towarów, czyli o takich, to usługi mocno wątpliwe, bo ideą po-
wstania katalogu stron www, czy wyszu- nowego. Użytkownik płaci za rekla- • Partner – firma (rzadko osoba fi-
kiwarki jest rzetelne i równorzędne trak- mę pośrednio, ponieważ koszt rekla- zyczna) dysponująca serwisem
towanie wszystkich stron www. my zawarty jest w cenie towaru lub lub serwisami internetowymi o
W ciągu ostatniego roku stał się bar- usługi. określonej powierzchni reklamo-
dzo zauważalny rozwój reklamy kontek- wej. Partner przyłącza się do sieci
stowej, która nie dość, że nie jest na- Sieci reklamowe reklamowej podpisując stosowną
chalna, to jeszcze okazuje się klikalna. W myśl zasady „reklama dźwignią han- umowę na wyłączność. Sieć rekla-
Dzieje się tak nie z nieudanej próby za- dlu” powstały pierwsze sieci reklamo- mowa zapewnia partnerowi pro-
mknięcia reklamy, a z faktycznej warto- we. Najstarsza polska sieć, IDMnet za- cent od dochodów uzyskanych w
ści przekazu reklamowego. wiązała się już w 1997 roku. Podstawo- wyniku realizacji kampanii na jego
Wszystkie do tej pory omówione wym zadaniem sieci reklamowej jest po- stronach. Partnerowi może przy-
czynniki rodzą sobą pytanie: czy nasta- średnictwo w sprzedaży powierzchni re- sługiwać tzw. gwarancja – o ne-
ły dobre czasy dla tych, którzy utrzymu- klamowej należącej do partnerów sieci gocjowanej wartości. Gwarancją
ją się z prowadzenia serwisów w sieci? oraz obsługa w ten sposób powstałych określamy minimalną miesięcz-
Spróbujmy odpowiedzieć na to pytanie kampanii. ną kwotę, którą partner otrzymuje
podsumowując możliwości zarobkowe Możemy zatem wyróżnić trzy strony biorą- bez względu na wyniki sprzedaży
właściciela strony www. ce udział w transakcjach: w danym okresie rozliczeniowym,
Pierwszym podziałem, który rysu- • Sieć reklamowa – odpowiada za
je się, gdy mowa o płatnościach jest fi- • Reklamodawca – dom mediowy, fir- pozyskiwanie klientów oraz ich ob-
zyczne źródło dochodu. Wyróżniamy ma, agencja reklamowa dysponują- sługę. Sieć realizuje kampanie re-
więc metody, które: ca określonym budżetem na reali- klamowe, kierując je do serwisów
zację kampanii marketingowej wła- wybranych partnerów w oparciu o
• Pozyskują środki bezpośrednio od snego produktu. Część środków ich oglądalność oraz tematykę. To
użytkownika. By skorzystać z usłu- kierowana jest do realizacji w sie- sieć reklamowa najczęściej decy-
gi, użytkownik musi dokonać płat- ci. W ten sposób w/w zleca realiza- duje o tym, komu przydzielić da-
ności na stronie www. Jego rachu- cję kampanii sieci reklamowej. Na ną kampanię, a komu nie. Jest to
nek telefoniczny lub bankowy ob- podstawie grupy docelowej, sta- jak najbardziej stronnicza decy-
ciążany jest należną kwotą, nowiącej przedmiot zainteresowa- zja, stąd partner nie ma wpływu na
• Pozyskują środki od reklamodaw- nia reklamodawcy, dobierani są ci ilość realizowanych u niego kam-
ców, czy pośrednio od użytkownika. partnerzy sieci reklamowej, którzy panii. Sieć reklamowa dostarcza
Reklamodawca zainteresowany pro- spełniają założenia. Reklama trafia tzw. technologię adserverową, czy-
mowaniem swoich towarów i usług do internautów, którzy mogliby być li oprogramowanie zdolne do rota-
decyduje się na uiszczenie opłaty najbardziej zainteresowani przeka- cji reklamami oraz zbierania i ana-
na podstawie ustalonego modelu ce- zem danej kampanii, lizy wyników kampanii. Dostarcza,
zarówno dla partnera, jak i dla re-
klamodawcy, odpowiednie panele
administracyjne przydatne w śle-
dzeniu postępów kampanii.
Płatne odnośniki
Pewnym pomysłem ułatwiającym pozy-
skiwanie klientów jest stworzenie usłu-
gi sprzedaży płatnych linków. Pole-
ga ona na wyświetlaniu listy odnośni-
ków reklamowych w określonych miej-
scach, np. na stronie głównej serwisu.
Treść reklam tekstowych (odnośników)
reklamodawcy ustalają samodzielnie,
bezpośrednio na odpowiedniej stronie
serwisu. Po uzupełnieniu formularza z
propozycją treści płatnego odnośnika,
dokonują oni płatności przy użyciu jed-
Rysunek 2. phpAdsNew to bezpłatne oprogramowanie do obsługi kampanii rekla- nej z dostępnych metod (mikropłatno-
mowych ści sms, płatność bankowa – przelew
z..., kartą kredytową).
Sieci reklamowe to nie tylko wyświe- Ustalanie cen na usługi w zakresie
tlenie różnego rodzaju i formatu reklam sprzedaży powierzchni reklamowej jest Reklama kontekstowa
na stronach www. To także realizacja zadaniem niezmiernie trudnym. Należy Głównym zarzutem wobec reklamy
kampanii opartych o mailing, czyli wy- pamiętać, że nie tylko zbyt wysokie, lecz bannerowej jest jej mała skuteczność.
syłkę internetowych przesyłek poczto- także i zbyt niskie ceny mogą odstraszyć Przy użyciu coraz większej siły raże-
wych o treści reklamowej do dużej gru- reklamodawcę. nia (coraz większe reklamy, w dodatku
py odbiorców. Stworzenie rozległej listy Problem technologii służącej do ob- w postaci filmów wyświetlanych na peł-
osób zainteresowanych treściami po- sługi tej formy reklamy jest łatwy do roz- ny ekran) sieci reklamowe starają się
chodzącymi z danego serwisu owocu- wiązania. Wystarczy skorzystać z jednej możliwe zwiększyć zasięg i skutecz-
je możliwością zaoferowania sieci rekla- z bezpłatnych aplikacji. Oprogramowa- ność reklamy. Z marnym skutkiem.
mowej tego typu usługi. W przypadku, nie na otwartym źródle, służące do rota- Reklama kontekstowa powsta-
gdy znajdzie się reklamodawca skłonny cji bannerów, jest nieskomplikowane do ła, by odmienić los rynku reklamowe-
zrealizować kampanię mailingową, mo-
żemy liczyć na jednorazowe zwiększe-
nie dochodu.
Sprzedaż reklam
na własną rękę
Alternatywą dla włączenia w szeregi jed-
nej z sieci reklamowych, jest sprzedaż
reklam na własną rękę. O ile wydaje się
to sensowne z ekonomicznego punktu
widzenia, to realizacja w praktyce jest
zadaniem wymagającym bardzo dużego
wysiłku. Z pewnością na reklamę sprze-
dawaną na własną rękę nie zdecydu-
ją się duże agencje, czy domy medio-
we. Możemy zatem liczyć wyłącznie na
mniejsze firmy, które z braku wystarcza-
jącego budżetu skupiają w niskobudże-
towych kampaniach. Tego typu klient naj-
częściej jednak trudno podejmuje decy-
zje i nie jest przekonany do reklamy in-
ternetowej. Ta w dodatku, jak wiadomo,
nie należy do najefektywniejszych. Rysunek 3. Reklama kontekstowa w wynikach wyszukiwania to dziś żadne novum
Google AdSense
Google AdSense skierowano do właści-
cieli stron www. Dzieląc się zyskami z
reklam, Google umożliwia właścicielom
stron www publikację reklamy kontek-
stowej i płaci za każde kliknięcie w tą
reklamę. Dołączenie do programu jest
bezpłatne, a wypłaty dokonywane ter-
minowo przelewem na rachunek banku
(dostępne w Polsce). Warunkiem wy-
płaty zgromadzonych środków jest uzy-
skanie po danym okresie rozliczenio- Rysunek 5. OnetKontekst to próba stworzenia polskiej alternatywy dla Google
wym $100 ogólnego zarobku. AdSense
Mikropłatności bankowe
Dla usług o większej wartości stosuje
się mikropłatności kartą lub przelewem.
Pozwalają one dokonywać płatności je-
dynie posiadaczom kart wypukłych (ok.
20% ogółu kart) oraz klientom banków
elektronicznych. W tym ostatnim przy-
padku korzysta się ze specjalnej for-
my zapłaty nazywanej przelew z....
W ten sposób można płacić korzysta-
jąc z usług:
Jesienią 2006 roku pojawiło się na rynku II wydanie książki “Tworzenie sklepów internetowych. PHP i MySQL”. Reklamowa-
no ją jako poradnik, z którego można nauczyć się jak stworzyć własny sklep internetowy. Reklama, reklamą, a jak jest na-
prawdę? Pierwsze, co rzuca się w oczy przy pierwszym kontakcie z książką, to bardzo staranne wykonanie oraz spis treści
obfitujący w interesujące tematy. Ze spisu treści wynika, że znajdziemy w niej wiedzę na temat szablonów Smarty, biblioteki
PEAR, mechanizmów autoryzacji i bezpieczeństwa oraz dowiemy się jak napisać nasz sklep. Wszystko wygląda pięknie do-
póki nie zaczniemy czytać. Książka liczy sobie około 500 stron, z czego 250 to wstęp do właściwego tematu. Z pierwszej po-
łowy naprawdę możemy się czegoś nauczyć np. trochę XML-u, obsługi wyjątków czy też poznać pakiety z biblioteki PEAR.
Natomiast w drugiej połowie zaczyna się dziać coraz gorzej. “Naukę” na temat sklepu podzielono na fragmenty np. katalog
produktów czy też koszyk, ale gdy zajrzymy do tych działów nie zobaczymy porad z typu “jak pisać”, ale napotkamy od razu
na klasy i obiekty, z których dajmy na to koszyk jest zbudowany. Przez takie podejście do sprawy mamy wrażenie, że tak na-
prawdę czytamy dokumentację sklepu internetowego. Przeglądamy spis elementów i listingi wraz z ich lakonicznym
opisem. Bardzo często zdarza się też umieszczanie niepełnych listingów, pod którymi dowiadujemy się, że braku-
jące elementy znajdziemy na dołączonej do książki płycie. Zasadniczo więc mamy marne szanse na zrozumienie
przekazywanej treści, jeżeli nie będziemy podczas lektury korzystać z komputera. Podsycając negatywne odczucia
należy zwrócić uwagę na tytuł i treść. W tytule mamy PHP i MySQL. Ale, gdzie podział się ten MySQL ?? W całej
książce nie ma ani fragmentu wyjaśniającego formę zwrotów do bazy danych. Autorów możemy za to bardzo po-
chwalić za ostatni dział - “Obsługa zamówień”. Jest naprawdę ciekawy i dowiemy się z niego, jak uruchomić w na-
szym sklepie płatności za pośrednictwem banków internetowych czy tez kart płatniczych. Dobrym aspektem jest
też wykorzystywanie w pełnym zakresie programowania obiektowego. Podsumowując można stwierdzić, że nie
jest to książka dla początkujących. Aby zrozumieć treści przez nią przekazywane, trzeba znać zasady programo-
wania obiektowego, język PHP i MySQL.
Zrecenzował: Łukasz Skowroński
MySQL «««««
Autor: Paul Dubois
Drugie wydanie „MySQL” Paul’a Dubois jest swoistym kompedium wiedzy na temat tego popularnego silnika bazodanowego
i całej otoczki, która mu towarzyszy. Na ponad tysiącu stron znajdziemy niemal wszystko odnośnie MySQL - od składni SQL,
poprzez optymalizację zapytań, po zaawansowaną administrację serwerem bazodanowym oraz omówienie API MySQL za-
implementowanych w popularnych językach programowania (C, PHP, Perl). Ale zacznijmy po kolei.
Książka wydana w oryginale w roku 2003, a w Polsce rok później, może się wydawać nieco nieaktualna i tak jest w rze-
czywistości. Poruszane zagadnienia dotyczą MySQL w wersji 3 i 4, co może wywołać pewien niesmak u osób starających
się być na bieżąco. Dzisiaj na wielu serwerach panuje już przecież MySQL 5. Z drugiej strony trzon systemu pozostaje nie-
zmieniony, więc większość zagadnień pokrywa się z jego najnowszą wersją.
Sama książka napisana jest bardzo czytelnie. Jej lektura nie powinna sprawić problemów nawet mniej zaawansowanym
użytkownikom. Autor bardzo dokładnie opisuje wszystkie zagadnienia, unikając stosowania języka typowo technicznego
i popierając wszystko stosownymi przykładami. Całość podzielona jest na trzy części: „Sposób używania MySQL”,
„Interfejsy programowania do systemu MySQL”, „Administrowanie MySQL” oraz „Dodatki”. Mogłoby się wydawać,
że każda z nich kierowana jest do innego odbiorcy, ale po chwili przemyślenia dochodzimy do wniosku, że przecież
o każdą z nich zahaczamy choć trochę w swojej codziennej pracy.
Podsumowując, „MySQL” Paul’a Dubois to wartościowa książka, którą warto mieć w swojej podręcznej biblio-
teczce. Trzecia edycja otrzymałaby ode mnie najwyższą ocenę, druga dostaje oczko niżej, ze względu na pewne
braki w stosunku do najnowszych wersji MySQL.
Wszystkim, którzy czują się mocno w języku angielskim, mogę polecić trzecią edycję „MySQL”. Wierzę, że nie
ustępuje ona merytorycznie swojej poprzedniczce, a zawiera informacje o nowych mechanizmach zaimplemento-
wanych w MySQL 5 (widoki, wyzwalacze, procedury przechowywane). Więcej o książce na stronie autora: http://
www.kitebird.com/mysql-book/.
Zrecenzował: Marcin Stefaniak
Testy
Marcin Kowalczyk
Kierownik Działu Systemów i Serwerowni
R E K L A M A
Daniel Maksymiuk,
Warszawskie Centrum Numizmatyczne
W obecnych
czasach suk-
ces firmy oraz jej
tą były w wersji off-line. Z biegiem cza-
su okazało się, że ilość przechowywa-
nych danych była tak duża, że usługa
lizację – znajduje się niedaleko Starego
Miasta, firma ma profesjonalną obsługę,
a także może poszczycić się korzystną
przetrwanie na rynku dzierżawienia pamięci dyskowej okaza- ofertą cenową. Podczas całego okresu
zależne jest od wielu ła się nieefektywna. Postanowiliśmy za- współpracy nie pojawiły się żadne pro-
czynników. tem zakupić własny serwer, który w peł- blemy z działaniem naszego serwera,
Do niektórych z ni miałby spełnić nasze oczekiwania i z czego jesteśmy niezwykle zadowole-
nich na pewno zali- kolokować go w profesjonalnej firmie w ni. Dzięki temu możemy całkowicie sku-
czymy profesjona- Warszawie. Firma, którą wybrano z po- pić się na działalności firmy i nie myśleć
lizm i doświadczenie, a także postęp i śród wielu innych konkurencyjnych firm o ciągłym kontrolowaniu poprawności
szybkość wdrażania nowych technolo- to Supermedia Internet Provider. Oka- działania naszego serwera. Biorąc pod
gii. Wychodząc na przeciw swoim klien- zało się, że spełnia ona wszystkie nasze uwagę usługę, która jest nam świadczo-
tom nasza firma zdecydowała się uru- podstawowe ustalenia. Do kryterium wy- na przez firmę Supermedia można jej z
chomić sprzedaż poprzez internet. W boru, które miały być spełnione należa- całą pewnością dać maksymalną oce-
przyszłości planuje także uruchomienie ły: profesjonalizm, dogodna lokalizacja, nę, jeśli chodzi o jakość hotelingu. Jeśli
aukcji on-line. Do tej pory wydzierża- całodobowy dostęp do serwera i konku- miałbym ponownie wybrać firmę do ko-
wialiśmy jedynie miejsce na serwerze, rencyjne ceny. Siedziba firmy Superme- lokacji serwera zdecydowanie byłaby to
a strony internetowe z całą naszą ofer- dia Internet Provider ma doskonałą loka- Supermedia Internet Provider.
Jakub Kuran,
QPrint
Grzegorz Pilarski
Warsaw Data Center
w przypadku wykrycia jakichkolwiek nie-
prawidłowości. Kolokowanie serwerów
i urządzeń w Warsaw Data Center jest
nie tylko ekonomicznym rozwiązaniem
ale także zwiększa jakość i niezawod-
ność świadczonych usług. W szczegól-
ności:
R E K L A M A
Michał Faber
serwis biznes.net
Magdalena Stec,
shooters.pl
Cyber rzeczywistość
– Cyber uzależnienie
Łukasz Skowroński
takie życie, to jest przecież nasze życie. musi przerwać. To jest jak wirus, który
To jest nasza rzeczywistość. I tu właśnie atakuje nieświadomych zagrożenia. Ist-
zaczyna się problem. nieją też już przypadki rozwodów, właśnie
Powstają nowe określenia typu: sie- z powodu nadużywania komputera przez
cioholizm, cybernałóg. Uzależnienie od jednego z małżonków. Zarażony człowiek
komputera staje się problemem, takim jak z każdym dniem oddala się od innych
alkoholizm czy każdy inny nałóg. Specja- ludzi, otaczając się murem, w którym jedy-
liści coraz głośniej nas przed tym ostrze- nym wyjściem jest jego komputer.
gają. Ale przecież nas to nie dotyczy. Dla dobra swojego i otaczających
Jesteśmy pewni, że panujemy nad kom- nas ludzi, sprawdźmy się. W sieci mnó-
puterem. Tkwimy w przekonaniu, że każdy stwo jest testów sprawdzających nasz
normalny człowiek korzysta z komputera stan uzależnienia lub od razu wybierz-
przez 20 godzin dziennie. Bo przecież, my lepszą drogę. Postawmy sprawę ja-
po co mi jakaś inna forma aktywności. Je- sno – komputer jest urządzeniem, któ-
P
opatrzmy na nasz współczesny stem najlepszy w grę sieciową, zostałem re ma nam umożliwić sprawną pracę i
świat. I zastanówmy się, co wi- doceniony przez użytkowników mojego naukę oraz rozrywkę w rozsądnych ilo-
dzimy – widzimy samych siebie, ulubionego forum, jestem na bieżąco, bo ściach. Zamiast poświęcać czas na bez-
widzimy innych ludzi i oczywiście widzi- internet jest moim źródłem informacji – to produktywne siedzenie przed monitorem
my nieodłączny element naszej cywilizacji jest rzeczywistość. Rzeczywistość, w któ- wybierzmy się na spacer, spotkajmy ze
– komputery. Maszyny, które służą nam do rej znajduję akceptację. znajomymi, poczytajmy książkę lub Wasz
pracy i nauki, bo przecież do tego zostały Niestety, takie myślenie jest nagmin- ulubiony magazyn. Ocalimy dzięki temu
stworzone. Ale z biegiem czasu te narzę- ne i bardzo szkodliwe. Najczęściej taka zdrowie psychiczne jak i fizyczne, któ-
dzia zaczęły umożliwiać nam też rozryw- osoba nie zdaje sobie sprawy ze skali pro- re przy dłuższym nadużywaniu kompute-
kę, robienie zakupów, kontakt z przyjaciół- blemu. W naszym skomputeryzowanym ra na pewno by ucierpiało. Otyłość, pro-
mi. Mało tego, komputery stają się naszy- społeczeństwie, coraz częściej możemy blemy z kręgosłupem i układem krążenia,
mi przyjaciółmi. Wracając do domu, pierw- zauważyć młodych ludzi, nie tylko w wieku słabszy wzrok, to tylko nieliczne “atrak-
sze, co robimy, to pędzimy do niego – że- szkolnym, którzy już nie widzą niczego cje” nadmiernego poświecenia się takie-
by biedaczek nie był sam – z myślą : sią- poza komputerem. W Polsce nie jest to mu “hobby”. Dodatkowym atutem powro-
dę na chwilkę i sprawdzę czy nie ma no- jeszcze tak widoczne jak, np. w Stanach tu do normalności niech będzie fakt, że w
wych wiadomości. Po chwili, co najczę- Zjednoczonych, ale warto zwrócić na to dzisiejszym realnym świecie, każdy chce
ściej oznacza godzinę, wygrywa fizjologia. uwagę już teraz. Nie jest to tylko problem osiągnąć sukces. Każdy chce być KIMŚ.
Kiedyś przecież trzeba coś zjeść. Szyb- ludzi młodych. Uzależniony i nieświadomy Żeby to osiągnąć musimy dokonać wybo-
ka przekąska i znowu wracamy do naszej rodzic przekazuje ten model życia swoim ru. Poświęćmy się rodzinie, pracy, nauce.
maszyny. Godzina za godziną, dzień za dzieciom, które z kolei przekazują ten Zdecydujmy się na prawdziwe życie, do
dniem – po chwili – rok za rokiem, przy- styl swoim rówieśnikom. Tak powstaje którego zostaliśmy stworzeni, a nie na cy-
zwyczajamy się do takiego życia. Lubimy pewnego rodzaju pętla, którą ktoś kiedyś ber namiastkę świata. n
Prosimy wypełnić czytelnie i przesłać faksem na numer: (22) 887 10 11 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) 887 14 44
Dokładny adres....................................................................................................................................................................................................................
Tytuł
Ilość Od numeru Opłata
Ilość
zamawianych pisma lub w zł
numerów
prenumerat miesiąca z VAT
Software Developer’s Journal (1 płyta CD)
– dawniej Software 2.0 12 250/1801
Miesięcznik profesjonalnych programistów
SDJ Extra (od 1 do 4 płyt CD lub DVD)
– dawniej Software 2.0 Extra! 6 150/1352
Numery tematyczne dla programistów
Suma
W sprzedaży od kwietnia
NARZĘDZIA
NOWE ARTYKUŁY W DZIAŁACH:
n ImageMagick i PHP
graficzny kombajn n dla początkujących