Elektronická žákovská knížka Electronic student`s booklet
Transkript
České vysoké učení technické v Praze Fakulta jaderná a fyzikálně inženýrská Katedra softwarového inženýrství v ekonomii Obor: Matematické inženýrství Zaměření: Softwarové inženýrství v ekonomii Elektronická žákovská knížka Electronic student's booklet BAKALÁŘSKÁ PRÁCE Vypracoval: Petr Řezníček Vedoucí práce: Mgr. Dana Majerová Ph.D. Rok: 2006 Prohlášení Prohlašuji, že tuto bakalářskou práci jsem vypracoval samostatně. Při tvorbě bakalářské práce jsem čerpal pouze z literatury uvedené v seznamu použité literatury. V Děčíně dne ……………………… ………………………… Podpis Poděkování Rád bych poděkoval Mgr. Daně Majerové Ph.D. za cenné konzultace a také Lukáši Noskovi za drobné rady ohledně OOP. Název práce: Elektronická žákovská knížka Autor: Petr Řezníček Obor: Druh práce: Matematické inženýrství Bakalářská práce Vedoucí práce: Mgr. Dana Majerová Ph.D. Konzultant: Mgr. Dana Majerová Ph.D., Lukáš Nosek, Mgr. Lenka Řezníčková Abstrakt: eSBooklet je nástroj na evidenci studijních výsledků na základních a středních školách. Zprostředkovává informace nejen studentům, ale hlavně jejich rodičům. Umožňuje snadnou komunikaci mezi uživateli systému. K dispozici 24 hodin denně na internetu. Jednoduchý na obsluhu. Klíčová slova: elektronická žákovská knížka, eSBooklet, student, rodič, komunikace, hodnocení Title: Electronic Student’s Booklet Autor: Petr Řezníček Abstract: eSBooklet is a tool for storing students' results at basic and high schools, delivering information not only for students, but mostly for their parents. It makes possible internal communication between system’s users. It is ready for use 24/7 on internet. It is easy to use. Keywords: electronic student’s booklet, eSBooklet, student, parent, communication, classification OBSAH Úvod.............................................................................................................................8 1 Přehled požadavků a vlastností systému ...........................................................9 1.1 Cíle .............................................................................................................9 1.2 Vlastnosti....................................................................................................9 2 Analýza a návrh databáze (ERA model) .........................................................10 2.1 Integritní omezení .....................................................................................10 2.2 ERA model ...............................................................................................10 2.3 Popis jednotlivých tabulek ........................................................................10 2.3.1 booklet_history.............................................................................10 2.3.2 booklet_list...................................................................................11 2.3.3 booklet_signs ...............................................................................11 2.3.4 class_masters................................................................................11 2.3.5 classes ..........................................................................................12 2.3.6 elements .......................................................................................12 2.3.7 grades...........................................................................................12 2.3.8 levels............................................................................................13 2.3.9 marks ...........................................................................................13 2.3.10 pm_attributes...............................................................................13 2.3.11 pm_list ........................................................................................13 2.3.12 pm_recievers ...............................................................................14 2.3.13 students2classes...........................................................................14 2.3.14 students2parents ..........................................................................14 2.3.15 subjects .......................................................................................14 2.3.16 subjects2classes...........................................................................15 2.3.17 subjects2teachers .........................................................................15 2.3.18 templates .....................................................................................15 2.3.19 users ............................................................................................15 2.3.20 users_groups................................................................................16 2.3.21 users_sessions .............................................................................16 2.3.22 users_stats ...................................................................................16 2.3.23 watchdog.....................................................................................17 3 Analýza aplikace, druhy uživatelů a jejich práva...........................................18 3.1 Vysvětlení základních funkcí a myšlenek..................................................18 3.1.1 Rozbor systému............................................................................18 3.1.2 Clean-URLs .................................................................................19 3.2 Druhy uživatelů – základní uživatelské skupiny ........................................19 3.2.1 Nejvyšší administrátor..................................................................19 3.2.2 Student .........................................................................................19 3.2.3 Rodič............................................................................................20 3.2.4 Učitel (třídní učitel) ......................................................................20 3.2.5 Ředitel..........................................................................................20 4 Výběr programových nástrojů ........................................................................21 4.1 Volba programovacího jazyka...................................................................21 4.2 Historie PHP .............................................................................................21 4.2.1 PHP/FI .........................................................................................21 4.2.2 PHP 3...........................................................................................21 4.2.3 PHP 4...........................................................................................22 6 4.2.4 PHP 5...........................................................................................22 4.2.5 PHP dnes......................................................................................23 4.3 Výběr vhodného web serveru ....................................................................23 4.3.1 Apache .........................................................................................23 4.4 Výběr databázového systému ....................................................................24 4.4.1 Co je MySQL? .............................................................................24 4.4.2 Jak MySQL spravovat? ................................................................24 4.4.3 Ostatní databázové systémy..........................................................24 4.5 Šablonový systém Smarty .........................................................................25 4.5.1 Vlastnosti .....................................................................................25 4.5.2 Proč jsem ho zvolil .......................................................................25 4.6 Vývojové prostředí pro PHP .....................................................................26 4.6.1 Zend Studio..................................................................................26 5 Implementace informačního systému..............................................................27 5.1 Adresářová struktura.................................................................................27 5.2 Jádro aplikace ...........................................................................................27 5.2.1 Základní principy .........................................................................27 5.2.2 Práce s databází............................................................................28 5.2.3 Uživatelé ......................................................................................28 5.2.4 Získávání proměnných z adresy (clean-URLs)..............................30 5.2.5 Systémové zprávy ........................................................................30 5.2.6 Řešení sekcí systému (elementy) ..................................................31 5.2.7 Menu............................................................................................32 5.2.8 Přidávání cest a menu z elementů .................................................33 5.2.9 Práce s časem ...............................................................................33 5.3 Úvodní uživatelská stránka .......................................................................33 5.4 Žákovská knížka .......................................................................................33 5.5 Soukromé zprávy ......................................................................................34 5.5.1 Výpis seznamu zpráv....................................................................34 5.5.2 Zobrazení zprávy..........................................................................34 5.5.3 Odesílání ......................................................................................34 6 Referenční příručka .........................................................................................35 6.1 Vstupní obrazovka ....................................................................................35 6.2 Přihlášení ..................................................................................................35 6.3 Student......................................................................................................35 6.3.1 Výpis známek...............................................................................35 6.3.2 Soukromé zprávy .........................................................................35 6.4 Rodič ........................................................................................................36 6.5 Učitel........................................................................................................36 6.6 Administrátor............................................................................................36 7 Instalace............................................................................................................37 7.1 Využití internetové domény ......................................................................37 7.2 Instalace na jiný server..............................................................................37 7.2.1 Systémové požadavky, konfigurace ..............................................37 7.2.2 Postup ..........................................................................................37 Závěr..........................................................................................................................38 Seznam použitých zdrojů..........................................................................................39 Seznam příloh............................................................................................................40 7 ÚVOD Historie žákovské knížky je velmi dlouhá. Již před několika desítkami let byly děti hodnoceny v žákovské knížce, protože bez známek by ztrácely chuť a motivaci do učení. Úplně prvním předchůdcem žákovské knížky byl tzv. „notýsek“. Tato forma zápisu známek se zachovala i do dnešní doby. Notýsek užívají paní učitelky na základních školách, ještě v prvních třídách. V samém začátku se zde prvňáčci teší z razítek a později i z prvních jedniček. Samozřejmě, že se zde objevuje i záporné hodnocení ve formě „černých puntíků“ nebo tiskátek jako je „chroust“, „pavouk“ a jiná razítka, která děti nemají v oblibě. Do notýsků i žákovských knížek se však nezapisují pouze známky, ale jsou tam zápisy týkající se informací o akcích školy, změny rozvrhu, třídních schůzkách, a hlavně záznamy o chování dítěte. Jedná se hlavně o záporná hodnocení, tzv. poznámky, nebo zápisy o zapomínání školních potřeb a pomůcek. Poslední dobou se stále častěji objevují i kladné zápisky. Některým pedagogům trvalo dost dlouho, než pochopili, že pochvala má daleko větší užitek, než stálé napomínání. Každý jedinec je při sebemenším pochválení přístupnější, ochotnější, pracovitější a touží po dalším pochválení, proto se více snaží a stává se aktivnějším. Opačné hodnocení má za následek nezájem, pasivitu, nechuť k učení a škole samé. Žákovské knížky si za léta své existence prošly mnoha podobami, ale jejich obsah zůstává stále stejný. Jde především o informovanost rodičů o tom, jak jejich dítě ve škole pracuje, jakých dosahuje výsledků a jak se chová. Rodič by měl mít o svém dítěti vždy dostupné informace, ať už ve formě klasické žákovské knížky, tak nové elektronické. Žákovská knížka v jakékoliv podobě bude mít stále svou důležitost a opodstatněnost a umožní tak důležitý styk mezi školou a rodinou. V dnešní době je snaha o zavedení nějaké formy žákovské knížky na středních školách. Tam totiž informovanost o prospěchu a chování je minimální a rodiče se o studiu svého dítěte dozvídají pouze na třídních schůzkách, které se většinou konají dvakrát ročně. Nebo jsou pozvání ředitelem školy, aby jim bylo sděleno, že jejich dítě neprospívá, a to je již dost pozdě tuto situaci řešit. Je tedy nutností vyřešit informovanost rodičů nějakým novým moderním způsobem a tím se v dnešní době stává elektronická žákovská knížka. 8 1 PŘEHLED POŽADAVKŮ A VLASTNOSTÍ SYSTÉMU 1.1 Cíle Hlavní cíl, který jsem si kladl, bylo vytvoření použitelného systému k evidenci známek, který bude velice dobře použitelný, lehce rozšiřitelný a dostupný z jakéhokoliv místa, kde se nachází připojení k internetu. Navíc jsem si kladl požadavky, aby byla takováto elektronická žákovská knížka velice rychlá, tedy ji optimalizovat pro výkon. Počítám totiž s tím, že se stane u uživatelů velice oblíbená, a tak se stane hojně navštěvovanou. V takovém případě, je nutné, aby byla navržená, pro rychlé odezvy i při velkém počtu zároveň přihlášených návštěvníků. Evidence známek a možnost studentů si tyto známky číst však není jediným důvodem, proč jsem se rozhodl tento systém vytvořit. V první řadě mi šlo hlavně o informovanost rodičů o výsledcích jejich dětí, a také o snadnou komunikaci mezi uživateli elektronické žákovské knížky. Proto by měl eSBooklet1 obsahovat také systém soukromých zpráv, který tuto komunikaci umožní. Z těchto požadavků je patrné, že takováto aplikace bude nutně obsahovat několik skupin uživatelů s rozdílnými právy. Mezi další vlastnosti, které by měl eSBooklet mít, patří jednoduchá a přehledná obsluha, dodržování webových standardů a nezávislost na použitém internetovém prohlížeči. Kromě snadné rozšiřitelnosti by bylo užitečné, aby bylo možné snadno měnit vzhled aplikace pomocí nějakého šablonového systému. 1.2 Vlastnosti Z výše uvedených požadavků mohu snadno složit vlastnosti aplikace: § § § § § § § § § 1 Evidence známek, jejich prohlížení Interní komunikace mezi uživateli Vysoká rychlost Jednoduchá rozšiřitelnost Dostupnost Snadné ovládání Skinovatelnost (změny vzhledu) Dodržení webových standardů Nezávislost na internetovém prohlížeči eSBooklet – pojmenování vytvářeného systému. 9 2 ANALÝZA A NÁVRH DATABÁZE (ERA MODEL) V této kapitole se pokusím vysvětlit úlohu všech tabulek a jejich vlastností, které systém eSBooklet používá. Nejdříve se podíváme na celkový pohled (ERA model) a následně si rozebereme jednotlivé tabulky. 2.1 Integritní omezení Popišme si, jaké mají tabulky mezi sebou vztahy. Některá omezení budu muset ještě dále omezit v samotné aplikaci, tyto položky jsou označeny *. § § § § § § § § § § § § § § § 2.2 Uživatel může být právě v jedné skupině *Online uživatelů může být až N z různých počítačů *Student může být až v N třídách Student může mít až N rodičů (většinou 2) Rodič může mít až N dětí Ročník může být v jednom stupni Třída může být v jednom ročníku Předmět může být přiřazen až N třídám Učitel může učit až N předmětů *Učitel může být třídním až v N třídách (většinou v 1) Záznam v žákovské knížce může obsahovat právě jeden předmět, právě jednu známku, od jednoho učitele a vlastnit jej může právě jeden student Uživateli náleží právě jedna statistika *Rodič může podepsat až N záznamů v žákovské knížce Soukromá zpráva má právě jednoho odesílatele Soukromá zpráva má 1 – N příjemců ERA model Při vytváření ERA modelu databáze jsem se snažil, aby byl co nejpřehlednější, bohužel výsledek není úplně optimální. Přesto je z něj patrné vzájemné propojení tabulek. Obrázek naleznete v příloze A. 2.3 Popis jednotlivých tabulek V této části se budu zabývat významem jednotlivých tabulek. Uvádím je v abecedním pořadí a u každé je i SQL příkaz pro její vytvoření. Nebylo využito tabulek InnoDB, které podporují cizí klíče, neboť potřebuji vysokou rychlost systému. Integrita dat je zajištěna aplikací. 2.3.1 booklet_history Slouží k určení počtu nových záznamů v žákovské knížce, resp. k jejich vyznačení ve výpisu. § user_id – ID uživatele, který si prohlíží výsledky § owner_id – ID uživatele, jehož výsledky si prohlížím 10 § time – čas posledního záznamu v unixovém tvaru2 CREATE TABLE `booklet_history` ( `user_id` int(11) NOT NULL default '0', `owner_id` int(11) NOT NULL default '0', `time` int(11) NOT NULL default '0', PRIMARY KEY (`user_id`,`owner_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.2 booklet_list Uchovává záznamy v žákovské knížce. § id – číslo záznamu s atributem auto_increment3 § time – čas vložení záznamu v unixovém tvaru § owners_id – ID uživatele, kterému je záznam určen § teacher_id – učitel, který záznam zadal § subject_id – ID předmětu § mark_id – ID známky, pokud se jedná o poznámku či pochvalu, je vyplněna 0 § text – popis či vysvětlení záznamu CREATE TABLE `booklet_list` ( `id` int(11) NOT NULL auto_increment, `time` int(11) NOT NULL default '0', `owners_id` int(11) NOT NULL default '0', `teacher_id` int(11) NOT NULL default '0', `subject_id` int(11) NOT NULL default '0', `mark_id` mediumint(8) NOT NULL default '0', `text` text collate utf8_czech_ci, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.3 booklet_signs Slouží pro rodiče, resp. pro učitele. Udává poslední známku, se kterou jsou rodiče obeznámeni. Ukládána je vždy pouze poslední známka, provádí se příkaz REPLACE. § bk_id – ID záznamu v žákovské knížce § parent_id – ID rodiče CREATE TABLE `booklet_signs` ( `bk_id` int(11) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`bk_id`,`parent_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.4 class_masters Přiřazuje třídám jejich třídní učitele. § teacher_id – ID učitele § class_id – ID třídy CREATE TABLE `class_masters` ( `teacher_id` int(11) NOT NULL default '0', `class_id` int(11) NOT NULL default '0', PRIMARY KEY (`teacher_id`,`class_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2 3 unixový tvar – počet vteřin od roku 1970. auto_increment – z anglického automatická inkrementace (čísla se samy navyšují). 11 2.3.5 classes Jednotlivé třídy, které jsou dále přiřazeny do ročníků. § id – číslo třídy s atributem auto_increment § code – kód třídy § name – název třídy § grade_id – ID ročníku, do kterého třída náleží CREATE TABLE `classes` ( `id` int(11) NOT NULL auto_increment, `code` varchar(50) collate utf8_czech_ci NOT NULL, `name` varchar(50) collate utf8_czech_ci NOT NULL, `grade_id` smallint(6) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.6 elements Zásuvné moduly – rozšiřující součásti aplikace. Nejsou nijak propojeny s ostatními tabulkami. Slouží pouze k vypsání elementů. Tento úkon bych mohl samozřejmě provést pouhým vypsáním příslušného adresáře, ale takto mohu ještě určité komponenty vypnout a zabránit jejich použití. § file – název souboru elementu § name – název elementu § description – popisek elementu § status – udává, jestli je element používán (1), či ne (0) § sort – řazení elementů podle důležitosti, slouží také k tomu, aby bylo řádně složeno menu CREATE TABLE `elements` ( `file` varchar(50) collate utf8_czech_ci NOT NULL, `name` varchar(100) collate utf8_czech_ci default NULL, `description` text collate utf8_czech_ci, `status` tinyint(1) NOT NULL default '1', `sort` tinyint(2) NOT NULL default '0', PRIMARY KEY (`file`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.7 grades Ročníky (např. 3. ročník). § id – číslo ročníku s atributem auto_increment § code – kód ročníku § name – název ročníku § level_id – ID stupně CREATE TABLE `grades` ( `id` smallint(6) NOT NULL auto_increment, `code` varchar(50) collate utf8_czech_ci NOT NULL, `name` varchar(50) collate utf8_czech_ci NOT NULL, `level_id` tinyint(2) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 12 2.3.8 levels Stupně. Tato tabulka bude použita asi jen na základních školách, kde jsou ročníky rozděleny na první a druhý stupeň. U středních škol se stupně nejspíše používat nebudou, nebo budou mít jiný význam. § id – číslo stupně s atributem auto_increment § code – kód stupně § name – název stupně CREATE TABLE `levels` ( `id` tinyint(2) NOT NULL auto_increment, `code` varchar(50) collate utf8_czech_ci NOT NULL, `name` varchar(50) collate utf8_czech_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.9 marks Známky pro klasifikaci v žákovské knížce. § id – číslo známky s atributem auto_increment § name – název (např. 1-) § value – desetinné číslo udávající hodnotu známky (např. 1.50, o to, zda je hodnota mezi 1.00 a 5.00, se stará aplikace) CREATE TABLE `marks` ( `id` mediumint(8) NOT NULL auto_increment, `name` varchar(50) collate utf8_czech_ci default NULL, `value` decimal(3,2) NOT NULL default '0.00', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.10 pm_attributes Atributy soukromých zpráv, určují, komu je zpráva určená, a zda si ji uživatel již přečetl nebo vymazal. § pm_id – ID zprávy § to – adresát zprávy (uživatelské ID) § readed – udává, zda je zpráva již přečtena (1) nebo ne (0) § deleted – zpráva je již vymazána (1), zatím ještě ne (0) CREATE TABLE `pm_attributes` ( `pm_id` int(11) NOT NULL, `to` int(11) NOT NULL, `readed` tinyint(1) NOT NULL default '0', `deleted` tinyint(1) NOT NULL default '0', PRIMARY KEY (`pm_id`,`to`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.11 pm_list Seznam soukromých zpráv. § id – číslo zprávy § from – ID uživatele, co zprávu vytvořil § subject – předmět zprávy § text – text zprávy § deleted – udává, zda odesilatel vzkaz již vymazal (1) či ne (0) 13 CREATE TABLE `pm_list` ( `id` int(11) NOT NULL auto_increment, `from` int(11) NOT NULL, `subject` varchar(200) collate utf8_czech_ci NOT NULL, `text` text collate utf8_czech_ci NOT NULL, `deleted` tinyint(1) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.12 pm_recievers Adresáti, kterým lze poslat soukromou zprávu. Tedy nejen samotní uživatelé, ale také celé třídy, ročníky, stupně, a také speciální skupiny jako např. „všichni učitelé“. § name – název adresáta § type – typ adresáta (uživatel, třída atd.) § id – ID konkrétního typu adresáta CREATE TABLE `pm_recievers` ( `name` varchar(100) collate utf8_czech_ci NOT NULL, `type` varchar(10) collate utf8_czech_ci NOT NULL, `id` int(11) NOT NULL, FULLTEXT KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.13 students2classes Přiřazení studentů do tříd. Udává, jaký uživatel patří do jaké třídy. § student_id – ID uživatele (studenta) § class_id – ID třídy CREATE TABLE `students2classes` ( `student_id` int(11) NOT NULL default '0', `class_id` int(11) NOT NULL default '0', PRIMARY KEY (`student_id`,`class_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.14 students2parents Přiřazení studentů rodičům. § student_id – ID uživatele (studenta) § parent_id – ID uživatele (rodiče) CREATE TABLE `students2parents` ( `student_id` int(11) NOT NULL default '0', `parent_id` int(11) NOT NULL default '0', PRIMARY KEY (`parent_id`,`student_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.15 subjects Předměty. § id – číslo předmětu § code – kód předmětu § name – název předmětu CREATE TABLE `subjects` ( `id` int(11) NOT NULL auto_increment, `code` varchar(50) collate utf8_czech_ci default NULL, `name` varchar(100) collate utf8_czech_ci default NULL, PRIMARY KEY (`id`) 14 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.16 subjects2classes Přiřazení předmětů příslušným třídám. § sb_id – ID předmětu § class_id – ID třídy CREATE TABLE `subjects2classes` ( `sb_id` int(11) NOT NULL, `class_id` int(11) NOT NULL, PRIMARY KEY (`sb_id`,`class_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.17 subjects2teachers Přiřazení předmětů příslušným vyučujícím. § sb_id – ID předmětu § teacher_id – ID uživatele (učitele) CREATE TABLE `subjects2teachers` ( `sb_id` int(11) NOT NULL default '0', `teacher_id` int(11) NOT NULL default '0', PRIMARY KEY (`sb_id`,`teacher_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.18 templates Grafické vzhledy. § id – číslo template § dir – adresář, kde je vzhled uložen § name – název vzhledu CREATE TABLE `templates` ( `id` smallint(6) NOT NULL auto_increment, `dir` varchar(50) collate utf8_czech_ci NOT NULL, `name` varchar(100) collate utf8_czech_ci default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.19 users Uživatelé systému. Tabulka se základními vlastnostmi uživatelů. § id – číslo uživatele § name – přezdívka, pod kterou bude uživatel vystupovat v systému § pass – přístupové heslo zašifrované kódováním MD5 § first_name – jméno § last_name – příjmení § gender – pohlaví (1 – muž, 0 – žena) § group_id – ID skupiny, do které uživatel náleží § birth – datum narození ve formátu RRRR-MM-DD (např. 1983-07-10) § tpl_id – ID template (šablony, kterou uživatel používá) CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) collate utf8_czech_ci NOT NULL, `pass` varchar(32) collate utf8_czech_ci NOT NULL, `first_name` varchar(100) collate utf8_czech_ci default NULL, 15 `last_name` varchar(100) collate utf8_czech_ci default NULL, `gender` tinyint(1) NOT NULL default '1', `group_id` mediumint(8) NOT NULL default '2', `birth` date default NULL, `tpl_id` smallint(6) NOT NULL default '1', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.20 users_groups Uživatelské skupiny. § id – číslo skupiny § name – název skupiny § perm – seznam akcí, které je tato skupina oprávněna provádět CREATE TABLE `users_groups` ( `id` mediumint(8) NOT NULL auto_increment, `name` varchar(150) collate utf8_czech_ci NOT NULL, `perm` text collate utf8_czech_ci, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.21 users_sessions Přehled uživatelů, kteří jsou právě přihlášeni. Slouží např. k zjištění, jací uživatelé jsou právě přihlášeni nebo ke zjištění jejich počtu. § sid – unikátní hash tvořený IP adresou a ID uživatele § uid – ID uživatele § ip – IP adresa § host – název počítače § last_activity – poslední aktivita uživatele v unixovém formátu § last_url – poslední navštívená adresa CREATE TABLE `users_sessions` ( `sid` varchar(32) collate utf8_czech_ci NOT NULL, `uid` int(11) NOT NULL default '0', `ip` varchar(50) collate utf8_czech_ci NOT NULL, `host` varchar(100) collate utf8_czech_ci default NULL, `last_activity` int(11) NOT NULL default '0', `last_url` varchar(100) collate utf8_czech_ci default NULL, PRIMARY KEY (`sid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.22 users_stats Další vlastnosti uživatelů, převážně statistické. Záznam do této tabulky se vytváří již při registraci. Dále slouží k evidování kolikrát se uživatel přihlásil, kdy naposledy atd. § user_id – ID uživatele § created – čas přidání do systému v unixovém formátu § last_modified – čas, kdy si uživatel naposledy editoval profil v unixovém formátu § last_visit – čas poslední aktivity v systému § last_ip – poslední IP adresa, pod kterou uživatel pracoval § last_host – poslední název počítače, pod kterým uživatel pracoval § log_count – počet přihlášení § vars – serializovaná data (počty výsledků na stránku, řazení atd.) 16 CREATE TABLE `users_stats` ( `user_id` int(11) NOT NULL default '0', `created` int(11) NOT NULL default '0', `last_modified` int(11) NOT NULL default '0', `last_visit` int(11) NOT NULL default '0', `last_ip` varchar(50) collate utf8_czech_ci NOT NULL, `last_host` varchar(100) collate utf8_czech_ci default NULL, `log_count` int(11) NOT NULL default '0', `vars` text collate utf8_czech_ci, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 2.3.23 watchdog Tzv. hlídací pes. Ukládá některé akce prováděné v systému, např. přihlašování uživatelů (i neúspěšné), vytváření uživatelů, a další systémové události. § id – číslo události § uid – ID uživatele § type – typ události § severity – důležitost § text – popis události § path – adresa, na které se to událo § ip – IP adresa která to provedla § host – název počítače § time – čas v unixovém formátu CREATE TABLE `watchdog` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL default '0', `type` varchar(50) collate utf8_czech_ci NOT NULL, `severity` tinyint(1) NOT NULL default '0', `text` text collate utf8_czech_ci, `path` varchar(200) collate utf8_czech_ci default NULL, `ip` varchar(50) collate utf8_czech_ci NOT NULL, `host` varchar(200) collate utf8_czech_ci default NULL, `time` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 17 3 ANALÝZA APLIKACE, DRUHY UŽIVATELŮ A JEJICH PRÁVA 3.1 Vysvětlení základních funkcí a myšlenek K tomu, abych dokázal celou aplikaci zrealizovat, bylo nutné použít jednak prostředek, který umožňuje nějakým způsobem zpracovávat data a zároveň úložiště, kde budu tato data uchovávat. Prvnímu prostředku se říká programovací jazyk, druhému databáze. Dále bylo nutné generovat nějaký výstup programu pro uživatele. O ten se na webových stránkách stará v mém případě XHTML verze 1.1. Je tedy patrné, že pro to, abych mohl data vyobrazit, je musím nejdříve zpracovat pomocí programovacího jazyka a následně je mohu zobrazit pomocí značkovacího jazyka. Abych tyto dvě věci mohl od sebe oddělit, používám šablonový systém. Jedná se tedy o prostředek, jak oddělit aplikační logiku od interpretační. To mi dovoluje jednoduše měnit vzhled celé aplikace. Není tedy problém, aby člověk, který nerozumí programování, mohl vytvořit svůj vlastní design. Stačí mu pouze výchozí vzhled, podle kterého pochopí, jak se šablony používají, a může začít s vytvářením vzhledu vlastního. Podrobněji tyto nástroje popisuji v kapitole 4. 3.1.1 Rozbor systému Nejzákladnější a zároveň nejpodstatnější vlastností eSBooklet je samozřejmě evidence známek. Neméně důležitou věcí je také přihlašování a samotné řešení uživatelů. K tomu, aby mohl začít návštěvník s programem vůbec pracovat, musí mít vytvořený účet a následně se přihlásit. Při tomto úkonu, se z příslušných tabulek v databázi načtou nutná uživatelská data potřebná pro práci v systému. Určí se tak především, v jaké je uživatelské skupině a tedy které operace je oprávněn provádět, stejně tak na jaké stránky má přistup a které se mu vůbec nezobrazí. Vraťme se nyní ke známkám. Ty jsou uloženy ve své tabulce v databázi, program se dále stará o jejich zobrazování konkrétnímu vlastníkovi. Pokaždé, když student (či jeho rodič) navštíví stránku se svými studijními výsledky, uloží se čas vložené poslední známky. Díky tomu je pak možno určit, které známky mu od poslední návštěvy přibyly a např. barevně je odlišit, či určit jejich počet. Student má dále možnost nastavit si, po kolika záznamech na stránku se mají známky zobrazovat, či v jakém pořadí. Tyto údaje se dále ukládají do speciální tabulky uživatele a při každém přihlášení či zobrazení stránky se znovu načítají. Podobně jako prohlížení známek probíhá i jejich vkládání. Uskutečňuje se tak však z administrace, do které má přístup jen učitel, či vyšší oprávnění. O uživatelských oprávněních a skupinách pojednává kapitola 3.2. Každý učitel má možnost vložit známky jen z těch předmětů, které učí, z čehož se dále i určí, jakým studentům je může zadávat a zároveň si je prohlížet. Stará se o to databázové propojení několika tabulek k tomu určeným. Soukromé zprávy slouží pro komunikaci mezi uživateli eSBooklet. Každý má vlastní „schránku“, ve které má přijaté a odeslané vzkazy. Tato schránka je limitována na počet zpráv, které zvolí k dané skupině administrátor. Vzkazy je možné posílat i více uživatelům najednou, či dokonce celým skupinám. Původně jsem chtěl tuto možnost realizovat pomocí stromové struktury výpisu skupin a vnořených uživatelů. Pak jsem se ale rozhodl jít jinou cestou. Odesílatel nebude mít na výběr takovýto seznam, ale do 18 políčka příjemce bude ručně vepisovat adresáta, či adresáty. Pokud tedy bude chtít odeslat zprávu např. Janu Novákovi, vepíše do políčka „Novák Jan“. Jestliže se rozhodně poslat zprávu více uživatelům, jednoduše je zapíše a oddělí čárkami, případně i s mezerou. Např. „Novák Jan, Součková Petra“. Když bude chtít např. třídní učitel poslat hromadný vzkaz všem žákům své třídy 8.B, do políčka odesilatel prostě napíše „8.B“ a následně ještě zaškrtne, jakým uživatelům má zpráva dojít (v tomto případě studentům). Celý eSBooklet je rozdělen na sekce, každá z nich je vlastně zásuvným modulem, tzv. elementem. Tyto elementy jsou vypsány z tabulky, kde je uvedeno, zda se mají používat. Díky tomuto pojetí je možné jednoduše rozšiřovat funkce celého systému. Pro snadný průchod všemi stránkami slouží přehledné menu s vnořenými položkami. Je generováno jednotlivými elementy a zobrazuje se na každé stránce. Podrobněji se o realizaci tohoto menu zmiňuji v kapitole 5.2.7. 3.1.2 Clean-URLs V dnešní době se dostávají do módy tzv. clean-URLs, což v češtině znamená čisté adresy. Co si pod tímto pojmem představit? Pokud se často pohybujete na webových stránkách, můžete si v adresovém řádku prohlížeče často všimnout dlouhé, nepřehledné adresy, která obsahuje všemožná slova, přepínače atd. např. („index.php?clanek=15&str=6&komentare=1“). Takovéto adresy jsou velice nepřehledné a neforemné, a také si s nimi moc nerozumí vyhledávače. Jiný důvod, proč je nepoužívat je ten, že je z takovéto adresy možno poznat v čem je skript napsán. Protože chceme mít ale vše přehledné a hezké, začíná se pozvolna přecházet na adresy pro uživatele a vyhledávače daleko příjemnější např. („clanek/15/str/6/komentare“). K tomu, abych takovýchto adres mohl docílit, musím jednak získávat proměnné jiným způsobem, než pomocí URL a zároveň použít jednu z metod na přepsání cesty. Více o tomto problému pojednávám v kapitole 5.2.4. 3.2 Druhy uživatelů – základní uživatelské skupiny eSBooklet obsahuje základní, předem definované uživatelské skupiny. Tyto skupiny se dají libovolně editovat, čí dokonce přidávat další. Slouží k rozlišení typů uživatelů a určení jejich oprávnění. Členy těchto skupin je ještě dále možno rozlišovat, např. učitel a třídní učitel. 3.2.1 Nejvyšší administrátor Jedná se o uživatele s pořadovým číslem jedna (ID = 1), tedy prvního uživatele v aplikaci. Tento účet nemusí být v žádné skupině a přesto má absolutní práva. S jeho pomocí se dá provést registrace prvních uživatelů a jejich přiřazení do skupin, případně nastavení oprávnění. Tento účet by měl mít k dispozici pouze ředitel školy, či oprávněný správce a využít ho jen k výše uvedeným úkonům. 3.2.2 Student Nejpoužívanější a zároveň nejzákladnější uživatelská skupina. Umožňuje vlastníkovi číst si své studijní výsledky a komunikovat s ostatními uživateli pomocí soukromých zpráv. 19 3.2.3 Rodič Tento účet dovoluje vlastníkovi prohlížet studijní výsledky svých dětí. Má tedy stejná oprávnění jako skupina Student, ale navíc je možné pod záznamy v žákovské knížce zanechat podpis, díky kterému učitelé poznají, zda jsou rodiče se známkami obeznámeni. Přiřazení studentů k rodičům provádí uživatel k tomuto úkonu oprávněn (ředitel, administrátor). 3.2.4 Učitel (třídní učitel) První skupina s vyšším oprávněním. Má možnost vkládat a také prohlížet známky studentům, a to buď podle předmětu, který má tento učitel přiřazen, anebo dle třídnictví4. V prvním případě je seznam studentů, kterým může kantor vložit známku, odvozen dle propojení předmět → třída → student. V případě druhém pak jen třída → student. Třídní učitel má však možnost vložit studentům známku z jakékoliv předmětu, který je třídě přiřazen. Učitel má též možnost posílat soukromé zprávy více uživatelům najednou, nebo celým skupinám na rozdíl od studentů a rodičů, kteří mohou vzkaz poslat vždy jen jednomu adresátovi. 3.2.5 Ředitel Skupina s nejvyšším oprávněním. Jak je již z názvu patrné, je tento účet určen řediteli, či jeho zástupci, aby měli absolutní přehled a možnosti používat eSBooklet v plném rozsahu. Je možné vkládat známky jakémukoliv studentovi, stejně tak jako si číst jeho výsledky. Dále mohou registrovat nové uživatele a přiřazovat je do skupin. Nastavování oprávnění je této skupině však odepřeno, k tomuto úkonu je doporučeno používat účet nejvyššího administrátora. 4 třídnictví – učitel je třídním učitelem. 20 4 4.1 VÝBĚR PROGRAMOVÝCH NÁSTROJŮ Volba programovacího jazyka Tato volba pro mě nebyla vůbec těžká. Jelikož s ním mám již nějaké zkušenosti a napsal jsem v něm i jiné aplikace, zvolil jsem skriptovací jazyk PHP. Jeho hlavní výhodou je, že se dá nainstalovat na téměř jakýkoliv server a jednoduše používat. Díky tomu je také velice rozšířený. Navíc se neustále vyvíjejí nové verze, které přinášejí někdy poměrně značná vylepšení. Svou syntaxí je velice podobný jazyku C++, má však z programátorského hlediska mnohá ulehčení práce, jako je např. skvěle vyřešená práce s poli. Jelikož jsem se rozhodl naspat eSBooklet zcela objektově, zvolil jsem nejnovější verzi PHP 5.1, která posouvá práci s objekty na úroveň plnohodnotného OOP programovacího jazyka, oproti verzi 4, která ji má vyřešenou jen na zcela základní úrovni. 4.2 4.2.1 Historie PHP PHP/FI Původně se PHP nazývalo PHP/FI, vytvořil jej Rasmus Lerdorf v roce 1995, pro začátek jako jednoduchou sadu skriptů v jazyce Perl5, která sloužila pro zpracování záznamů o přístupech k jeho webu. Nazval jí „Personal Home Page Tools“. Protože však byla třeba větší funkčnost, napsal Rasmus daleko rozsáhlejší implementaci v C6, která byla schopná komunikovat s databázemi, a také umožňovala uživatelům vyvíjet jednoduché dynamické aplikace pro web. Lerdorf se rozhodl uvolnit zdrojový kód svého PHP/FI pro veřejnost, mohl ho tedy kdokoliv používat, stejně jako upravovat a vylepšovat kód. PHP/FI obsahovalo některé základní funkce PHP, jaké známe doposud. Proměnné byly perlovského typu, mělo automatickou interpretaci formulářových proměnných a syntaxi vloženou do HTML. Samotná syntaxe byla podobná jazyku Perl, přesto dosti omezená a jednoduší. Roku 1997 vyšlo PHP/FI 2.0, bylo celé implementované v C a stalo se kultovní záležitostí pro tisíce uživatelů po celém světě. I přesto, že do projektu začalo přispívat více lidí svými kousky kódu, stále to byl projekt jednoho muže. PHP/FI 2.0 bylo oficiálně uvolněno až v listopadu 1997, předcházelo jí mnoho betaverzí. Krátce nato se objevila první alfaverze PHP 3.0. 4.2.2 PHP 3 PHP 3.0 byla první verze, která se velmi blížila PHP, jak ho známe dnes. Vytvořili ho Andi Gutmans a Zeev Suraski v roce 1997 zcela od nuly, poté co shledali PHP/FI 2.0 téměř nepoužitelné pro vývoj svých aplikací pro e-komerci. Rozhodli se pracovat společně a prohlásili PHP 3.0 za oficiálního nástupce PHP/FI 2.0, jehož vývoj byl v podstatě zastaven. 5 Perl – programovací jazyk vycházející z jazyka C. Používá se pro psaní programů běžících na WWW serveru. 6 C – mocný, relativně minimalistický, kompilovaný programovací jazyk logikou poměrně blízký assembleru. Jeho zdrojový kód je ovšem mnohem čitelnější a je také jednodušší ho zapsat. 21 Jednou z nejsilnějších zbraní této verze byly její obrovské možnosti rozšíření. Umožňovala připojení k mnoha různým databázím, protokolům a použití různých API7. Mnoho vývojářů připojovalo své rozšiřující moduly. Byl to nesporně klíč k obrovskému úspěchu PHP 3.0. Další podstatnou změnou v PHP 3.0 byla podpora objektově orientované syntaxe (i když velice omezeně). Nový název „PHP“, což je rekurzivní akronym (PHP: Hypertext Preprocessor), odstranil dojem omezeného osobního použití. Verze byla oficiálně uvolněna v červnu 1998, po devíti měsíčním veřejném testování. Na konci roku 1998 vyrostlo PHP do rozsahu instalací v řádu (odhadem) desítek tisíc uživatelů a stovek tisíc webů. V době svého vrcholu bylo verze 3.0 instalována na přibližně 10 % všech WWW serverů na internetu. 4.2.3 PHP 4 V zimě 1998, krátce po oficiálním uvolnění PHP 3.0, začali Andi Gutmans a Zeev Suraski pracovat na přepsání jádra PHP, kvůli zvýšení výkonu pro složité aplikace a jeho jednodušší úpravy. Předchozí verze sice byla schopná pracovat se složitými aplikacemi, ovšem s nepoužitelným výkonem. Nový engine, nazvaný „Zend Engine“ (sestaven z jejich křestních jmen, Zeev a Andi), úspěšně splnil cíle návrhu a byl uveden v polovině roku 1999. PHP 4.0, založené na tomto enginu a doplněné širokou škálou nových prvků, bylo oficiálně uvolněno v květnu 2000, necelé dva roky po svém předchůdci. K podstatně zvýšenému výkonu této verze přidává další klíčové prvky, jako je podpora pro mnoho WWW serverů, HTTP sessions, buffering výstupu, bezpečnější způsoby zpracování vstupů od uživatele atd. 4.2.4 PHP 5 Nová verze přinesla celou řadu změn a vylepšení. Ta podstatnější nyní uvedu. § Vylepšené jádro „Zend Engine II“ Toto jádro obsahuje spoustu nových funkcí, zejména pokud se jedná o práci s objekty. Detaily naleznete na stránkách projektu Zend. § Nové vlastnosti objektů Pokud chcete v PHP pracovat s objekty (nebo pokud jste chtěli již dávno, ale zjistili jste, že to není zrovna ideální), tato verze přináší mnoho nových vlastností. Můžete používat privátní, chráněné a veřejné proměnné, zlepšené je použití konstruktorů a destruktorů. Je zavedena podpora rozhraní a abstraktních tříd. § Vylepšená práce s chybami Moderní programovací jazyky mají tzv. strukturovanou správu chyb. PHP 5 nabízí sice odlehčenou, přesto však strukturovanou správu chyb pomocí třídy Exception. § Kompletně přepsaná podpora XML8 Jedna z nejlepších zpráv kolem nové verze, ta totiž spolupracuje s knihovnou libxml2 (vyvinutou původně pro Gnome9) a navíc přináší rozhraní SimpleXML10. 7 API – zkratka anglických slov application programming interface, což znamená rozhraní pro programování aplikací. 8 XML – (eXtensible Markup Language - rozšiřitelný značkovací jazyk). 9 Gnome – jedna z grafických nadstaveb operačního systému Linux. 10 SimpleXML – rozhraní pro zpracování dokumentů XML, které načte informace z XML dokumentu do hierarchicky uspořádaných objektů, což je jak rychlé na napsání, tak rychlé na pochopení. 22 § Sada pro připojení k MySQL 4.1 Pro připojení k MySQL 4.1 (či ještě novější verze5) bylo vyvinuto rozhraní mysqli. Je objektové, takže je možno psát skripty pro připojení k MySQL databázi objektově. (To je samozřejmě možné už teď pomocí vlastních tříd nebo tříd z knihoven třetích stran). § Zabudovaná podpora SQLite11 § Iconv Funkce pro konverzi znakových sad jsou interní součástí, takže se nebudou muset instalovat a konfigurovat zvlášť. 4.2.5 PHP dnes Dnes používají PHP (odhadem) stovky tisíc vývojářů a nainstalované PHP hlásí několik milionů serverů – tj. přes 20 % domén na internetu. Aktuální verze má (v době psaní práce) číslo 5.1.4. Vývojový tým PHP zahrnuje mnoho vývojářů, stejně tak jako mnoho dalších lidí, kteří pracují na projektech spojených s PHP. 4.3 Výběr vhodného web serveru Web server je program, který běží na počítači umístěném v internetu. Tato aplikace poskytuje internetové stránky a skripty uživatelům, kteří si web prohlíží. Můj systém tedy nutně tento prostředek vyžaduje. Proto, abych mohl na tomto serveru spouštět i PHP skripty, musím na něj nainstalovat jeho podporu. Web serverů, které to umožňují, je povícero. Např. IIS server, který je součástí instalace operačního systému Windows. Já jsem se však rozhodl pro aplikaci, která je na internetu asi nejrozšířenější, nezávislá na platformě a dopodrobna konfigurovatelná. Jedná se o web server Apache. 4.3.1 Apache Apache HTTP Server je softwarový webový server s otevřeným kódem pro Linux, BSD, Microsoft Windows a další platformy. V současné době poskytuje prohlížečům na celém světě většinu internetových stránek. Vývoj Apache začal v roce 1993 v NCSA (National Center for Supercomputing Aplications) na Illinoiské univerzitě. Původní jméno projektu bylo NCSA HTTPd. V dalším roce však vývojářský tým opustil hlavní programátor Rob McCool, tím došlo ke zpomalení vývoje a poté, v roce 1998, k úplnému zastavení. NCSA HTTPd však mezitím už používali správci webových serverů a dodávali k němu vlastní úpravy – patche12. Hlavní úlohu v dalším vývoji sehráli Brian Behlendorf a Cliff Skolnick, kteří založili e-mailovou konferenci a začali sběr úprav a jejich distribuci koordinovat. První veřejná verze s označením 0.6.2 byla vydána v dubnu 1995. Následovalo kompletní přepsání kódu (Apache2 už neobsahuje nic z původního NCSA HTTPd) a založení Apache Group, která je dnes základem vývojářského týmu. Od dubna 1996 byl Apache nejpopulárnější server na internetu. V květnu 1999 běžel na 57% všech serverů a v listopadu 2005 jeho používanost dosáhla 69%. 11 SQLite – velmi skromný (co do nároků na systém) databázový engine používající pro celou databázi jeden soubor. Není to tedy databázový server ve stylu např. MySQL, ale pro jednodušší úlohy je velmi rychlý a ve webových aplikacích si jistě najde své místo. 12 patch – záplata. 23 Název vznikl z anglického slovního spojení „A patchy server“ (záplatovaný server). Jako indiánský symbol je ve znaku ptačí pero. 4.4 Výběr databázového systému eSBooklet využívá pro ukládání dat databázový systém MySQL, a to v jeho nejnovější verzi 5.0.21. Důvodem pro volbu MySQL byla především rychlost a také licenční podmínky. MySQL má některá omezení, které obsahují jiné databázové systémy, např. robustní Oracle (viz dále). Právě díky tomu dosahuje vynikající rychlosti. 4.4.1 Co je MySQL? Je to relační databáze typu DBMS (database managment system) a vychází z deklarativního programovacího jazyka SQL13 a je šířen jako Open Source. MySQL je zkratka z angl. My Structured Query Language, jedná se o systém pro řízení relačních databází. Do MySQL lze ukládat různá data (texty, obrázky atd.), s nimiž lze dále jednoduše pracovat (třídit, řadit, filtrovat apod.). Nejčastěji se MySQL používá ve spojení s jazykem PHP. Každá databáze v MySQL obsahuje tabulky, každá tabulka má sloupce a řádky – v každém řádku jsou záznamy předem určeného typu. MySQL je jeden z prvních hojně rozšířených systémů. Práce s tímto systémem se dá využít v C, C++, Java, Perl, PHP, Python, Tcl, Visual Basic nebo .NET. 4.4.2 Jak MySQL spravovat? Pro jednoduchou správu MySQL databází se nejčastěji používá nástroj PhpMyAdmin. Je to Open Source program napsaný v PHP, který umožňuje zálohování, vytváření tabulek, vkládání, editaci a mazání záznamů v tabulkách, vytváření databází apod. Vše je prováděno přes webové rozhraní. Poslední verze PhpMyAdminu je 2.8.1. Samozřejmě existují i další programy pro správu. Za všechny zmíním velice povedený, bohužel placený produkt MySQL Front od německých tvůrců. 4.4.3 Ostatní databázové systémy Rád bych ještě zmínil některé další databázové systémy, které se dnes používají: PostgreSQL je plnohodnotným relačním databázovým systémem s otevřeným zdrojovým kódem. Má za sebou více než patnáct let aktivního vývoje a má vynikající pověst pro svou spolehlivost a bezpečnost. Běží na všech rozšířených operačních systémech včetně Linuxu, UNIXů (AIX, BSD, HP-UX, SGI-IRIX, Solaris, Tru64), MacOS a Windows. Plně podporuje cizí klíče, operace JOIN, pohledy (VIEWs), spouště a uložené procedury. § Oracle Moderní multiplatformní databázový systém s velice pokročilými možnostmi zpracování dat, vysokým výkonem a snadnou škálovatelností. Plně podporuje transakce, cizí klíče, operace JOIN, pohledy (VIEWs), spouště a uložené procedury. § SQLite § 13 SQL – (podle anglické výslovnosti lze slyšet také es-kjů-el), standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích. SQL je zkratka anglických slov Structured Query Language (strukturovaný dotazovací jazyk). 24 Velice rychlá a malá databáze, která je umístěna v jediném souboru na disku. Poskytuje podporu transakcí. Databázový soubor může být sdílen mezi různými počítači i platformami. Tvůrci uvádějí, že je až 2x rychlejší než MySQL. 4.5 4.5.1 Šablonový systém Smarty Vlastnosti Smarty má sice mnoho vlastností, které z něj tvoří jeden z nejlepších systémů šablon v současné době, nelze o něm však říci, že se jedná o univerzálně nejlepší řešení. Například rychlost není zrovna tím, v čem by vynikal. Při výběru nejvhodnějšího systému pro jakýkoli projekt je však nutné brát v úvahu nejen rychlost, ale i funkčnost, rozšiřitelnost, komplexnost, dokumentaci, velikost vytvářeného projektu a další vlastnosti, v nichž Smarty vyniká. Od ostatních systémů se odlišuje především způsobem, jakým jsou šablony zpracovávány. Při prvním volání (tzn. při prvním spuštění skriptu, který pro svůj výstup šablonu používá) jsou šablony převedeny (zkompilovány) do podoby PHP skriptu, který je následně spuštěn a výsledek odeslán prohlížeči. Při dalším volání je pak spuštěna jen zkompilovaná verze šablony. Využití kompilace výrazně zrychluje odezvu serveru při opakovaném volání skriptů. Kromě toho má Smarty také vestavěnu podporu vyrovnávací paměti (cache), což při použití PHP akcelerátorů umožňuje dosáhnout velmi zajímavých výsledků. Další výhodou je komplexnost a robustnost. Distribuce obsahuje kromě základních tříd asi 40 předdefinovaných modifikátorů, filtrů a uživatelských funkcí, přičemž není problémem vytvořit další funkce, které jsou pro projekt potřeba. Výše uvedené přednosti však v sobě skrývají jeden problém. Tím je velikost třídy Smarty. Samotný soubor „Smarty.class.php“ má 61,7 Kb. Další knihovny, potřebné pro používání systému, mají dohromady 246,6 Kb. Autoři tedy upřednostnili funkční rozsah před rychlostí zpracování. Další nevýhodu bych viděl v samotné syntaxi, která se podobá spíše PHP, než klasickému template systému. Méně zdatní XHTML designéři zde budou mít menší problémy. O kvalitách tohoto systému však především svědčí to, že jej pod svá křídla vzala komunita vývojářů PHP. Jeho domovskou stránku najdete na adrese ‚http://smarty.php.net‘, kde je také k dispozici aktuální verze. 4.5.2 Proč jsem ho zvolil Může se zdát zvláštní, že si kladu za cíl, aby eSBooklet byl rychlostně optimalizován, a pak zvolím takovýto systém šablon. Je však nutné připomenout, že se ve většině času používají již zkompilované skripty, které na tom jsou rychlostně lépe. Hlavním důvodem, proč jsem Smarty zvolil, byla možnost používání smyček, podmínek a vnořených souborů v šablonových souborech. Mohl jsem klidně použít i jednodušší systém, jelikož stejně většinu funkcí Smarty nevyužiji, bohužel, takový, který by splňoval moje podmínky, neexistuje. Samozřejmě jsem si mohl napsat vlastní systém na míru. To by však zabralo více času a já jsem se chtěl věnovat spíše jiným částem aplikace. Při používání jsem si otestoval jeho rychlost a shledal jsem ji jako velice dobrou. Navíc jsem použil i pokročilejší funkce. Použití tohoto systému se tedy nakonec ukázalo jako výhodné. 25 4.6 Vývojové prostředí pro PHP Tato věc byla pro PHP vždy velkým problémem, protože pro něj neexistovalo žádné IDE14. To se stará především o ladění aplikace, doplňování kódu při psaní apod. Zjednodušeně řečeno, snaží se vývojáři ulehčit práci. Takovéto prostředí mají veškeré běžné programovací jazyky, jako např. C, Java, Delphi atd. Při vývoji PHP jste se donedávna museli spolehnout pouze na poznámkový blok (či nějaký podobný editor), bez nároku na jakékoliv ladění, to se dalo provést za běhu aplikace „echováním“15. Tuto skutečnost si však uvědomilo pár firem a uvedly na trh vývojová prostředí pro PHP. Některá z nich nejsou stoprocentně použitelná, další jsou ještě ve vývoji, avšak s jinými se pracuje velice dobře a přinášejí plnohodnotné IDE pro PHP. 4.6.1 Zend Studio Jedním takovým prostředím je Zend Development Environment. Tento program přináší plnohodnotné ladící prostředí pro PHP. Obsahuje kvalitní editor, zabudovanou nápovědu, doplňování syntaxe, integrovaný debuger, který se však dá nahradit instalací další aplikace (Zend Studio Server), která v podstatě přidá další rozšíření do instalace PHP. Velice užitečnou vlastností je dle mého názoru integrovaný prohlížeč, který umožňuje takové věci, jako je otevření stránky, kterou chcete ladit, a následně kliknout na ladění. Ihned se vám program přepne do kódu a můžete ladit. Daleko použitelnější věcí ovšem je možnost ladění následující stránky. Tedy, kliknete na tuto možnost, vyplníte např. formuláře, odešlete stránku. Spustí se ladění se vším, co jste na stránce provedli (můžete tak např. dopátrat, co se děje s vloženými daty apod.). Osobně tento program považuji za nejlepší prostředí pro PHP vůbec. Jednak kvůli možnostem, které nabízí, a hlavně kvůli tomu, že jej vyvíjí společnost, která se stará samotné PHP. Jedinou nevýhodou, i když se jedná zároveň o výhodu je fakt, že je ZDE psáno v programovacím jazyce Java. To mu sice zajišťuje, že se stává v podstatě multiplatformní (dá se používat ve Windows, Linuxu/Unixu a MacOS), ale na druhou stranu je pod operačním systémem Windows dosti pomalé. Je to způsobeno tím, že tento systém nemá přímo zabudovanou podporu Javy, takže ta se musí spouštět přes speciální program, který tyto rychlostní neduhy způsobuje. 14 15 IDE – zkratka Integrated Development Environement – v češtině integrované vývojové prostředí. echování – vypsání obsahu proměnné na obrazovku. 26 5 IMPLEMENTACE INFORMAČNÍHO SYSTÉMU Nyní se budu věnovat samotné implementaci. Nejdříve bych rád popsal adresářovou strukturu a dále se věnoval řešení ostatních problémů. 5.1 Adresářová struktura V adresáři „_config“, se nacházejí 3 konfigurační soubory, a sice „config.php“, který obsahuje nastavení aplikace (jako je název, kódování, doba platnosti přihlášeného uživatele atd.), dále „config_db.php“, ve kterém je nastavení databáze, včetně názvů tabulek, znakové sady a typu samotné databáze). Posledním souborem, který se zde nachází, je nastavení šablon Smarty, a sice „config_smarty.php“, ve kterém se nacházejí cesty k šablonám a také k jejich zkompilovaným podobám. „_system“ je adresář, který obsahuje hlavní třídy projektu a spouštěcí soubory. Zahrnuje tedy ještě složku „classes“, kde jsou právě všechny důležité třídy. Dalšími adresáři jsou „elements“, ten obsahuje všechny součásti webu, tedy jednotlivé sekce. Dále „Smarty“ a nakonec ještě „template“, kde jsou šablony. 5.2 5.2.1 Jádro aplikace Základní principy Celý eSBooklet je psán pomocí objektově orientovaného programování. Ze souboru „index.php“ je zavolán soubor „main.php“ z adresáře „_system“. Ten následně zavolá všechny konfigurační soubory pomocí souboru „boot.php“, zapne sessions pro práci s uživateli, načte třídy pro práci s databází, uživateli, template atd. Poté zavolá hlavní třídu projektu, sb_main. Veškerá další práce s aplikací již probíhá v této třídě. Vyhnul jsem se používání vlastních funkcí, místo toho používám jen metody této hlavní třídy a dalších tříd v ní umístěných. V jejím konstruktoru zavolám nejprve knihovny na práci s databází, uživateli, šablonami a elementy (jejich konstruktory). Jelikož chci ale používat metody třídy sb_main i v těchto knihovnách, musím si je do nich umístit, a to sice pomocí odkazu $this odkazem. Díky tomu pak mohu využívat veškeré metody a proměnné nejen hlavní třídy, ale i z tříd dalších, které se na ni postupně nabalují. Ještě nastavím hlavičku stránky na správné kódování a odstraním přebytečné znaky z adresy. public function __construct($CONF,$start_time) { $this->start_time = $start_time; } $this->CONF = $CONF; $this->DB = new sb_database(&$this); $this->USER = new sb_user(&$this); $this->TPL = new Smarty(); $this->ELM = new sb_elements(&$this); $this->setHeaders(); // nastavení kodování stránky a typu $this->removeSlash(); // odstraní konečné lomítko z adresy Po vykonání konstruktoru je zavolána metoda run, která se stará o chod celé aplikace. V ní se rozhoduje, jestli je uživatel přihlášen a umožní mu používat elementy, či zobrazí přihlašovací obrazovku. 27 Tím by byla hlavní funkce třídy sb_main popsána. To, jak jsou volány jednotlivé elementy, popíši později. I když by se toto řešení dalo ještě považovat za součást jádra systému, rozhodl jsem se mu věnovat vlastní podkapitolu. 5.2.2 Práce s databází Protože jsem chtěl, aby bylo možno v eSBooklet použít více druhů databází, rozhodl jsem se napsat třídu na její obsluhu. Dle jejího vzoru je následně možné napsat další třídy pro jiné typy databází než je MySQL 4.1+. Všechny budou totiž obsahovat stejné metody, které dále používám v celé aplikaci. Kromě standardních příkazů umí tato knihovna i zaznamenávat počet provedených dotazů a ukládat si jejich čas vykonávání. Dále obsahuje metody pro ulehčení některých prováděných operací při vybírání dat. Třída na obsluhu MySQL 4.1+ tedy implementuje základní funkce z knihovny mysqli a přidává pár ulehčení navíc. Následuje ukázka konstruktoru, kde je vidět, jak se předávají metody a proměnné třídy sb_main. public function __construct(&$main) { $this->MAIN = & $main; $this->server = $this->MAIN->CONF['DB']['SERVER']; $this->user = $this->MAIN->CONF['DB']['USER']; $this->password = $this->MAIN->CONF['DB']['PASS']; $this->database = $this->MAIN->CONF['DB']['DATABASE']; $this->charset = $this->MAIN->CONF['DB']['CHARSET']; $this->run_time = 0; $this->connect_time = 0; $this->run_queries_count = 0; $this->free_queries_count = 0; $this->row = null; $this->EOF = true; $this->queries = array(); $this->query_result = null; $this->connect_id = null; } $this->connect(); 5.2.3 Uživatelé Pro ukládání uživatelských dat používám proměnné sessions. Ty se buď ukládají na straně uživatele, či na straně serveru, podle toho, jak je nakonfigurováno PHP. Mají nastavenou určitou dobu platnosti, která se dá nastavit obdobným způsobem či přímo ze skriptu. Do těchto proměnných ukládám pouze 3 uživatelské údaje. A sice login, zašifrované heslo a jakýsi hash, který je pro každého uživatele na jiném počítači unikátní, a dále ho podrobněji popíši. Pomocí těchto základních údajů následně načtu informaci o uživateli z databáze. V konstruktoru třídy sb_user nejdřív předpokládám, že uživatel není přihlášen, a proto nastavím hodnoty, jako by se jednalo o hosta (guest). Prvním způsobem ověření, 28 jestli jím skutečně je, je právě kontrola session proměnné. Pokud by se náhodou uživatel zrovna odhlašoval, provedu nutné operace a běh je ukončen. Jestliže tomu tak však není, provede se ověření uživatele. A to pomocí metody login, která ověří, zda je uživatel korektně přihlášen a nastaví mu veškerá data, anebo se ho teprve pokusí přihlásit pomocí vyplněného loginu a hesla a teprve následně nastaví příslušné proměnné. Samotné nastavení zahrnuje kromě vybrání dat o uživateli také uložení do tabulky přihlášených uživatelů (user_sessions), kde se aktualizují hodnoty (čas poslední aktivity a navštívené adresy), dále aktualizaci poslední aktivity v tabulce statistik. Požaduji, aby jeden uživatel mohl být jen jednou přihlášen, tedy aby se nestalo, že se na jeden účet přihlásí více lidí z různých počítačů. Návrh tabulky to umožňuje, a proto musím tento neduh ošetřit v kódu (řešení pomocí unikátního „uid“ nepřichází v úvahu, jelikož by pak mohl být online pouze jeden guest). To provedu jednoduše tím, že při zapisování nového přihlášení vymažu z tabulky záznam se stejným ID. Každému uživateli se generuje unikátní „hash“, který zahrnuje jeho ID a IP adresu počítače. Takovéto složení je dále zakódováno pomocí MD5. Tento „hash“ je generován pouze při přihlášení a uložen v session proměnné. Pokud by totiž nastala změna IP adresy uživatele (např. vytáčená připojení), způsobilo by to problém. Pokud chci dále přistupovat k datům uživatele, provádím to pomocí proměnných této třídy. Pro vytvoření představy o této třídě, následuje ukázka konstruktoru: public function __construct(&$main) { $this->MAIN = & $main; $this->DB = & $main->DB; $this->id = 0; $this->id_group = 1; $this->name = 'guest'; $this->password = ''; $this->tpl_id = 1; $this->tpl_dir = 'default'; $this->getHosts(); $this->pending_logout = false; $this->pending_login = false; $this->is_logged = false; // pokud má uživatel uložené nějaké session, je to potencionální neguest :) $this->is_guest = (isset($_SESSION['usr']))?false:true; if ($this->MAIN->arg('0') == 'logout') { $this->logout(); $this->MAIN->setMessages('Odhlášení proběhlo úspěšně.'); $this->MAIN->goto(); // přesměrování na úvodní stránku } else { if (!$this->login()) { $this->MAIN->setMessages('Jméno nebo heslo je zřejmě chybné, zkuste to prosím znovu ;)'); $this->MAIN->goto(); // přesměrování na úvodní stránku } } } Oprávnění je uživatelům určováno podle toho, v jaké jsou skupině. U každé skupiny je výpis akcí, které je oprávněna provádět. Tyto akce jsou odděleny čárkou. Při získávání jsou rozděleny do pole pomocí funkce explode. Jestliže chci poté ověřit, jestli má uživatel oprávnění provádět nějakou akci, zavolám metodu, která otestuje, zda je 29 výraz v tomto poli. Pokud ano, uživatel může pokračovat, v opačném případě je mu vypsáno chybové hlášení, či se nezobrazí část menu atd. Speciální případ je, pokud se jedná o hlavního administrátora s ID 1. U něj se žádná oprávnění netestují. public function canDo($perm) { if($this->id == 1) return true; if(in_array($perm, $this->perm)) return true; } Nastavení počtu záznamů na stránku a jejich řazení je ukládáno do pole, které je následně serializovaně16 zapsáno do databáze, odkud se posléze získává. 5.2.4 Získávání proměnných z adresy (clean-URLs) Standardně se proměnné z URL adresy získávají pomocí superglobálního pole $_GET. Pokud však chci dosáhnout adres zkrácených, musím použít metodu jinou. Mé řešení spočívá v tom, že používám pouze jednu $_GET proměnnou a to sice „q“, do které ukládám proměnné ze stránek, které odděluji lomítky „/“. Pokud pak chci proměnnou z adresy získat, musím vědět na jaké pozici v „q“ se nachází. Následně zavolám metodu s touto pozicí, která mi proměnnou vrátí. public function arg($index) { static $arguments; static $q; // pokud již jsou argumenty explodovány, není důvod to dělat znovu // pouze pokud se změní cesta :) if (empty($arguments) || $q != $_GET['q']) { $arguments = explode('/', $_GET['q']); $q = $_GET['q']; } } if (array_key_exists($index, $arguments)) { return $arguments[$index]; } Tímto způsobem však docílím jen toho, že mé adresy budou vypadat nějak takto „?q=neco/dalsi/15“, abych odstranil i první tři písmena, musím použít modul serveru Apache, který se nazývá mod_rewrite. Ten mi dovolí tyto 3 znaky v podstatě odmazat z URL a pracovat dál, jako by se nic nestalo. Toto řešení se dnes běžně používá na mnohých serverech. 5.2.5 Systémové zprávy K informování uživatele o změnách na stránce, chybách, úspěšných změnách atd. používám vlastní systém zpráv. Ten spočívá v tom, že po vykonané akci je do session proměnné uložena zpráva, která se po dalším načtení stránky zobrazí a vymaže. public function setMessages($text) { $_SESSION['messages'][] = $text; 16 serializace – metoda PHP, jak uchovávat obsahy proměnných v textové podobě kvůli možnosti snadného uložení např. do databáze, tato data se dají následně vrátit do původního stavu funkcí unserialize. 30 } public function readMessages() { if(is_array($_SESSION['messages'])) { $this->TPL->assign('MESSAGES',$_SESSION['messages']); unset($_SESSION['messages']); } } Takto je možné zobrazit i několik zpráv najednou. 5.2.6 Řešení sekcí systému (elementy) Každá součást eSBooklet je v podstatě zásuvným modulem. Tyto moduly jsem nazval elementy. Díky tomu je možné systém jednoduše rozšiřovat bez jakéhokoliv zásahu do jádra aplikace. Každý z těchto modulů je samostatná třída nazvána sbe_název. Elementy jsou uloženy v databázi, ze které se vypisují jen ty aktivní dle priority zobrazení. To je důležité pro správnou posloupnost položek v menu. Dále se ověří, zda daný soubor elementu existuje, a pokud ano, vykoná se konstruktor třídy elementu. Tuto akci je nutné provést pomocí funkce eval, která vykoná část kódu. $sql = "SELECT * FROM ".T_ELEMENTS." WHERE status = 1 ORDER BY sort ASC"; $result = $this->DB->selectQuery($sql); while ($row = $this->DB->fetchArray($result)) { if(file_exists('elements/'.$row['file'].'.php')) { include('elements/'.$row['file'].'.php'); $command = '$this->e'.strtoupper($row['file']).' = new sbe_'.$row['file'].'(&$this->MAIN,$row);'; eval($command); } } $this->DB->freeResult($result); V konstruktorech jednotlivých elementů musím určit, jaká metoda se má vykonat po zadání konkrétní adresy. K tomuto účelu jsem si napsal metody, na přidání cesty a poté také na její zobrazení. Vzhledem k tomu, že se v adrese mohou vyskytovat i čísla, musel jsem na zjištění konkrétní adresy použít regulární výrazy. public function buildRoute($path,$class,$function,$perm) { $this->route[] = array('path' => preg_replace('/\//', '\\/', $path), 'class' => $class, 'function' => $function, 'perm' => $perm); } public function printRoute() { foreach($this->route as $item) { if(!preg_replace('/'.$item['path'].'/','',$_GET['q'])) { if($this->USER->canDo($item['perm'])) { $command = '$this->e'.strtoupper($item['class']).'>'.$item['function'].';'; eval($command); } else { 31 $this->TPL->assign('INC_TPL','access_denied'); $this->TPL->assign('SUBTITLE','Nemáte oprávnění přistupovat do této sekce!'); } return true; } } return false; } 5.2.7 Menu Další věc, kterou musím provést, je sestavit menu elementu. Musel jsem myslet na to, že některé položky, nebudou v menu přímo pod daným modulem, ale až v administraci. S tímto požadavkem jsem napsal obsluhující metody složené ze dvou polí. Do jednoho ukládám hlavní položky v menu (elementy) a do druhého jednotlivá pod-menu. Následně je musím spojit a vytvořit z nich menu, které bude mít každou vnořenou položku odsazenou a navíc bude rozbalena jen ta větev, která bude zrovna vybrána. Původně jsem si myslel, že to bude celkem lehký úkol, ale nebylo tomu tak. Nicméně zde je výsledek. Jak je vidět, to, jestli se jedná o hlavní položku (první) v menu určuje level (vnoření). Také se musí brát ohled na to, jestli se toto menu uživateli vůbec zobrazí. public function addMenu($location,$path,$name,$title,$level,$perm=true) { if($perm) { if($level == '0') $this->primaryMenu[] = array('element'=>$location,'path'=>$path, 'name'=>$name, 'title'=>$title); else $this->subMenu[$location][] = array('path'=>$path, 'name'=>$name, 'title'=>$title, 'level'=>$level); } } Vygenerování celého menu je trochu složitější. Nejprve musím projít pole s hlavními položkami a pak následně k nim přidávat položky vnořené, ale to jen tehdy, pokud se má menu celé rozbalovat, nebo pokud je vybrána položka, pod kterou jsou další. V tom případě chci, aby se zobrazila jen jedna úroveň pod danou. public function buildMenu($expanded=false) { foreach($this->primaryMenu as $primary) { $this->mainMenu[] = array('link'=>$this->MAIN>url($primary['path']),'name'=>$primary['name'],'title'=>$primary['tit le'],'selected'=>($_GET['q']==$primary['path'])?1:0,'level'=>'0'); // zobrazí se jen pokud na položce stojím, nebo je expandováno if(($expanded || $this->MAIN->arg('0') == $primary['element']) && is_array($this->subMenu[$primary['element']])) { foreach($this->subMenu[$primary['element']] as $menu) { if($this->expandMenu($menu['path'])) { $this->mainMenu[] = array('link'=>$this->MAIN>url($menu['path']),'name'=>$menu['name'],'title'=>$menu['title'],'sel ected'=>($_GET['q']==$menu['path'])?1:0,'level'=>$menu['level']); } } } // konec if } 32 $this->TPL->assign('MENU',$this->mainMenu); } private function expandMenu($path) { $p = explode('/',$path); $iteration = count($p); for($i=0; $i<($iteration-1); $i++) { if($this->MAIN->arg($i) != $p[$i]) return false; } return true; } Přidávat další položky menu je možné nejen v konstruktoru, ale i nadále při vykonávání metod. Můžu tak do menu např. přidat seznam dětí přihlášeného rodiče, a to až poté, co se podívá na studijní výsledky. 5.2.8 Přidávání cest a menu z elementů Příklad, jak se přidají takové cesty (tedy návod, co se bude v aplikaci dít, pokud bude v URL konkrétní adresa), uvádím zde. // cesta pro rodiče, kteří kliknou na svého žáka $this->ELM->buildRoute($this->element.'/[0-9]',$this>element,'show('.$this->MAIN->arg('1').')','view booklet'); $this->ELM->addMenu($this->element,$this>element,$info['name'],$info['description'],'0',$this->USER>canDo('view booklet')); Tímto způsobem pak mohu vytvořit cest a položek menu, kolik chci. 5.2.9 Práce s časem Již z popisu jednotlivých databázových tabulek je možno si všimnout, že používám na ukládání časových údajů unixový formát. A sice z toho důvodu, že se s ním v kódu jednoduše pracuje (dá se snadno porovnávat). Pokud pak chci vypsat časový údaj v nějakém čitelném formátu, používám funkci strftime, která toto formátování právě umožňuje. Nebyl by tedy problém, dát možnost uživatelům, aby si sami mohli tento formát nastavovat. 5.3 Úvodní uživatelská stránka Načtu počty nových záznamů v žákovské knížce pomocí spočítání záznamů od posledního zobrazení, pokud bude mít rodič více dětí, zobrazím jejich jména a počty nových záznamů. Naopak u učitelů a vyšších nezobrazím nic, k ověření mi slouží metoda in_group volaná z třídy sb_user. Dále zjistím, jestli došly nějaké nové soukromé zprávy, tedy jestli se v tabulce nachází zpráva pro daného uživatele s atributem readed 0. 5.4 Žákovská knížka Nejdříve musím zjistit, jestli si výsledky prohlíží sám student, či jeho rodič. V prvním případě zavolám rovnou metodu na zobrazení show s ID uživatele 33 v argumentu, což zapříčiní vypsání výsledků. V případě opačném nabídnu rodiči seznam jeho dětí a výsledky se vypíší teprve až po kliknutí na jedno z nich. V tom případě musím také ověřit, zda výsledky opravdu patří některému z dětí (pro případ, že by rodič schválně přepsal číslo v adrese). Tento seznam získám pomocí metody, která vypíše jména a ID dětí pomocí tabulky students2parent. Seznam známek vypisuji složitějším SQL dotazem z tabulky booklet_list, ke které musím dále připojit další tabulky, abych získal názvy předmětů, známky, zadavatele. Podle času záznamů pak rozlišuji nové a již viděné. Při této operaci je ještě proveden update posledního času shlédnutí výsledků. 5.5 5.5.1 Soukromé zprávy Výpis seznamu zpráv Seznam doručených zpráv vypisuji z tabulky pm_list na základě toho, jestli se ID uživatele nachází v tabulce pm_attributes jakožto adresát. V jednom dotazu tak vyberu seznam vzkazů s jejich odesilateli, časy odeslání, předměty a atributy (zda jsou již přečtené). Podobně provádím zobrazení zpráv odeslaných, zde však vypisuji příjemce a všechny vzkazy považuji za přečtené. 5.5.2 Zobrazení zprávy Samotná zpráva je v databázi uložena pouze jednou, kdežto „ukazatelů“ na tuto zprávu je takové množství, kolika adresátům je určena. Zobrazení zprávy spočívá ve vybrání z databáze dle jejího ID, při čemž se kontroluje, zda je zpráva určena danému uživateli, nebo zda jí odeslal a dále je v případě čtení příchozí zprávy nastaven atribut na přečteno (jednoduchý update). 5.5.3 Odesílání Odesílání zprávy funguje tak, že se nejprve prohledá tabulka pm_recievers, zda obsahuje vyplněné slovo či slova (jména uživatelů nebo skupin). Pokud jsou slova nalezena, zjistí se jejich typ a ID, pomocí čehož se následně určí, komu se zpráva odešle. V případě, že se bude jednat o uživatele, může se zpráva odeslat přímo všem daným ID, která jsou v této tabulce. Pokud se však bude jednat o skupiny, musím zjistit ID uživatelů, kteří jsou v těchto skupinách a těm teprve následně zprávu odeslat. Navíc je ještě možno zaškrtnout, jakým uživatelům odesílám (student, rodič, učitel). Možnost odesílat více uživatelům najednou, skupinám a vybírat jejich typy před odesláním však může pouze učitel a vyšší oprávnění. 34 6 6.1 REFERENČNÍ PŘÍRUČKA Vstupní obrazovka Základní stránka, která se zobrazí každému návštěvníkovi, je pouze výzva k přihlášení se. Je to z toho důvodu, že pracovat s žákovskou knížkou mohou pouze přihlášení uživatelé. Není zde ani možnost vytvořit si účet, jelikož tyto operace provádí ředitel školy, nebo osoba k tomu určená. Obrázek 1 – přihlašovací obrazovka 6.2 Přihlášení Po zadání jména a hesla se údaje zkontrolují v databázi a v případě, že jsou správně, uživateli se zobrazí informace o jeho účtu, včetně nových přijatých soukromých zpráv. 6.3 Student Ihned po přihlášení, se uživateli zobrazí počet nových záznamů v žákovské kníž- ce. Po pravé straně je navigační menu, které slouží pro průchod celým systémem. Pod ním je pak menu uživatele s možností se odhlásit. Tato menu se zobrazují všem druhům uživatelů. 6.3.1 Výpis známek Pokud student klikne na „Žákovskou knížku“, vypíše se mu seznam známek, či jiných sdělení. Tyto záznamy jsou situovány v tabulce. Obsahují informace o času vložení, předmětu, kdo je vložil, popisku a známce. Na stránce se zobrazuje posledních 25 záznamů. Jsou řazeny od nejnovějších. Je samozřejmě možné zobrazit předchozí záznamy opět vypisované po 25. Pokud nějaké záznamy student ještě neviděl, má je ve výpisu znázorněné jinou barvou, aby poznal, že jsou nové. 6.3.2 Soukromé zprávy Obsahují vzkazy přijaté, odeslané a možnost napsat novou zprávu. V přijatých zprávách, jsou tyto vypisovány pod sebou od nejnovějších. S informacemi, kdy byly poslány, kým a předmětem. Po kliknutí na daný vzkaz se zobrazí celý jeho obsah. Stejně vypadá i výpis zpráv odeslaných. 35 Při psaní nové zprávy je nutné znát celé jméno adresáta, které se vepisuje do pole příjemce. Dále je nutné vyplnit pole a předmět a samozřejmě text vzkazu. Následně je možné zprávu odeslat. O tom, jestli odeslání proběhlo úspěšně, je uživatel ihned informován systémovou zprávou. Pokud bude v systému více uživatelů se stejným jménem, odešle se zpráva všem těmto příjemcům. 6.4 Rodič Má ovládání v podstatě shodné se studentem, s tím rozdílem, že se mu na úvodní stránce kromě informace o jeho nových vzkazech zobrazují i počty nových záznamů v žákovských knížkách jeho dětí. Při vstupu do žákovské knížky pak musí ještě následně kliknout na dítě, jehož výsledky si bude prohlížet. 6.5 Učitel Oproti předchozím skupinám je možné odeslat zprávu více příjemcům. Jednoduše jejich jména vyplní do pole příjemců a oddělí čárkami. V hlavním menu má novou položku „Administrace“. Z ní je možné prohlížet známky studentů, kteří studují nějaký jeho předmět, nebo studentů, u kterých je třídním učitelem. Ve výpisech známek vidí, zda je již viděli i rodiče. Dále také může vkládat známky (po kliknutí na nový záznam). Postupně se zvolí v rolovacích menu student, předmět a známka. Následně odešle a záznam se uloží. 6.6 Administrátor Veškeré úkony, které může provádět, jsou vidět v menu „Administrace“, u každé stránky je popis a malá nápověda. Myslím, že není nutné tyto části dále vysvětlovat, jelikož systém administrátora sám navede. 36 7 7.1 INSTALACE Využití internetové domény Aplikace je k vyzkoušení na internetové adrese http://sbooklet.kecinzer.com. Zde je možné se přihlásit pod třemi typy účtů pro vyzkoušení funkčnosti. Jedna se o účty „student“, „rodic“, „ucitel“. Všechny mají nastavené heslo „demo“. 7.2 Instalace na jiný server Pro správný běh eSBooklet na jiném serveru zde uvádím požadavky a postup. 7.2.1 Systémové požadavky, konfigurace Za prvé bude potřeba web server, na kterém je možné zprovoznit PHP. Osobně doporučuji server Apache. Na něm je dále zapotřebí PHP ve verzi 5 a vyšší. Na předchozích verzích nebude aplikace fungovat! Není však potřeba jej dále konfigurovat, stačí základní nastavení. Dále bude zapotřebí MySQL databáze a to minimálně ve verzi 4.1. Doporučoval bych spíše verzi 5, na které byl systém vyvíjen. Pro úplnou podporu všech funkcí eSBooklet je dále nutno nainstalovat na server Apache mod_rewrite, který se stará o clean-URL a také v jeho nastavení povolit konfigurační soubory „.htaccess“. 7.2.2 Postup Nejprve je nutné rozbalit archív „esbooklet.zip“ na místo, kde chcete, aby systém běžel. Dále je potřeba otevřít si správu MySQL databáze, kde vytvořit novou databázi s názvem např. „esbooklet“. Poté je třeba naimportovat soubor „db.sql“ z adresáře „install“ do vytvořené databáze. Následně je nutné nastavit správné údaje v souborech „config.php“ a „config_db.php“ v adresáři „_config“. Důležité je dát pozor, zda je server nakonfigurován na používání zkrácených adres, pokud tomu tak není, je nutné vypnout jejich podporu (na 4. řádku). Pomocí přednastavených hodnot v těchto souborech nebude nastavení žádný problém. Po těchto krocích je možné přejít na adresu, kde je aplikace umístěna a začít ji používat. 37 ZÁVĚR Základní cíle a myšlenky mé práce se mi podařilo splnit. eSBooklet zvládá evidenci známek, komunikaci mezi uživateli, podporuje snadnou změnu vzhledu, pracuje velice rychle a umožňuje jednoduše přidávat nové funkce. Proto je otevřen k dalším úpravám a rozšířením. Je tedy patrné, že se mu budu ještě dále věnovat. V textu práce jsem se snažil podrobně vysvětlit návrh databáze, proč jsem tak učinil a jaké jsou vztahy mezi jednotlivými tabulkami. Dále jsem čtenáře seznámil se všemi technologiemi, které jsem využil. Samotná implementace je vysvětlena z mého podhledu jen okrajově. Kdybych měl vysvětlovat každý řádek svého kódu, určitě bych několikanásobně překročil rozsah práce, která by se stala dle mého názoru i méně čitelnou. Nejlepší přehled o kódu se získá přímo z jeho zdrojů, které jsem se snažil dosti komentovat. Do budoucna předpokládám tato rozšíření: § diskusní fóra § uživatelské profily § rozvrh hodin 38 SEZNAM POUŽITÝCH ZDROJŮ PHP manual [online]. The PHP Group, 2001 – 2006 [denně], Dostupný na WWW: <http://php.net>. Multilingual Dictionary [online]. LangSoft, PC Translator, 1995 – 2006 [týdně], Dostupný na WWW: <http://slovnik.cz>. Smarty – šablonovací systém pro PHP [online]. Interval.cz (Zoner software, s.r.o.), 2006 [2006-04-18] Dostupný na WWW: < http://interval.cz/serialy/smarty-sablonovaci-system-pro-php/>. 39 SEZNAM PŘÍLOH Příloha A – ERA model databáze 40 Příloha B – CD s programem Obsah CD: § aplikace eSBooklet (zabaleno v zip archivu) § text práce 41
Podobné dokumenty
BAKALÁŘSKÁ PRÁCE Matyáš Novák Zpřístupnění a
internetu, budou tyto dokumenty snadno k dispozici k výzkumu pro (prakticky) neomezenémý počet lidí. Zároveň se velmi usnadní pořizování dalších kopií těchto dokumentů.
Digitalizací dokumentů se zá...
PHP, PERL, ASP.NET
pro vývoj webových aplikací zpracovávanými na straně klienta. Poslední třetí díl s
podtitulkem „PHP, PERL, ASP.NET“ se pak zabývá částmi, které jsou zpracovávány na
straně serveru.
Úvod
Mezi skript...
MySQL databáze - český manuál
- př.: SELECT kniha FROM knihovna WHERE poznamka='precteno';
- vytáhne názvy knih, které jsou označeny jako přečtené "precteno"
- př.: SELECT knihovna.kniha FROM knihovna,cetba WHERE knihovna.kniha...
MySQL – manuál
6.4.15 Manipulace s čísly (agregační fce)........................................................................................... 21
6.4.16 Manipulace s textem......................................
link >>> PORTFOLIO AKTIVIT PDF
ubytovací projekt pro nižší vrstvy v Caracasu. Juniorovi je devět let a má kudrnaté vlasy.
Chtěl by si je nechat narovnat pro fotku do školní ročenky, aby vypadal jako populární
popoví zpěváci. To ...
2007 - Moravská národní obec
by měli být zárukou výrazně vyšší grafické i obsahové kvality listu. Jsem
přesvědčen, že toto dvojčíslo je toho důkazem. I nadále budeme pokračovat
v rozvoji rubrik, které mají příznivý ohlas. Pro ...
international conference 2005 - Evropský polytechnický institut, sro
Po Japonsku a „asijských tygrech“ nastupuje těžká kavalerie – Čína, Indie, Vietnam. Kolem roku
2025 převezme Asie mnohá prvenství. Tomuto vývoji se musí přizpůsobit také naše civilizace.
V době glo...
9. Datové typy v MySQL, typy tabulek, funkce v MySQL
UNSIGNED - pouze kladná čísla,e se interval př: (TINYINT má rozsah -118 až +127 a
TINYINT UNSIGNED má rozsah 0 až 255)
AUTO_INCREMENT - automatické zvyšování čísla, používá se hlavně v sloupci ID
k...
najdete zde - Výuka na FAI UTB ve Zlíně
vstupně - výstupní chování programu odpovídá specifikaci. Při této metodě neuvažujeme
vnitřní strukturu a logiku programu. Testovací vstupy se odvíjejí přímo ze specifikace programu a musí být zadá...