Mendelova univerzita v Brně Provozně ekonomická fakulta
Inovace a rozšíření dotazníkového systému primární prevence Bakalářská práce
Vedoucí práce: Ing. Ondřej Popelka, Ph.D.
Oldřich Faldík
Brno 2012
Děkuji vedoucímu bakalářské práce Ing. Ondřeji Popelkovi, Ph.D. za vedení mé práce, za cenné rady a připomínky a za trpělivost a čas, který mi věnoval při řešení dané problematiky. Dále děkuji Ing. Michaelu Štenclovi, Ph.D. za zprostředkování tématu a za podnětné připomínky a rady.
Prohlašuji, že svoji bakalářskou práci jsem vypracoval samostatně pouze s použitím pramenů uvedených v seznamu citované literatury. V Brně dne 14. května 2012
__________________
Abstract Faldík, O. Innovation and extension of a questionnaire system of primary prevention. Bachelor thesis. Brno: MENDELU, 2012. The bachelor thesis deals with upgrading and extension of a specialized questionnaire for the organization Prevence.net. The thesis analyses the current state of services offered by providers of web questionnaire systems. A solution to the issue according to specific requirements of the client is presented in the theoretical section. This solution includes two main parts: collecting the questionnaire data and generating charts based on the collected data. The practical section implements the solution proposed in the theoretical section. The questionnaire system is put into practice in the PHP language using Nette framework. Chart rendering is implemented in the Highcharts framework. The PostgreSQL database server has been selected as data storage. Keywords Questionnaire system, Nette, Highcharts, PHP, Javascript, PostgreSQL.
Abstrakt Faldík, O. Inovace a rozšíření dotazníkového systému primární prevence. Bakalářská práce. Brno: MENDELU v Brně, 2012. Práce pojednává o inovaci a rozšíření specializovaného dotazníkového systému pro organizaci Prevence.net. Práce analyzuje současný stav nabízených služeb poskytovatelů webových dotazníkových systémů. V teoretické části předkládá vlastní řešení, založené na speciálních požadavcích zadavatele. Toto řešení zahrnuje dvě podstatné části, a to sběr dotazníkových dat a generování grafů na základě nashromážděných dat. Praktická část implementuje řešení navržené v teoretické části. Dotazníkový systém je realizován v jazyce PHP s využitím frameworku Nette. Vykreslování grafů je implementováno ve frameworku Highcharts. Jako úložiště dat byl zvolen databázový server PostgreSQL. Klíčová slova Dotazníkový systém, Nette, Highcharts, PHP, Javascript, PostgreSQL.
Obsah
6
Obsah 1
2
Úvod a cíl práce 1.1
Úvod .......................................................................................................... 9
1.2
Cíl práce .................................................................................................... 9
1.3
Popis používání systému .......................................................................... 9
Současný stav
Funkční požadavky na dotazníkový systém .................................... 12
2.1.2
Nefunkční požadavky na dotazníkový systém ................................. 12
2.2
Existující dotazníkové systémy ................................................................ 12
2.3
Online dotazníkové systémy .................................................................... 12
2.3.1
Survey Monkey................................................................................. 13
2.3.2
Survey Gizmo ................................................................................... 14
2.3.3
Easyresearch.biz .............................................................................. 16
2.3.4
Likeex ............................................................................................... 17
Hodnocení stávajících online dotazníkových systémů ...........................18
Vlastní řešení
19
3.1
Návrh struktury databáze ........................................................................ 19
3.2
Návrh uživatelského rozhraní aplikace ................................................... 21
3.2.1
Administrativní rozhraní ................................................................. 21
3.2.2
Uživatelské rozhraní ....................................................................... 23
3.3 4
10
2.1.1
2.4 3
9
Statistické charakteristiky ...................................................................... 24
Implementace
26
4.1
Informace o klientovi .............................................................................. 28
4.2
Autorizace a autentizace ......................................................................... 28
4.3
Postup pro přidání nové otázky .............................................................. 29
4.4
Generování grafů .................................................................................... 29
4.5
Zobrazení dotazníku ............................................................................... 34
4.6
Statistické charakteristiky ...................................................................... 35
Obsah
7
5
Závěr
39
6
Literatura
40
A
Původní dotazník
44
B
Diagramy tříd
45
8
Úvod a cíl práce
9
1 Úvod a cíl práce 1.1
Úvod
Myšlenka zapojení informačních technologií do prevence sociálních patologií vyvstala na konci 90. let dvacátého století. Cílem bylo zefektivnit, zpřesnit a zkrátit dobu vyhodnocování vyplněných dotazníků. Z toho důvodu byl v r. 2006 vyvinut dotazníkový systém pro organizaci Prevence.net, zabývající se primární prevencí sociálních patologií. Projekt Prevence.net nabízí služby, jako jsou analýzy a studie monitoringu na základních a středních školách pro evidenci a zpracování informací o těchto jevech. K tomu využívá dotazníkový systém pro sběr a vyhodnocování dotazníků, který tuto činnost automatizuje. Dotazníkový systém shromažďuje velké množství dat, z nichž potom na základě statistické analýzy generuje grafy. V systému pro elektronické zpracování dotazníkových dat nebyly od doby jeho vzniku prováděny žádné změny ani aktualizace, takže je zastaralý. V posledních letech se několik vývojových pracovníků pokoušelo přepracovat systém s ohledem na nejnovější postupy a technologie, avšak neúspěšně.
1.2 Cíl práce Stávající systém od svého vytvoření funguje bez jakékoliv údržby a vývoje, takže je zastaralý. Proto musí být přinejmenším z hlediska bezpečnosti a funkčnosti převeden na nové technologie (PHP verze 5.3). Zadavatel si také přeje větší možnosti nastavení v oblasti grafů, například více typů grafu (sloupcový, výsečový) a případnou úpravu jejich vzhledu, což nelze se stávající strukturou databáze realizovat. Proto cílem této práce je zjistit možnosti inovace stávajícího dotazníkového systému projektu Prevence.net. Dále je práce zaměřena na rozšíření tohoto dotazníkového systému o statistické a analytické funkce za použití nejnovějších webových technologií. Na to navazuje výběr vhodného způsobu inovace a implementace inovovaného systému.
1.3 Popis používání systému Sběr dat probíhá tak, že pověřená osoba navštíví nějakou třídu a požádá studenty o vyplnění dotazníku vytištěného na papíře. Tato osoba buď předá vyplněné dotazníky jiné osobě, která je zadá do systému, nebo je tam zadá sama – dotazníky budou převedeny do elektronické formy. Systém umožňuje exportovat vložená data a generovat z nich sloupcové grafy pro každou otázku. Tyto výstupy pak slouží jako podklad pro odborného pracovníka, který sepíše zprávu a výsledky prezentuje klientovi – škole. Z toho jasně vyplývá, že nejde o klasický dotazníkový systém. Do styku se systémem přichází jen omezený počet osob, které jsou pověřené organizací Prevence.net jeho užíváním a spravováním.
Současný stav
10
2 Současný stav Sběr dat probíhá tak, že osoba pověřená společností Prevence.net rozdá na žádost klienta – školy – v jejích třídách studentům vytištěný dotazník. Po vyplnění dotazníku zadá pověřená osoba tento dotazník do dotazníkového systému. Dotazníkový systém podporuje tři typy uživatelů: 1) nepřihlášený uživatel má pouze právo zobrazit přihlašovací stránku. 2) přihlášený uživatel systému – nejčastěji osoba pověřená, která dotazník do systému zadává, má pouze právo vložit dotazník do systému, a to na základě identifikačního čísla klienta. 3) administrátor může nejenom dotazníky vkládat, ale i vytvářet nové klienty a třídy. Může i exportovat vyplněné dotazníky z databáze do formátu CSV nebo XLS. Může také generovat sloupcové grafy pro každou otázku zvlášť. Tento dotazníkový systém je ale v mnoha ohledech zastaralý, nepřehledný, má nevhodné zarovnání textu a objektů a rozlišení jednotlivých otázek vyplňovaného dotazníku je nedostatečné. Statistické vyhodnocení a grafické vyjádření také není dostačující – je nutné rozšířit možnosti statistických analýz a grafického vyjádření. Celý systém je napsán v zastaralé verzi PHP 5.1.0. Ke generování grafů se využívá také zastaralá verze JPgraph 1.6.2. Rozvržení databáze (viz obr. 1) také není vyhovující. Názvy tabulek a atributů jsou psány s diakritikou, což může způsobit problémy s kódováním. Největším problémem je to, že odpovědi na dotazníky jsou uchovávány ve dvou tabulkách (part_a; part_b), ve kterých jednotlivé názvy atributů jsou stejné jako zadání jednotlivých odpovědí. V databázi nejsou také nikde uchovávána zadání otázek, ke kterým patří odpovědi z tabulek part_a a part_b. Tento přístup komplikuje generování grafů a má za následek vytváření duplicitních informací. Např. ve skriptu, který zajišťuje zobrazení dotazníku v dotazníkovém systému, jsou zadání otázek a odpovědí znovu napsána.
Současný stav
obr. 1
Původní schéma databáze
11
Současný stav
2.1.1
12
Funkční požadavky na dotazníkový systém
Provozovatel projektu Prevence.net má na dotazníkový systém tyto funkční požadavky: zajištění základní kontroly odevzdaných dotazníků export nashromážděných dat možnost generování grafů zajištění základní statistické analýzy schopnost rozlišení uživatelů systému – zda jde o běžného uživatele, který jen zadává informace do systému nebo administrátora, který může generovat grafy a upravovat informace o klientech možnost spravovat data o klientech – přidání nových klientů do systému, zobrazení informací o klientech – funkce administrátora možnost generovat grafy – patří do kompetencí administrátora 2.1.2
Nefunkční požadavky na dotazníkový systém
počet možných odpovědí na dotazníky (minimálně 200/měsíc) bezpečné uložení dat – bez ukládání na cizích serverech bezpečnost přenášených dat – podpora šifrování technická podpora
2.2 Existující dotazníkové systémy Existující dotazníkové systémy lze rozdělit do dvou kategorií offline a online. Offline (aplikační) dotazníkové systémy nebyly zkoumány z toho důvodu, že jsou obtížně přizpůsobitelné a jsou pochopeny funkčně jinak, než jaké jsou požadavky zadavatele. Jde například o přístup uživatelů k dotazníkovému systému, který je omezen tím, jaký typ operačního sytému příslušný uživatel má. Navíc by jejich integrace do stránek projektu byla velmi složitá, jsou závislé na platformě. Zadavatel vyžaduje takovou mobilitu aplikace, aby uživatel aplikace měl přístup odkudkoliv bez nutnosti instalovat další programové vybavení. To však tyto dotazníkové systémy nesplňují.
2.3 Online dotazníkové systémy V této kapitole bude posuzováno několik variant a rozšíření nebo nahrazení stávajícího dotazníkového systému online verzí, a to s ohledem na funkčnost, implementovatelnost a náklady. U každého řešení pak budou zhodnoceny jeho pozitivní a negativní stránky ve vztahu k projektu. Na závěr pak bude provedeno celkové zhodnocení a výběr nejlepšího řešení v závislosti na projektu Prevence.net.
Současný stav
2.3.1
13
Survey Monkey
Tento dotazníkový systém je nabízen ve čtyřech verzích. První verze Basic je zdarma, disponuje však několika omezeními. Například do každého dotazníku lze dát jen deset otázek a na každý dotazník může odpovědět celkem sto respondentů. Mezi výhody této a dalších verzí (Select, Gold, Platinum) patří možnost poslání dotazníku pomocí odkazu, mailu, Twitteru a Facebooku. Dotazník ve formě Basic obsahuje také patnáct druhů odpovědí, třicet jedna dotazníkových šablon a full-time technickou podporu. Možná nevýhoda tohoto a dalších produktů je, že dotazníky se uchovávají na serveru poskytovatele. Vyšší verze Select, která stojí 25 €, obsahuje oproti verzi Basic neomezený počet otázek, na jeden dotazník může odpovědět tisíc respondentů za měsíc a každý další respondent navíc stojí 0,10 €. Dále obsahuje funkce Page logic – umožňuje automaticky přecházet na zvolenou otázku dotazníku a Question logic – možnost pokládat otázky na základě předchozích odpovědí, vytvářet si svoje vlastní vizuální podoby dotazníků, vytvářet značkové dotazníky s logem. Placené verze také obsahují šifrování. [[1], [5]]
Současný stav Tab. 1
14
Technické parametry Survey Monkey
Vlastnost Počet otázek na průzkum Počet odpovědí na průzkum Jazyková podpora
Basic
Select
Gold
Platinum
10
neomezeně
neomezeně
neomezeně
100
1000/měsíc
neomezeně
neomezeně
všechny jazyky
žádné
všechny jazyky témata vzhledu a vlastní logo SSL
všechny jazyky témata vzhledu a vlastní logo SSL
všechny jazyky témata vzhledu a vlastní logo SSL
ano
ano
ano
ano
ne
PDF
PDF
PDF
ano
ano
ano
ano
Facebook , Twitter
Facebook, Twitter
Facebook, Twitter
Facebook, Twitter
ano
ano
ano
ano
24x7, odpověď na email do dvou hodin 25€/měsíc
24x7, odpověď na email do dvou hodin 300€/rok
24x7, odpověď na email do dvou hodin 800€/rok
Přizpůsobení vzhledu dotazníku Šifrování Přímý odkaz na dotazník Export do formátů Integrace průzkumu do vlastních stránek Sdílení dotazníku na sociálních sítích Kontrola správnosti dotazníků
žádné
Podpora Cena 2.3.2
Zdroj: [1]
24x7 zdarma Survey Gizmo
Je to částečně komerční dotazníkový systém, který je poskytován v několika verzích. První verze Free je zcela zdarma a obsahuje jen základní statistické a programové funkce. Například u verze Free je jen jeden účet, prostřednictvím kterého lze přistupovat k systému. Mezi výhody oproti jiným programovým alternativám, které jsou zdarma, patří: neomezený počet průzkumů a hlasování, upgrade a downgrade kdykoliv a z jakékoli verze podle přání zákazníka, dvě stě možných odpovědí na dotazníky za měsíc, velké množství šablon a přizpůsobitelných možností dotazníkového systému, záruka uchování dat až do zrušení účtu, možnost vytvářet přímé odkazy na dotazník – jak s vlastní doménou, tak i tzv. zkrácené odkazy. Dotazník lze také exportovat do CSV formátu. Verze Personal, Pro, Enterprise, Dedicated umožňují u textových odpovědí kontrolu zadaného řetězce pomocí regulárních výrazů. [[2], [5]]
Současný stav Tab. 2
Technické parametry Survey Gizmo
Vlastnost Počet otázek na průzkum Počet odpovědí na průzkumy (všechny) Jazyková podpora Přizpůsobe ní vzhledu dotazníku Šifrování Přímý odkaz na dotazník Export do formátů Integrace průzkumu do vlastních stránek Sdílení dotazníku na sociálních sítích Kontrola správnosti dotazníků Podpora Cena
15 Zdroj: [2]
Free neomeze n
Personal neomezen
Pro neomezen
Enterprise neomezen
Dedicated neomezen
250
1000
5000
50000
1000000
všechny jazyky témata vzhledu a jejich úprava žádné ne
všechny jazyky témata vzhledu a jejich úprava žádné ne
všechny jazyky témata vzhledu a jejich úprava SSL ano
všechny jazyky témata vzhledu a jejich úprava SSL ano
všechny jazyky témata vzhledu a jejich úprava SSL ano
CSV
CSV
CSV, PDF
ano
ano
ano
CSV, PDF, SPSS ano
CSV, PDF, SPSS ano
Twitter, Facebook
Twitter, Facebook
Twitter, Facebook
Twitter, Facebook
Twitter, Facebook
žádné
regulární výrazy
regulární výrazy
regulární výrazy
regulární výrazy
online, email – omezen, zdarma
online, email
online, email
19$/měsíc
49$/měsíc
online, email, telefon 159$/měsíc
online, email, telefon 7888$/rok
Současný stav
2.3.3
16
Easyresearch.biz
Je to plně komerční systém, lokalizovaný do českého jazyka. Systém disponuje intuitivním uživatelským rozhraním, jehož vzhled ale bohužel nepůsobí nejlépe. Kromě základních funkcí disponuje dotazníkový systém také funkcí pro generování grafů: sloupcových, výsečových, dvojrozměrných a trojrozměrných; výsledné grafy lze také upravovat. Za další příplatky lze využít služby vytvoření dotazníku – použít už předem připravený dotazník, šíření dotazníku. Samotné zadání dotazníku lze pak vyexportovat do souboru PDF. Ve výsledcích lze pomocí grafického znázornění vidět u každé otázky četnost jednotlivých odpovědí. Výsledky lze třídit a filtrovat. Výsledky lze také exportovat do mnoha formátů, například XLS, DOC, PDF a CSV. Systém samotný nedisponuje žádnou další statistickou funkcí, ale tento problém se dá částečně vyřešit, například exportem do XLS. Systém je nabízen ve dvou verzích, jejichž funkčnost je téměř identická, a to demo a placené verze. Demo verze není funkčně omezena, slouží však pouze k seznámení se s placenou verzí, protože průzkumy a všechna nastavení, která zde byla vytvořena, jsou vždy následující den vymazány. Placená verze zahrnuje dvě podverze: Easy a One-shot. Verze Easy platí 12 měsíců a umožňuje spustit libovolný počet průzkumů. Konkrétní cena této verze je odstupňovaná podle celkového počtu odpovědí na všechny dotazníky za dobu platnosti licence na danou verzi. Další verze One-shot je zaměřena pouze na jednorázovou dotazníkovou akci. Licence na tuto verzi platí po dobu jednoho měsíce a umožňuje spustit pouze jeden průzkum. Počet možných odpovědí je odstupňovaný stejně jako u verze Easy. [[3], [5]]
Současný stav Tab. 3
17
Technické parametry Easyresearch.biz
Zdroj: [3]
Vlastnost Počet otázek na průzkum Počet odpovědí na průzkumy (všechny) Jazyková podpora Přizpůsobení vzhledu dotazníku
Demo neomezen 1000000
Placená verze neomezen neomezen
čeština ne
Šifrování Přímý odkaz na dotazník Export do formátů Integrace průzkumu do vlastních stránek Sdílení dotazníku na sociálních sítích Kontrola správnosti dotazníků Podpora Cena
SSL ano PDF, CSV, XLS, DOC ne
čeština témata dotazníků, vlastní logo, obraz i zvuk SSL ano PDF, CSV, XLS, DOC ne
ne
ne
ano
ano
online zdarma
online, email, telefon Od 9900 Kč/měsíc
2.3.4
Likeex
Tento dotazníkový systém, který ve verzi Free je zcela zdarma, je plně lokalizován do českého jazyka. Software je vyvíjen českou firmou. Tato verze Free disponuje jen velice omezenými funkcemi. Například lze udělat pouze jeden výzkum za měsíc, výzkum může mít jen pět otázek za měsíc, počet respondentů za měsíc je deset a délka trvání dotazování je jeden měsíc. Mezi výhody této verze patří: výzkum je umístěn na veřejné adrese – není potřeba se přihlásit do systému, když je třeba vyplnit dotazník, nasbíraná data lze exportovat do XML, je zabezpečený přístup do systému a zabezpečený přístup při vyplňování dotazníků. Placené verze umožňují i základní statistické zpracování dat, které je podpořeno grafickým zobrazením statistických ukazatelů. Bezpečnost je zajištěna u verzí BusinessTeam a Corporate pomocí uživatelských hesel a filtrování IP adres. [[4], [5]]
Současný stav Tab. 4
18
Technické parametry Likeex
Zdroj: [4]
Vlastnost Počet otázek na průzkum Počet odpovědí na průzkumy (všechny) Jazyková podpora Přizpůsobení vzhledu dotazníku
Demo neomezen 1000000
Placená verze neomezen neomezen
čeština ne
Šifrování Přímý odkaz na dotazník Export do formátů Integrace průzkumu do vlastních stránek Sdílení dotazníku na sociálních sítích Kontrola správnosti dotazníků Podpora Cena
SSL ano PDF, CSV, XLS, DOC ne
čeština témata dotazníků, vlastní logo, obraz i zvuk SSL ano PDF, CSV, XLS, DOC ne
ne
ne
ano
ano
online zdarma
online, email, telefon Od 9900 Kč/měsíc
2.4 Hodnocení stávajících online dotazníkových systémů Při srovnání všech online dotazníkových systémů v této práci bylo zjištěno, že v kategorii dotazníkových systémů zdarma by byla nejlepší volba dotazníkový systém Survey Gizmo, jehož vlastnosti se nejvíce přibližují požadavkům reálného nasazení, tj. hlavně tím, že počet průzkumů je neomezený a počet vyplněných dotazníků za měsíc je mezi konkurenčními produkty v nekomerční sféře největší. V kategorii komerčních online dotazníkových systémů zvítězil produkt Easyresearch.biz, jehož parametry umožňují nastavit licenci přesně podle potřeb zákazníka – zvláště odstupňování ceny podle celkového množství odpovědí. Další výhoda je, že produkt je vyvíjen českou firmou, která zná český trh a jeho požadavky na průzkum. Také technická podpora je v češtině. Důkazem kvality produktu jsou také reference společností, jako např. Seznam.cz, UPC a Nestle. Bohužel u obou těchto dotazníkových systémů se všechny nasbírané dotazníky ukládají ať už přechodně nebo trvale na serveru poskytovatele dotazníkové služby. Shromažďovaná data projektu Prevence.net jsou natolik citlivá, že toto bezpečnostní riziko je zásadní překážkou ve využití uvedených online dotazníkových systémů.
Vlastní řešení
19
3 Vlastní řešení Na základě výsledků rešerše alternativních dotazníkových systémů bylo rozhodnuto, že požadavky klienta jsou natolik specifické, že nejlepší postup bude vytvořit aplikaci na míru, která bude ve všech ohledech vyhovovat požadavkům klienta na systém.
3.1 Návrh struktury databáze Navržená databáze pro projekt Prevence.net se skládá z relací Kraj, Okres a Mesto. Relace Klient uchovává informace o klientech-školách, které patří pod města. K jednotlivým klientům se vážou školní třídy. Informace o nich jsou uchovávány v relaci Trida. Každá třída pak může mít libovolný počet dotazníků, které jsou uchovávány v tabulce Dotaznik. K dotazníku je přiřazen vždy uživatel, který je momentálně přihlášen do systému a vkládá dotazník. Relace Uzivatel uchovává jméno, heslo a uživatelskou skupinu. Skupina je reprezentována číslicemi 0, 1 a 2 (nepřihlášený uživatel, běžný uživatel a administrátor). Zadání jednotlivých otázek dotazníku jsou uchovávána v relaci Otazka. Texty odpovědí pro každou otázku jsou uchovávány v relaci Odpovedi. V poslední relaci Hod_odpovedi se uchovává identifikační číslo odpovědi vybrané respondentem, identifikační číslo daného dotazníku a hodnota, kterou představuje buď číselná odpověď (věk, škála) nebo textová odpověď. Podrobné schéma databáze lze vidět na obrázku níže (viz obr. 2).
Vlastní řešení
obr. 2
Nové schéma databáze
20
Vlastní řešení
21
3.2 Návrh uživatelského rozhraní aplikace Aplikace vychází z velké části z původního návrhu, který se ukázal jako funkční. Tento návrh byl optimalizován pro specifický provoz aplikace. Hlavně je kladen důraz na to, aby v některých případech počet kroků k dosažení cíle byl co nejmenší. Např. u vyplňování dotazníků v uživatelském rozhraní je vyžadováno jen identifikační číslo klienta. Dotazníkový systém je navržen tak, že při otevření hlavní stránky bude vyžadováno přihlášení uživatele. (viz obr. 3) Podle toho, jaký uživatel se přihlásí (dva typy: uživatel a administrátor), provede se přesměrování do různých částí aplikace. Existují dva typy rozhraní – administrativní rozhraní a uživatelské rozhraní.
obr. 3
Přihlašovací obrazovka
3.2.1
Administrativní rozhraní
Uživatel přihlášený do administrativního rozhraní (viz obr. 4) má možnost vkládat dotazníky, generovat grafy, exportovat vyplněné dotazníky, vypsat informace o krajích, okresech, městech, klientech, třídách, otázkách a odpovědích, upravovat tyto informace a odhlásit se. Při volbě vložení dotazníku se nejdříve musí vybrat kraj, okres a město, ve kterém se nachází klient a jeho třída. U zadávání dotazníků dochází často k tomu, že se osoba, která zadává dotazníky, potřebuje přepnout pod jinou třídu proto, že chce zadat dotazník pro jinou třídu stejného klienta. Tato volba je explicitně nabídnuta v levém hlavním menu administrativního rozhraní.
Vlastní řešení
22
Zadávaný dotazník je zobrazen celý najednou, aby se ušetřilo co nejvíce akcí ze strany uživatele (např. kliknutí). Také je pro zadavatele dotazníku lepší, když se zobrazený elektronický dotazník co nejvíce podobá dotazníku vytištěnému na papíře, ze kterého odpovědi opisuje. U volby Grafy je napřed uživatel požádán, aby si zvolil, zda chce grafy generovat pro jednotlivé třídy, podle okresu (grafy pro každé město tohoto okresu), podle kraje (grafy pro každý zvolený kraj) a podle jednotlivých krajů (grafy pro všechny kraje). Následná nabídka umožňuje zvolit otázky, které uživatel chce zobrazit jako graf a zvolit klienta, okres a kraj v závislosti na předchozí nabídce. U možnosti generování grafů pro jednotlivé kraje obsahuje následná nabídka jen výběr požadovaných otázek, protože graf je generován pro všechny kraje. Volba Export vyžaduje před exportováním vyplněných dotazníků výběr města, klienta a třídy. Tato volba umožňuje stáhnout export už vyplněných dotazníků pro vybranou třídu jako soubor ve formátu XLSX (Microsoft Excel). Volba Úpravy v administrativním rozhraní umožňuje zobrazovat a upravovat (měnit, přidávat, mazat) záznamy v tabulkách Kraj, Okres, Mesto, Klient, Trida a provádět změny (pouze úpravu zadání) v záznamech tabulky Otazka a Odpoved. Protože dotazník je komplikovaný (viz kapitola 3.1) a téměř se nemění, je editace dotazníku řešena tak, že při editaci znění otázky nebo odpovědi na stránkách projektu uživatel typu Administrátor pouze vstoupí do sekce Úpravy, a tam úpravu provede. V tomto rozhraní lze měnit pouze znění otázky, nikoliv její formát nebo jejich počet. V případě přidávání nebo mazání otázek se musí přidat do šablony aplikace zadání otázky (viz kap. 4.3).
Vlastní řešení
obr. 4
Administrativní rozhraní
3.2.2
Uživatelské rozhraní
23
Po přihlášení má uživatel možnosti (viz obr. 5) zadávání dotazníku a odhlášení. Při volbě zadávání dotazníku je před zadáváním samotného dotazníku dotázán na identifikační číslo klienta. Tak jako v administrativním rozhraní má uživatel možnost změnit třídu, aniž by musel znovu vybírat identifikační číslo klienta.
Vlastní řešení
obr. 5
24
Uživatelské rozhraní
3.3 Statistické charakteristiky Zadavatel požaduje využití standardních statistických charakteristik pro hodnoty číselných odpovědí, jako je průměr, modus, medián, variační rozpětí a odchylka. Ze statistických charakteristik pro textové odpovědi byl požadován modus. Na základě jednotlivých druhů (viz obr. 9) odpovědí byly odpovědi rozděleny do tří kategorií, a to odpovědi zabývající se věkem, odpovědi, ve kterých je škála 1-5 a textové odpovědi. Podle požadavků zadavatele a po jejich zvážení na základě publikace [7] byly zvoleny příslušné charakteristiky. Pro otázky zabývající se věkem byly zvoleny tyto charakteristiky polohy (podávají představu o celém sledovaném statistickém souboru ve formě jedné nebo více statistických charakteristik): aritmetický průměr, geometrický průměr, medián, modus. Jako charakteristiky variability (charakterizují míru rozptýlení hodnot znaku okolo střední hodnoty) u otázek zabývajících se věkem byly použity tyto charakteristiky: minimální hodnota, maximální hodnota, variační rozpětí, rozptyl, výběrový rozptyl. U odpovědí, ve kterých je škála 1-5, byly použity tyto charakteristiky polohy: aritmetický průměr, geometrický průměr, medián, modus. Jako
Vlastní řešení
25
charakteristiky variability u otázek byly použity tyto charakteristiky: minimální hodnota, maximální hodnota, rozptyl, výběrový rozptyl. Pro odpovědi textového charakteru byla vybrána jen jedna charakteristika polohy, a to modus. U těchto odpovědí se dá vyhodnocovat pouze to, zda byly odpovězeny nebo ne. Pro všechny typy otázek pak byla zvolena ještě jedna statistická charakteristika, a to míra vyplnění, která udává v procentuálním vyjádření, kolikrát bylo z celkového počtu dotazníků odpovězeno na danou otázku. Statistické charakteristiky jsou vyhodnocovány obdobně jako u grafů, pro každou otázku zvlášť, a to za klienta – školu, okres, kraj a jednotlivé kraje. U klienta, okresu nebo kraje jsou souhrnné charakteristiky pro klienta, okres nebo kraj. Dále jsou vyhodnocovány statistické charakteristiky v případě klienta pro jednotlivé třídy, v případě okresu pro jednotlivá města a v případě kraje pro jednotlivé okresy.
Implementace
26
4 Implementace K implementaci databázového návrhu byl vybrán MySQL community server ve verzi 5.5.20, a to z toho důvodu, že tato platforma je nejrozšířenější – bývá ve standardní nabídce webhostingů. Později však bylo z důvodu optimalizace práce s databází (bude se pracovat s velkým objemem dat) a rozšíření databázových funkcí v oblasti statistických charakteristik (zvláště budoucího vývoje aplikace v oblasti využití regresivních funkcí) přistoupeno k přesunutí databáze na PostgreSQL server. Mezi rozšiřující statistické charakteristiky PostgreSQL serveru patří korelační koeficient, výběrový průměr, průměr závislý na proměnné, průměr nezávislý na proměnné a kvadratický korelační koeficient. K implementaci programové logiky byl vybrán programovací jazyk PHP (verze 5.4.0), protože je to jazyk používaný nejčastěji [19] pro vývoj webových aplikací a podporuje mnoho známých frameworků. Také původní verze projektu byla vyvíjena ve starší verzi tohoto jazyka. Navíc jeho masové rozšíření zajišťuje jeho velmi dobrou podporu na většině serverů. Jako framework1 byl vybrán Nette [6]. Tento framework disponuje českou dokumentací a stránkami fóra [24], které jsou aktivní. Také tento framework je stále vyvíjen a v krátkých intervalech je pravidelně aktualizován, což je z hlediska bezpečnosti webu žádoucí. Tento framework implementuje model MVC – model view controller, který zajišťuje větší přehlednost programového kódu, což je pro tento projekt velice důležité. K exportu vyplněných dotazníků do formátu XLSX byl zvolen framework PHPExcel [27], který usnadňuje vytváření XLSX dokumentů a umí vytvářet i starší dokumenty formátu XLS. Na základě [[9], [10]] byl pro implementaci grafů zvolen grafový framework Highcharts, jehož klientská část je naprogramovaná v jazyce JavaScript, serverová v jazyce PHP. Podporuje velké množství druhů grafů (např. sloupcový, výsečový, spojnicový atd.) a jejich přizpůsobování. Grafy jsou generovány vlastní webovou aplikací (viz kapitola 4.4) a vyžadují podporu JavaScriptu na straně klienta, což je v současné době standardní. Architektura aplikace vychází z modelu MVP. Kód je rozdělen na tři typy. První typ, který zajišťuje komunikaci s databází, se nazývá model. Soubory modelů jsou soustředěny do zvláštního adresáře models. Druhý typ kódu je View, což je vrstva aplikace, která zajišťuje zobrazení výsledku požadavku [28]. Tato vrstva využívá šablonovací systém. Soubory šablon udávají, jak bude výsledný vzhled stránky vypadat. Jejich obsah se skládá z HTML kódu a maker [25]. V šablonách dochází jen k vykreslení dat, která jsou předána do PHP proměnných. Tyto šablony jsou uloženy ve zvláštním adresáři templates. Framework – programová nadstavba umožňujících použití už hotových řešení, která přímo nesouvisejí s řešeným problémem, např. předpřipravených formulářů, zajištění bezpečnosti – autorizace a autentizace. 1
Implementace
27
O předání dat do šablony se stará presenter, který hraje roli prostředníka mezi šablonou a modelem. Soubory presenterů jsou uloženy ve zvláštním adresáři presenters. Jednotlivé třídy modelů a presenterů jsou pro přehlednost rozděleny do samostatných souborů typu PHP. Všechny presentery dědí od třídy BasePresenter, který mimo jiné obsahuje společné metody pro vykreslování informací o vybraném klientovi a pro zobrazování a vyhodnocování dotazníku. Třída BaseModel obsahuje zase připojení k databázi a od této třídy dědí všechny modely. (viz obr. 11) Pro uživatele typu administrátor byly vytvořeny třídy AdmPresenter a model AdmModel implementující základní metody pro práci v jeho prostředí. Pouze některé metody (např. metody týkající se dotazníku, grafů a informací o klientovi), které zasahují do administrativního rozhraní nebo uživatelského rozhraní nebo jsou rozsáhlé, byly vyčleněny. (viz obr. 10obr. 11) Pro uživatele typu user byly vytvořeny třídy UsrPresenter a UsrModel. Třídy UsrPresenter a AdmPresenter dědí od stejného předka DotaznikPresenter. Pro nepřihlášeného uživatele je přístupný pouze SignPresenter, který zajišťuje přihlašování k systému. Tento presenter vykresluje jedinou šablonu, a to in, která zobrazuje přihlašovací formulář. (viz obr. 10, obr. 11) Pro snadnější upravování záznamů v tabulkách Kraj, Okres, Mesto, Otazka, Otazka a Odpoved je na webových stránkách dotazníkového systému implementována speciální stránka Úpravy, která umožňuje přehledné zobrazení a editaci dat z jednotlivých tabulek. K tomuto se využívá v Nette datagrid2 Tabella [17]. Tato komponenta umožňuje editaci jednotlivých záznamů, a to včetně jejich přidávání a odebírání. Tyto operace se provádějí s využitím technologie AJAX, která umožňuje pomocí asynchronního Javascriptového požadavku, aby se při každé úpravě, která se provede, neaktualizovala celá webová stránka, a tím se nenačítaly prvky, které jsou v dané chvíli neměnné, ale aby se aktualizoval pouze ten obsah, který byl pozměněn. [23] K získání, odebrání a upravení dat z databáze slouží třída TabellaModel, která implementuje metody: getKrajSource() – stará se o získání dat z databáze, saveKraj() – zajišťuje uložení nebo upravení konkrétního záznamu v databázi a deleteKraj() – zajišťuje odebrání záznamu z databáze. Tyto metody vyžadují použití databázové vrstvy Dibi [18], která umožňuje serializaci objektů. Tato vlastnost je vyžadována datagridem Tabella. Pro každou tabulku je pak v presenteru komponenta [20], která zajistí nastavení atributů vykreslované tabulky a její předání šabloně. V samotné šabloně Upravy je pak použit jQuery UI [15], který umožňuje pomocí Widget tabs [16] snadnou orientaci na stránce pomocí záložek (viz obr. 6).
2
Datagrid – prvek, který zobrazuje hodnoty v upravitelné mřížce
Implementace
obr. 6
28
jQuery UI widget Tabs a Tabella
4.1 Informace o klientovi Informace o vybraném klientovi, které musí být vloženy do systému před zadáním vlastního dotazníku, jsou uloženy ve třídě KlientModel. Tato třída obsahuje atributy potřebné k identifikaci dotazníku, které jsou zobrazovány při práci s aplikací, aby měl uživatel přehled, kde se právě nachází. Tyto atributy jsou IDkraj, IDokres a IDtrida. Dále jsou v této třídě atributy, jako je kraj, okres, mesto, skola, trida, ve kterých jsou uchovávány názvy k daným atributům třídy KlientModel s prefixem ID, aby se minimalizovalo dotazování na databázi.
4.2 Autorizace a autentizace O autentizaci se stará vlastní autentizační třída, která implementuje rozhraní NS\IAuthenticator. Tato třída poskytuje metodu Authenticate, která v případě, že je uživatel úspěšně přihlášen, vrátí instanci třídy
Implementace
29
Nette\Security\IIdentity. Tato třída disponuje metodami getId() a getRoles(). V případě neúspěšného přihlášení je vyvolána výjimka. O autorizaci se stará třída AclModel, která obsahuje tři klíčové části. První jsou role uživatelů (Administrátor, Uživatel, Nepřihlášený), zdroje (názvy presenterů) a operace, které lze se zdrojem dělat, např. vkládání dotazníků, generování grafů atd.
4.3 Postup pro přidání nové otázky
1.
V případě, že zadavatel bude požadovat přidání nebo odebrání otázky/odpovědi, bude použit tento postup: Vytvořit další proměnné šablony v metodě renderSberDat(). Tato metoda se nachází ve třídě DotaznikPresenter. Do této nové proměnné předat zadání otázky pomocí metody getOtazky(), která je ve třídě DotaznikModel. Jako jediný parametr se metodě getOtazky() předá id_otazka.
2.
Přidat jednotlivé odpovědi jako prvky formuláře metody createComponentDotaznik() třídy DotaznikPresenter. K získání textu odpovědí slouží metoda getTextOdpovedi(), kde první parametr je id_otazka a druhý poradi.
3. 4.
Umístit zadání otázky a prvků formuláře v šabloně SberDat. Přidat vyhodnocení otázky do metody dotaznikSubmitted() ve třídě DotaznikPresenter. Uložení odpovědi do databáze zajišťuje metoda addOdpoved() třídy DotaznikModel. Tato metoda přebírá jako parametry id_otazka, poradi. Jako volitelný parametr může do metody addOdpoved() vstupovat hodnota_odpovedi.
4.4 Generování grafů Generování grafů zajišťuje vlastní třída GrafModel, která získává data z databáze a převádí je do formátu pro grafy Highcharts (viz kap. 4.6). Tato třída obsahuje atributy, které představují atributy grafu HighCharts, to znamená, že jedna instance třídy GraphModel reprezentuje právě jeden konkrétní graf k jedné otázce. Tato třída obsahuje atribut nazevGrafu, který slouží pro zobrazení názvu otázky v grafu a atribut categories, který uchovává informace o ose x grafu. Atribut categories představuje pole, ve kterém jsou uloženy názvy jednotlivých tříd v případě klienta, jednotlivých měst v případě okresu, jednotlivých okresů v případě krajů a názvy krajů v případě jednotlivých krajů. Atribut series uchovává hodnoty, legendu (řetězce znaků) a samotné číselné hodnoty grafu. Protože atribut series uchovává informace složitější povahy, byla k jejich uchovávání zvolena třída Serie. Tato třída má atribut name, kde se uchovává
Implementace
30
odpověď na zvolenou otázku. Atribut data je pole číselných hodnot, které patří jednotlivým třídám daného klienta tak, jak následují po sobě v grafu. Ve třídě AdmPresenter, která slouží jako presenter pro administrativní část aplikace, jsou pak metody jako renderKlient(), renderOkres(), renderKraje(), renderJednotliveKraje(). Tyto metody zajišťují vytvoření jednotlivých instancí třídy GrafModel a předání parametrů jejím konstruktorům. Parametry jsou: 1) identifikační číslo záznamu v požadované tabulce (Klient, Okres, Kraj), 2) číslo otázky – hodnota atributu id_otazka z tabulky Otazka, 3) řetězec znaků, který určuje, zda bude daný graf vykreslován pro klienta, okres, kraj nebo jednotlivé kraje, 4) název javascriptové proměnné, ve které bude uložen graf. Pro každý druh grafu (sloupcový, výsečový atd.) je vytvořena samostatná šablona v Latte [21], která obsahuje předem připravený graf, do kterého se pomocí maker [25] vloží hodnoty generovaného grafu. Vygenerovaný graf je pak umístěn do značky <script> hlavičky HTML dokumentu a je na něj odkazováno uvnitř těla HTML dokumentu značkou
s jedinečným ID. Renderování grafu zajišťuje knihovna highcharts.js [26]. Tento skript vyžaduje pro svou funkčnost zavedení knihovny jQuery. Stažení vygenerovaného grafu zajišťuje přídavný exportní modul. Tento modul se skládá z klientské a serverové části. Klientská část je Javascriptový modul, na který se musí odkazovat v hlavičce HTML dokumentu, ve kterém se bude graf nacházet. Správné vložení tohoto modulu se projeví tak, že v každém grafu přibudou dvě tlačítka, a to na vytisknutí nebo stažení grafu v daném formátu. Tento modul zajišťuje, že v případě požadavku na stažení grafu v daném formátu se graf vygenerovaný v Javascriptu převede do formátu SVG. Jako odpověď ze strany serveru je pak obdržen soubor grafu ve výsledném formátu (jpg, pdf, png, svg). Další možnost, kterou exportní klientský modul umožňuje, je vytisknutí grafu. V tomto případě se graf nikam neposílá a je okamžitě vytisknut. Serverová část, která zajišťuje převedení grafu do požadovaného formátu, umožňuje dva druhy implementace, a to buď využití už funkčního serveru na export.highcharts.com nebo vytvoření vlastního serveru, který umožňuje rozšířené možnosti manipulace s daty. Jako nejlepší varianta bylo vyhodnoceno využití už existujícího serveru, a to export.highcharts.com. Využití vlastního serveru vyžaduje nainstalování a nastavení Java knihovny Batik [22], která provádí převod SVG grafu do požadovaného formátu. Na základě požadavků zadavatele bylo také implementováno tlačítko, které umožňuje stažení všech vygenerovaných grafů. S tímto požadavkem však vyvstal problém, protože aktuální exportní klientský modul dokázal zároveň exportovat pouze jeden graf. Proto bylo nutné odvodit vlastní klientský modul od modulu původního. Nový klientský modul se skládá ze dvou metod třídy Highcharts. Metoda getSVG() převezme jako argument všechny grafy, které si uživatel nechal vygenerovat. Toto pole se všemi grafy se projde cyklem a jeden graf po druhém
Implementace
31
se převede do formátu SVG a připojí se do proměnné celek, která uchovává jednotlivé grafy ve formátu SVG za sebou v řetězcové podobě. Highcharts.getSVG = function(charts) { var celek=""; $.each(charts, function(i, chart) { var svg = chart.getSVG(); celek+=svg; celek+='||'; }); return celek; }; Metoda exportChart() pak přebere takto upravené grafy do proměnné svg, vytvoří formulář a přidá grafy do formuláře jako prvek hidden. Takto upravený formulář je poslán do PHP skriptu k dalšímu zpracování. Highcharts.exportCharts = function(charts, options) { var form, svg = Highcharts.getSVG(charts); options = Highcharts.merge( Highcharts.getOptions().exporting, options); form = Highcharts.createElement('form', { method: 'post', action: '/ostmig2P/www/expserver/' }, { display: 'none' }, document.body); Highcharts.each(['filename', 'type', 'width', 'svg'], function(name) { Highcharts.createElement('input', { type: 'hidden', name: name, value: {
Implementace
32
filename: otazka || 'chart', type: options.type, width: options.width, svg: svg }[name] }, null, form); }); form.submit(); form.parentNode.removeChild(form); }; Odeslaný formulář s grafy pak přebere PHP skript, který rozdělí řetězec znaků do jednotlivých položek pole po jednotlivých grafech. Stejný postup se provede i s názvy těchto grafů, které představují číslo otázky. Potom se pomocí cyklu pole projde a pro každý graf se pomocí funkce Curl() vyšle požadavek na adresu export.highcharts.com na převedení do patřičného formátu. Odpověď představuje graf převedený do požadovaného formátu. Takto přijatý soubor se pomocí funkce file_put_contents() uloží do dočasného adresáře. Pro převedení všech grafů se zavolá funkce, která zkomprimuje soubory do formátu ZIP a smaže už nepotřebné soubory s grafy. Následně nabídne zazipovanou složku s jednotlivými grafy ke stažení. Vygenerovaný graf typu HighCharts, který se nachází v šabloně, má několik vlastností. Vlastnost Charts obsahuje informace o názvu daného grafu a jednoznačně ho identifikuje v HTML dokumentu – tato vlastnost má zejména své využití, když se vykresluje více grafů na jednu stránku. Další vlastnost title obsahuje název grafu, vlastnost subtitle může obsahovat podnadpis grafu. Vlastnost xAxis obsahuje informace o ose X. V případě vykreslování grafů pro klienta obsahuje názvy jednotlivých tříd, pro okresy obsahuje názvy jednotlivých měst, pro kraje obsahuje názvy jednotlivých okresů a pro jednotlivé kraje představuje názvy krajů. Tyto názvy jsou uchovávány v poli.[26] Vlastnost yAxis uchovává název osy Y, který je ve všech případech Lidé, protože na dotazník odpovídají lidé. Vlastnost legend umožňuje vykreslení legendy a nastavení barvy na pozadí legendy. Vlastnost tooltip umožňuje u vykresleného grafu po „najetí“ kurzoru na libovolný sloupec grafu zobrazit, co tento sloupec znamená. Vlastnost plotOption umožňuje nastavení grafických vlastností sloupců, jako je šířka a tloušťka ohraničení sloupců. [26] Ve vlastnosti series jsou uloženy jednotlivé odpovědi na otázku a k těmto odpovědím jsou přiřazeny hodnoty. Počet těchto hodnot musí odpovídat počtu položek, které jsou uloženy ve vlastnosti xAxis. Položky, ke kterým není přidělena žádná hodnota, bylo nutno doplnit nulou. Tento fakt musel být při tvorbě a optimalizaci SQL dotazů brán v potaz.[26]
Implementace
33
Ukázka vygenerovaného grafu: chart["otazka1"]= new Highcharts.Chart({ chart: { renderTo: "container1",defaultSeriesType: 'column'}, title: { text: "Trval\u00e9 bydli\u0161t\u011b"}, subtitle: { text: ''}, xAxis: { categories: ["9.A","9.B","9B","9.C","9.D","9.E","9Z","6N"]}, yAxis: { min: 0, title: { text: 'Lidé'}}, legend: { backgroundColor: '#FFFFFF', shadow: true }, tooltip: { formatter: function() { return ''+this.x +': '+ this.y +' lidé'; } }, plotOptions: { column: { pointPadding: 0.2, borderWidth: 0}}, series: [ { name: "venkov",data: [0,0,0,0,0,1,0,0] }, { name: "m\u011bsto do 5000 obyvatel", data: [0,9,0,5,1,0,0,0]}, { name: "m\u011bsto od 5000 do 10000 obyva tel",data: [7,0,0,0,0,0,0,0]}, { name: "m\u011bsto od 10000 do 50000 obyvatel",data: [0,10,0,3,14,0,2,0]}, { name: "m\u011bsto od 50000 do 100000 obyvatel",data: [0,15,0,0,9,0,0,2]}, { name: "m\u011bsto nad 100000 obyvatel ", data: [12,0,0,0,0,3,0,0]}, ] }); Na základě vygenerovaného grafu uvedeného výše je renderován graf (viz obr. 7).
Implementace
obr. 7
34
Ukázka vykresleného grafu
4.5 Zobrazení dotazníku Vykreslení dotazníku zajišťuje v presenteru komponenta Dotaznik(), která předává do šablony jednotlivé prvky formuláře – dotazníku. Vzhledem k tomu, že komponenta Dotaznik() je využívána v obou částech aplikace (administrativní a uživatelské), nachází se ve třídě BasePresenter. Šablona explicitně určuje, kde budou jednotlivé prvky umístěny. O předání dat z databáze do komponenty Dotaznik() se stará třída DotaznikModel. Tato třída implementuje metody nactiOtazky() a nactiOdpovedi(), které načtou všechny otázky a odpovědi z databáze do lokálního asociativního pole dané metody. Metoda nactiOtazky() do tohoto asociativního pole uloží jako klíč id_otazka – jednoznačný identifikátor otázky v tabulce Otazka a jako hodnotu použije zadání otázky. Metoda nactiOdpovedi() uloží do tohoto pole odpovědi, a to ve formě dvojrozměrného asociativního pole. První klíč tohoto pole je id_otazka, ke které daná odpověď patří, a poradi – atribut
Implementace
35
tabulky Odpovedi, který určuje pořadí odpovědí v dotazníku. Znění odpovědi je pak uloženo jako hodnota asociativního pole. Obě metody vracejí takto vytvořené asociativní pole. Tyto dvě metody jsou volány už v konstruktoru třídy DotaznikModel, kde se vrácená hodnota metody nactiOtazky() uloží do atributu otázky třídy DotaznikModel. V případě metody nactiOdpovědi() je vrácená hodnota uložena do atributu odpovědi třídy DotaznikModel. Toto řešení bylo zvoleno, aby se minimalizovalo dotazování na databázi. Využívání asociativních polí umožňuje – zvláště u hodnot odpovědí – efektivní přístup k hodnotám odpovědí a otázkám. V komponentě Dotaznik() je pak využívána metoda getTextOdpovedi(), jejímž vstupním parametrem je id_otazka a poradi. Pak je vrácena hodnota, která se nachází na žádané pozici v dvojrozměrném asociativním poli. V presenteru, který vykresluje stránku s dotazníkem, se pak využívá metoda getOtazky(), která předává zadání otázky do šablony. Jejím vstupním parametrem je id_otazka.
4.6 Statistické charakteristiky Protože v databázi bude uloženo velké množství vyplněných dotazníků, se kterými bude aplikace pracovat, a také z důvodu optimalizace práce aplikace, jsou všechny statistické charakteristiky vyhodnocovány na úrovni databázového serveru. Proto samotná programová část aplikace se pouze dotazuje databázového serveru a dostává přímo hodnoty jednotlivých charakteristik. Pro získávání dat z databáze za tímto účelem slouží třída StatModel, která implementuje metody, které zjišťují charakteristiky pro otázky zabývající se věkem. Tyto metody jsou PodleKlientaVek(), PodleKlientaTridyVek(), PodleOkresuVek(), PodleOkresuTridyVek(), PodleKrajeVek(), PodleKrajeTridyVek(), PodleJednotliveKrajeTridyVek(). Dotazování na odpovědi, ve kterých je škála 1-5, zajišťují tyto metody: PodleKlientaSkaly(), PodleKlientaTridySkaly(), PodleOkresuSkaly(), PodleOkresuTridySkaly(), PodleKrajeSkaly(), PodleKrajeTridySkaly(), PodleJednotliveKrajeTridySkaly(). V dalších krocích se potom pro všechny otázky volají metody v závislosti na předchozí volbě rozsahu (klient, okres, kraj, okres nebo jednotlivé kraje), které vrátí procentuální vyjádření zodpovězených otázek a odevzdaných dotazníků. Pro každou volbu rozsahu (klient, okres, kraj, okres nebo jednotlivé kraje) jsou vytvořeny zvlášť presentery, kde jsou volány metody třídy StatModel a vrácené hodnoty jsou předávány do jednotlivých proměnných šablon. Šablony pro klienta, okres a kraj obsahují pro každou otázku jednu souhrnnou tabulku pro daného klienta, okres, kraj a další tabulku pro jednotlivé třídy, města, okresy. V šabloně pro jednotlivé kraje je jedna tabulka, ve které jsou vypsány názvy jednotlivých krajů a k nim jednotlivé charakteristiky. (viz obr. 8)
Implementace
obr. 8
36
Statistické charakteristiky pro klienta
Databázový server PostgreSQL má integrovanou většinu požadovaných funkcí [8]. Mezi ně patří funkce určující charakteristiku polohy, jako je aritmetický průměr (funkce avg). Mezi funkce určující míru variability patří: rozptyl (funkce variance), odchylka (funkce stddev), výběrový rozptyl (funkce var_samp), nejmenší hodnota (funkce min), největší hodnota (funkce max). Funkce, které nebyly přímo definované, byly vytvořeny spojením jiných definovaných funkcí. Je to variační rozpětí, které je rozdílem mezi funkcí max a min a geometrický průměr exp(avg(ln(hodnota::integer))). Funkce modus a medián, které nebylo možno vypočítat pouhým složením několika funkcí, musely být implementovány v jazyku PL/SQL. Po důkladné analýze byla použita už hotová řešení. Pro výpočet mediánu a modu byla použita funkce ze stránek PostgreSQL [[11], [12]], jejichž autorem je Scott Bailey. Protože databáze obsahuje velké množství dat, je kladen důraz na to, aby programová část webové aplikace dostávala už zpracovaná data. Framework HightCharts vyžaduje data ve speciální podobě (viz kap. 4.4). Například u grafů klienta, ve kterých jsou zachyceny jednotlivé třídy a odpovědi na danou otázku, bylo v počtech odpovědí nutné zařídit, aby byla vypsána každá třída klienta, tedy i ta, která nemá žádný odevzdaný dotazník. Po analýze druhu odpovědí byly zjištěny tři typy odpovědí, a to odpovědi zabývající
Implementace
37
se věkem, odpovědi, ve kterých je škála 1-5 a textové odpovědi. Některé odpovědi jsou smíšené (viz obr. 9). Aby bylo možné odpovědi rozlišit v rámci jedné otázky, a to nejen z hlediska grafů, ale i z hlediska exportování dotazníků z databáze, byl do tabulky Odpoved přidán další atribut zobrazit_hodnotu, který může nabývat hodnoty nula nebo jedna. Nula je to v případě, jde-li o odpověď, kde není potřeba brát v potaz hodnotu odpovědi – pouze textové odpovědi; jedna je to v případě, že má být brána v potaz hodnota odpovědi – věk nebo škála. U textových odpovědí pak bylo nutné přiřadit ke každé třídě všechny odpovědi na danou otázku. To bylo zařízeno přes kartézský součin [14]. Do podmínkové části where bylo tedy vloženo omezení na id_klient a id_otazka, aby se vybral jen požadovaný klient a požadovaná otázka. K tomuto poddotazu byla pomocí Left join [13] postupně přiřazována tabulka Dotaznik a Hod_odpovedi. Na závěr byla použita funkce count s klausulí group by, která spočítala počet přiřazených odpovědí ke každé třídě. Tímto způsobem byly řešeny textové odpovědi. SELECT tp.id_trida, tp.id_odpoved, text_odpoved, tp.poradi, tp.nazev_tridy, Count(hodnota) AS kolikrat FROM (SELECT * FROM Trida, Odpoved WHERE zobrazit_hodnotu = 0 AND id_otazka = 2 AND id_klient = 8) AS tp LEFT JOIN Dotaznik ON tp.id_trida = Dotaznik.id_trida LEFT JOIN Hod_odpovedi ON Dotaz - nik.id_dotaznik = Hod_odpovedi.id_dotaznik AND tp.id_odpoved = Hod_odpovedi.id_odpoved GROUP BY tp.id_trida, tp.id_odpoved, tp.nazev_tridy, text_odpoved, tp.poradi ORDER BY tp.id_trida, tp.poradi; Podobným způsobem byly řešeny SQL dotazy pro okres, kraj a jednotlivé kraje s tím rozdílem, že ve vnořeném SQL dotazu byla tabulka Trida nahrazena patřičnou tabulkou, tj. v případě okresu tabulkou Mesto, kraje tabulkou Okres a
Implementace
38
pro jednotlivé kraje tabulkou Kraj. U grafu pro kraj a jednotlivé kraje musely být k vnořenému SQL dotazu ještě připojeny tabulky nesoucí spojovací atribut, tj. tabulky Mesto a Okres. V případě číselných odpovědí – vyjádřených věkem nebo škálou, bylo bráno v úvahu to, že rozmezí věku nebo škály, které je stanoveno zadavatelem, se může v budoucnosti měnit, takže by bylo nepraktické přiřazovat ke každé třídě každou hodnotu věku nebo škály, i tu, kterou odevzdaný dotazník neobsahuje. Došlo by k znepřehlednění grafů. V případě číselných odpovědí se vycházelo z textových odpovědí s tím rozdílem, že odpovědi, které byly v případě textových odpovědí u klienta spojeny kartézským součinem, byly nahrazeny dalším vnořeným dotazem, který zjišťuje výskyt jednotlivých číselných odpovědí ve všech vyplněných dotaznících. Touto úpravou odpadá práce s hodnotami, které zjištěny nebyly. SELECT tp.nazev_tridy, tp.hodnota AS hod, Count(Hod_odpovedi.hodnota) AS kolikrat FROM (SELECT * FROM Trida, Odpoved, (SELECT hodnota FROM (SELECT * FROM Trida, Odpoved WHERE zobrazit_hodnotu = 1 AND id_otazka = 4 AND id_klient = 8) AS tp LEFT JOIN Dotaznik ON tp.id_trida = Dotaznik.id_trida LEFT JOIN Hod_odpovedi ON Dotaznik.id_dotaznik = Hod_odpovedi.id_dotaznik AND tp.id_odpoved = Hod_odpovedi.id_odpoved WHERE hodnota IS NOT NULL GROUP BY hodnota) AS tab WHERE zobrazit_hodnotu = 1 AND id_otazka = 4 AND id_klient = 8) AS tp LEFT JOIN Dotaznik ON tp.id_trida = Dotaznik.id_trida LEFT JOIN Hod_odpovedi ON Dotaznik.id_dotaznik = Hod_odpovedi.id_dotaznik AND tp.id_odpoved = Hod_odpovedi.id_odpoved AND Hod_odpovedi.hodnota = tp.hodnota GROUP BY tp.id_trida, tp.hodnota, tp.nazev_tridy
Závěr
39
5 Závěr Výsledkem této práce je inovace původního systému, a to zvláště v oblasti použitých technologií, především využití PHP frameworku Nette. Rozvržení jednotlivých tabulek v databázi bylo také změněno, a to zejména v oblasti uchovávání hodnot zodpovězených dotazníků. V oblasti grafů se přešlo z původního grafového frameworku JpGraph na Highcharts, což podstatně rozšiřuje využití grafů, a to jak ve stávajícím systému, tak i v budoucím rozvoji aplikace. Pro exportování vyplněných dotazníků do formátu XLSX byl použit exportní framework PHPExcel. Přidaná nabídka Úpravy v administrativním rozhraní umožňuje měnit záznamy tabulek v databázi, aniž by se musela využívat další externí aplikace k databázi, např. phpMyAdmin nebo phpPgAdmin. Byla také posílena celková bezpečnost aplikace, která spočívá zejména v rozdělení uživatelských rolí pomocí ACL modelu v Nette a ochraně proti SQLinjection. V průběhu dalšího vývoje by mohla být pozornost zaměřena na optimalizaci práce s historickými údaji, které s používáním aplikace narůstají, a práce s nimi se stává problematičtější. Jako jedno z možných řešení by mohlo být průběžné zpracování těchto údajů do dalších tabulek, ve kterých by se nacházely jen předem připravené výsledky za určité období. Tyto výsledky by pak byly využity při generování grafů a vyhodnocování statistických charakteristik.
Literatura
40
6 Literatura [1]
Survey Monkey [online]. c2011 [cit. 2011-5-12]. Dostupný z WWW: http://www.surveymonkey.com
[2]
Survey Gizmo [online]. c2011 [cit. 2011-5-12]. Dostupný z WWW: http://www.surveygizmo.com
[3]
Easyresearch.biz [online]. c2011 [cit. 2011-5-12]. Dostupný z WWW: http://www.easyresearch.biz
[4]
Likeex.eu [online]. c2011 [cit. 2011-5-12]. Dostupný z WWW: http://www.likeex.eu
[5]
Výzkumy.cz [online]. c2011 [cit. 2011-5-12]. Dostupný z WWW: http://www.vyzkumy.cz/software-pro-vyzkum
[6]
Začínáme s Nette Frameworkem | Nette Framework [online]. c2011 [cit. 2012-3-3]. Dostupný z WWW: http://doc.nette.org/cs/getting-started
[7]
MELOUN, Milan. Kompendium statistického zpracování dat: metody a řešené úlohy. Vyd. 2., přeprac. a rozš. Praha: Academia, 2006, 982 s. ISBN 80-200-1396-2.
[8]
PostgreSQL: Documentation: Manuals: Aggregate Functions [online]. c2011 [cit. 2012-5-12]. Dostupný z WWW: http://www.postgresql.org/docs/8.2/static/functions-aggregate.html
[9]
Top 10 Sites about JavaScript Charts | Xmarks [online]. c2012 [cit. 20125-12]. Dostupný z WWW: http://www.xmarks.com/topic/javascript_charts
[10]
Vaadin + Charts: A Review of the main Chart addons avaliable to Vaadin. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://cristianofontes.posterous.com/vaadin-charts-vaadin-addons-forgraphs
Literatura
41
[11] BAILEY, Aggregate Median – PostgreSQL wiki [online]. c2012 [cit. 20125-12]. Dostupný z WWW: http://wiki.postgresql.org/wiki/Aggregate_Median [12] BAILEY, Aggregate Mode – PostgreSQL wiki [online]. c2012 [cit. 2012-512]. Dostupný z WWW: http://wiki.postgresql.org/wiki/Aggregate_Mode [13] GILMORE, W. J. Velká kniha PHP a MySQL 5 : kompendium znalostí pro začátečníky i profesionály. 1. vyd. Brno: Zoner Press, 2007. 864 s. Encyklopedie webdesignera. ISBN 978-80-86815-53-4. [14] CELKO, J. Joe Celko's SQL for Smarties: Advanced SQL Programming. 3. vyd. Massachusetts: Morgan Kaufmann, 2005. 840 s. ISBN 978-0-12369379-2. [15] jQuery UI – Home. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://jqueryui.com/ [16] jQuery UI – Tabs Demos; Documentation. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://jqueryui.com/demos/tabs/ [17] Tabella | Nette Framework. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://addons.nette.org/cs/tabella [18] Dibi is Database Abstraction Library for PHP 5. | dibi. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://dibiphp.com/cs/ [19] TIOBE Software: The Coding Standards Company. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html [20] Komponenty | Nette Framework. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://dev.nette.org/cs/komponenty
Literatura
42
[21] Šablony | Nette Framework. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://doc.nette.org/cs/templating#toc-latte [22] Batik SVG Toolkit. [online]. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://xmlgraphics.apache.org/batik/ [23] Ajax (programming) – Wikipedia, the free encyclopedia. c2012 [cit. 20125-12]. Dostupný z WWW: http://en.wikipedia.org/wiki/Ajax_(programming) [24] Nette Framework forum. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://forum.nette.org/cs/ [25] Výchozí Latte makra | Nette Framework. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://doc.nette.org/cs/default-macros [26] Highcharts – Interactive JavaScript charts for your webpage. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://www.highcharts.com/ [27] PHPExcel. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://phpexcel.codeplex.com/ [28] Class Nette\Application\Request | Nette Framework 2.0.3 API. c2012 [cit. 2012-5-12]. Dostupný z WWW: http://api.nette.org/2.0/Nette.Application.Request.html
Literatura
43
Přílohy
Literatura
44
A Původní dotazník
obr. 9
Původní dotazník
Literatura
45
B Diagramy tříd
obr. 10
Diagram tříd presenterů
Literatura
obr. 11
46
Diagram tříd modelů