VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor Aplikovaná informatika
Logistika internetového obchodu bakalářská práce
Autor: Michal Kozderka Vedoucí práce: Ing. Pavel Matějka Jihlava 2013
Anotace Bakalářská práce se zabývá přepracováním logistiky stávajícího eshopového řešení z verze pro Joomla! 1.5 na verzi 2.5. Přepracováno bude grafické uživatelské rozhraní, znova naprogramována logika práce s objednávkami. Bude přidáno napojení na přepravní společnosti přes SOAP, pomocí kterého se budou importovat zásilky a objednávky svozu do informačního systému přepravců, a zjišťovat stav zásilek.
Klíčová slova PHP, Joomla!, HTML, SOAP, internetový obchod, logistika
Abstract This bachelor thesis deals with redesigning the logistics of the e-shop arrangement from version Joomla! 1.5 to Joomla! 2.5. The graphic user interface will be redesigned and the logic of work with orders will be reprogrammed. There will be added the connection to transportation companies over the SOAP by which it will be allowed to import orders and order deliveries of transporting into an information system of transportation companies, and check the order status.
Key words PHP, Joomla!, HTML, SOAP, e-shop, logistics
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutí licence. V Jihlavě dne
............................................... Podpis
Poděkování Na tomto místě bych rád poděkoval svému vedoucímu práce Ing. Pavlu Matějkovi, za poskytnutí tématu a možnost vytvářet ho pod jeho vedením. Dále bych chtěl poděkovat Janu Prokešovi za další možnosti konzultace k bakalářské práci.
Obsah 1
Úvod.......................................................................................................................... 8
2
Popis řešeného problému .......................................................................................... 9 2.1
2.1.1
Výpis objednávek ....................................................................................... 9
2.1.2
Detail objednávky ....................................................................................... 9
2.1.3
Statistiky ................................................................................................... 10
2.1.4
Expedice.................................................................................................... 10
2.2
3
4
Práce s objednávkami ......................................................................................... 9
Napojení na přepravní společnosti ................................................................... 10
2.2.1
PPL............................................................................................................ 10
2.2.2
Česká pošta ............................................................................................... 11
Popis struktury ........................................................................................................ 12 3.1
Práce s objednávkami ....................................................................................... 12
3.2
Napojení na přepravní společnosti ................................................................... 12
Analýza a návrh implementace ............................................................................... 13 4.1
Vývojové prostředí ........................................................................................... 13
4.1.1 4.2
Netbeans IDE ............................................................................................ 13
Použité technologie .......................................................................................... 13
4.2.1
PHP ........................................................................................................... 13
4.2.2
MySql........................................................................................................ 13
4.2.3
JavaScript .................................................................................................. 14
4.2.3.1
jQuery ................................................................................................ 14
4.2.3.2
Mootools ............................................................................................ 14
4.2.3.3
Google Visualization API.................................................................. 14
4.2.4
HTML ....................................................................................................... 14
4.2.5
CSS ........................................................................................................... 14
4.2.6
Joomla!...................................................................................................... 15
4.2.7
RedShop .................................................................................................... 15
4.2.8
SOAP ........................................................................................................ 15
4.3
Diagram případů užití ...................................................................................... 16
4.4
Databázová struktura ........................................................................................ 16
4.5
Uživatelské rozhraní......................................................................................... 17
4.5.1
Výpis objednávek ..................................................................................... 17
4.5.2
Detail objednávky ..................................................................................... 18
4.5.3
Tisk předávacích protokolů a objednání svozů......................................... 19
4.5.4
Statistiky ................................................................................................... 19
4.6
4.6.1
MVC ......................................................................................................... 20
4.6.2
Adresářová struktura ................................................................................. 21
4.7 5
Komponenta ..................................................................................................... 20
Plugin ............................................................................................................... 22
Popis implementace ................................................................................................ 23 5.1
Statistiky........................................................................................................... 23
5.1.1 5.2
Výpis objednávek ............................................................................................. 25
5.2.1 5.3
Vykreslení grafu ....................................................................................... 23 Základní a detailní zobrazení .................................................................... 25
Detail objednávky ............................................................................................ 25
5.3.1
Vložení speciální slevy ............................................................................. 25
5.3.2
Editace položky objednávky ..................................................................... 27
5.4
Plugin pro napojení PPL .................................................................................. 28
5.4.1
Získání informací o zásilce ....................................................................... 30
5.4.2
Import zásilek ........................................................................................... 30
5.4.3
Import objednání svozu ............................................................................ 31
6
Testování ................................................................................................................. 33
7
Srovnání s existujícím řešením ............................................................................... 34
8
7.1
VirtueMart ........................................................................................................ 34
7.2
HikaShop .......................................................................................................... 34
7.3
MijoShop .......................................................................................................... 34
Závěr ....................................................................................................................... 36
Seznam použité literatury ............................................................................................... 38 Seznam obrázků .............................................................................................................. 39 Seznam tabulek ............................................................................................................... 40 Seznam použitých zkratek .............................................................................................. 41 Přílohy............................................................................................................................. 42 1
Obsah přiloženého CD ............................................................................................ 42
1 Úvod Během své letní praxe ve firmě Komtesa jsem se podílel na vývoji internetového obchodu. V souvislosti s touto praxí mi bylo firmou nabídnuto několik témat bakalářské práce. Vybral jsem si téma Logistika internetového obchodu. Toto téma mi bylo nejblíže, protože se zabývám vývojem webových aplikací. Na tomto tématu se mohu naučit vývoj aplikací pro redakční systém Joomla!, její správu a napojení aplikace na webové služby třetích stran. Bakalářská práce se bude zabývat refaktorizací stávajícího řešení logistiky internetového obchodu, které je založeno na staré verzi redakčního systému Joomla! a jejím převedením na novou verzi. Refaktorizace bude spočívat v nakódování nového grafického uživatelského rozhraní pro práci s objednávkami, úpravě databázových tabulek a přeprogramování stávající logiky. Implementace bude zahrnovat napojení internetového obchodu na přepravní společnosti, pokud to daná společnost umožňuje. Důraz návrhu bude kladen na správném použití návrhové vzoru MVC, ten umožňuje oddělení aplikační vrstvy od prezentační vrstvy, čistotu kódu a přívětivé uživatelské prostředí. Dále bude důraz kladen na využívání tříd a jejich metod frameworku Joomla Platform, u kterých není příznak deprecated, abychom předešli potížím při aktualizaci na novou verzi. Implementace bude vedena tak, aby v budoucnu bylo snadné refaktorizovat i zbylé funkčnosti internetového obchodu ze staré verze na novou a zároveň, aby nebyla ztracena stávající funkčnost. Joomla! je postavena na webových technologiích PHP, JavaScript, HTML a CSS, proto i pro vývoj budou použity tyto technologie. Jako databáze je zvolena MySql.
8
2 Popis řešeného problému Internetový obchod obsahuje v administraci část, která zpracovává objednávky vložené zákazníkem. Poté co je objednávka vložena zákazníkem do systému, musí mít administrátor internetového obchodu možnost zobrazit si zadané objednávky, a dále je zpracovávat.
2.1 Práce s objednávkami 2.1.1 Výpis objednávek Vypsány jsou pouze objednávky, které odpovídají nastavení aktuálnímu filtru. Výpis umožňuje nastavení počtu objednávek na stránku a průchod mezi jednotlivými stránkami. Výpis lze zobrazit v základním nebo detailním provedení. Základní provedení obsahuje pouze nejdůležitější údaje a možnosti objednávky (číslo objednávky, datum vytvoření, změnu stavů objednávky, celkovou cenu a práci s logistikou). Rozšířený výpis přidává další podrobnější údaje o objednávce a možnosti další práce s ní (fakturační údaje, výpis produktů a poznámky k dané objednávce). Filtrovat lze dle klíčového slova, data, stavu, platby, typu, pobočky a výrobce zboží. Klíčové slovo se vyhledává ve jménu, adrese, čísle nebo id objednávky. Filtrování podle data vyhledává objednávky, které byly vytvořeny v zadaném rozmezí. Pokud je u data vybrán i stav, vyhledávání bude probíhat i v historii práce s objednávkami. Zbylé filtrace jsou nastavovány výběrem z roletky.
2.1.2 Detail objednávky Detail objednávky obsahuje podrobný výpis o objednávce. Informace můžeme rozdělit do několika částí. Část pro podrobné informace o objednávce obsahuje id objednávky, číslo objednávky, číslo balíku, umožňuje změnit stav objednávky a poznámku zákazníka k objednávce, dále obsahuje informace o způsobu platby a dopravy. Další část obsahuje poznámky k dané objednávce a možnost vložit nové nebo je odebrat. Část pro fakturační údaje vypisuje informace pro fakturaci objednávky, tyto údaje lze editovat. Část pro doručovací údaje je stejná jako část pro fakturační údaje. Část souhrnu objednávky vypisuje to, z jakých položek je objednávka složena a jejich jednotlivé ceny. Tato část umožňuje editovat jednotlivé položky, upravovat cenu, 9
upravovat počet a odebírat položky nebo aplikovat slevu na objednávku. Část pro vložení nového produktu do objednávky umožňuje vyhledat produkt dle jména, nastavit jeho cenu, počet kusů a vložit jej do objednávky. Nakonec detail objednávky obsahuje část pro výpis historie změn stavů objednávky.
2.1.3 Statistiky Statistiky informují administrátora obchodu o celkových obratech, které se na internetovém obchodu uskutečnily. Statistiky obsahují výpis dle aktuálně nastaveného filtru, kde se vypisuje počet objednávek, celkový obrat, průměrná, minimální a maximální cena objednávky. Další výpis je podle stavu objednávky, kde je vypsán počet objednávek v daném stavu a celkový obrat. Stejný jako výpis podle stavu objednávek je i výpis podle stavu platby objednávek. Ve statistikách je zahrnut i graf, který vypisuje celkový obrat za jednotlivé dny podle filtru.
2.1.4 Expedice Expedice je výpis objednávek, které jsou připraveny k expedici podle jednotlivých přepravních společností a poboček. Jednotlivé objednávky lze odebrat z expedice nebo změnit pobočku. Objednávky lze vytisknout na podací archy pro přepravní společnosti, nebo pokud to daný přepravce umožňuje, naimportovat objednávky přímo do systémů přepravních společností a objednat k nim svoz.
2.2 Napojení na přepravní společnosti Napojení je realizováno tak, aby bylo možno kdykoliv přidat dalšího dopravce. Napojení na tyto přepravní společnosti spočívá v možnosti hromadného podání objednávek, objednání svozu a sledování zásilky. Toto napojení bude realizováno pomocí webové služby SOAP (Simple Object Access Protocol). Pro využití těchto funkcí je zapotřebí mít smlouvu s daným přepravcem.
2.2.1 PPL PPL (Professional parcel logistic) umožňuje import objednávek a objednání svozu několika způsoby. Jedním ze způsobu je import pomocí XML (Extensible Markup Language) souboru, kde je podle dané struktury vygenerován obsah se všemi 10
objednávkami určenými k expedici. Druhý přístup, který je použit i v bakalářské práci, je pomocí SOAP, kde pomocí PHP knihovny je vygenerováno XML a odesláno do informačního systému. Pomocí SOAP je také umožněno sledování zásilek a objednání svozu. Nakonec je možné zásilky vkládat ručně přímo v informačním systému PPL. Tento informační systém dále umožňuje tisk etiket, předávacích protokolů, kontrolu validity údajů, objednávku svozů atd.
2.2.2 Česká pošta Česká pošta umožňuje podat zásilky přímo na pobočce, kam je třeba odnést podací arch a zásilky. Další způsob je podání pomocí webové aplikace Podání online. Tato aplikace umožňuje import objednávek pomocí CSV (Comma-Separated Value) nebo TXT (Text file) souborů. Strukturu těchto souborů je možné si přímo nastavit v této aplikaci. Uživatel má možnost zadat objednávky do systému i ručně. Aplikace umožňuje tisk podacích archů, štítků a potvrzení o převzetí zásilek u odesílatele. [11] Česká pošta není implementována v bakalářské práci z důvodu absence webové služby SOAP.
11
3 Popis struktury Struktura aplikace se dělí na dvě části, které vyplívají ze zadání:
práce s objednávkami
napojení na přepravní společnosti
3.1 Práce s objednávkami Část práce s objednávkami je realizována pomocí komponenty a je dále rozdělena na logickou a prezenční vrstvu. Logická vrstva obsahuje veškeré metody a třídy, které jsou zapotřebí pro práci s daty. Prezenční vrstva zobrazuje data, která jsou zpracována logickou částí, do přehledného výpisu pro uživatele.
3.2 Napojení na přepravní společnosti Napojení na přepravní společnosti obsahuje logiku pro import dat z internetového obchodu do informačního systému přepravních společností. Jediným cílem této části je převzít data, zkontrolovat zdali jsou určena pro tuto konkrétní přepravní společnost a poskládat je do potřebné struktury pro provedení importu. Tato část je realizována pomocí pluginu.
12
4 Analýza a návrh implementace V celkovém návrhu je kladen důraz na používání tříd a metod, které nám ulehčí budoucí update Joomla! na verzi 3.5. Refaktorizace práce s objednávkami spočívá ve znovu naprogramování celkové logiky dle specifikace zadání a odstranění starého kódu, který již bylo těžké nadále udržovat, a ztěžoval další vývoj internetového obchodu. Refaktorizace skladů v rámci objednávek spočívá v odstranění napojení skladů na objednávky, kdy při každém vložení položky do objednávky byl počet položek na skladu snížen, popřípadě při odebrání z objednávky byl počet kusů na skladě navýšen.
4.1 Vývojové prostředí 4.1.1 Netbeans IDE Netbeans IDE (integrated development environment) je vývojové prostředí, které nyní spadá pod firmu Oracle, které umožňuje vyvíjet aplikace. Především je určeno pro vývoj java aplikací, avšak podporuje vývoj i v mnoha dalších programovacích jazycích. Tento nástroj ulehčuje vývoj aplikací, ladění, testování a správu projektu.
4.2 Použité technologie 4.2.1 PHP PHP je rekurzivní zkratka pro PHP: Hypertext preprocesor. PHP je open-source skriptovací jazyk, který především slouží pro programování webových aplikací. Skript je zpracováván na straně serveru a k uživateli je odeslán až výsledek např. vygenerovaná webová stránka. PHP je objektově orientovaný programovací jazyk. Podpora objektově orientovaného programování je od verze 5. [1]
4.2.2 MySql MySql je open-source databázový systém, který slouží pro uchování dat na serveru. Komunikace s databází probíhá pomocí dotazovacího jazyka SQL (Structured Query Language). Hlavní výhody jsou rychlost, přenosnost, spolehlivost a flexibilita. [2]
13
4.2.3 JavaScript JavaScript je interpretovaný objektově orientovaný programovací jazyk. Nejčastěji je použit pro webové aplikace, kde slouží zejména pro obsluhu událostí nebo pro načítání dat pomocí technologie AJAX (Asynchronous JavaScript and XML). [3] 4.2.3.1 jQuery JQuery je JavaScriptový framework, usnadňující vývojáři obsluhovat události, vytvářet animace a další komponenty. Knihovna obsahuje velké množství zásuvných modulů, které si již programátor nemusí sám programovat. Velikou výhodou je snadná modifikace jednotlivých elementů v HTML stránce, a jeho kompatibilita s různými prohlížeči. V Joomla! 3.0 se stal základním JavaScriptovým frameworkem. [4] 4.2.3.2 Mootools Mootools je kompaktní, modulární a objektově orientovaný JavaScriptový framework. Tento framework je základním JavaScriptovým frameworkem v Joomla! 2.5. [5] 4.2.3.3 Google Visualization API Google Visualization API (application programming interface) je javascriptová knihovna, která umožňuje reprezentovat data v podobě různých grafů. [6]
4.2.4 HTML HTML (HyperText Markup Languages) je značkovací jazyk pro prezentaci textu nebo grafiky ve webových prohlížečích. Jazyk udává strukturu dokumentu pomocí množiny tagů a jejich atributů. [7]
4.2.5 CSS CSS (Cascading style sheet) slouží pro definování zobrazení dokumentů ve formátech HTML, XHTML, XML. Jazyk slouží pro oddělení struktury dokumentů od jeho vzhledu. CSS se skládá ze selektorů a bloků dat. Selektor slouží pro výběr prvků ve struktuře dokumentu, blok dat slouží k nadefinování vlastností a jejich hodnot. [8]
14
4.2.6 Joomla! Joomla! je CMS (Content Manage System) založený na technologiích PHP a MySql. Tento systém umožňuje zprávu webového obsahu jako například: přidávání článků, správu uživatelů, přidávání dalších položek do menu a mnoho dalších možností. Do systému lze nahrávat další rozšíření, jako jsou komponenty, moduly, pluginy, jazyky nebo template, které lze nalézt přímo na oficiálních stránkách Joomla!. Komponenty přidávají novou funkčnost do Joomla!. Moduly slouží pro zobrazování dat na webové stránce nejčastěji ve formě malých boxů. Plugin slouží pro obsluhu událostí. Pomocí jazykových souborů lze jednoduše udělat multijazykové stránky. Template slouží pro přidávání nových vzhledů Joomla!. Pro vývojáře webových aplikací poskytuje Joomla! vlastní framework Joomla Platform. Díky obsáhlé dokumentaci lze snadno naprogramovat novou funkčnost a začlenit ji do tohoto systému. [9]
4.2.7 RedShop RedShop je řešení internetového obchodu, které slouží jako rozšíření pro redakční systém Joomla!. Původní řešení je od dánské firmy RedComponent. Firma Komtesa nyní vyvíjí vlastní řešení, které je založeno nad tímto řešením, které nevyhovovalo dnešním trendům v internetovém obchodě.
4.2.8 SOAP SOAP je protokol založený na xml, sloužící pro výměnu informací. Pro přenos zpráv se používá HTTP (HyperText Transfer Protocol) nebo SMTP (Simple Mail Transfer Protocol). SOAP umožňuje komunikaci mezi aplikacemi, které běží na různých operačních systémech a jsou naprogramovány v různých programovacích jazycích. Soapová zpráva obsahuje kořenový element envelope, tento element dále obsahuje elementy header a body. Element header slouží pro pomocné informace (např. autentizační údaje) a je nepovinný. Element body určuje volanou službu a předává jí parametry. [10]
15
4.3 Diagram případů užití uc Primary Use Cases Logistika internetového obchodu
Vypsat expedici «extend»
Tisk
«extend» Editov at obj ednáv ky «extend»
Notifikov at uživ atele
«include» «include» Vypsat statisktiky
«include»
Administrator
«include» Vypsat obj ednáv ky
Vyhledat obj ednáv ky
«include»
Expedov at obj ednáv ky
Obrázek 1: Diagram případů užití
Tento diagram vychází přímo ze zadání bakalářské práce. Administrátor si může nechat vypsat statistiky, objednávky, objednávky k expedici, editovat objednávku, expedovat objednávku a tisknout štítky, podací archy nebo konkrétní objednávku. Při úpravě objednávky lze o změnách notifikovat uživatele.
4.4 Databázová struktura Při refaktorizaci databázové struktury jsou odstraněny již nepotřebné tabulky a stávající jsou upraveny, popřípadě jsou přidány nové tabulky. Úprava stávajících tabulek obsahuje odstranění nepoužívaných sloupců, přejmenování stávajících sloupců, popřípadě tabulek, pokud název neodpovídal stanovené konvenci. Přidány jsou dvě nové tabulky order_types a order_notes. Tabulka order_types je číselník, který určuje typ objednávky, například zdali se jedná o objednávku pořízenou 16
na aukru nebo na tomto internetovém obchodě. Tabulka obsahuje sloupec id (primární klíč) a title (název typu objednávky). Tabulka order_notes slouží k ukládání poznámek k jednotlivým objednávkám a obsahuje sloupce id (primární klíč), note (text poznámky) a created (datum a čas vytvoření poznámky). Napojení těchto dvou tabulek je znázorněno ve zjednodušeném ER diagramu.
Obrázek 2: Zjednodušený ER diagram pro napojení nových tabulek
4.5 Uživatelské rozhraní 4.5.1 Výpis objednávek Návrh vychází z dlouhodobého sledování uživatelů, jakých funkcí a informací nejvíce využívají. V základním zobrazení jsou vidět pouze nejdůležitější funkce a informace o objednávce. V detailním zobrazení jsou zobrazeny další důležité údaje jako fakturační údaje, výpis položek objednávky, a poznámky k objednávce. K lepší orientaci v objednávce je cena a jednotlivé položky, z kterých se cena skládá, podbarveny jinou barvou pozadí. Toto podbarvení rozděluje vizuálně detail objednávky do několika přehledných částí.
17
Obrázek 3: Výpis objednávek
4.5.2 Detail objednávky Tento výpis obsahuje veškeré potřebné informace o objednávce, které jsou rozděleny do několika bloků. Každý blok obsahuje údaje z části, která byla popsána ve specifikaci zadání. Tyto bloky vizuálně oddělují jednotlivé informace a zpřehledňují celkový výpis.
Obrázek 4: Výřez detailu objednávky se zobrazením souhrnu a přidáním nového produktu
18
4.5.3 Tisk předávacích protokolů a objednání svozů Výpis obsahuje tabulku objednávek určených pro expedici rozdělenou dle přepravních společností a poboček.
Obrázek 5: Tisk podacích archů a objednání svozu
4.5.4 Statistiky Statistiky jsou rovněž rozděleny do několika bloků jako předchozí výpisy. Pro lepší prezentaci údajů je použit ve výpisu graf, který umožní administrátorovi lépe posoudit vývoj obratu na internetovém obchodě v určitém rozmezí dat.
Obrázek 6: Statistiky objednávek
19
4.6 Komponenta 4.6.1 MVC
Obrázek 7: Diagram návrhové vzoru MVC [12]
Komponenty
v Joomla!
jsou
realizovány
pomocí
návrhové
vzoru
MVC
(Model-View-Controller). MVC slouží především pro oddělení aplikační vrstvy od prezenční. Controller slouží k obsluze uživatelského vstupu, předání dat do příslušného modelu a určuje, které view má být použito. Model slouží pro zpracování dat a styk s databází. View zajišťuje reprezentaci dat z modelu uživateli. [9] Životní cyklus stránky joomly se skládá z několika kroků. Nejprve je načten soubor index.php, následně jsou načteny soubory s konstantami určujícími cestu k souborům jádra joomly. Poté se načte joomla framework, a vytvoří se nové session pokud již neexistuje. Pak se provede routování url, při kterém dostaneme asociativní pole příkazů obsahující např. název view, komponenty a další informace. Nyní se načte požadovaná komponenta a provede se konkrétní požadavek na komponentu, tak že se vyhledá konkrétní task v controlleru, pokud požadavek neobsahuje task, zavolá se defaultní controller a jeho metoda display(). V následujícím kroku jsou do stránky na určené místo v šabloně vloženy moduly a zprávy. Nakonec je stránka poslána zpět do prohlížeče. [9] 20
Tabulka 1: Seznam tříd pro využití MVC v Joomla!
Třída JController
Popis Základní třída pro joomla controllery, obsahuje pouze základní funkcionalitu.
JControllerAdmin
Používá se pro obsluhu výpisu seznamu.
JControllerForm
Slouží pro obsluhu formulářů.
JModel
Základní třída pro joomla modely, obsahuje pouze základní funkcionalitu.
JModelList
Slouží pro manipulaci se seznamem prvků.
JModelAdmin
Slouží pro manipulaci s formulářem a obsluhu jeho prvků.
JModelForm
Slouží pouze pro předpřipravení formuláře a validaci dat.
JModelItem
Slouží pro načtení jednoho prvku.
JView
Slouží k předání dat z modelu do šablon, a obsahuje metody pro práci se šablonami.
4.6.2 Adresářová struktura Pojmenování komponenty je v následujícím tvaru com_{nazevkomponenty}. Hlavní složka komponenty obsahuje soubory controller.php, který je základním controllerem pro danou komponentu, soubor který je pojmenován stejným názvem jakým je název komponenty {nazevkomponenty}.php, tento soubor je jakým si vstupním bodem do komponenty, access.xml určuje práva co uživatel může dělat a co může vidět, soubor {nazevkomponenty}.xml je instalační soubor komponenty a nakonec config.xml, který obsahuje předpis pro vygenerování formuláře pro nastavení komponenty. Controllers obsahuje subcontrollery, pokud jsou pro danou komponentu vyžadovány. Helpers slouží pro podpůrné metody, které jsou využívány aplikací. Models obsahuje soubory, které spolupracují s databází a mají v sobě aplikační logiku komponenty. Adresář forms obsahuje XML soubory, které nesou předpis pro vygenerování formuláře. Rules obsahuje soubory pro validaci formulářových prvků. Fields obsahuje předpisy pro 21
generování nestandardních formulářových prvků. Tables obsahuje třídy pro práci s jednotlivými databázovými tabulkami. Adresář views obsahuje podsložky, které jsou pojmenovány
podle
konkrétního
view.
Každá
podsložka
obsahuje
soubor
view.html.php, to je základní soubor pro výstup HTML. Pokud by výstup byl v jiném formátu než HTML, je část HTML nahrazena příslušným názvem. Adresář tmpl obsahuje již soubory, které generují příslušnou stránku.
Obrázek 8: Adresářová struktura komponenty
4.7 Plugin Složka pluginu obsahuje pouze dva soubory. Soubor {nazevpluginu}.xml slouží jako instalační soubor pluginu a obsahuje předpis pro generování formuláře pro nastavení pluginu. Soubor {nazevpluginu}.php je soubor se samotnou logikou pluginu. Tento soubor musí dědit od třídy JPlugin a obsahuje metody, které obsluhují příslušné eventy.
22
5 Popis implementace V implementaci jsou popsány pouze některé části aplikace, z důvodu ukázky programování rozšíření pro redakční systém Joomla! a rozsáhlosti aplikace.
5.1 Statistiky Pro získání dat z databáze je založen model, který dědí od třídy RedshopModelOrders. V modelu je zapotřebí přepsat metody populateState(), getStoreId() a getListQuery(). Tyto metody jsou přepsány již v modelu RedshopModelOrders, tento model slouží pro výpis objednávek a dědí od třídy JModelList. Metoda populateState() načte stavy modelu z požadavku a uloží je. GetStoreId() slouží pro vygenerování unikátního klíče pro uložení cache. GetListQuery() slouží pro implementaci dotazu, který slouží pro získání dat z databáze. Tento postup, kdy se přepisují tyto tři metody, slouží pro každý výpis seznamu v Joomla!. V modelu
RedshopModelStatistics
byla
dále
přepsána
metoda
getItems()
a getListQuery(), Metoda getItems() byla přepsána tak, aby vracela pouze objekt místo kolekce objektů. Tento objekt obsahuje počet objednávek, průměrnou, minimální a maximální cenu objednávky a celkový obrat. Metoda getListQuery() využívá metodu předka, který vrací objekt JDatabaseQuery a dále ho použije k získání statistik. Model obsahuje
další
metody
pro
získání
statistik
dle
stavu
objednávky
getStatisticsByStateOrders() a dle stavu platby getStatisticsByStatePayments(). Pro získání dat z modelu a vypsání v šabloně slouží třída RedshopViewStatistics, která dědí od třídy JViewLegacy. Tato třída zavolá příslušné metody modelu a vrácená data předá šabloně. V této třídě se nastavuje panel nástrojů, který slouží pro mazání, editaci atd. Šablona již obsahuje HTML a výpis dat, které byly předány třídou RedshopViewStatistics.
5.1.1 Vykreslení grafu Pro vykreslení grafu je použit javascript. Nejdříve je načteno API pro vykreslení grafu metodou load(). Poté se nastaví pomocí setOnLoadCallback() funkce, v našem případě drawChart(), která je volána po načtení Google API.
23
google.load("visualization", "1", { packages:["corechart"] }); google.setOnLoadCallback(drawChart); Ve funkci drawChart() je nejprve inicializována proměnná ordersData. Poté je vypnuto asynchronní provádění ajaxového požadavku a je poslán dotaz pomocí ajaxu na vrácení dat pro graf. Data jsou ve formátu JSON. Tyto data se rozparsují metodou JSON.parse() a forcyklem jsou předpřipravena pro použití v metodě arrayToDataTable(). Následně je opět
povoleno
provádění
asynchronního
ajaxu.
Poté
je
zavolána
metoda
arrayToDataTable(), kde parametrem jsou předpřipravená data. Metoda vrátí objekt DataTable. Poté je nadefinováno další nastavení grafu jako nadpis a velikost znázorněného bodu. Dále je vytvořena instance třídy AreaChart() s parametrem, který udává místo v HTML stránce, kde se má graf vykreslit. Nakonec je zavolána metoda draw(), která vykreslí požadovaný graf. function drawChart() { var ordersData = new Array(); jQuery.ajaxSetup({async:false}); jQuery.get('index.php?option=com_redshop&task=ordersstatistics.getgraphdat a&tmpl=component', function(data) { var parsedData = JSON.parse(data); ordersData.push(new Array('Datum', 'Obrat')); for( i = 0 ; i < parsedData.length ; i ++){ ordersData.push(new Array(parsedData[i].ordersDate, parseFloat(parsedData[i].ordersSum))); } }); jQuery.ajaxSetup({async:true}); var data = google.visualization.arrayToDataTable(ordersData); var options = { title: 'Obrat dle data', pointSize: 4 }; var chart = new google.visualization.AreaChart(document.getElementById('ordersGraph')); chart.draw(data, options); }
24
5.2 Výpis objednávek 5.2.1 Základní a detailní zobrazení V základním zobrazení jsou načtena data i pro detailní zobrazení. Těmto datům je v HTML stránce přiřazena třída visbleDetail. Po načtení stránky je proveden javascript, který zjistí, o které zobrazení jde. if ( jQuery('.detail').is(':checked') ){ jQuery(".visibleDetail").hide(); }else{ jQuery(".visibleDetail").show() } Přes jQuery selektor je ukázáno na element, kde se nachází informace, o který druh zobrazení jde. Metodou is(‘:checked’) je zjištěno, zdali je zobrazení detailní nebo základní. Podle vyhodnocení podmínky je následně nad elementy s třídou visbleDetail zavolána metoda hide(), která nastaví CSS na display:none a schová všechny elementy s danou třídou, nebo metoda show(), která zobrazí veškeré schované elementy.
5.3 Detail objednávky 5.3.1 Vložení speciální slevy Po vložení speciální slevy v procentech je zavolána metoda updateSpecialDiscount() controlleru RedshopControllerOrder. V této metodě se z požadavku získá sleva a id objednávky. $input = JFactory::getApplication()->input; $specialDiscount = $input->get('specialDiscount', 0); Vytvoří se instance modelu RedshopModelOrder a zavolá se metoda modelu updateSpecialDiscount() s parametrem specialDiscount. $model = $this->getModel('order'); $model->updateSpecialDiscount($specialDiscount) V metodě updateSpecialDiscount() v modelu se nejprve zjistí, jestli výška slevy nepřesahuje 100%.
25
if ($specialDiscount > 100) { JError::raiseNotice(500, JText::_('COM_REDSHOP_SPECIAL_DISCOUNT_ERROR_AMOUNT')); return false; } Poté se vytvoří instance RedshopTableOrder, pomocí její metody load() se načte informace o objednávce. Poté pomocí modelu RedshopOrderItems získáme všechny položky objednávky, které použijeme pro přepočet ceny objednávky. $orderData = $this->getTable('Order', 'RedshopTable'); $orderData->load($this->id); $modelOrderItems = JModelList::getInstance('OrderItems', 'RedshopModel'); $modelOrderItems->setOrderId($this->id); $orderItems = $modelOrderItems->getItems(); Poté metodami getSubtotalPrice(), getSubtotalPriceEsclVat() se dostane výsledná cena všech položek objednávky s DPH a bez DPH. Následně se zjistí metodou applyVatOnSpecialDiscount(), zdali se má sleva aplikovat na cenu s DPH nebo bez DPH. Nakonec se vypočítá velikost slevy v korunách a přepočítá se cena objednávky. $subtotal = $this->getSubtotalPrice($orderItems); $subtotalExclVat = $this->getSubtotalPriceExclVat($orderItems); if ($this->applyVatOnSpecialDiscount()) { $amt = $subtotal; } else { $amt = $subtotalExclVat; } $discountPrice = ($amt * $specialDiscount) / 100; $orderData->special_discount = $discountPrice; $orderTotal = $subtotal + $orderData->shipping_price + $orderData->payment_price - $discountPrice - $orderData->discount; $orderData->total_price = $orderTotal; $orderData->subtotal_price = $subtotal; $orderData->tax = $subtotal - $subtotalExclVat; $orderData->modified = JFactory::getDate()->toSql(); try { $orderData->check(); if (!$orderData->store()) { return false; } 26
} catch (Exception $e) { JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); return false; } return true; Pokud se nevyskytla žádná chyba a je povolena notifikace zákazníka, je zákazníkovi odeslán informační email s podrobným výpisem údajů o objednávce. if ($this->email->hasNotifyUser('notifySpecialDiscount')) { $this->email->sendOrderInfo((int)$id); }
5.3.2 Editace položky objednávky Po
úpravě
položky
objednávky
je
zavolána
metoda
update()
RedshopControllerOrderItem. Metoda z požadavku načte orderId
controlleru (identifikátor
objednávky), orderItemId (identifikátor produktu), price (cenu bez dph) a quantity (počet kusů). $input = JFactory::getApplication()->input; $orderId = $input->getInt('orderId'); $orderItemId = $input->getInt('id'); $price = $input->get('updatePrice'); $quantity = $input->getInt('quantity'); Poté se získá instance modelu RedshopModelOrderItem a RedshopModelOrder. U modelu modelOrder je zavolána metoda setId(), čímž se nastaví identifikátor objednávky, rovněž u modelu modelOrderItem je zavolána metoda setId(), kterou je nastaven identifikátor produktu. $modelOrder = $this->getModel('Order'); $modelOrder->setId($orderId); $modelOrderItem = $this->getModel('OrderItem'); $modelOrderItem->setId($orderItemId); Nyní se zavolá metoda update() s parametry price a quantity. Tato metoda provede update produktu. $modelOrderItem->update($price, $quantity) V metodě update() v modelu je vytvořena instance tabulky RedshopTableOrderItem a pomocí metody load() jsou načteny informace o položce. 27
$orderItemTable = $this->getTable('OrderItem', 'RedshopTable'); $orderItemTable->load($this->id); Poté zkontrolujeme cenu, zda není menší než nula, pokud je tato cena menší, pak je vynásobena -1, aby cena položky objednávky byla validní. Následně je vypočítána výška DPH. $productTax = $orderItemTable->tax_rate * $productPrice; Nakonec v této metodě jsou nové údaje produktu přiřazeny do instance tabulky, zkontroluje se validita dat a uloží se nové údaje do databáze. Pokud by při validaci nebo ukládání došlo k chybě je metodou vráceno false. $orderItemTable->price = $productPrice + $productTax; $orderItemTable->price_excl_vat = $productPrice; $orderItemTable->quantity = $quantity; $orderItemTable->modified = JFactory::getDate()->toSql(); try { $orderItemTable->check(); if ( !$orderItemTable->store() ) { return false; } } catch (Exception $e) { JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); return false; } return true; V controlleru je zkontrolováno, zdali je vráceno tru nebo false. Pokud metoda vrátí true je zavolána metoda getSpecialDiscount(), která vrátí výši speciální slevy v procentech a následně je zavolána metoda pro přepočet speciální ceny updateSpecialDiscount(), tato metoda přepočítá i celou objednávku. $modelOrder->updateSpecialDiscount($modelOrder->getSpecialDiscount()) Nakonec pokud vše dopadlo v pořádku a pokud je povolena notifikace uživatele, je uživatel informován o změně v objednávce.
5.4 Plugin pro napojení PPL Třída plgRedshopExpeditionPpl musí dědit od třídy JPlugin. V konstruktoru této třídy je vytvořena instance soapového klienta a možná chyba se odchytí v try bloku. Proměnná WSDL obsahuje url na WSDL předpis pro soapovou službu PPL. 28
try { $this->soap = new SoapClient($wsdl); } catch (Exception $e) { throw new Exception(JText::_('PLG_REDSHOPEXPEDITION_PPL_SOAP_ERR')); } Jednotlivé metody pro import zásilek, objednání svozu a zjištění stavu zásilky jsou volány pomocí eventů. Tabulka 2: Seznam eventů
Event
Parametry shippingCompany – název přepravní
onGetPackageInfo – získá informace o
společnosti
zásilce labelNumber – číslo zásilky shippingCompany – název přepravní onImportPackagesExt – importuje zásilky
společnosti
do informačního systému ppl orders – objednávky určené pro import onImportOrderCart – importuje
shippingCompany – název přepravní
objednání svozu do informačního systému společnosti ppl
sender – údaje o odesílateli
Nejprve se získá instance JDispatcheru metodou JDispatcher::getInstance(). Poté se načtou veškeré pluginy, které jsou ve složce redshopexpedition. Dále se metodou trigger() vyvolá event onGetPackageInfo s parametrem pole, které má proměnnou carrier, obsahující název přepravní společnosti a labelNumber což je číslo zásilky. Tyto proměnné jsou zároveň předané metodě jako parametry. Tento příklad konkrétně zavolá metodu pro vrácení informací o zásilce. Podobně se budou volat zbývající eventy s příslušnými parametry. $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('redshopexpedition'); $data = $dispatcher->trigger('onGetPackageInfo', array($this->carrier, $labelNumber));
29
Třída plgRedshopExpeditionPpl obsahuje privátní proměnné soap (soapový klient), notDelivCodes (obsahuje pole chybových kódu s důvody nedoručení objednávky), errorCodes (pole s obecnými chybovými kódy), firCode (firemní kód), redshopParams (umožňuje přístup k nastavení komponenty).
5.4.1 Získání informací o zásilce Po zavolání eventu onGetPackageInfo nejprve plugin zjistí, zdali se má provést. To zajistí tak, že porovná jméno přepravní společnosti, pro kterou jsou data určena, se společností pro kterou je určen plugin. Dále zkontroluje, zdali je v proměnné orderNumber číslo objednávky. Poté je zavolána metoda GetPackageInfo() soapového klienta s parametrem pole, pomocí které je zaslán požadavek. Metoda vrací výsledek zaslaný webovou službou obsahující informace o zásilce a její průchod přepravní společností až do převzetí zákazníkem. Tento výsledek dále zpracuje metoda getOrderInfo(). Metoda getOrderInfo() projde výsledný objekt a vrátí pole s uloženými časovými údaji s konkrétními popisky. public function onGetPackageInfo($shippingCompany, $orderNumber) { $result = null; if ($orderNumber != null && $shippingCompany == 'PPL') { $result = $this->soap->GetPackageInfo(array('PackageID' => $orderNumber)); return $this->getOrderInfo($result); } return $result; }
5.4.2 Import zásilek Import zásilek je zavolán eventem onImportPackagesExt. Stejně jako při získání informací o objednávce je i zde kontrola, zdali jsou data určena tomuto pluginu. if ($shippingCompany == 'PPL') Poté je zkontrolováno, zdali je nastaven firemní kód a zda pole objednávek orders není pouze prázdné. Pokud některá z těchto kontrol neprojde je vyhozena výjimka. if ($this->firCode == null) { throw new Exception( JText::_('PLG_REDSHOPEXPEDITION_PPL_FIRCODE_ERROR')); 30
} if (!is_array($orders) || count($orders) <= 0) { throw new Exception( JText::_('PLG_REDSHOPEXPEDITION_PPL_ORDERS_ERROR')); } Následně se zjistí dostupnost webové služby metodou isOnline(). Poté je pro jednotlivé objednávky zavolána metoda getImportOrder(), která vrátí objednávku v požadovaném tvaru pro zpracování soapovým klientem, a následně je objednávka soapOrder odeslána metodou ImportPackageExt(). Po odeslání přijde odpověď od požadované služby a zkontroluje se úspěšnost importu zásilky. Pokud import zásilky nebyl úspěšný, je vyhozena výjimka s kódem chyby a zprávou o jakou chybu jde. $soapOrder = array( 'FirCode' => $this->firCode, 'pack' => $this->getImportOrder($order), ); $result = $this->soap->ImportPackageExt($soapOrder); if ($result->pack->ErrorCode != 0) { if (array_key_exists( $result->pacErrorCodek->ErrorCode, $this->errorCodes)) { throw new Exception($order->number . ': ' . $this->errorCodes[ $result->pack->ErrorCode ], $result->pacErrorCodek->ErrorCode); } else { throw new Exception($order->number . ': ' . $result->pack->ErrorMessage, $result->pacErrorCodek->ErrorCode); }}
5.4.3 Import objednání svozu Import pro objednání svozu obsluhuje event onImportOrderCart. Tato metoda je podobná s metodou pro importování zásilek, proto se zaměřím pouze na odlišnosti implementace této metody od předchozí. Kontrola probíhá pouze na firemní kód, pokud firemní kód není zadán, je vyhozena výjimka s příslušnou hláškou. Pro získání informací o svozu v požadovaném tvaru je zavolána metoda getImportOrderCartData(). $soapOrderCart = array( 'FirCode' => $this->firCode, 'order' => $this->getImportOrderCartData($sender), 'Accept' => $sender->orderCartAccept); 31
Pro import objednání svozu se volá metoda ImportOrderCart() soapového klienta, s parametrem soapOrderCart. $result = $this->soap->ImportOrderCart($soapOrderCart); Výsledek je kontrolován na úspěšnost importu stejně, jako v importu objednávek. if ($result->order->ErrorCode != 0) { if (array_key_exists($result->order->ErrorCode, $this->errorCodes)) { throw new Exception($this->errorCodes[$result->order->ErrorCode], $result->order->ErrorCode); } else { throw new Exception($result->order->ErrorMessage, $result->order->ErrorCode); } }
32
6 Testování Během vývoje byla aplikace pravidelně testována. Vždy po dokončení některé z funkčností, byla tato funkčnost testována a případné chyby byly ihned odstraněny. Testování probíhalo na mém lokálním počítači, ve kterém jsem měl nahranou databázi se vzorovými daty. Po dokončení vývoje prošla aplikace firemním code review a po schválení se stala hlavní součástí internetového obchodu. Zde se již s touto aplikací pracuje a nalezené chyby jsou reportovány a posléze opraveny. Kvůli absenci možnosti otestovat napojení na přepravní společnosti přímo v jejich informačním systému, testování bylo realizováno zatím pouze jen na lokálním počítači a to tak, že jsem si nechával vypisovat své požadavky, které byly odeslány na informační systém dopravce, a porovnával jsem je s dokumentací, zdali jsou stejné. Další část testování a ladění bude probíhat již v ostrém provozu, kdy budou data posílána do systému přepravce a budou se moci zkontrolovat, zda přenos proběhl v pořádku.
33
7 Srovnání s existujícím řešením Pro porovnání řešení bakalářské práce jsem vybral několik internetových obchodů pro redakční systém Joomla!.
7.1 VirtueMart Verze VirtueMart pro srovnání je 2.0.16. Výpis objednávek používá vzhled, který je typický pro výpisy v Joomla!. Filtrace je velmi strohá, objednávkám nelze přiřadit pobočku. Detail objednávek rovněž obsahuje podobné informace o objednávce jako v mém řešení. V detailu lze editovat fakturační a doručovací údaje kliknutím na jméno, to mi přijde nepřehledné a na první pohled není jasné, že takto se dají editovat tyto údaje. Do objednávky již nelze vložit další položku. Statistiky zde představují reporty. Bohužel statistiky objednávek se mi nepovedli porovnat z důvodu špatné funkčnosti filtrace objednávek. Ve verzi 1.1.5 byly tyto reporty pouze textové bez grafického znázornění. Tuto funkčnost lze doinstalovat v podobě rozšíření pro Joomla!. Pro napojení tohoto internetového obchodu na dopravní společnosti v České republice jsem nenašel žádné řešení.
7.2 HikaShop Porovnání bylo provedeno na verzi 2.1.3. Výpis objednávek používá vzhled, který je typický pro výpisy v Joomla!. Tento obchod nepodporuje pobočky. Možnosti filtrace objednávek jsou o něco menší. Detail objednávky je velmi podobný mému řešení, jednotlivé informace o objednávce jsou přehledně rozděleny do několika bloků, funkčnost je též velmi podobná. Statistiky jsou zde tvořeny jako reporty, u kterých lze nastavit různé druhy grafů a jaká data se mají zobrazit. Tento způsob je složitější, ale umožňuje nastavit spoustu způsobů prezentace dat. Pro napojení tohoto internetového obchodu na dopravní společnosti v České republice jsem nenašel žádné řešení.
7.3 MijoShop Porovnávaná
verze
je
1.6.2.
Výpis
objednávek
neumožňuje
žádnou
práci
s objednávkou, je nutné jít do detailu objednávky. Filtrace objednávek je přehledná a umožňuje filtraci dle několika parametrů jako v mém případě. V detailu objednávky
34
se nachází v levé části menu, kde je na výběr jaké údaje o objednávce chceme zobrazit, to mi přijde zbytečné a nevidím celkový přehled o objednávce, údaje jsou totožné jako v mém řešení. Funkčnost je rovněž totožná, pouze navíc umožňuje změnit metodu platby a dopravy. Pokud chci editovat objednávku, musím na výpisu objednávek kliknout na editace, kdybych klikl pouze na view detailu objednávky tak mohu editovat pouze stav objednávky, tudíž pokud bych chtěl editovat některé jiné údaje, musím se znova proklikat na výpis objednávek a vstoupit do správného view. Ve statistikách se zobrazuje počet objednávek, počet produktů v objednávkách a celkový obrat objednávek. Objednávky ve statistikách lze filtrovat. Pro napojení tohoto internetového obchodu na dopravní společnosti v České republice jsem nenašel žádné řešení.
35
8 Závěr Cílem bakalářské práce byla refaktorizace logistiky internetového obchodu a napojení na přepravní společnosti. Refaktorizace se dotkla výpisu objednávek, detailu objednávky
a
výpisu
objednávek
k expedici.
Při
refaktorizaci
byla
znovu
naprogramována logika aplikace a prezentační část. Díky použití MVC návrhového vzoru, který je použit při implementaci komponent v Joomla! byla logika oddělena od prezenční části aplikace. Databázová vrstva prošla rovněž refaktorizací, kde proběhla analýza existujících tabulek a byly odstraněny tabulky, které se již nepoužívají. Důraz byl kladen na použití tříd frameworku Joomla Platform. Přidána byla funkcionalita pro napojení na informační systémy přepravních společností, možnost tohoto napojení spočívá ve sledování zásilek, importu zásilek a objednání svozu přímo do informačního systému přepravních společností. Oproti předchozí verzi internetového obchodu prošel velikou změnou design uživatelského rozhraní výpisu objednávek a statistik, tento design považuji za velmi přehledný a kvalitní. U výpisu objednávek byly zachovány všechny prvky pro práci s objednávkami jako ve starší verzi. Ve statistikách je nyní podrobnější výpis a přibylo i grafické znázornění pomocí grafu. Ostatní obrazovky neprošli tak razantní změnou a byly pouze poupraveny. Vzhled detailu objednávek by bylo dobré v budoucnu zkonzultovat s grafikem, aby byl výpis ještě přehlednější. Za velký krok směrem k udržitelnosti kódu a možnosti budoucího vývoje považuji odstranění starého kódu, který již nebyl používán. Tímto krokem se staly přehlednější zdrojové kódy. Dále se povedlo oprostit novou logiku od používání technologických postupů z verze pro Joomla! 1.5, a však starý kód je i nadále funkční. Na pár místech aplikace se nepovedlo úplně odstranit zastaralý kód. Odstranění tohoto kódu by zabralo více času pro analýzu, kde se používá a zdali odstraněním nedojde k narušení funkčnosti internetového obchodu. Protože webové služby SOAP pro import zásilek a objednávek svozu zatím z českých dopravců podporuje pouze firma PPL. Byl naprogramován plugin pro napojení pouze na tuto společnost. Práci lze v budoucnu rozšířit o další přepravní společnosti, kdy bude stačit doprogramovat plugin. Práci lze rozšířit i o funkčnost importu zásilek do informačních 36
systémů dopravních společností pomocí souborů XML, TXT a CSV, popřípadě další refaktorizaci aplikace. Zapotřebí by bylo provést refaktorizaci práce s produkty, a zbavovat se starých závislostí, které již nikdo nepoužívá, popřípadě přeprogramování starých konstrukcí, které jsou časově náročné nebo jdou naprogramovat lépe. Tato bakalářská práce se již stala hlavní částí internetového obchodu pro práci s objednávkami na straně administrace a je používána zákazníkem. Protože se zajímám a webové technologie, díky tématu bakalářské práce, jsem se během realizace své práce mohl seznámit s několika novými technologiemi a vyzkoušet si je v praxi. Vyzkoušel jsem si práci s webovými službami SOAP a tvorbou grafů pomocí Google Vizualisation API.
37
Seznam použité literatury [1] GUTMANS, Andi. Mistrovství v PHP 5. Vyd. 2. Brno: Computer Press, 2007, 655 s. ISBN 978-80-251-1519-0. [2] TAHAGHOGHI, Seyed M a Hugh E WILLIAMS. Learning MySQL. Sebastopol, Calif.: O'Reilly, c2007, xvii, 598 p. ISBN 05-960-0864-3. [3] RESIG, John. JavaScript a Ajax: moderní programování webových aplikací. Vyd. 1. Překlad Ondřej Baše, Ondřej Žižka. Brno: Computer Press, 2007, 360 s. ISBN 978-80251-1824-5. [4] MARGORÍN, Marián. JQuery bez předchozích znalostí. Vyd. 1. Brno: Computer Press, 2011, 253 s. ISBN 978-80-251-3379-8. [5] MooTools - a compact javascript framework [online]. 2006-2009 [cit. 2013-04-12]. Dostupné z: http://mootools.net/ [6] Google Chart Tools — Google Developers [online]. 2012, 3.4.2012 [cit. 2013-0510]. Dostupné z: https://developers.google.com/chart/ [7] RAGGETT, Dave. Getting started with HTML. World Wide Web Consortium (W3C)
[online].
2005,
24.5.2005
[cit.
2013-04-29].
Dostupné
z:
http://www.w3.org/MarkUp/Guide/ [8]
CSS
Tutorial
[online].
1999-2013
[cit.
2013-05-10].
Dostupné
z:
http://www.w3schools.com/css/ [9] DEXTER, Mark a Louis LANDRY. Joomla! programming. Upper Saddle River, NJ: Addison-Wesley, c2012, xxv, 558 p. ISBN 01-327-8081-X. [10] KOSEK, Jiří. Inteligentní podpora navigace na WWW s využitím XML. Praha, 2002. Diplomová práce. Vysoká škola ekonomická, Fakulta informatiky a statistiky, Katedra informačního a znalostního inženýrství. Vedoucí práce Ing. Vojtěch Svátek, Dr. [11] ČESKÁ POŠTA, s. p. Podání Online. Česká republika, 21.12.2012. [12] Joomla! [online]. 2005-2013 [cit. 2013-05-22]. Dostupné z: http://www.joomla.org
38
Seznam obrázků Obrázek 1: Diagram případů užití .................................................................................. 16 Obrázek 2: Zjednodušený ER diagram pro napojení nových tabulek ............................ 17 Obrázek 3: Výpis objednávek ......................................................................................... 18 Obrázek 4: Výřez detailu objednávky se zobrazením souhrnu a přidáním nového produktu .......................................................................................................................... 18 Obrázek 5: Tisk podacích archů a objednání svozu ....................................................... 19 Obrázek 6: Statistiky objednávek ................................................................................... 19 Obrázek 7: Diagram návrhové vzoru MVC [12] ............................................................ 20 Obrázek 8: Adresářová struktura komponenty ............................................................... 22
39
Seznam tabulek Tabulka 1: Seznam tříd pro využití MVC v Joomla!...................................................... 21 Tabulka 2: Seznam eventů .............................................................................................. 29
40
Seznam použitých zkratek AJAX – Asynchronous JavaScript And Xml API – Application Programming Interface CMS – Content Management System CSS – Cascading Style Sheets CSV – Comma-Separated Value DPH – Daň z přidané hodnoty ER diagram – Entity Relationship diagram HTML – HyperText Markup Language HTTP – HyperText Transfer Protocol IDE – Integrated Development Environment JSON – JavaScript Object Notation MVC – Model View Controller PHP – Hypertext Preprocessor PPL – Professional Parcel Logistic SMTP – Simple Mail Transfer Protocol SOAP – Simple Object Access Protocol SQL – Structured Query Language TXT – Text file URL – Uniform Resource Locator XHTML – Extensible HyperText Markup Language XML – Extensible Markup Language WSDL – Web Service Definition Language
41
Přílohy 1 Obsah přiloženého CD Na přiloženém CD se v kořenovém adresáři nachází tato bakalářská práce ve formátu bakalarska_prace.pdf. V adresáři source jsou přiloženy zdrojové kódy této bakalářské práce a v adresáři images se nacházejí použité fotky v této práci a další, které nebyli zařazeny do tohoto textu.
42