Knihovna PHP-GTK

Skriptovacφ jazyk PHP se pou₧φvß na serveru ke generovßnφ dynamick²ch HTML strßnek. PodobnΘ tvrzenφ si m∙₧ete p°eΦφst tΘm∞° v ka₧dΘ knize nebo Φlßnku, kter² se PHP zab²vß. Mßlokdo vÜak vφ, ₧e ho lze s pomocφ knihovny PHP-GTK pou₧φt i k programovßnφ klasick²ch grafick²ch aplikacφ ve Windows i v Unixu.

Binßrnφ verze 0.52 pro Windows

ZdrojovΘ k≤dy verze 0.52

Oficißlnφ referenΦnφ p°φruΦka

http://gtk.php.net

typ softwaru  demoverze  |   operaΦnφ systΘm  Win.9x/Me, Win.2k,.Win.XP  |   objem dat  9,2.MB  |   jazyk  anglicky  |   cena  2000 KΦ

Knihovna GTK+ p∙vodn∞ vznikla pro grafick² editor Gimp. Jejφ obliba rychle rostla a pozd∞ji se stala zßkladem GNU desktopovΘho prost°edφ Gnome. Pojem GTK nenφ tedy ve sv∞t∞ Linuxu neznßm², ale existuje takΘ verze knihovny pro Windows. PHP-GTK potom rozÜi°uje jazyk PHP o mo₧nost vytvß°enφ grafick²ch GTK aplikacφ, kterΘ nijak nevyu₧φvajφ webov² server a jsou relativn∞ dob°e p°enositelnΘ mezi r∙zn²mi operaΦnφmi systΘmy. V²sledn² program b∞₧φ na vaÜem poΦφtaΦi podobn∞ jako Word nebo Mozilla, (spustφ se nap°. p°φkazem php skritp.php.

Vzhled okna ve Windows
Screenshot - Windows

Vzhled okna v Linuxu
Screenshot - Linux

Instalace

P°ed instalacφ v Linuxu se ujist∞te, ₧e mßte nainstalovanou CGI verzi PHP (alespo≥ ve 4. verzi) a knihovnu GTK (verzi 1.26).

Trochu zklaman∞ musφme °φci, ₧e na rozdφl od Linuxu jste ve Windows uÜet°eni mnoha problΘm∙. Na domovskΘ strßnce nebo na CD najdete p°edkompilovanou aktußlnφ verzi (momentßln∞ 0.5.2), kterß obsahuje vÜe pot°ebnΘ, vΦetn∞ n∞kolika ukßzkov²ch skript∙, kter²mi m∙₧ete otestovat, jestli vÜechno funguje tak, jak mß.

V n∞kter²ch distribucφch Linuxu m∙₧ete zkusit nainstalovat existujφcφ RPM balφky, ale p°ipravte se na hotovΘ orgie zßvislostφ a kolizφ (testovßno na RedHat 7.3 a Mandrake 8.1). My jsme to po 20 minutßch vzdal, proto₧e se instalace zaΦala podez°ele podobat tvorb∞ novΘ distribuce, a vyzkouÜeli zdrojovΘ k≤dy. Situace vÜak nebyla o moc lepÜφ, ale vÜechny chyby si u₧ ani nepamatujeme (z mailing listu jseme zjistili, ₧e nejsme sami, kdo mß s kompilacφ problΘmy). Nakonec jsme bez problΘm∙ nainstalovali starÜφ verzi 0.5 klasick²m zp∙sobem:

  ./configure
  make
  make install

╚eÜtina

Drobn² zßdrhel p°edstavuje naÜe mate°Ütina, tedy jejφ diakritickß Φßst. PHP-GTK vnit°n∞ pou₧φvß pro k≤dovßnφ °et∞zc∙ Unicode, co₧ na v∞tÜin∞ systΘm∙ zp∙sobφ problΘmy se zobrazovßnφm n∞kter²ch znak∙.

S tφm se m∙₧ete vypo°ßdat n∞kter²m z nßsledujφcφch zp∙sob∙:

Ukßzkovß aplikace

Zßkladnφ principy tvorby programu s PHP-GTK jsme se rozhodli ukßzat na jednoduchΘm programu, jeho₧ jedinou funkcφ je vytvo°enφ zßstupce internetovΘ adresy URL na pracovnφ ploÜe Windows. Jde v podstat∞ o obyΦejn² textov² soubor s p°φponou .url. Soubor m∙₧e vypadat t°eba takto:

  [DEFAULT]
  BASEURL=http://www.google.com/
  [InternetShortcut]
  URL=http://www.google.com/
  Modified=E086A4673499C20101

Poslednφ °ßdek nenφ nutn². Program si od u₧ivatele vy₧ßdß cφlov² adresß°, jmΘno souboru a URL adresu. V²sledn² program tedy nebude p°enositeln², respektive fungovat bude vÜude, ale v²sledek vßm bude jinde ne₧ ve Windows naprosto k niΦemu. ┌prava pro Linux vÜak nenφ slo₧itß û jde jen o to, rozeznat operaΦnφ systΘm a podle n∞j zapsat data v po₧adovanΘm formßtu do souboru. Musφte ale pamatovat na to, ₧e ne ka₧d² desktop pracuje se stejn²m formßtem souboru, navφc nap°. KDE mß tuto funkci integrovanou. Hotov² skript je zde.

<?php
  if (!class_exists('gtk')) {
    if (strtoupper(substr(PHP_OS, 0,3) == 'WIN'))
      dl('php_gtk.dll');
    else
      dl('php_gtk.so');
}

Takto by m∞l zaΦφnat ka₧d² skript, kter² si chce d∞lat jakΘkoliv ambice na p°enositelnost. Prvnφ podmφnka zkouÜφ, jestli u₧ je knihovna PHP-GTK zavedena v pam∞ti a pokud ne, druhß podmφnka zavede podle operaΦnφho systΘmu sprßvnou verzi knihovny. Nßsledujφ definice funkcφ.

  function delete_event()
  {
    return false;
  }

Funkce delete_event se zaregistruje jako obslu₧nß rutina (handler) pro signßl delete-event, kterß je vyvolßna v okam₧iku, kdy systΘm nebo window mana₧er poÜle po₧adavek k odstran∞nφ n∞kterΘho widgetu. Signßl zavolß metodu destroy(), kterß zruÜφ objekt a uvolnφ pam∞¥. Typicky se s nφ m∙₧ete setkat v okam₧iku, kdy kliknete na ikonu pro uzav°enφ okna v titulkovΘm pruhu. Pokud zm∞nφte nßvratovou hodnotu funkce na true, nep∙jde okno standardnφm zp∙sobem uzav°φt. Toho m∙₧ete vyu₧φt pro vyvolßnφ potvrzovacφho dialogu, ve kterΘm se ptßte, zda chce u₧ivatel opravdu skonΦit.

  function destroy()
  {
    gtk::main_quit();
  }

Zde, uvnit° funkce destroy(), volßme statickou funkci pro ukonΦenφ programu. Pokud ji nepou₧ijete a ukonΦφte program, okno sice zmizφ z obrazovky, ale v pam∞ti z∙stane.

  function create_shortcut()
  {
    global $dir_entry, $name_entry, $adr_entry;

    $filename = $dir_entry->get_text().$name_entry->get_text();
    $file = fopen($filename, "w") or die("\nSoubor nelze vytvorit!\n");

    fputs($file, "[DEFAULT]\nBASEURL=".$adr_entry->get_text()."\n");
    fputs($file, "[InternetShortcut]\nURL=".$adr_entry->get_text()."\n");

    fclose($file) or die("Soubor nelze uzavrit!");

    $name_entry->set_text(".url");
    $name_entry->set_position(0);
    $adr_entry->set_text("http://");
  }

Toto je funkce, kterß vytvo°φ zmφn∞nΘho zßstupce. Mimo standardnφ funkce PHP pro prßci se soubory obsahuje volßnφ t°φ r∙zn²ch metod objektu GtkEntry:

A nynφ u₧ m∙₧eme vytvß°et samotnΘ grafickΘ rozhranφ programu. ZaΦneme hlavnφm oknem.

  $window = &new GtkWindow();
  $window->connect("destroy","destroy");
  $window->connect("delete_event","delete_event");
  $window->set_usize(350, 150);
  $window->set_title("Novy zastupce URL");
  $window->set_border_width(4);
  $window->set_position(GTK_WIN_POS_CENTER);

  $table = &new GtkTable(4, 2);
  $window->add($table);

Jak vidφte nenφ to nic slo₧itΘho. Na prvnφm °ßdku volßme konstruktor t°φdy GtkWindow, Φφm₧ vytvo°φme novou instanci objektu. Nßsleduje dvojφ volßnφ metody connect(), kterß k signßl∙m p°ipojuje v²Üe definovanΘ obslu₧nΘ rutiny: delete_event zav°e okno a destroy definitivn∞ ukonΦφ program. ZbylΘ Φty°i metody objektu $window nastavujφ jeho vlastnosti: rozm∞ry, titulek, Üφ°ku okraje a poΦßteΦnφ umφst∞nφ na obrazovce pomocφ v²ΦtovΘ konstanty. Tyto konstanty mß k dispozici mnoho widget∙ a jejich pomocφ lze snadno zm∞nit °adu vlastnostφ. NejlepÜφ bude, kdy₧ se podφvßte do manußlu.

P°edposlednφ °ßdek ·ryvku vytvß°φ objekt GtkTable. GtkTable slou₧φ k rozmφst∞nφ dalÜφch prvk∙ v rodiΦovskΘm okn∞ a jeho parametry vyjad°ujφ poΦet °ßdk∙ a sloupc∙ tabulky. Do jednotliv²ch bun∞k se potom umφs¥ujφ dce°inΘ prvky. Pokud vytvß°φte jenom jednoduch² program, m∙₧ete zvß₧it, jestli si nevystaΦφte s prvky GtkVBox a GtkHBox, jejich₧ pou₧itφ je jednoduÜÜφ, ale v²sledn² efekt nemusφ b²t v∞tÜinou tak p∞kn².

A na poslednφm °ßdku p°idßme objekt $table do hlavnφho okna. Tφm jsme p°ipravili kostru programu a te∩ je nutno p°idat popisky, textovß pole apod.

  $dir_label = &new GtkLabel("Adresar");
  //a p°ipojφme popisek do levΘho hornφho rohu (0 zleva, 1 z prava, 0 se shora, 1 ze zdola)
  $table->attach($dir_label, 0, 1, 0, 1);
  $name_label = &new GtkLabel("Jmeno");
  $table->attach($name_label, 0, 1, 1, 2);
  $adr_label = &new GtkLabel("URL adresa");
  $table->attach($adr_label, 0, 1, 2, 3);

B∞₧nΘ textovΘ popisky se vytvß°φ pomocφ t°φdy GtkLabel. Parametr, kter² p°ijφmß konstruktor, je textov² °et∞zec, kter² se mß zobrazit. Ihned po vytvo°enφ p°idßme popisek do tabulky $table. K tomu pou₧ijeme metodu attach(), kde prvnφ parametr je jmΘno p°idßvanΘho prvku a nßsledujφcφ Φty°i Φφsla udßvajφ pozici prvku v tabulce (Φφslovßno od nuly).

  $dir_entry = &new GtkEntry();
  $dir_entry->set_text("C:\\Documents and Settings\\petr\\Plocha\\");
  $table->attach($dir_entry, 1, 2, 0, 1);
  $name_entry = &new GtkEntry();
  $name_entry->set_text(".url");
  $name_entry->set_position(0);
  $table->attach($name_entry, 1, 2, 1, 2);
  $adr_entry = &new GtkEntry();
  $adr_entry->set_text("http://");
  $table->attach($adr_entry, 1, 2, 2, 3);

Stejn²m zp∙sobem vytvo°φme textovß pole, jen mφsto t°φdy GtkLabel pou₧ijeme t°φdu GtkEntry. Navφc vÜak pou₧ijeme v²Üe zmφn∞nΘ metody pro nastavenφ implicitnφho textu a umφst∞nφ kurzoru.

  $button = &new GtkButton("Vytvorit!");
  $button->connect("clicked", "create_shortcut");
  $table->attach($button, 0, 2, 3, 4);

TlaΦφtka se tvo°φ pomocφ t°φdy GtkButton. Vytvo°φ se a do okna umφstφ stejn∞ jako p°edchozφ prvky. Od tlaΦφtka vÜak oΦekßvßme n∞jakou Φinnost, proto k n∞mu musφme jeÜt∞ p°ipojit signßl, na kter² bude reagovat, a handler, kter² signßl zpracuje. V naÜem p°φpad∞ to bude prßv∞ signßl clicked, kter² zavolß funkci create_shortcut.

  $tip = &new GtkTooltips();
  $tip->set_delay(200);
  $tip->set_tip($button, "Vytvori zastupce URL");

Drobnou, ale p°φjemnou u₧iteΦnostφ je nßpov∞da v podob∞ plovoucφch tip∙. Po vytvo°enφ instance t°φdy GtkTooltips nastavφme dobu v milisekundßch, po kterΘ se mß nßpov∞da zobrazit, kdy₧ ponechßme kurzor myÜφ nad widgetem s nßpov∞dou. Potom dßme na v∞domφ, ₧e se nßpov∞da vztahuje ke tlaΦφtku $button.

  $window->set_focus($name_entry);
  $window->show_all();

Pomalu jsme se p°iblφ₧ili ke konci programu. Metodou set_focus() urΦφme, ₧e aktivnφm prvkem bude implicitn∞ textovΘ pole $name_entry û u₧ivatel tak m∙₧e rovnou zadat jmΘno souboru.

VÜe, co jsme zatφm ud∞lali, vÜak existuje jenom n∞kde v pam∞ti, ale na obrazovce by se po spuÜt∞nφ nic nezobrazilo. Proto zavolßnφm

  $window->show_all();
  gtk::main();
?>

zobrazφme okno a vÜechny p°ipojenΘ prvky a ·pln∞ nakonec spustφme hlavnφ smyΦku programu.

Ukßzky hotov²ch program∙

VÜechny uvedenΘ programy a mnoho dalÜφch je voln∞ ke sta₧enφ na domovskΘ strßnce knihovny PHP-GTK.

IP Look-up
Jednoduch² program pro zjiÜt∞nφ IP adresy zadanΘ domΘny.
Stßhnout zde

Number Converter
Program pro p°evod zßkladnφch Φφseln²ch soustav.
Stßhnout zde

PHP Header Grabber
Zobrazφ HTTP hlaviΦky, kterΘ se odesφlajφ p°i navazovßnφ spojenφ, a umo₧nφ jejich ulo₧enφ do souboru.
Stßhnout zde

Porg
Utilitka pro hromadnΘ p°ejmenovßnφ soubor∙.
Stßhnout zde


Teak

Teak je p°φkladem v∞tÜφho programu v PHP-GTK. Jde o poÜtovnφho klient s podporou protokolu IMAP a vlastnφm adresß°em.
Stßhnout zde

Zßv∞r

Pokud jste doΦetli a₧ jsme a vyzkouÜeli si vlastnoruΦn∞ a ·sp∞Ün∞ napsat n∞jak² program, pak vßm gratulujeme. Asi jste pochopili, ₧e s knihovnou PHP-GTK nemß smysl pouÜt∞t se do n∞jak²ch velk²ch program∙, ale p°i psanφ drobn²ch utilit m∙₧e b²t jejφ pou₧itφ jednoduÜÜφ, ne₧ psßt k≤d t°eba v C++. Na domovskΘ strßnce i zde na CD naleznete n∞kolik p°φklad∙ r∙znΘ slo₧itosti, kter²mi se m∙₧ete inspirovat.

Petr KinÜt