VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA STROJNÍHO INŽENÝRSTVÍ ÚSTAV AUTOMATIZACE A INFORMATIKY FACULTY OF MECHANICAL ENGINEERING INSTITUTE OF AUTOMATION AND COMPUTER SCIENCE
WWW STRÁNKY PRO MEZINÁRODNÍ KONFERENCI TITLE
DIPLOMOVÁ PRÁCE DIPLOMA THESIS
AUTOR PRÁCE
MICHAL SVOJANOVSKÝ
AUTHOR
VEDOUCÍ PRÁCE SUPERVISOR
BRNO 2007
DOC. ING. PAVEL OŠMERA, CSC
Strana 3
ZADÁNÍ ZÁVĚREČNÉ PRÁCE
Strana 5
LICENČNÍ SMLOUVA
Strana 7
ABSTRAKT Předložená práce se zabývá řešením informačního systému pro podporu mezinárodní konference. K řešení byl použit skriptovací jazyk PHP. Z tohoto důvodu se předpokládá HTML výstup a použití webového prohlížeče jako nástroje pro klienta. S použitím tohoto sytému by mělo dojít ke zrychlení a zefektivnění organizace.
ABSTRACT Exposed thesis is dealing with solution of information system supporting an international conference. In this case, the PHP scripting language has been used. Because of it, HTML is supposed to be an output to web browser as a tool for client side. With this system, organization should be faster and more effective.
KLÍČOVÁ SLOVA PHP, MySQL, CSS, XML, RSS, konference
KEYWORDS PHP, MySQL, CSS, XML, RSS, konference
Strana 8
Strana 9
PODĚKOVÁNÍ Tímto děkuji panu docentu Ošmerovi za podporu a náměty při tvorbě mé práce a serveru BigSun za bezplatné umístění a prezentaci mého projektu. Také bych chtěl touto cestou poděkovat panu inženýru Poliščukovi za vytvoření šablony, která mi velmi usnadnila psaní této práce.
Historie.................................................................................................................................. PHP a OOP............................................................................................................................ OOP v PHP 3....................................................................................................................... OOP v PHP 4....................................................................................................................... OOP v PHP 5.......................................................................................................................
Možnosti účastníků....................................................................................................... 45 Možnosti recenzentů..................................................................................................... 46 Možnosti administrátorů............................................................................................... 47 Struktura databáze......................................................................................................... 50 RSS................................................................................................................................52 Prostředí pro běh aplikace...........................................................................................55 Závěr............................................................................................................................... 57 Seznam použité literatury............................................................................................. 59
Strana 13
1
ÚVOD
Cílem této práce je vytvoření aplikace, která by zautomatizovala a zrychlila úkony při pořádání konference. Práce s elektronickým textem je mnohem pružnější a s použitím elektronické pošty lze komunikovat na obrovské vzdálenosti při velmi nízké ceně.
Strana 15
2
DOSTUPNÉ TECHNOLOGIE
2.1
HTML
HTML - Hypertext Markup Language je stále nejpoužívanější jazyk pro formátování obsahu dokumentu v síti Internet. Jedná se o značkovací jazyk, to proto, že výrazy jsou uvozeny značkami < a >. HTML používá SGML formát. Prohlížeče by měly ignorovat tagy (značky) nebo atributy, které neznají. 2.1.1
Konsorcium W3C
World Wide Web Consortium (W3C) je mezinárodní konsorcium, kde zaměstnanci na plný úvazek a vybraní lidé z veřejnosti, pracují společně na vývoji standardů pro WWW. Od roku 1994 W3C publikovalo přes 90 dokumentů, které se nazývají W3C Recommendations (Doporučení). Také se angažuje ve vzdělávání, ve vývoji softwaru a v diskuzích kolem Webu. Plný potenciál Webu se rozvine pouze při zachování kompatibility se softwarem, který bude použit na získávání obsahu.
Obr. 1 - Logo World Wide Web konsorcia 2.1.2
Historie
V roce 1991 CERN spustilo Web spolu s poštovním seznamem, který se nazýval www-talk. Záhy se našli další lidé, aby pomohli vznikající komunitě svými nápady. Chtěli vytvořit systém, který by byl stejně dostupný napříč platformami na počítačích CERNu. V té době se používaly pro formatování dokumentů hlavně TeX a PostScript, někdy SGML. HTML bylo shledáno jako ideální prostředek realizace tohoto požadavku spolu s jednoduchým protokolem http.
Strana 16
Obr. 2 - Ukázka prvního prohlížeče s editorem vydaného v roce 1992, který byl první „pravý“ editor pro první verzi HTML. Běžel pod operačním systémem NeXT, programovací jazyk byl použit objektové C. 2.1.3
HTML 4.01
HTML 4.01 je v současnosti poslední verzí HTML. Již se dále nevyvijí, protože stoupají požadavky na validitu kódu, což HTML nezaručuje. HTML 4.01 je revize verze 4.0, poprvé byla vydána 18. prosince 1997. Typické rozvržení HTML dokumentu uakzuje příklad:
2.1.4
XHTML Basic
XHTML Basic je druhý z Doporučení XHTML specifikací. Dokument psaný v tomto jazyce má minimální seznam modulů, aby byl typu XHTML. Má podporu pro obrázky, formuláře, základní tabulky a objekty. Je navržen pro klienty, kteří nemají podporu pro plný seznam XHTML modulů, jako např.: PDA, mobilní telefony, pagery a set-top boxy. Typ dokumentu je natolik obsáhlý, aby umožňoval autorizaci obsahu. 2.1.5
XHTML 1.1
Účel tohoto typu dokumentu je sloužit jako základ pro budoucí typy XHTML a poskytovat neměnnou, dopředu hledící typ dokumentu úplně oddělený od zastaralého typu HTML 4. Tento typ dokumentu je přeformulací typu XHTML 1.0 Strict (Striktní) užitím XHTML modulů. To znamená, že mnoho protředků, které jsou k dispozici v jiných XHTML formátech (např.: XHTML Frames (Rámy)), nejsou k dipozici v tomto typu dokumentu.
Strana 17 2.1.6
Šablony, režimy prohlížečů
DTD – Document Type Declaration (Deklarace typu dokumentu) je instrukce, která přikládá k SGML nebo XML dokumentu definici jeho typu. HTML enginy v moderních prohlížečích zkoumají DOCTYPE hlavičku HTML dokumentu a přepínají zobrazení do režimu platných standardů nebo režimu s chybami. V následujícím příkladě definujeme šablonu DTD pro dokument typu HTML 4.01 Transitional, čímž docílíme zobrazení takové stránky v režimu platných standardů: – –
V režimu s chybami (Quirks Mode) se prohlížeč snaží emulovat starší verzi, naproti tomu v režimu standardů (Standards Mode) vykresluje engine stránku podle nejnovějších pravidel. Tyto módy jsou velmi důležité zejména při použítí CSS (viz dále).
2.2
PHP
PHP je dnes jedním z nejpoužívanějších skriptovacích jazyků pro tvorbu dynamicého obsahu na stránkách WWW. Jeho obrovská výhoda je open source vývoj, to znamená, že je dostupný zdarma pod PHP licencí. Jedná se o licenci speciálně navrženou pro PHP, která je postavená na základech Free Software Foundation. 2.2.1
Historie
PHP je nástupcem PHP/FI, který vytvořil Rasmus Lerdorf v roce 1995. Na počátku se jednalo pouze o sadu skriptů napsaných v jazyce Perl. V roce 1997 se PHP/FI 2.0, druhá implementace psaná v C, stala kultovní záležitostí pro (odhadem) tisíce uživatelů po celém světě, a s přibližně 50.000 doménami oznamujícími nainstalované PHP/FI, což čítalo zhruba 1 % všech domén na Internetu. I když do projektu začalo svými kusy kódu přispívat více lidí, stále to byl velký projekt jednoho muže. PHP/FI 2.0 bylo oficiálně uvolněno až v listopadu 1997, poté co strávilo většinu svého života v betaverzích. Krátce nato bylo následováno první alfaverzí PHP 3.0. PHP 3.0 byla první verze, která se velmi blížila takovému PHP, jak ho známe dnes. Vytvořili ho Andi Gutmans a Zeev Suraski v roce 1997 jako kompletně přepsaný celek, poté co shledali PHP/FI 2.0 výrazně "poddimenzované" pro vývoj svých aplikací pro e-komerci. Ve snaze spolupracovat a zahájit budování nad existující uživatelskou základnou PHP/FI, rozhodli se Andi, Rasmus a Zeev pracovat společně a prohlásit PHP 3.0 za oficiálního nástupce PHP/FI 2.0, a vývoj PHP/FI 2.0 byl v podstatě zastaven. Jednou z nejsilnějších zbraní PHP 3.0 byly jeho obrovské možnosti rozšíření. K poskytnutí pevné infrastruktury pro mnoho různých databází, protokolů a API koncovým uživatelům, přilákaly možnosti rozšíření PHP 3.0 také tucty vývojářů, kteří se připojili a vytvořili nové rozšiřující moduly. Toto byl nesporně klíč k obrovskému úspěchu PHP 3.0. Jiným klíčovým prvkem v PHP 3.0 byla podpora objektově orientované syntaxe a mnohem silnější a konzistentnější syntaxe jazyka. Nový jazyk byl uvolněn pod novým názvem, který odstranil implikaci omezeného osobního použití, kterou neslo označení PHP/FI 2.0. Byl nazván pouze 'PHP', což je rekurzívní akronym - PHP: Hypertext Preprocessor. Hello World v jazyce PHP (příklad je záměrně složitější pro podrobnější vysvětlení):
Strana 18
Na tomto příkladě vysvětlím hlavní klíčová slova a uvozování jazyka PHP. PHP není nic jiného, než script, který generuje HTML kód pro prohlížeč podle zvolených zákonitostí. Uvozuje se značkami , dnes je také možná krátká forma a ?>. na některých serverech dokonce je povoleno uvozování jako v kódu ASP, což je „bratr“ PHP od společnosti Microsoft (ovšem komerční). Tento skript se uvozuje <% a %>. Na valné většině serverů je však toto použití z pochopitelných důvodů zakázáno a tímto způsobem uvozovat PHP se nedoporučuje. Toto všechno záleží na nastavení konfiguračního souboru na serveru. Mezi těmito značkami je vloženo PHP. Komentář je uvozen // nebo /*. PHP totiž v hodně případech umožňuje použití alternativních syntaxí, včetně řídicích struktur, což ale v praxi je spíše na obtíž, protože když např. jiný programátor používá odlišnou syntaxi, velmi těžko se v jeho kódu dokažete zorientovat. Toto bývá hodně problém při týmové práci. Pod komentářem se nachází proměnná $var. Proměnné se v PHP uvozují pomocí znaku dolar ($). Do této proměnné je přiřazen řetězec (string) Hello World. Definice proměnných a alokace v paměti se zde neprovádí, PHP se o tyto rutiny stará samo automaticky. Na konci každého výrazu se musí nacházet středník. Ten značí, že již nic dále nebude následovat a daný výraz je kompletní. Klíčové slovo echo říká, že to, co je za ním, má zobrazit, čili předat HTML. V mém případě je to proměnná $var. Ve verzi PHP3 je první podpora objektového programování, má však hodně odlišností od verze 4 a 5, z nichž ty nejzávažnější si řekneme níže: 2.2.2
PHP a OOP (objektově orientované programování)
Programování obecně lze rozdělit na funkcionální a objektově orientované. Záleží na programátorovi, jaký typ si vybere. Některé programovací jazyky mají pouze objektový přístup (např.: Java), jiné mají možnost obojího (C) a další objekty nemají vůbec (Assembler). PHP dnes patří do druhé kategorie, objekty se mohou a nemusejí použít.
Strana 19 V tomto příkladě máme definovanou funkci xyz, která má jednu vstupní proměnnou $a. Funkce vrací proměnnou $c, kterou dostaneme tak, že se vynásobí $a * 10. V PHP je možné mít i funkci, která má předdefinované proměnné. 2.2.3
OOP v PHP 3 Jak jsem již zmínil výše, v PHP3 se poprvé setkáváme s objektem. Přístup k objektům byl však hodně odlišný, než jej máme v PHP dnes. Základní rozdíl je v chápání konstruktoru třídy, což vysvětlím podrobněji níže, kde vysvětlím nutné pojmy. Dnes je však tato verze již značně zastaralá a už se s ní prakticky nesetkáme.
2.2.4
OOP v PHP 4 PHP4 je první verzí PHP, kde práce s objekty dostává smysl. Rozlišujeme několik hlavních klíčových slov pro práci s nimi: class - uvození třídy var - interní proměnná náležící objektu, viditelnost se nerozlišuje extends – toto klíčové slovo je součástí uvození třídy spolu s class a značí, že daná třída je potomek. V následujícím příkladě máme dvě třídy A a B, přičemž třída B je potomek A.
(nová instance třídy A) s voláním funkce B:
$objekt = new A; $objekt->B(); ?>
Nyní se dostávám k problému verzí PHP3 a PHP4. Tento problém popíši na stejném příkladě. Neméně důležitým prvkem v objektu je konstruktor. Jedná se o speciální funkci, která je volána při každém vytvořením objektu (tzn. voláním třídy). V mém příkladě třída A má konstruktor funkci A. V PHP4 nemá konstruktor vyhrazeno klíčové slovo, namísto toho se jím automaticky stává fuknce se stejným jménem jako třída, ke které náleží. Naproti tomu v PHP3 je konstruktor automaticky každá funkce se stejným jménem jakéhokoliv objektu. Takže při „spuštění“ mého příkladu na PHP3 třída B má konstruktor funkci B z objektu A, což odporuje principu chování objektů.
Strana 20 Závěr: V PHP 3 se nedoporučuje OOP, protože takový skript může mít nepředvídatelné chování. Verze 4 má sice hodně omezenou práci s objekty, nicméně objektový model je víceméně standardní. 2.2.5
OOP v PHP 5
PHP5 má od základů přepracován objektový model, protože v této verzi se na objekty klade velmi velký důraz. Jedná se o robustní jazyk, vhodný pro svůj potenciál na rozsáhlé projekty pod značným vytížením. Klíčová slova se v mnoha případech liší, velké množství nových bylo přidáno. Je však dodržená kompatibilita s verzí PHP4. Malý příklad PHP 5:
Mezi hlavní rozdíly patří zavedení klíčového slova __constructor pro konstruktor dané třídy a rozlišení viditelnosti proměnných a funkcí, kde nyní definujeme klíčová slova private, protected a public. – –
private – takto uvozená fuknce nebo proměnná třídy je viditelná pouze z dané třídy protected - takto uvozená fuknce nebo proměnná třídy je viditelná z dané třídy a všech potomků
–
public - takto uvozená fuknce nebo proměnná třídy je viditelná i mimo třídu (stejné jako PHP4)
K dalším novým vlastnostem patří například klonování objektů a reflexe.
2.3
SQL
SQL je dotazovací jazyk pro komunikaci s databázemi. V podstatě můžu říci, že se jedná o typ funkcionálního programování, to znamená, že nás nezajímá, jak dostaneme výsledek (co se děje uvnitř), pouze popíšeme, co chceme. Typickým příkladem funkcionálního programování je Matlab.
Strana 21 2.3.1
Historie
Psal se rok 1960 a databázové aplikace po celém světě vyžadovaly mainframe, který ovšem byl velmi náročný na údržbu. Každý mainframe však běžel na jiném softwaru od různých výrobců. IBM vyvíjelo databázové programy, ale velký problém byla právě tato nekompatibilita. Tak se na scéně objevuje SQL, Standard Query Language (Standardní dotazovací jazyk),aby sjednotil komunikaci s databázemi, to se stalo v roce 1970. SQL umožňuje programátorovi přesně definovat, jaká data chce získat a jakým způsobem je zobrazit. 2.3.2
MySQL
MySQL je nejoblíbenější open-source databázový systém. Je vyvíjen a spravován společností MySQL AB. MySQL AB je komerční společnost založená vývojáři MySQL. Jedná se o druhou generaci Open Source společnosti, která sjednocuje Open Source model s úspěšným obchodním modelem.
Obr. 3 - Logo MySQL databáze
V současné době MySQL AB poskytuje několik databázových řešení podle nároků na výkon a struktury: –
Enterprise – jedná se o nejvyšší systém, vyznačuje se spolehlivostí, bezpečností a bezporuchovostí provozu. Dostupná je 24x7 technická podpora, která je placená.
–
Cluster – verze navržná s důrazem na spolehlivost, dosahuje 99.999%. Motto je „Nulová tolerance k chybám“.
–
Embedded – velmi oblíbená mezi OEM (Original Equipment Manufacturer, tzn. jedna společnost koupí od druhé zboží, které následně prodává pod její značkou) partnery pro svoji velmi zajímavou cenu a vysokým výkonem.
- MySQL Community Server – tato verze je vydávána jako Open Source a právě ji můžeme potkat na většině serverů. Na rozdíl od verze Enterprise jsou k dipozici pouze balíčky k instalaci a předpokládá se, že dotyčný je seznámen s postupy konfigurace a uvedením do provozu. Není zde k dispozici žádná technická podpora. Poslední verze je 5.0.
Strana 22 2.3.3
PHP a MySQL
Dále se budu věnovat právě verzi Community Server. V PHP máme k dispozici celou škálu funkcí pro práci nejen s MySQL databázemi. Pro ni jsou nejpoužívanější: mysql_connect() – vytvoří spojení s MySQL serverem mysql_select_db() - vyber daný název databáze mysql_query() - proveď zadaný dotaz na databázi v SQL mysql_num_rows() - spočítej počet ovlivněných řádků daným SQL dotazem. mysql_fetch_row() - načti výsledný řádek do pole mysql_fetch_array() - načti výsledný řádek do asociativního, čísleného pole nebo obojího Následující příklad nám ukazuje použití PHP funkcí s využitím dotazovacího jazyka SQL pro navázání kontaktu se serverem MySQL a posléze nastavením správného kódování daného jazyka: php // funkce pro připojení k databázi function db_connect(){ $conn = mysql_connect("db_server", "db_login", "db_pswd"); $db = mysql_select_db("db_dbname", $conn); mysql_query("SET NAMES 'utf8'", $conn); return $conn; } // zavoláme tuto funkci $conn = db_connect(); ?>
Po zavolání této funkce se provede připojení na MySQL server, ukazatel na fci mysql_connect si uložím do proměnné $conn, kterou mě tato fukce vrátí. Je to z důvodu toho, že PHP funkce pro MySQL databázi vyžadují identifikátor spojení se serverem, nebo použijí poslední dosptupné připojení, což jsem si zachoval v proměnné $conn. Plné znění všech PHP MySQL funkcí - SQL dotaz a identifikátor spojení mysql_query("SET NAMES 'utf8'", $conn);
Zkrácené znění PHP MySQL funkcí - pouze SQL dotaz, využije se naposledy použité spojení mysql_query("SET NAMES 'utf8'");
Strana 23 2.3.4
phpMyAdmin
Po instalaci MySQL databázového systému pod podporovaný OS (nejčastěji typu UNIX), spustíme patřičný proces serveru (mysqld) a přes příkaz (mysql) se ocitneme v konzoli, kde přímo zadáváme SQL příkazy. Avšak toto vyžaduje určité oprávnění na serveru včetně přístupu k samotnému OS (například přes SSH). V praxi ovšem nás nikdo ke svému serveru „tak blízko“ nepustí, je to pro dotyčného příliš velké bezpečnostní riziko. Proto se uchytil tento nástroj na správu MySQL databáze, který je celý napsán PHP jazyce a tudíž výstup je HTML, což se pohodlně dá obsloužit webovým prohlížečem.
Obr. 4 - Logo projektu phpMyAdmin phpMyAdmin nabízí přehledně základní i pokročilé funkce MySQL databáze, mezi které patří vytváření, mazání a úprava tabulek, přidávání, ubírání sloupců, tvorba indexů apod. Mezi jeho hlavní nevýhody bych zařadil velmi omezenou práci s tabulkami typu InnoDB, což je jediný typ tabulky, které umožňují TRIGGERS – při změně se provede definovaná akce (spoušť). Příklad takového triggeru nad tabulkami InnoDB: CREATE TABLE rodic (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE dite (id INT, rodic_id INT, INDEX rodic_index (rodic_id), FOREIGN KEY (rodic_id) REFERENCES rodic(id) ON DELETE CASCADE ) ENGINE=INNODB;
V tomto příkladě při smazání řádku(ů) v tabulce rodic se smažou všechny odpovídající řádky i v tabulce dite podle id rodice. Stále nejlepší je zadávat podobné příkazy přes SQL okno phpMyAdmina, protože pouze tak je zaručeno, že se požadovaný TRIGGER provede podle našich představ. Za velký boj bych však označil export takových dat, protože nemáme jistotu, že Admin vypíše všechny námi definované relace.
I z těchto důvodů se v MySQL databázi používají tabulky typu MyISAM, které nám sice neumožňují výše popsané akce, ale jejich podpora je mnohem komplexnější.
Strana 24
Obr. 5 - Okno pro přímé zadání SQL příkazů v phpMyAdmin
2.4
XML
eXtensible Markup Language (rozšiřitelný značkovací jazyk) je dnes jeden z nejdůležitějších formátů pro vzájemnou výměnu dat i mezi jinak nekompatibilními systémy. Jedná se o systém značek, mezi kterými se nacházejí požadované informace. Definice těchto značek i obsah informace mezi nimi je na vzájemné domluvě, proto je nyní definována spousta různých standardů a není problém se domluvit s druhou stranou na svoji verzi pro výměnu dat mezi sebou. Příklad: <studenti> <student> <jmeno>Michal Brno2944
Hlavička takového XML dokumentu může vypada takto:
Což značí, že verze XML je 1.0 a dokument je v UTF-8 kódování. 2.4.1
Historie
V 70. letech tři pánové od IBM vynalezli GML, způsob značení technických dokumentů strukturovanými tagy. Tehdy vlastě poprvé zaznělo slovo „mark-up language“, čili značkovací jazyk. Tak vznikla v roce 1986 ISO norma pro SGML. To ovšem bylo poněkud matoucí, protože samotné SGML nebylo značkovací jazyk, ale pouze specifikace. Jedna z nejznámějších aplikací SGML je HTML (viz kapitola 2.1). V tomto případě se jedná o sadu definovaných tagů použitelných pro WWW stránky.
Strana 25 2.4.2
RSS
Obr. 6 - Ikonka RSS používaná hlavně v prohlížečích firmy Mozilla
Really Simple Syndication (opravdu jednoduché „vytvoření skupiny“) je prostředek pro jednoduché sdílení obsahu. Pro svoji strukturu používá XML s definovanými tagy. Mezi povinné patří tyto: <description>Toto je popis mého kanálu Jazyk URL dané položky – musí začínat http:// Textová indentifikace zdroje
Příklad uvedený výše je napsán v „oficiální“ verzi RSS. Konkrétně se jedná o verzi 0.91, což poznáme podle hlavičky RSS dokumentu:
Často se však můžeme potkat i s jinými verzemi RSS. Vychází to z teorie XML, kde si můžeme de facto zvolit jakoukoliv značku. Druhým nejpoužívanějším typem RSS kanálu je tzv ATOM. ATOM vznikl hlavně z důvodu nespokojenosti s formátem RSS v2.0, od které se liší v mnoha bodech, vypíši zde ty nejzajímavější: – – –
Každá zpráva má přiřazen unikátní řetězec, aby aktualizace byla spolehlivější Obsahuje XML schéma Může být digitálně podepsán
Zde uvádím jednoduchý příklad takového výpisu ve formátu ATOM 1.0: Example Feed <subtitle>A subtitle. 2003-12-13T18:30:02ZJohn Doe <email>[email protected]urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 <entry> Atom-Powered Robots Run Amokurn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a2003-12-13T18:30:02Z <summary>Some text.
Na příkladě si lze všimnout, že verze není definována pomocí značky rss, ale přes xmlns schéma na W3C.
Také je zde vidět unikátní řetězec pro každou zprávu. urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
K „přeložení“ takového textu uživateli se používá software zvaný RSS čtečky. Jedná se o program, který vezme patřičně formátovaný XML dokument a podle značek naformátuje výstup. V dnešní době existuje spousta čteček a drtivá většina si umí poradit s oběma formáty. Dokonce některé webové prohlížeče je mají už zabudovány v sobě, např. Mozilla nebo Opera. Internet Explorer by měl čtečku obsahovat od verze 7.0.
Strana 27
V dnešním světě význam RSS čteček rapidně stoupá, protože umožňují např. vybrat si článek z určitého serveru, který nás zajímá, sledovat mnoho serverů najednou, stáhnout si za krátký čas stovky zpráv z různých serverů, a probrat je, až budu mít čas apod.. Možnoti využití je spousta. I u nás už spousta převážně zpravodajských serverů podporuje tento způsob exportu dat čtenáři. V případě, že používáme prohlížeč firmy Mozilla nebo Opera, lze upozornit návštěvníky svého serveru na tuto skutečnost přidáním speciálního řádku do hlavičky HTML stránky:
Výsledek pak může vypadat např. takto: (zde v prohlížeči Mozilla Firefox). Na pravé straně je ikonka reprezentující RSS, při kliknutí jsme vyzváni, jestli chceme odebírat z tohoto serveru novinky, jestliže odpovíme kladně, přidá se nám tento server do odebíraných:
Bohužel toto funguje pouze u novějších verzí prohlížečů, u kterých je zabudována čtečka. Jinak vidíme pouze formátovaný XML dokument. Z tohoto důvodu je lepší mít nainstalovanou separátní čtečku (může mít také vice možností nastavení).
2.5
CSS
CSS je dnes velmi významým jazykem pro definování vzhledu HTML dokumentu. CSS znamená Cascading Style Sheets, čili Kaskádové styly. 2.5.1
Historie
Sága CSS se začala psát roku 1994. Jeden ze zakladatelů pracoval v CERNu, což byl kolébka Webu. Neexistoval žádný způsob, jakým by šlo definovat vzhled dokumentu. Například nebylo řešení, aby webová stránka vypadala jako noviny. Stylistické předlohy nebyly u webu zcela nový nápad. Oddělení struktury dokumentu od vzhledu byl cílem HTML od jeho vzniku v roce 1990. Tim Berners-Lee napsal jeho NeXT prohlížeč/editor (viz obr. 2) již s použitím svého jednoduchého souboru s definici stylu, nicméně nikdy nepublikoval jeho syntaxi. Další prohlížeče si také definovaly svoje styly, avšak bylo jich stále méně a méně. Nejpopulárnější prohlížeč NSCA Mosaic byl ale velkým zklamáním a obrovským krokem zpět, protože dovoloval měnit pouze barvy a druh písma. Tři dny před uvedením Netscapu Håkon publikoval první práci na téma CSS. Na tuto práci nejmarkantněji odpověděl Bert Bos, který je autorem prohlížeče Argo. V tomto velmi přizpůsobitelném prohlížeči již nalezneme prvky dnešní verze CSS.
Strana 28 2.5.2
Použití
Rozlišujeme dva druhy aplikace stylů do HTML stránky. První způsob spočívá v přímém zápisu CSS do kódu mezi stanovené tagy: <style> body { background: black; font-family: garamond, sans-serif; color: white; font-size: 20px; } Lorem ipsum dolor sit amet consectetuer sem elit tincidunt augue.
Styly se uvozují tagem <style> a uzavírá je tag . V mém příkladě mám definovánu třídu body, což je celkový vzhled (mezi tady a ). V této třídě bude černé pozadí (background: black), rodina písma se vezme garamond, jestliže není k dispozici tak sans-serif (fontfamily: gamramond, sans-serif), barva bude bílá (color: white) a velikost písma 20 pixelů (font-size: 20px).
Obr. 7 - vykreslení dokumentu webovým browserem Druhý způsob načtení stylů spočívá v připojení externího souboru. Takový soubor potom nemá již uvození tagy <style>, poněvadž není součástí HTML kód. Jinak je struktura samozřejmě naprosto stejná. Tento soubor má příponu .css a jeho připojení se provádí kódem v hlavičce HTML dokumentu následovně:
Kaskádovými styly ale definujeme nejen vzhled prvků, ale i rozmístění na stránce. Zde používáme dva druhy pozicování – absolutní a relativní. Absolutní je dáno pozicí nadřazeného prvku, v praxi hrana obsahu. Toto pozicování se uvozuje klíčovým slovem absolute. Takto zformátovaný prvek se vyjme z toku dokumentu, a tím vlastně vznikají další vrstvy (osa z). Pohyb mezi nimi je dán direktivou z-index:
Potom spojením s definicí z předchozího příkladu a zapsáním do HTML dostaneme: <style> body { background: black; font-family: garamond, sans-serif; color: white; font-size: 20px; } #menu { position: absolute; z-index: 0; left: 10px; width: 150px; background: #CC0000; }
Lorem ipsum dolor sit amet consectetuer sem elit tincidunt augue.
Obr. 8 - ukázka absolutního pozicování za použití CSS
Strana 30 Z ukázky můžeme vidět, že zleva je odsazení, je to právě těch deklarovaných 10px. Zhora je sice také, ale to je způsobeno použitým prohlížečem, aby text stránky nebyl moc vysoko. Co se týká HTML kódu, přibyla tam další definice:
Jedná se o zápis, který říká, že následující HTML kód patří do dané třídy CSS definic. Pozadí tohoto prvku je zadáno v hexadecimálním tvaru RGB a vykresluje se tak dlouho, dokud se v něm nachází text. Tento poznatek náleží obecně ke všem vlastnostem CSS. Dnes však šlo použití CSS ještě dále. Obrovký přínos spočívá v definici speciálního stylu pro tisk HTML stránky. Černobílá stránka dnes nikoho nezaujme, stejně jako stránka bez grafiky. Avšak na tisk by naopak bylo velmi žádoucí, aby takto stránka vypadala. Řešení je použít druhý styl na tisk. To, aby prohlížeč o této možnosti věděl, zařídíme definicí do hlavičky HTML kódu:
Tímto zápisem řekneme prohlížeči, že pro vzhled při tisku má využít místo původního souboru print.css. K čemu to je dobré? Tato zdánlivě nevyužitelná drobnost v sobě skrývá velký potenciál. Pomocí příkazu display: none;
lze skrýt bloky (třídy), které nepotřebujeme (typicky obrázky), a naopak těm, které obsahují text, nastavit bílé pozadí a černé písmo. Tak máme stránku připravenu k tisku a nenutíme uživatele nic nastavovat.
Strana 31
Obr. 9 - stránka konference při běžném náhledu
Obr. 10 - stránka konference při náhledu tisku
Strana 33
3
VÝBĚR Z DOSTUPNÝCH TECHNOLOGIÍ V této části bych přistoupil k problému výběru a pokusil se jej zdůvodnit.
3.1
Proč HTML
V dnešní době patří k nejpoužívanější verzi XHTML 1.0, popř. 1.1. Děje se tak převážně z důvodů použití XML tagů a také ze zastarávání HTML, které se již dále neaktualizuje. Jestli však XHTML má tolik přinosů, aby se jej používalo, o tom se vedou dlouhé debaty. XHTML vzniklo na popud faktu, že v HTML chybí mechanismus na „validitu“ kódu, tzn. nemusí být např. uvozovky u hodnot tagů, jsou překřížené tagy apod.
Tyto problémy vznikaly nejen z přehlédnutí, ale velmi často byly úmyslné. To klade zvýšené nároky na engine prohlížečů, který se musí nějakým způsobem vypořádat s takovými zápisy, nehledě na zátěž počítače. Takto napsaná stránka se sice v drtivé většině zobrazí korektně, nicméně minimalně doba potřebná k jejímu zpracování je mnohem delší. V jiném prohlížeči se tato stránka nemusí zobrazit vůbec nebo s chybami. V mé práci jsem však použil HTML, konkrétně 4.01 Transitional. Existují totiž mechanismy, které vývojáře dokáží upozornit na případnou chybu. Nejznámějším je W3C Validator pro HTML/XHTML stránky. Jedná se o internetovou službu, které se pošle kód, a po chvíli se objeví přímo výsledek, zda je vše v pořádku, či ne. U „problémových“ řádků je také poznámka na nejčastější chyby, popř. i odkaz přímo na manuál na W3C.
Obr. 11 - Ukázka výstupu W3C Validatoru, zde je vše v pořádku
Strana 34 Při použití tohoto nástroje na „odchytání“ chyb nevidím osobně důvod, proč nepoužít HTML. I přesto, že norma Transitional, jak lze vidět z obrázku, není prohlížeči vykreslována podle režimu platných standardů, lze tohoto docílit přes DTD šablony (viz kapitola 2.2.6). Všechny tyto údaje spolu s dalšími se nacházejí v hlavičce (X)HTML stránky, která je nejdůležitější částí. \n"; echo "\n"; echo "\n"; echo "<META http-equiv=\"Pragma\" content=\"no-cache\">\n"; echo "<META http-equiv=\"Cache-control\" content=\"no-cache\">\n"; echo "<META content=\"text/html; charset=UTF-8\" http-equiv=\"ContentType\">\n"; echo "<META name=\"author\" content=\"Michal Svojanovský\">\n"; echo "<META name=\"googlebot\" content=\"index,follow,snippet,archive\">\n"; echo "<META name=\"robots\" content=\"all,follow\">\n"; echo "<META name=\"keywords\" content=\"ICSC\">\n"; echo "\n"; echo "\n"; //echo "\n"; echo "\n"; echo "<TITLE>ICSC - International Conference on Soft Computing\n"; echo "\n"; ?>
V tomto příkladě z mé práce lze vidět, že se nepoužívá cache (kvůli přihlášení a soukromé sekci), kódování je UTF-8, následují řádky pro vyhledávače (roboty), CSS styly pro zobrazení a tisk (viz kap. 2.5), přítomnost RSS kanálu (viz kap. 2.4.2) a nadpis stránky prohlížeče.
3.2
Proč PHP 4 OOP
V kapitole 2.2.3 jsem se zmínil o objektech v PHP 5. Tato hlavní verze je zatím poslední (ještě jsou subverze, např. 4.4.4 nebo 5.1.3, které slouží vesměs na opravy chyb). Na svůj projekt jsem však použil objektový přístup v PHP 4. Nyní se pokusím vysvětlit proč: –
PHP 5 je sice relativně dlouho, ale nasazení na serverech je menší než 50%. To se týká převážně velkých poskytovatelů webhostingu, kteří se obávají problémů a odlivu zákazníků, protože některé nestandardní postupy ve skriptech už nemusejí fungovat.
–
Je velmi málo kvalitní literatury, která by názorně přiblížila nový objektový model tohoto jazyka s využitím nových funkcí.
–
V případě, že aplikace je napsána správně v PHP 4 OOP, tento model by měl bez problémů běžet i na PHP 5 serveru.
–
V případě, že bude nutné použít PHP 5, není problém přímo do PHP 4 kódu toto dopsat.
Strana 35 V několika bodech jsem se tedy pokusil vysvětlit mé rozhodnutí. Samozřejmě je jasné, že použití PHP5 by některé činnosti s objekty mohlo výrazně zjednodušit, a tím by celá aplikace byla rychlejší. V mé práci jsem použil následující objektový model:
Obr. 12 - použitý OOP model Na použitém modelu je klíčová hlavní třída, která obsahuje všechny společné proměnné a metody. Tato třída je rodičem všech stránek, které se v projektu nacházejí. Každá členská třída má v sobě nejméně jednu metodu, což je ona stránka. Může však mít interní proměnné nebo i metody, v tom případě jsou pouze určeny ji.
$loginname = mull; $userid = null; $islogged = null; $rights = null;
var $script_name; var $error = 0; var $time; // jméno session s objektem var $session_object = "icsc_session_id"; // jména tabulek var $table_users = "mendel_users"; var $table_pm = "mendel_pm"; var $table_news = "mendel_news"; var $table_participants = "mendel_participants"; var $table_files = "mendel_files"; var $table_reviewers = "mendel_reviewers"; var $table_fr = "mendel_files_reviewers"; var $table_emails = "mendel_emails"; var $table_admins = "mendel_admins";
Zde je ukázka hlavní třídy, kterou jsem pojmenoval mendel. Můžeme si všimnout i konstruktoru (viz kap. 2.2.4). Volání této třídy (tedy vytvoření objektu) zde však nenajdeme. Tato třída se totiž inicializuje při každé návštěvě konference, přičemž její obsah je uložen v tzv. SESSION. 3.3
SESSIONS a objekt v SESSION
Při vývoji aplikace, která se sestává z více stránek, lze narazit na požadavek identifikovat daného uživatele podle určitých pravidel na každé stránce projektu. V praxi to znamená, že je potřeba nějakým způsobem zajistit předávání proměnných, které se nastaví zpravidla po úspěšném přihlášením do aplikace. K tomu slouží několik technik: – –
POST – Data se předávají přes metodu http POST, nejčastěji se jedná o formulář. GET – Data poskytovaná přes metodu http GET, v PHP jde o proměnné předané z URL, např.: http://soldat.bigsun.cz/index.php?page=contact
–
SESSION – Je nejčastější metodou, z technického hlediska se jedná o soubor, který je uložen na serveru. Název tohoto souboru je vygenerovaný MD5 hash a jsou v něm uloženy všechny proměnné pro daného uživatele, které si přejeme předávat. Každý uživatel má uložen u sebe identifikátor názvu daného souboru, tzn. MD5 hash. Mluvíme o tzv. SESSION ID. Ten se předává dvěma způsoby: –
–
COOKIE – jedná se o malý textový soubor na disku uživatele. Drtivá většina následujících vlastností lze nastavit v konfiguračním souboru PHP (php.ini). Platnost dané cookie většinou končí při zavření okna prohlížeče. Soubor na disku se stejným MD5 se maže po 24 minutách od poslední akce uživatele. Jedná se o nejvíce používaný způsob uložení SESSION. GET – MD5 identifikátor souboru je předáván v URL (viz výše). Tato metoda není oblíbená kvůli dlouhým URL, vytvářením duplicitních názvů stejného souboru (každý uživatel má jiné URL) apod.. index.php?PHPSESSID=3ffc2f3d1ccdf56b2847d80a2b1a1fd5
Strana 37 URL s identifikátorem SESSION ID. Každé proměnné, kterou si přejeme předat, musíme přiřadit název, pod kterým bude vystupovat v SESSION:
Během vývoje se však může stát, že proměnných, které musíme předávat, je velké množství a hledá se způsob, jak celé programování zjednodušit. Proto jsem v mém projektu použil objektově orientovaný přístup s uložením objektu do SESSION.
$loginname = mull; $userid = null; $islogged = null; $rights = null;
} // vloz objekt if(!isset($_SESSION['objekt'])){ $_SESSION['objekt'] = new mendel; } // vypis login uzivatele echo $_SESSION['objekt']->loginname; ?>
V příkladě je ukázána část třídy mendel se čtyřmi vnitřními proměnnými. Jestliže uživatel nemá v SESSION objekt mendel, vytvoř tento objekt a ulož. Potom již můžeme přistupovat k vnitřním proměnným tak, jak je ukázáno níže (V PHP 4 není rozlišena viditelnost proměnných v rámci třídy, viz kap. 2.2.3). S použitím tohoto řešení máme pouze jednu proměnnou v SESSION, kam lze uložit n vnitřních proměnných a metod dané třídy.
Strana 39
4
ROZBOR APLIKACE
V předchozí kapitole jsem se snažil odůvodnit výběr z dostupných technologií za použití ukázek z práce. Nyní se budu věnovat rozboru samotné aplikace z hlediska uživatelského i programového.
4.1
Design
Pro mou aplikaci jsem se rozhodl použít jednoduchý layout vytvořený za použití CSS (viz. kap. 2.5).
Obr. 13 - Layout stránky vytvořený v CSS Konečné rozložení klíčových prvků (hlavička, menu, hlavní část a patička) jsou myslím přehledné a intuitivně rozmístěné bez nutnosti uživatele jednotlivé prvky hledat. Díky použití CSS jde tento vzhled měnit bez nutnosti zasahovat do kódu stránek. body { margin: 0; padding: 0; background: #FFFFF1; text-align: center; font-family: garamond, sans-serif; } #header { padding: 0; border-bottom: 1px solid black; background: #D7D4C5 url("img/tmp.png") left no-repeat; height: 135px; } #background { width: 750px; margin: 1em auto;
Zde jsem uvedl ukázku z použitého CSS stylu, je zde uveden styl pro BODY, HEADER (hlavičku) a BACKGROUND (pozadí). Lze si všimnout direktivy url v elementu HEADER, což značí načtení externího souboru, v mém případě obrázku, který se zobrazí vlevo bez opakování. Tímto jsem docílil i snadné případné úpravy loga konference. Druhé použití CSS je pro tisk stránek, jak jsem již naznačil v kapitole 2.5.2 o možnostech CSS. Jedná se o soubor print.css, který je relativně krátký a nese v sobě následující hlavní příkaz: #left, #header, #left_content, #footer { display: none; }
Ten značí, že třídy LEFT (menu), HEADER (hlavicka), LEFT_CONTENT (obsah menu) a FOOTER (patička) budou při tisku skryty. Příkaz display jsem popsal také v kapitole 2.5.2. Mimo toho ještě obsahuje barevné úpravy prvků a písma na černobílé, což není už tak důležité.
4.2
Registrace
V této a dalších kapitolách již opustím design a vrátím se zpět k programové části. Registrování se do systému je klíčovou záležitostí pro první přístup veřejnosti a s tím také souvisí otázka bezpečnosti. V mém systému jsou tři nezávislé registrace podle množství údajů získávaných od budoucího člena konference. Každá registrace, až na jeden typ (viz následující podkapitola), má velmi podobný mechanismus: 1. Vyplnění údajů 2. Potvrzení e-mailu 3. První přihlášení Zájemce o konferenci vyplní políčka jejichž kompletnost není testována, protože se předpokládá, že si uživatel vytvoří nový účet při chybném zadání informací o sobě. Z tohoto důvodu je zbytečná i úprava profilu. Administrátor vidí všechny účty, takže není problém takové účty odstranit. Po úspěšné registraci je dotyčnému na uvedenou adresu poslán e-mail, který slouží jako záruka správného e-mailu. Po kliknutí na odkaz z e-mailu si vyplní login a heslo, čímž se vytvoří účet. O odstranění nepotvrzených účtů se stará metoda eppuracc() - viz kap. 4.3.2, která je automaticky spuštěna při přihlášení některého administrátora (nespouští se pokaždé kvůli zbytečné záteži, ideální by bylo použít CRON) . 4.2.1
Ověření e-mailu
Na e-mail je posláno URL, které identifikuje daného uživatele. To je zajištěno přes SESSION ID (viz kap. 3.2.1): Thank You for Your registration at Mendel Conference, please follow up http://soldat.bigsun.cz/!_konference/index.php?page=reg_rev&UIN=slsrv i3ijpp9nd8cpvnmvhkte2 to end the registration process. If You have any problems, please contact Prof. Osmera at [email protected]
Zde je uveden příklad takového e-mailu, vidíme GET MD5 string, který obsahuje SESSION ID. Tato
Strana 41 URL volá metodu, která po zkontrolování validity daného ID provede nastavení parametru valid_email na 1 v databázi a vyzve uživatele, aby si zvolil login a heslo: function check_email($type, $UIN){ if(isset($UIN)){ if($type == 'part'){ $rows = mysql_num_rows($query = mysql_query( "SELECT `Id` FROM `".$this->table_participants."` WHERE (`sess_id`='$UIN') AND (`valid_email`='0')" )); }elseif($type == 'rev'){ $rows = mysql_num_rows($query = mysql_query( "SELECT `Id` FROM `".$this->table_reviewers."` WHERE (`sess_id`='$UIN') AND (`valid_email`='0')" )); }elseif($type == 'admin'){ $rows = mysql_num_rows($query = mysql_query( "SELECT `Id` FROM `".$this->table_admins."` WHERE (`sess_id`='$UIN') AND (`valid_email`='0')" )); } if($rows > 0){ if($type == 'part'){ $this->update_row($this>table_participants,"valid_email","1","sess_id",$UIN); }elseif($type == 'rev'){ $this->update_row($this>table_reviewers,"valid_email","1","sess_id",$UIN); }elseif($type == 'admin'){ $this->update_row($this>table_admins,"valid_email","1","sess_id",$UIN); } return $UIN; }else{ $this->error = 1; return "
Sorry, no member with this UIN exists or is already registered
"; } } }
Při selhání této metody (tzn. uživatel je již registrován nebo má chybné Id) je uživatel na tuto skutečnost informován a třídní proměnná $error je nastavena na 1, čehož si všimne vlastní stránka a nezobrazí formulář na volbu přihlašovacího jména a hesla. V případě, že vše proběhne tak jak má, je uživatel vyzván, aby si zvolil login a heslo. Po zadání těchto údajů se již může přihlásit.
4.3
Přihlášení
O vlastní přihlášení se stará metoda login, která má jako vstupní proměnné $login a $password. Nejprve se provede SQL dotaz do databáze. table_users."` WHERE (`login`='$login') AND (`password`='$password')"
Strana 42 ?>
V případě, že daný dotaz proběhne v pořádku (tzn. člen s takovým uživatelským jménem a heslem existuje), v existující SESSION s objektem (viz kap. 3.3) se změní vnitřní proměnné: session_object]->islogged = 1; $_SESSION[$this->session_object]->loginname = $login; $_SESSION[$this->session_object]->userid = $user['Id_user']; if($user['type'] == 'P'){ // práva člena $_SESSION[$this->session_object]->rights = 'part'; } if($user['type'] == 'R'){ // práva recenzenta $_SESSION[$this->session_object]->rights = 'rev'; } ?>
Ve výše uvedeném kódu z přihlašovací metody je vidět nastavení čtyř třídních proměnných, a to: $islogged – defaultně je nastavena na 0 – binární vyjádření stavu přihlášení pro filtraci veřejné a soukromé sekce, $loginname – zde je uložen uživatelův login pro případný výpis (např.: v menu), $userid – index uživatele z databáze, který jej reprezentuje v relačním modelu (viz kap. 4.7) a nakonec práva, které se berou také z databáze - $rights. Tato promměnná zaručuje, že uživatel uvidí pouze to, co mu jeho práva dovolí. Rozlišuji tři vrstvy práv – člen, recenzent a admin. Na příkladě si však lze všimnout, že chybí vrstva práv pro administrátora. Je to z toho důvodu, že této problematice bude věnována následující podkapitola. 4.3.1
Přihlášení administrátora
Protože administrátor má největší práva, musí mu být věnována zvýšená pozornost. Nyní uvedu předchozí ukázku nastavení práv z pohledu administrátora:
if($user['type'] == 'A'){
Strana 43 Lze si všimnout, že kód je o poznání složitější. Je to způsobeno „mezičlánkem“, který ověřuje, zda daný administrátor je již schválen některým z dosavadních adminů. Když tomu tak není, přihlášení dotyčnému není povoleno, třídní proměnné jsou nastaveny zpět na výchozí hodnoty a stránka je přesměrována na index.php (úvodní). Z tohoto důvodu je patrné, že v systému musí být přítomen na počátku alespoň jeden administrátor, protože jinak by logicky ho neměl kdo potvrdit. Toto omezení však nepovažuji za příliš obtěžující a myslím, že „účel světí prostředky“. Jestliže je vše v pořádku, jsou systémem přidělena práva a poté se provede metoda eppuracc(), která „čistí“ nepotvrzené účty (bližší popis kap. 4.2): table_participants." WHERE (`timestamp` < '".$max_time."') AND (`valid_email`='0') " ) or die (mysql_error()); mysql_query( "DELETE FROM ".$this->table_reviewers." WHERE (`timestamp` < '".$max_time."') AND (`valid_email`='0') " ) or die (mysql_error()); mysql_query( "DELETE FROM ".$this->table_admins." WHERE (`timestamp` < '".$max_time."') AND (`valid_email`='0') " ) or die (mysql_error()); } ?>
Obr. 14 - Login do konference s odkazem na poslání zapomenutého hesla
Poslední částí, kterou bych se chtěl zabývat této podkapitole, je možnost poslání hesla při jeho ztrátě. Často se setkávám s názory, že hesla v databázi by měla být nějakým způsobem zakódována, nejčastěji se tak děje použitím MD5. Je to jistě užitečná funkce, avšak nevidím důvod ji použít u databáze, a to kvůli následujícím hlavním aspektům:
Strana 44 –
když se někdo dostane do databáze, uvidí její kompletní strukturu a nic mu nebrání si vytvořit svůj účet s libovolnými právy, popř. vše smazat.
–
heslo se posílá na server nekódovaně, takže ho lze kdykoli během přenosu přečíst.
–
v dnešní době jsou natolik vykonné počítače, že není problém MD5 prolomit.
–
nelze heslo poslat při ztrátě
Poslání hesla při ztrátě se děje podle loginu (přihlašovacího jména) daného uživatele. Protože neregistrovaný uživatel nikde nevidí login ani e-mail, procento zneužití např. na spam je velmi malé. Když uživatel si vyžádá heslo, volá se následující kód jako akce formuláře: table_users."` WHERE `login`='$log'" )); if($rows > 0){ $row = mysql_fetch_row($query); $db_type = $row[0]; $db_iduser = $row[1]; $pswd = $row[2]; if($db_type == 'P'){ $query1 = mysql_query( "SELECT `email` FROM `".$this>table_participants."` WHERE `Id`='$db_iduser'" ); }elseif($db_type == 'R'){ $query1 = mysql_query( "SELECT `email` FROM `".$this>table_reviewers."` WHERE `Id`='$db_iduser'" ); }elseif($db_type == 'A'){ $query1 = mysql_query( "SELECT `email` FROM `".$this>table_admins."` WHERE `Id`='$db_iduser'" ); } $row1 = mysql_fetch_row($query1); $email = $row1[0]; mail($email,"Mendel conference forgotten password","Hello! Your password is - $pswd. Have a nice day, webmaster");
}
}else{ echo "
Sorry, no account for this login has been found
"; }
Skript se podívá do databáze, zda na zadaný login existuje účet a v kladném případě načte podle zařazení člena (recenzent, administrátor, člen) e-mail a heslo. V případě, že se v databázi daný člen nenachází, je žadatel na tuto skutečnost upozorněn hlášením Sorry, no account for this login has been found
Strana 45
4.4
Možnosti účastníků
V následujících třech kapitolách bych se zaměřil na rozbor možností každé skupiny uživatelů konference podle jejich práv. Účastníci konference mají dvě základní volby: 1. Zaregistrovat se na poslání pozvánky - „Call For Papers“ 2. Nahrát soubor se svým článkem, popř. dalšími věcmi na rencenzi Ad 1) – Zde není příliš co popisovat. Člen v dialogu se zaregistruje, příp. odregistruje pro poslání papírové formy pozvánky: You are currently NOT registered for Call for papers – register... V případě odregistrování se pouze změní text hlášení You are registered for Call for papers – unregister...
Register a unregister jsou v tomto případě odkazy, které nastavují bytový parametr v databázi (1 nebo 0). Ad 2) – Nahrání souboru na server je realizováno formulářem metodou POST bez použití nebezpečné a často zakazované funkce copy(). Místo ni je použita standardní funkce move_uploaded_file(), která je doporučována i v manuálu. Z toho vyplývá, že soubory jsou ukládány na pevný disk serveru. Aby se předešlo možnému duplicitnímu pojmenování souboru (a tím přepsání původního), je toto ošetřeno generováním názvu. Osobně jsem zvolil funkci time(), která vrací unixový timestamp, což je počet sekund od epochy unixu (1.1.1970). Z tohoto je patrné rozlišení, což je 1s. Předpokládám, že toto rozlišení bude plně postačovat mému systému.
} ?>
Výše zmíněný PHP kód náleží metodě, která má na starosti vlastní proceduru nahrání souboru. Tato metoda má osm vstupních proměnných, a to – název pole se souborem, cílový adresář, název souboru, maximální velikost souboru, cestu, kam se má vrátit v případě selhání a tři dovolené přípony. Tyto přípony jsou archivy typu TAR, RAR nebo ZIP. Je to z důvodů: – – –
ušetření místa na disku účastník může poslat v jednom archivu spolu s článkem i například obrázky apod přehlednosti
Strana 46
Po uložení souboru na disk je do databáze vložen záznam, že daný soubor náleží tomuto členovi. Tento systém je navržen plně univerzálně, což znamená, že jeden účastník může mít n souborů. Každý soubor může mít přiložen popisek.
Obr. 15 - Upload článku na server
4.5
Možnosti recenzentů Recenzenti mají dvě pro ně specifické možnosti: 1. Výběr souboru k recenzi v případě, že se shodují témata 2. Stáhnutí daného souboru a napsání recenze
Ad 1) - V případě, že již některý účastník nahrál na server soubor pro recenzi, a při registraci si zvolil stejné téma jako recenzent, recenzent u dotyčného vidí jméno a příjmení včetně jeho všech souborů, které nahrál.
Obr. 16 - Registrování se na recenzi Na obrázku lze vidět, že uživatel nahrál dva soubory, které se recenzují každý zvlášť. Ve sloupci Reviewers je čílem udáno kolik recenzentů se již přihlásilo k recenzi. Jakmile je zvolen některý ze souborů, recenzent je na tuto skutečnost upozorněn, aby zbytečně nestahoval stejné soubory vícekrát.
Strana 47
Obr. 17 - Dotyčný recenzent byl registrován na první soubor
Po zvolení alespoň jednoho souboru nastává druhá fáze: Ad 2) – Recenzentovi je nabídnut zvolený soubor ke stáhnutí a na stejné stránce je i formulář, kam může napsat recenzi.
Obr. 18 - Stáhnutí zvoleného souboru a napsání recenze
4.6
Možnosti administrátorů
Administrátoři mají největší pravomoce, proto je na ně už při registraci a přihlášení kladen velký důraz (viz kap. 4.3.1). Jeho možnosti se dají rozdělit do několika bodů: 1. 2. 3. 4.
správa účastníků, recenzentů a ostatních administrátorů údržba a psaní novinek týkajících se konference správa e-mailů pro elektronický styk s potencionálními účastníky povolení nového administrátora po jeho registraci (viz kapitola 4.3.1)
Ad 1) – Těmto možnostem se věnují tři položky v menu, a to Ukaž členy, Ukaž recenzenty a Ukaž recenze.
Obr. 19 - Zobrazení členů a případných jejich souborů
Strana 48
V položce Ukaž členy jsou zobrazeny jméno, příjmení, e-mail a všechny soubory, které dotyčný člen nahrál s jejich popisky. Každý soubor i vlastní účet lze smazat. Následuje menu Ukaž recenzenty, pro které platí stejná pravidla jako pro členy, ale s tím rozdílem, že místo souborů je zde informace o jejich počtu, které si recenzent vyžádal.
Obr. 20 - Zobrazení recenzentů a počtu právě recenzovaných souborů Poslední položka z této oblasti je Ukaž recenze, kde je pouze výpis recenzí s loginem účastníka, loginem recenzenta a názvem souboru. Po kliknutí na odkaz se automaticky zobrazí daná recenze.
Obr. 21 - Zobrazení recenze k danému souboru V položce Ukaž administrátory je zobrazena tabulka s výpisem všech administrátorů, které lze také mazat mimo sebe. Ad 2) – K psaní novinek slouží speciální stránka, kde je k dispozici formulář na vložení nové novinky a smazání existující. Při některé z těchto akcí se také aktualizuje soubor rss.xml v adresáři rss, který slouží pro RSS (teorie viz kap. 2.4.2, konkrétní popis kap. 4.8). K novinkám se automaticky vloží datum a čas + login administrátora, který ji napsal. Ad 3) – Emaily jsou uloženy v databázi a slouží hlavně pro poslání termínů na konferenci. Také mohou sloužit pro call for papers. Základem je formulář, kam administrátor napíše text, který se následně pošle na všechny emaily v databázi. Na úpravu tohoto seznamu je připravena další stránka, kde lze emaily prohlížet nebo příp. mazat. Seznam se pro přehlednost automaticky stránkuje. Protože však ruční přidávání emailů je dosti zdlouhavé, obsahuje systém možnost přípravy si takového seznamu například v textovém editoru a následně ho nahrát do určené složky na server přes připravený formulář. Systém tento soubor zpracuje a v případě, že se daný email v databázi nenachází, automaticky jej přidá do databáze.
Strana 49 if($use == 'first'){ $query = mysql_query( "SELECT `email` FROM `".$this->table_emails."` WHERE `mode`='1'" ); }elseif($use == 'second'){ $query = mysql_query( "SELECT `email` FROM `".$this->table_emails."` WHERE `mode`='2'" ); }elseif($use == 'third'){ $query = mysql_query( "SELECT `email` FROM `".$this->table_emails."` WHERE `mode`='3'" ); } while($arr = mysql_fetch_array($query)){ $arr_emails[] = $arr['email']; } $open = fopen($filename, 'rb'); while(!feof($open)){ $current_email = rtrim(fgets($open, $buffer_size)); if(!in_array($current_email, $arr_emails)){ $q = "INSERT INTO `".$this->table_emails."` (`email`,`mode`)"; if($use == first){ $q .= "VALUES ('".$current_email."','1')"; }elseif($use == second){ $q .= "VALUES ('".$current_email."','2')"; }elseif($use == third){ $q .= "VALUES ('".$current_email."','3')"; } mysql_query($q) or die (mysql_error()); }
} fclose($open);
} ?>
V mém systému se nachází tři nezávislé seznamy, záleží na administrátorovi, kam se přeje daný soubor importovat. Na příkladě kódu z aplikace je uvedena metoda zpracovávájící soubor s emaily. Ad 4) – Tato možnost slouží k povolení přihlášení pro nový administrátorský účet. Tuto akci má na starosti následující kód: loginname.". You may now login. Best regards, Conference webmaster"; $this->update_row($this-
Strana 50 >table_admins,"chef_agree","1","Id","".$_GET['Id'].""); mail($mail, $subject, $text); } ?>
Na stránce se zobrazí všechny registrované účty jako administrátoři, kteří mají potvrzený email (viz kap. 4.2.1), ale nejsou potvrzeni žádným ze současných adminů. Jestliže se tato akce provede, nový admin je na tuto skutečnost informován e-mailem, který zadal do profilu. Již se může přihlásit. Jakmile je akce hotova, daný admin zmizí z této stránky a je zobrazen jako regulerní admin mezi ostatními.
4.7
Struktura databáze Data aplikace jsou uchovávány v devíti tabulkách: –
Admins – zde jsou uloženy profily administrátorů, obsahuje sloupce pro každou položku registračního menu a navíc bytové (0/1) sloupce s parametry, a to valid_email, které je u všech typů členů a značí, zda daný člen má potvrzený e-mail. Další bytové políčko je specifické administrátorům a určuje, jestli některý admin souhlasí s přihlášením nového administrátora (viz kap. 4.6 a 4.3.1). Přeposlední je také u všech typů a je v něm uložena SESSION ID pro kontrolu e-mailu (viz kap. 4.2.1) a poslední rovněž, jedná se o časovou značku vytvoření účtu pro jeho případné autmatické smazání.
–
Reviewers – tabulka recenzentů - platí dtto co pro administrátory, akorát bez specifických sloupců.
–
Participants – tabulka účastníků – dtto jako recenzenti.
–
Users – vytvořené účty se jménem a heslem pro každou skupinu. Rozlišení v daných tabulkách je realizováno přes předání indexu, který je unikátní. Unikátnost mezi tabulkami je pomocí bytového sloupce type, kde 'A' je pro adminy, 'P' pro členy a 'R' pro recenzenty.
–
Emails – zde jsou uloženy e-maily s parametrem, do jaké skupiny seznamů patří (viz kap. 4.6).
–
Files – tabulka se soubory, které nahráli účastníci konference. Je zde index uživatele, název souboru na disku serveru a popis. (bližší popis kap. 4.4).
–
Files_reviewers – tato tabulka by se dala nazvat vazební, slouží k provázání indexu souboru s indexem recenzenta při jeho zvolení. Poslední sloupec obsahuje recenzi.
–
News – tabulka novinek. Sloupce jsou časová značka, nadpis, vlastní text a kdo poslal.
–
Pm – o využití této tabulky zde nebyla řeč, protože rozhraní není podle mého až tak zajímavé, jedná se o vnitřní systém soukromých zpráv mezi uživateli, tuto možnost vidí všechny vrstvy práv. Je v ní vlastní zpráva, index odesílatele, index příjemce a časová značka.
Názvy všech tabulek jsou uloženy v hlavní třídě jako string a tudíž se dají libovolně měnit (viz kap. 3.2 v ukázce třídy).
Strana 51
Obr. 22 - Seznam tabulek v phpMyAdmin (viz kap. 2.3.4) se zvoleným prefixem „mendel_“
Obr. 23 - E-R diagram
Na výše uvedeném obrázku je závislost tabulek přes indexy naznačena pro větší názornost pomocí E-R diagramu. Vazba na tabulku users z levé strany je realizována přes parametr, který reprezentuje danou tabulku. Jsou zde uvedeny pouze ty tabulky, které mají závislosti.
Strana 52
4.8
RSS
Teorie okolo XML formátu včetně příkladů a použití RSS je uvedena v kapitole 2.4, proto v této kapitole pouze ukáži použití tohoto formátu u mého systému. Základní kámen je metoda gen_rss(), která je volána při každém přidání, resp. smazání novinky. rss = ""; $this->rss .= ""; $this->rss .= ""; $this->rss .= "cs"; $this->rss .= "<description>International Conference on Soft Computing (ICSC) NEWS"; $this->rss .= "http://soldat.bigsun.cz/!_konference"; $this->rss .= "<docs>http://blogs.law.harvard.edu/tech/rss"; $this->rss .= "News from ICSC"; $this->rss .= "Engine powered by PHP"; $this->rss .= "<webMaster>[email protected]"; $query = mysql_query( "SELECT `Date_rfc` FROM `".$this->table_news."` ORDER BY `Id` DESC LIMIT 1" ); while($arr = mysql_fetch_row($query)){ $this->rss .= "".$arr[0].""; } $count = mysql_num_rows($result = mysql_query( "SELECT `Id`, `Date_rfc`, `Title`, `Text`, `From` FROM `".$this->table_news."` ORDER BY `Id` DESC" )); if($count != 0){ while($array = mysql_fetch_array($result)){ $this->rss .= ""; $this->rss .= "".$array['Title']." - sent by ".$array['From'].""; $this->rss .= "http://soldat.bigsun.cz/!_konference/index.php#news".$array['I d'].""; $this->rss .= "<description>".$array['Text'].""; $this->rss .= "".$array['Date_rfc'].""; $this->rss .= "http://soldat.bigsun.cz/!_konference/index.php#news".$array['I d'].""; $this->rss .= ""; } } $this->rss .= ""; $this->rss .= ""; $this->write("./rss/rss.xml","".$this->rss.""); } ?>
Strana 53 Metoda vybere z databáze všechny novinky s patřičnými údaji a uloží je jako string do třídní proměnné $rss. Poté je volána pomocná metoda write(), která obsahuje dvě vstupní proměnné, a to cestu k souboru a data. Tato metoda soubor vyprázdní a znovu naplní aktualizovanými údaji. Návštěvníkovi stránek je poté předkládán právě ten vygenerovaný soubor.
Obr. 24 - Renderované podání RSS dokumentu s testovací novinkou a výzvou pro odebírání tohoto zdroje v prohlížeči Mozilla Firefox 2.0.0.2 Verzi RSS jsem zvolil „oficiální“ RSS v2.0.
Strana 55
5
PROSTŘEDÍ PRO BĚH APLIKACE
V poslední kapitole bych poznamenal pár slov ke konfiguraci serveru, na kterém by měla konference běžet. Co se týče http serveru, nejrozšířenější je open source server Apache, nyní ve verzi 2.2. Jedná se o stabilní a prověřený server na unix-like systémech (tento OS velmi doporučuji pro provoz http serveru). Software nutný pro běh se sestává samozřejmě ze skriptovacího jazyka PHP, v mém případě je nutná verze alepsoň 4.2.x a výše. Na PHP 5 je aplikace plně funkční. V konfiguraci PHP může být povolen safe mode i vypnuty register globals. Pro správný běh je nutno nastavit u adresářů „files“, „emails_file“ a „rss“ a souboru rss.xml, který se nachází v adresáři /rss, práva 0777. Databázový stroj je vyžadován MySQL, verze 4 nebo 5, nejsou zapotřebí žádná speciální nastavení, používá se systém MyISAM, což je nativní prostředí pro ukládání dat v MySQL. Relace ani triggery verze 5 nejsou použity, vše je řešeno manuálně v SQL. Důvody jsou jednoduchý export i import struktury přes phpMyAdmin (viz kap. 2.3.4) a velmi malá podpora MySQL 5. Ve zkratce: operační systém UN*X, http Apache >= 1.3, PHP >= 4.2.x, MySQL >= 4
Obr. 25 - Logo projektu PHP
Obr. 26 - Logo MySQL databáze
Obr. 27 - Logo projektu http serveru Apache
Strana 57
6
ZÁVĚR
Výsledkem mé práce je webová aplikace se zaměřením na správu a organizaci konference. Při vývoji jsem se zčásti inspiroval již existujícími konferencemi, od nichž jsem převzal některé vlastnosti, které jsem se snažil dále rozvinout, popř. přidat některé nové. Systém je přizpůsoben požadavkům konference ICSC, což je dceřinná konference Mendel, avšak je řešen co nejuniverzálněji, tudíž by neměl být problém ho nasadit na obecnou konferenci. K tomu by měly dopomáhat prvky aplikace jako například CSS vzhled (jednoduchá úprava vzhledu), objektové PHP (snadná upravitelnost a přenositelnost) a v neposlední řadě RSS, jakožto důležitý prvek informovanosti účastníků. Jako každá aplikace, i ta moje, se dá vylepšit, zejména po stránkách plateb, správy ubytování zahraničních účastníků atp.. Myslím, že tyto doplňky by díky navrženému modelu aplikace a databáze nebyly problém v případě potřeby snadno implementovat a tím dále rozšířit možnosti systému. Z hlediska praxe došlo k nasazení na minulou konferenci Mendel na dobu cca 2 měsíce. Jedná se o konferenci, kterou pořádá UAI a jedním z vedoucích konference je můj školitel doc. Ošmera. I když nasazení bylo relativně krátké, ze strany účastníků přišlo několik kladných ohlasů a také se samozřejmě projevilo několik nedostatků a nepřesností. Mezi tyto nedostatky bych zařadil například rozvržení stránky, které se ukázalo jako nevhodně zvoleno, a začalo být při větším počtu údajů méně přehledné. Z tohoto důvodu jsem vzhled v této verzi kompletně předělal. Je možné, že při delším ostrém nasazení by se projevily další nedostatky, ať už po stránce funkční či grafické. Z těchto důvodů je běžná testovací lhůta rozsáhlejších projektů, ve které se simulují situace, které mohou nastat při ostrém provozu. Mezi nejzákladnější patří otestování funkčnosti, rychlosti, rychlosti při větším zatížení, bezpečnost apod.. Tato lhůta je nezbytná pro spolehlivý běh dané aplikace a její význam by se neměl podceňovat. Protože zadání znělo „mezinárodní konference“, jako jazyk pro komunikaci jsem zvolil angličtinu, která je myslím jeden z nejrozšířenějších světových jazyků a „jazyk internetu“.
Strana 59
SEZNAM POUŽITÉ LITERATURY [1]
STANÍČEK, Petr CSS – kompletní průvodce ISBN-80-7226-872-4
[2]
KOSEK, Jiří Tvorba interaktivních internetových aplikací.. Grada Publishing 1999. ISBN 80-7169-373-1
[3]
Extensible Markup Language [HTML dokument] přeložil: Michal Svojanovský Last modified Date: 2006/09/11 15:03:49, poslední úprava ze dne 11.9.2006, Dostupné z: http://www.w3.org/XML [citováno 30.2.2007]
[4]
ANDERSON, Tim Introducing XML, its history, what it is, its significance [HTML dokument] přeložil: Michal Svojanovský January 2004, poslední úprava ze ledna 2004 Dostupné z: http://www.itwriting.com/xmlintro.php [citováno 30.2.2007]
[5]
RSS [HTML dokument] Stránka byla naposledy editována v 07:39, 6. 4. 2007 Dostupné z: http://cs.wikipedia.org/wiki/RSS [citováno 2.3.2007]
[6]
BUREŠ, Jiří RSS? RSS! [HTML dokument] poslední úprava 4.3.2003 Dostupné z: http://interval.cz/clanky/rss-rss [citováno 5.3.2007]
[7]
Atom (standard) [HTML dokument] přeložil: Michal Svojanovský This page was last modified 01:48, 16 April 2007, stránka byla naposledy upravena 16.4.2007 Dostupné z: http://en.wikipedia.org/wiki/Atom_%28standard%29 [citováno 16.3.2007]
[8]
LIE, W. H., Bert, B. Cascading Style Sheets, designing for the Web. 2nd edition, 1999, Addison Wesley, ISBN 0-201-59625-3 The CSS saga [HTML dokument, část knihy – kap. 20] přeložil: Michal Svojanovský Dostupné z: http://www.w3.org/Style/LieBos2e/history [citováno 6.4.2007]
[9]
PHP: Hypertext Preprocesor [HTML dokument] Last updated: Mon May 7 02:40:19 2007, stránka byla naposledy upravena 7.5.2007 Dostupné z: http://php.net [citováno 20.2.2007]
[10]
MySQL AB :: Developer Zone [HTML dokument] stránka byla naposledy upravena v roce 2007 Dostupné z: http://dev.mysql.com [citováno 26.2.2007]