Systém údaje uloží po kliknutí na tlačítko Uložit.
7
3 Analýza a návrh řešení Smazat nabídku Smazání uložené nabídky. Tok událostí: • • • •
USES (Zobrazit nabídky). Přihlášený uživatel zvolí u jedné z nabídek Smazat nabídku. Systém administrátorovi zobrazí výzvu k potvrzení. Systém smaže nabídku v případě, že výzva byla potvrzena.
Spočítat ceny Vypočítání koncových cen pro prezentaci zákazníkovi. Tok událostí: • •
Systém zaregistruje požadavek na spočítání cen. Systém projde ceny jednotlivých položek a služeb, sečte je.
Tisknout nabídku Tisknout nabídku - generování stránky pro tisk. Tok událostí: • • • • •
USES (Zobrazit nabídky). Přihlášený uživatel zvolí u jedné z nabídek Tisk. USES (Spočítat ceny). Systém vygeneruje PDF soubor a zobrazí jej uživateli. Uživatel zvolí tisk do souboru (Uložit) nebo tisk na tiskárnu (Tisk).
Vytvořit uživatele Vytvoření (přidání) nového uživatele do systému. Tok událostí: • • •
Přihlášený administrátor zvolí možnost Přidat uživatele. Systém administrátorovi zobrazí formulář pro zadání uživatelského jména, reálného jména a hesla. Systém údaje uloží po kliknutí na tlačítko Přidat.
Zobrazit uživatele Zobrazení jmen uživatelů Tok událostí: • •
Přihlášený administrátor zvolí možnost Zobrazit uživatele. Administrátorovi se zobrazí seznam uživatelů.
8
3 Analýza a návrh řešení Editovat uživatele Editace existujícího uživatele. Tok událostí: • USES (Zobrazit uživatele). • Administrátor vybere uživatele určeného k editaci. • Systém zobrazí formulář s předvyplněnými údaji uživatele. • Administrátor provede změny. • Systém údaje uloží po kliknutí na tlačítko Uložit. Smazat uživatele Smazání existujícího uživatele. Tok událostí: • • • •
USES (Zobrazit uživatele). Administrátor vybere uživatele určeného k mazání. Systém zobrazí administrátorovi výzvu k potvrzení. Systém smaže uživatele v případě, že výzva byla potvrzena.
Upravit údaje firmy Úprava kontaktních a fakturačních údajů firmy. Tok událostí: • • • •
Administrátor zvolí Upravit údaje firmy. Systém administrátorovi zobrazí formulář s předvyplněnými údaji (v případě prvního použití budou předvyplněné údaje prázdné). Administrátor provede editaci údajů. Systém údaje uloží po kliknutí na tlačítko Uložit.
Upravit ceny za služby Úprava cen za poskytované služby firmou. Tok událostí: • • • • •
Administrátor zvolí Upravit ceny za služby. Systém administrátorovi zobrazí seznam služeb a jejich cen. Administrátor vybere službu určenou k editaci. Administrátor provede editaci údajů Systém údaje uloží po kliknutí na tlačítko Uložit.
9
3 Analýza a návrh řešení
3.4 Diagram aktivit Diagram aktivit znázorňuje možnosti použití uživatelem – tzn. osobou s omezenými právy.
Obrázek 2: Aktivity diagram pro uživatele
10
3 Analýza a návrh řešení
3.5 Analytické třídy
Nabídka Tato třída představující nabídku může obsahovat libovolný počet položek. Je vytvořena právě pro jednoho zákazníka a právě jednou obsahuje firemní údaje. Nabídku vytváří právě jeden uživatel. Obsahuje následující metody: •
pridatZakaznika - vloží do nabídky zákazníka (spáruje).
•
pridatPolozku - do aktuální nabídky přidá další položku.
•
pridatFirmeniUdaje - vloží do nabídky firemní údaje.
•
tisk - tiskne danou nabídku.
PolozkaNabidky Třída vyjadřující položku v nabídce, kterou může být různý typ okna či vrat. Obsahuje několik atributů vyjadřujících její vlastnosti. Položka se vztahuje k právě jedné nabídce a nemůže existovat bez nabídky. Obsahuje metodu: •
nastavitVlastnosti - nastaví atributy položky.
11
3 Analýza a návrh řešení Uzivatel Třída představuje osobu registrovanou v systému. Uživatel může vytvářet libovolný počet nabídek. Obsahuje následující metody: •
prihlasit - přihlášení uživatele do systému.
•
odhlasit - odhlášení uživatele ze systému.
•
vytvoritNabidku - vytvoření nové nabídky uživatelem.
•
editovatNabidku - editováni již existující nabídky.
•
zobrazitNabidky - zobrazení všech vytvořených nabídek.
Administrator Tato třída je speciálním případem třídy Uzivatel (je potomkem). Vyznačuje se především přidanými metodami: •
pridatUzivatele - přidání uživatele do systému.
•
editovatUzivatele - editace existujícího uživatele systému.
•
smazatUzivatele - smazání uživatele ze systému.
•
editovatUdajeFirmy - editace firemních údajů.
•
editovatCeny - editace cen za poskytované služby.
Zakaznik Třída reprezentující zákazníka. Zákazník může mít libovolný počet nabídek, nejméně však právě jednu. Atributy jsou jméno, kontaktní údaje a další. Obsahuje metodu: •
nastavitUdaje - nastaví údaje zákazníka.
FiremniUdaje Třída pracující s firemními údaji jako jsou adresa, bankovní spojení, ceny za služby a další. V nabídce je obsažena právě jednou a měnit je může kterýkoli administrátor. Metodou je: •
editovatUdaje - nastaví atributy.
12
3 Analýza a návrh řešení
3.6 ER schéma databáze
Obrázek 3: ER schéma databáze
Možným vylepšením by bylo vytvoření další tabulky s názvem adresa, která by uchovávala společné položky pro tabulky firemni_udaje a zakaznik. Tento krok se jeví výhodně i z toho důvodu, že by to umožnilo definovat firmě více adres (například adresy poboček). Přineslo by to však smyčku do schématu, což je nežádoucí. Více adres není vyžadováno, proto jsem to takto ponechal.
13
3 Analýza a návrh řešení
3.7 Návrh grafického rozhraní Návrh grafického rozhraní si kladl za cíl, aby bylo ovládání aplikace co nejvíce přehledné i intuitivní. Primárním ovládacím prvkem je tlačítko.
Jednotlivá tlačítka jsou
zobrazena v levé části aplikace a obsahují stručné popisky a také ikonky, které blíže specifikují či dokreslují význam konkrétního tlačítka. Tlačítka jsou v menu uspořádána do logických skupin, které sdružují operace nad danou sekcí. V aplikaci se vyskytují i tlačítka bez popisku. Takové tlačítko obsahuje pouze ikonku a jeho význam je blíže specifikován v nápovědě zobrazené pod ovládacím menu. Jedná se především o tlačítka typu editace, tisk či mazání záznamu, která jsou vždy umístěna u zobrazených záznamů. Všechna tlačítka jsou uložena ve formátu PNG. Pro orientaci, v jaké části aplikace se uživatel či administrátor nachází, slouží informační obdélník oranžové barvy vpravo nahoře pod hlavním logem. Vždy zobrazuje informaci o aktivní sekci či prováděné operaci. Pro vytvoření grafických prvků byl použit grafický editor GIMP verze 2.4.7. [8]
3.7.1 •
Popis tlačítek menu Nová nabídka
Tlačítko Nová slouží pro vytvoření nové cenové nabídky. Je umístěno v sekci nabídky a nemá jiný význam.
•
Zobrazit
Tlačítko Zobrazit vypíše obsah typický pro danou sekci. Může být umístěno do více sekcí.
•
Údaje
Tlačítko Údaje se nachází v sekci firma a zobrazuje formulář určený k editaci firemních údajů.
14
3 Analýza a návrh řešení •
Ceny
Tlačítko Ceny odkazuje na stránku určenou k zobrazení a editaci cen.
•
Přidat uživatele
Tlačítko Přidat uživatele slouží k zobrazení formuláře na vytvoření nového uživatele. Stejné tlačítko s obdobným popiskem se může vyskytnout i v jiných sekcích.
•
Odhlásit
Tlačítko provede odhlášení z aplikace.
3.7.2
Tlačítka bez popisku
Následující tlačítka jsou z řady tlačítek bez popisku. Jejich význam je dán vlastní ikonkou a také vysvětlivkami v nápovědě zobrazené pod menu. Další stručná nápověda se zobrazí při najetí myši nad plochu ikonky (text nápovědy je uložen v atributu title daného tlačítka). smazat editovat tisknout
3.7.3
Formulářová tlačítka
V aplikaci se vyskytují i standardní tlačítka, která jsou součástí formuláře. Jejich popisek vždy přesně vystihuje akci, kterou vykonávají. Neobsahují žádné grafické prvky.
15
4 Implementace a realizace
4
Implementace a realizace
4.1 Architektura MVC [9] V aplikaci je používána struktura aplikace typu MVC (Model View Controller). Zend framework je na tomto návrhovém vzoru založen. Spočívá v oddělení aplikace na tři nezávislé komponenty. Tato architektura by měla kód udržovat více přehledný a organizovatelný. Využívá se zejména v případech, kdy na projektu pracuje více vývojářů.
4.1.1
Model (model) Model je část aplikace pracující s daty či databází. Obsahuje definice jednotlivých tříd
a mimo jiné obsahuje metody pracující s databází. Kód je psán v PHP.
4.1.2
View (pohled) Pohled definuje, jak budou data zobrazena uživateli. Data poskytuje model. Jde
o reprezentaci dat za pomocí jazyka XHTML a CSS. Za pomocí jazyka PHP jsou do view skriptů vkládány proměnné, které view skript na daném místě zobrazí.
4.1.3
Controller (řadič) Řadič zpracovává jednotlivé požadavky či akce (action) od uživatele a příslušně je
směruje. Každá akce je reprezentována veřejnou metodou v třídě controlleru. Lze nadefinovat více řadičů s různým množstvím akcí. Výsledkem jsou změny v pohledu a modelu. Psán v PHP.
4.2 Vývoj a nasazení 4.2.1
Prostředí pro vývoj Aplikace je vyvíjena na počítači s konfigurací Intel Centrino 1,66 GHZ Dual Core 16
4 Implementace a realizace s 2GB RAM, s operačním systémem Windows XP. Vývoj je prováděn pomocí balíčku XAMPP, který vytváří na localhostu webserver s podporou PHP5, MySQL a phpMyAdmin.
4.2.2
Prostředí pro nasazení Aplikace je nasazena na komerčním serveru s konfigurací počítače 2x Xeon 2.66 GHz
QuadCore s 8 GB RAM s nainstalovaným PHP 5.1 i MySQL.
4.2.3
Použité nástroje Pro vývoj aplikace je použit již zmíněný balíček XAMPP verze 2.5 [10], psaní
aplikace je prováděno v PHP Eclipse verze 1.2.0.20090611-1013 [11]. Šablona pro PDF soubory byla vytvořena v programu OpenOffice Writer 3.0 [12].
4.2.4
Použité technologie Na straně klienta, který k aplikaci přistupuje pomocí webového prohlížeče (Internet
Explorer, Firefox, Opera, Google Chrome, Maxthon a další) je využíváno XHTML, CSS a JavaScript. Na straně serveru je využíváno pro aplikační logiku PHP. Pro uchovávání a práci s daty MySQL.
4.3 Konfigurace serveru 4.3.1
Balíček Zend framework V první fázi je třeba z originálních stránek framework.zend.com stáhnout balíček Zend
frameworku ve formátu ZIP. Použil jsem verzi 1.8.0 (pro tuto verzi frameworku je nutné mít nainstalované PHP ve verzi 5.2.4). Po jeho rozbalení se objeví několik složek, z nichž nejdůležitější je složka library, která obsahuje PHP soubory definující tímto frameworkem poskytované třídy. Tuto složku je potřeba překopírovat do pracovního adresáře projektu. Balíček dále obsahuje složku bin, která obsahuje soubory pro instalaci konzole, pomocí které se Zend framework ovládá. Dalšími složkami jsou demos, external, extras, tests. Též obsahuje obvyklé soubory INSTALL.txt, LICENSE.txt, README.txt.
4.3.2
Úprava souboru .htaccess a mód mod_rewrite Aplikace je stavěná tak, že veškeré požadavky jsou řízeny přes controller a proto je
zapotřebí na serveru aktivovat mod_rewrite, který zajistí přepis adresy do požadovaného formátu. Podmínkou je, že server musí mít nainstalovaný modul, který tento mód podporuje.
17
4 Implementace a realizace Též je třeba zajistit podporu pro soubory .htaccess, kterými lze individuálně upravovat některé nastavení serveru (včetně zapnutí mod_rewrite). Změna provedená v souboru tohoto typu platí pro aktuální adresář a všechny adresáře jemu podřízené. V podřízených adresářích lze pravidlo změnit vytvořením stejného souboru s upravenými pravidly, který přepíše původní pravidla. Pro tuto aplikaci nasazenou na některém z komerčních webhostingů je třeba do kořenového adresáře webu umístit soubor .htaccess s následujícím obsahem [13]: RewriteEngine On RewriteRule ^\.htaccess$ - [F] RewriteCond %{REQUEST_URI} ="" RewriteRule ^.*$ /public/index.php [NC,L] RewriteCond %{REQUEST_URI} !^/public/.*$ RewriteRule ^(.*)$ /public/$1 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^.*$ - [NC,L] RewriteRule ^public/.*$ /public/index.php [NC,L]
Toto nastavení je nutné u těch typů hostingů, kde nelze změnit root adresář (aplikace z bezpečnostních důvodů vyžaduje mít jako root složku public). Výsledkem bude přesměrování všech požadavků na soubor index.php ve složce public, tedy na vstupní bod aplikace.
4.3.3
Adresářová struktura Pro využívání Zend frameworku je doporučeno vytvořit uvedenou adresářovou
strukturu. Tato struktura se též vytváří automaticky po založení nového projektu pomocí konzole:
zf create project nazev. Do složky library je třeba ze stáhnutého
balíčku nakopírovat knihovny, které bude projekt využívat.
Adresářová struktura vypadá následovně [9]: |-- application | |-- Bootstrap.php
18
4 Implementace a realizace | | | | | | | | | | | | | |-|-| `--
|-| |-| | |-`--
configs `-- application.ini controllers |-- ErrorController.php `-- IndexController.php models views |-- helpers `-- scripts |-- error | `-- error.phtml `-- index `-- index.phtml library public `-- index.php tests |-- application | `-- bootstrap.php |-- library | `-- bootstrap.php `-- phpunit.xml
Složka public obsahuje veřejně přístupné soubory a měla by být typu root. Vše ostatní je veřejně nedostupné, což je důležitý bezpečnostní prvek v prostředí internetu. Tohoto opatření lze mimo jiné dosáhnout úpravou souboru .htaccess.
4.3.4
Instalace konzole Zend framework verze 1.8.0 a vyšší se ovládá pomocí konzole. Její instalace se liší dle
použitého systému. Jelikož vývoj provádím v operačním systému Windows, uvedu zde postup právě pro tento systém [14]: 1. Vytvořit složku, kam se konzole „nainstaluje“. Např.: C:\Program Files\ ZendFrameworkCli. 2. Ze staženého balíčku zkopírovat složky bin a library do nově vytvořené složky. 3. Přidat cestu C:\Program Files\ZendFrameworkCli\bin do systémových proměnných - do položky Path. Postup je následující: Start → Nastavení → Ovládací panely → Systém → Upřesnit → Proměnné prostředí → Systémové proměnné. 4. Restart systému. 5. Tím je konzole připravena provádět svoji práci. Otestování funkčnosti lze zadáním příkazu zf
show
version do terminálového okna (Start →
Programy
→ Příslušenství → Příkazový řádek).
4.4 Implementace Analytické třídy sloužily pro přehledné zobrazení rozdělení na logické celky či zobrazení struktury a fungování aplikace. V implementaci je však nutné, vzhledem 19
4 Implementace a realizace k použitému návrhovému vzoru MVC, třídy a jejich metody přizpůsobit pravidlům, jimiž se vzor řídí. Vzhledem k tomu, že data jsou ukládána do databáze, představuje práce s databází významnou součást celé aplikace. Na základě toho vzniklo velké množství tříd orientujících se tímto směrem – každá databázová tabulka má vlastní databázovou třídu, která definuje operace nad konkrétní tabulkou. Každá třída definuje své specifické metody pro práci s tabulkou.
4.4.1
Inicializace Vstupním bodem aplikace je soubor index.php ve složce public, na který jsou
směrovány všechny požadavky. Proto jsou v tomto souboru prováděny inicializační kroky pro celou aplikaci. Dochází zde k nastavení cest k jádru aplikace, ke knihovnám a k application.ini souboru. V ini souboru se nastavuje zobrazování chyb, údaje pro spojení s databází, cesta k layoutu („šabloně“ aplikace), dále timezona a další. Na konci souboru index.php je volán bootstrap.php, kde metoda _initAutoload() zajišťuje automatické nahrání třídy při jejím prvním použití v aplikaci (při použití operátoru new). Metoda _initViewHelpers() nastaví doctype, XHTML hlavičky, jazyk a titulek pro celou
aplikaci. Atributy nastavené pomocí metody _initViewHelpers() se vykreslují v layoutu (soubor layout.phtml). Mimo jiné je v layoutu nastavena cesta k CSS souboru, který složí pro správné zobrazování aplikace v prohlížeči. Úkolem layoutu je zobrazit prvky společné pro všechny stránky. Tzn. hlavní logo a menu. Variabilní obsah se v layoutu volá pomocí $this>layout()->content;
4.4.2
Zpracování akcí Akce uživatelů či administrátora jsou řízeny přes controller. Každý controller je třída
umístěná v samostatném souboru. Soubor má příponu php a je pojmenován stejně jako třída. Definoval jsem tři třídy controllerů, které se starají o jednotlivé, jim příslušející akce. Každá akce je reprezentována metodou v dané třídě. Jsou to třídy: AuthController, 20
4 Implementace a realizace AdminController
a
IndexController.
Defaultně
je
také
definována
třída
ErrorController. Jaký controller se zavolá a jaká akce se bude provádět, se extrahuje
z URL adresy. Za bázovou částí adresy se uvede controller, potom akce. Např. adresa: aplikace.mbplast.cz/auth/login má za následek nasměrování na AuthController
a zavolání metody loginAction(). Pokud je třeba, mohou se za akcí vyskytovat i parametry
předávané
v
adrese.
Musí
aplikace.mbplast.cz/auth/login/id/2
být
odděleny
vyjadřuje
připojení
lomítky.
Např.:
parametru
id
s hodnotou 2.
4.5 Popis tříd Aplikace obsahuje velké množství tříd. Teoreticky je lze rozdělit na hlavní a pomocné. Pomocné třídy jsou především třídy formulářové a databázové. Za hlavní třídy lze považovat třídy controllerů a modelu (Nabídka a Tisk). Zde uvádím popis hlavních tříd a jejich metod. Úplný seznam tříd s výpisem jejich metod je uveden v příloze A. Nutno říci, že Zend framework vyžaduje přesný formát názvů tříd a jejich metod. Metody musí vždy začínat malým písmenem a třídy zase musí mít předem definovanou předponu. Jedná-li se například o formulářovou třídu nabídky, pak je její název Form_NabidkaForm a je uložena v souboru NabidkaForm.php. To je důležité právě pro
automatické nahrávání tříd a volání jednotlivých metod v controlleru.
4.5.1
Třídy Controllerů
AuthController Třída udržující informace o přihlášeném uživateli či administrátorovi. Obsluhuje požadavky týkající se přihlášení a odhlášení z aplikace. Po načtení dat z databáze a rozlišení, zda se jedná o uživatele či administrátora, udržuje data v session. Po úspěšném přihlášení 21
4 Implementace a realizace dojde k přesměrování na IndexController.php. •
init - provede inicializaci pohledu.
•
indexAction - pouze přesměruje na IndexController.php.
•
loginAction - používá přihlašovací formulář. Po odeslání formuláře ověřuje správnost údajů v databázi. Ukládá uživatele do session.
•
logoutAction - zruší session a přesměruje na login.
AdminController Možnosti této třídy využívá pouze administrátor. Uživatel k metodám ani k této třídě nemá přístup. Obstarává požadavky související s editací firemních údajů a cen. Také směruje požadavky na zobrazení, přidávání, mazání a editaci uživatelů. •
init – zjistí identitu přihlášeného uživatele.
•
preDispatch
–
není-li
uživatel
typu
administrátor,
přesměruje
ho
na
IndexController.php. Výsledkem je nepovolení vstupu. •
adduzivatelAction – přijme-li validní data z formuláře, zavolá privátní metodu zapisUzivatele. Jinak vyzve k opravení údajů.
•
edituzivatelAction – do formuláře zobrazí data určená k editaci . Poté je postup podobný předchozí metodě.
•
deleteuzivatelAction – provádí mazání uživatele na základě jeho id. Nedovolí smazat vlastní účet.
•
showuzivatelAction – zobrazí seznam všech uživatelů.
•
zapisUzivatele – privátní metoda, která dle požadavku přidává nebo aktualizuje uživatele v databázi voláním metod databázové třídy.
•
udajeAction – zobrazuje formulář s firemními údaji a provádí aktualizaci.
•
showSluzbyAction – provede zobrazení služeb. Služby jsou fixně definovány.
•
editsluzbaAction – zobrazí formulář pro změnu ceny vybrané služby a provede zpracování z něj zaslaných údajů.
IndexController IndexController je třída dostupná oběma typům uživatelů. Zabývá se tvorbou,
editací a tiskem nabídek. Vyjímku v přístupu k metodám tvoří pouze mazání nabídek, které je umožněno pouze administrátorovi. •
init - zjistí identitu přihlášeného uživatele. 22
4 Implementace a realizace •
preDispatch – není-li uživatel přihlášen, přesměruje ho na login.
•
indexAction – zobrazí seznam nabídek.
•
newnabidkaAction – zobrazí formulář pro vytvoření nabídky. Po obdržení validních údajů volá privátní metodu zapisNabidku.
•
editnabidkaAction – má podobné chování jako předchozí metoda s tím rozdílem, že data aktualizuje a také předvyplňuje do formuláře data z databáze.
•
deletenabidkaAction – maže nabídku voláním metody třídy Model_Nabidky.
•
shownabidkyAction – zobrazí všechny nabídky. V případě zaregistrování požadavku na tisk zobrazí PDF soubor do nového okna.
•
vypisVse – pomocná privátní metoda pro zobrazení nabídek.
•
zapisNabidku – pomocná privátní metoda pro ukládání či aktualizování nabídek.
•
tiskAction – metoda zajišťující zobrazení konkrétního PDF souboru k tisku.
4.5.2
Třídy Modelu
Nabidky Třída Model_Nabidky má na starosti seskupit metody zabývající se akcemi prováděnými nad nabídkami. Obsahuje následující metody: •
__construct – v konstruktoru se uloží data předaná v parametru do privátních
23
4 Implementace a realizace proměnných a vytvoří se instance používaných tříd. •
zjistiIdProfilu – pomocná privátní wrapper metoda pro zjištění id profilu.
•
zjistiIdSluzby – pomocná privátní wrapper metoda pro zjištění id služby.
•
zapisZakaznik – privátní metoda pro uložení nebo aktualizaci zákazníka. Formulářová data předává databázové třídě. Podobně se chovají následující 3 metody.
•
zapisOkno – privátní metoda pro uložení nebo aktualizaci okna (dveří).
•
zapisVrata – privátní metoda pro uložení nebo aktualizaci vrat.
•
zapisSluzby – privátní metoda pro uložení nebo aktualizaci služeb.
•
ulozitNabidku – metoda zabezpečující uložení celé nabídky mimo jiné voláním privátních metod.
•
editovatNabidku – oproti předchozí metodě navíc předvyplňuje data do formuláře.
•
smazNabidku – maže konkrétní nabídku na základě parametru id.
Tisk Tato modelová třída seskupuje metody zajišťující vykreslování údajů do PDF. Jejich výčet následuje: •
__construct – konstruktor provádí nahrání šablony pro tisk, nastavení druhu a barvy písma a do privátní proměnné načte objekt nabídky určený k tisku.
•
zjisti_rozmery – privátní metoda ukládající rozměry stránky do třídních proměnných.
•
tiskni_firemni_udaje – vykresluje firemní údaje uložené v databázi do PDF.
•
getDelka – privátní metoda vracející délku slova.
•
tiskni_zakaznika – provádí zobrazení údajů zákazníka v PDF.
•
tiskni_polozky – provádí zobrazení položek v PDF.
•
uloz – ukládá PDF.
•
tiskni_nabidku – veřejná metoda zastřešující celý proces vykreslování údajů do PDF. Volá příslušné privátní metody.
4.5.3
Databázové třídy Databázové třídy jsou třídy, které obsahují metody pro práci s databází. Jsou
podmnožinou tříd modelu. Jejich význam spočívá ve volání jejich metod místo psaní SQL dotazu přímo do kódu v controllerech. Jejich metody tvoří jakýsi obal SQL dotazů. Hlavními představiteli
jsou
třídy
Model_DbTable_Zakaznik,
Model_DbTable_Polozka a Model_DbTable_Udaje.
24
Model_DbTable_Nabidka,
4 Implementace a realizace
4.5.4
Formulářové třídy Formulářové třídy slouží výhradně ke tvorbě formuláře. V každé takové formulářové
třídě je vytváření formuláře prováděno v metodě init(). U složitějších formulářů, jako je například formulář nabídky, jsou součástí další pomocné privátní metody. Každý formulář má svoji vlastní formulářovou třídu.
4.6 View scripty View scripty spadají do poslední, třetí, vrstvy MVC architektury. Mají za úkol zobrazení informace uživateli. Obsahem je převážně HTML, resp. XHTML, kód. Ke každému controlleru je přidružen view script. Nutné je opět dodržení správného tvaru názvu daného scriptu. Tím je zajištěno správné volání příslušného scriptu při vykonávání určité metody v controlleru. Např. k metodě tiskAction() je přidružen script uložen v souboru tisk.phtml. Po vytvoření nebo editaci nabídky je zobrazena uživateli výzva k tisku. V případě pozitivní volby se view script snaží PDF soubor zobrazit pomocí JavaScriptu do nového okna. Většina prohlížečů tuto akci blokuje, proto je třeba ji povolit!
4.7 Diagram nasazení
25
4 Implementace a realizace
Obrázek 5: Diagram nasazení
26
5 Testování
5
Testování Testování je důležitá součást vývoje aplikací, proto by se mu měla věnovat patřičná
pozornost. Dílčí testování probíhá při samotném vývoji, kdy programátor testuje jím právě napsaný kód. Toto je u aplikací v PHP velmi významné, neboť ve většině bezplatných vývojových prostředích pro PHP nelze najít debugger. To je dáno charakterem jazyka. Proto nejjednodušší formou testování je spustit skript na serveru se zapnutým hlášením chyb.
5.1 Test splnění požadavků Testem splnění požadavků se rozumí porovnání funkcionality výsledné aplikace s požadavky na ni kladenými. Obyčejným používáním aplikace lze dojít k závěru, že tento test dopadl úspěšně.
5.2 Uživatelské testování Uživatelský test jde o trochu dále. Aplikaci jsem zpřístupnil úzkému okruhu zainteresovaných uživatelů, kteří aplikaci používali a následně reportovali svoje zkušenosti či připomínky. Takový test může odhalit chyby související s chybným zpracováním zadaných dat či také závažné chyby běhu aplikace. Výsledkem tohoto testu bylo odhalení chyb ve zpracování vstupních dat. Vyskytl se i problém s „přetečením“ textu ve vytvořeném PDF. Tento problém byl vyřešen omezením délky zadávaných dat do formulářových políček. Pro běžné situace, ve kterých se bude aplikace používat, je toto řešení vyhovující. Avšak pro výjimečné testovací situace (např. při zadání řetězce „OOO...OO“ v maximální dovolené délce) je stále nedostatečné. V některých situacích byl zaznamenán pomalejší běh scriptu, což je ovlivněno mimo jiné hardwarovými prostředky serveru a počtem aktuálně připojených uživatelů. Zrychlení lze docílit použitím nástrojů Zend Optimizer a Zend Accelerator na straně serveru [1].
27
5 Testování
5.3 Automatizované testování Uživatelské testování často není schopno pojmout všechny události, které mohou nastat a tím odhalit případné skryté chyby. V událostmi řízených aplikacích mohou vznikat nevyžádané události či závislosti. Proto je vhodné je otestovat nástroji, které se na tuto problematiku zaměřují. Pro testování jsem použil nástroj Selenium IDE [15], který je určený pro test webových aplikací (je implementováno jako doplněk do internetového prohlížeče Firefox).
5.3.1
Selenium IDE Test je prováděn tak, že v prvním kroku se nahrají akce uživatele a zaznamenají se
výstupy. V druhém kroku jsou zaznamenané akce vykonávány automaticky a porovnávají se výstupy. Jde o test typu black-box, kde testovací nástroj nic neví o zdrojovém kódu aplikace. Byly proveden test na tyto akce: přihlášení administrátora, editace cen, editace údajů, zobrazení uživatelů, přidání uživatele, editace uživatele, smazání uživatele, vytvoření nabídky, editace nabídky a smazání nabídky. Test proběhl úspěšně.
28
6 Závěr
6
Závěr Úkolem bylo napsat grafickou aplikaci pro tvorbu cenových nabídek na plastová okna,
dveře a garážová vrata. Domnívám se, že se zadání podařilo splnit. Nicméně je plánováno další rozvíjení a vylepšování. Zákazník často nemá při zadávání práce představu jak přesně by měla aplikace vypadat a jak by měla jednotlivé úkony provádět. Až když dostane na vyzkoušení první verze programu, začíná reportovat, co a jak by mělo být jinak. Tato zpětná vazba je důležitá pro vývoj aplikace správným směrem (čili dle představ zákazníka). Právě na základě takových zpětných reakcí bude aplikace dále rozvíjena a rozšiřována. Mně osobně práce přinesla základní zkušenosti s vývojem webových aplikací. Do této chvíle jsem v PHP psal pouze webové stránky. Proto jsem nastudoval literaturu [17] [18] pojednávající o technice OOP v PHP, která je v této aplikaci velmi používanou. Zcela nové pro mě bylo použití frameworku. Zvolený, silně objektově orientovaný, framework Zend byl v počátcích zdrojem mnoha potíží. Velkým pomocníkem v těchto chvílích byl tutoriál [14], pomocí kterého bylo možno vytvořit základní jednoduchou aplikaci (stránku) spolupracující s jednou databázovou tabulkou. Dalším zdrojem informací bylo české fórum [16] pojednávající o Zend frameworku a problémy s ním spojenými. Po osvojení používání frameworku dostává vývojář do rukou zcela jistě silný nástroj oproti čistému PHP, který za něj řeší některé nutné kroky, které je nucen dělat opakovaně v různých aplikacích. Tím je např. validace formuláře, kterou framework poměrně významně ulehčuje. Nyní bych při psaní další aplikace znovu zvažoval jaký framework použít. Pravděpodobně bych zvolil (zkusil) framework Nette, který se rychle vyvíjí, rozšiřuje a stále více se rozrůstá česká komunita vývojářů, kteří tento framework používají. To může být přínosem při řešení atypických úkolů. Za velké plus považuji jeho podaní v českém jazyce.
29
7 Literatura
7
Literatura
[1]
Zend Framework [online]. c2006-2009 [cit. 2009-06-24]. Dostupný z WWW:
[2]
CakePHP: the rapid development php framework [online]. c2009 [cit. 2009-06-24]. Dostupný z WWW:
[3]
Nette Framework [online]. c2008-2009 [cit. 2009-06-24]. Dostupný z WWW:
[4]
Wikipedia, the free encyclopedia [online]. c2001-2009 [cit. 2009-06-24]. Dostupný z WWW:
[5]
STOUPA, Václav. Přehled a vývoj PHP frameworků [online]. 28.3.2008 [cit. 2009-06-24]. Dostupný z WWW:
[6]
Microsoft Office Visio 2007 [online] c.2009 [cit. 2009-07-01]. Dostupný z WWW:
[7]
ER modelář – Konceptuální datový modelář [online] c2009 [cit. 2009-07-01]. Dostupný z WWW:
[8]
GIMP – The GNU Image Manipulation Program [online] c2001-2009 [cit. 2009-07-01]. Dostupný z WWW:
[9]
Zend Framework Quick Start [online]. c2006-2009 [cit. 2009-06-24]. Dostupný z WWW:
[10] Apache friends – xampp [online] c.2002-2009 [cit. 2009-07-01]. Dostupný z WWW:
30
7 Literatura [15] Selenium IDE [online] c2008 [cit. 2009-07-08]. Dostupný z WWW:
31
A Seznam implementačních tříd
A Seznam implementačních tříd •
Třídy Controllerů
Název třídy
Seznam metod (bez parametrů)
AdminController extends Zend_Controller_Action
private zapisUzivatele() public init() public preDispatch() public indexAction() public addAction() editAction() deleteAction() showAction() udajeAction() showsluzbyAction() editsluzbaAction()
AuthController extends Zend_Controller_Action
public public public public
IndexController extends Zend_Controller_Action
private zapisNabidku() private vypisVse() public init() public preDispatch() public indexAction() public newnabidkaActoin() public editnabidkaAction() public shownabidkyAction() public deletenabidkaAction() public tiskAction()
ErrorController extends Zend_Controller_Action
public errorAction()
init() indexAction() loginAction() logoutAction()
Tabulka 2: Třídy Controllerů
32
A Seznam implementačních tříd •
třídy Modelů
Název třídy
Seznam metod (bez parametrů)
Model_DbTable_Udaje extends Zend_Db_Table
public getUdaje() public addUdaje() public updateudaje()
Model_DbTable_Users extends Zend_Db_Table
public public public public public
getUser() addUser() updateUser() smazUser() showAllUser()
Model_DbTable_Zakaznik extends Zend_Db_Table
public public public public public
getZakaznik() zjistiZakaznika() addZakaznik() updateZakaznik() deleteZakaznik()
Model_DbTable_Nabidka extends Zend_Db_Table
public public public public public public public
getNabidka() zjistiNabidkuWhere() addNabidka() updateNabidka() deleteNabidka() zjistiCisloNabidky() getAll()
Model_DbTable_Polozka extends Zend_Db_Table
public getPolozka() public getPolozkaWhere() public getPolozkaWhereIdentifikace() public addPolozka() public updatePolozka() public deletePolozka() public deletePolozkaWhere()
Model_DbTable_Okno extends Zend_Db_Table
public public public public public public
getOkno() getOknoWhere() addOkno() updateOkno() deleteOkno() deleteOknoWhere()
Model_DbTable_Vrata extends Zend_Db_Table
public public public public
getVrata() addVrata() deleteVrata() deleteVrataWhere()
Model_DbTable_Sluzby extends Zend_Db_Table
public public public public public public
getSluzba() zjistiSluzbu() zjistiCenuSluzby() addSluzba() updateSluzba() smazSluzbu((
33
A Seznam implementačních tříd Model_DbTable_PoskytnutiSluzeb extends Zend_Db_Table
public getPoskytnutiSluzeb() public getPoskytnutiSluzebWhereNabidka() public addPoskytnutiSluzeb() public deletePoskytnutiSluzeb() public deletePoskytnutiSluzebWhere()
Model_DbTable_Profil extends Zend_Db_Table
public public public public
Model_Nabidky
public __construct() private zjistiIdProfilu() private zjistiIdSluzby() private zjistiIdZakaznika() private ZapisOkno() private ZapisVrata() private ZapisSluzby() public ulozitnabidku() public editovatNabidku() public showAllNabidky() public smazNabidku()
Model_Tisk
public __construct() private getDelka() private zjisti_rozmery() private tiskni_firemni_udaje() private tiskni_zakaznika() private tiskni_polozky() private uloz() public tiskni_nabidku)
getProfil() zjistiProfil() addProfil() smazProfil()
Tabulka 3: Třídy Modelů
34
A Seznam implementačních tříd
•
Třídy Formulářů
Název třídy
Seznam metod (bez parametrů)
Form_LoginForm extends Zend_Form
public __construct() public init()
Form_NabidkaForm extends Zend_Form
public init() public pridatPolozku() public pridatPolozkuVrata()
Form_UzivatelForm extends Zend_Form
public init()
Form_UdajeForm extends Zend_Form
public init()
Form_ProfilForm extends Zend_Form
public init()
Form_SluzbyForm extends Zend_Form
public init() Tabulka 4: Třídy formulářů
35
B Seznam zkratek
B Seznam zkratek CD
Compact Disk – kompaktní disk. Jedná se o nosič dat.
CSS
Cascading Style Sheets – tabulky kaskádových stylů. Popisují zobrazení HTML (XHTML) elementů na webové stránce.
ER
Entity Relationship
GHz
Giga Hertz – jednotka frekvence
HTML
HyperText Markup Language, je značkovací jazyk pro hypertext.
MVC
Model-View-Controller. Je to jeden z návrhových vzorů.
MySQL
My Structured Query Language - systém pro řízení či dotazování v relačních databázích.
OOP
Objektově orientované programování.
OS
Operační systém
PDF
Portable Document Format – souborový formát pro dokumenty.
PHP
Hypertext Preprocessor, původně Personal Home Page, je jazyk pro tvorbu dynamických webových aplikací. Je vykonáván na straně serveru.
PNG
Portable Network Graphics – grafický formát. Používá bezeztrátovou kompresi.
RAM
Random-Access Memory - paměť s libovolným (náhodným) přístupem.
URL
Uniform Resource Locator – řetězec znaků (adresa) vyjadřující umístění zdroje informací na internetu.
XHTML
eXtensible HyperText Markup Language – rozšíření HTML
ZIP
Souborový formát pro kompresi a archivaci dat.
36
C Obsah přiloženého CD
C Obsah přiloženého CD Složka
Popis
aplikace
Zdrojové soubory aplikace. Složka obsahuje rozšířenou adresářovou strukturu uvedené v odstavci 4.3.3.
text
Text bakalářské práce ve zdrojovém (OpenOffice) a PDF souboru.
databáze
SQL skripty pro vytvoření a naplnění MySQL databáze.
diagramy
Diagramy ve zdrojových formátech a jako obrázky.
testy
Zdrojové soubory uložených akcí pro testovací nástroj Selenium.
37