Elektronická žákovská knížka Electronic student`s booklet

Transkript

Elektronická žákovská knížka Electronic student`s booklet
Č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

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á...

Více

PHP, PERL, ASP.NET

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...

Více

prace jk 2001

prace jk 2001 Čistý stůl Clean Table … a smontujte … and assemble

Více

MySQL databáze - český manuál

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...

Více

MySQL – manuál

MySQL – manuál 6.4.15 Manipulace s čísly (agregační fce)........................................................................................... 21 6.4.16 Manipulace s textem......................................

Více

link >>> PORTFOLIO AKTIVIT PDF

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 ...

Více

2007 - Moravská národní obec

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 ...

Více

international conference 2005 - Evropský polytechnický institut, sro

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...

Více

9. Datové typy v MySQL, typy tabulek, funkce v MySQL

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...

Více

najdete zde - Výuka na FAI UTB ve Zlíně

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á...

Více