Stagedocumentatie - Typepad...2014/06/18 · Informatica is niet meer weg te denken in onze huidige...
Transcript of Stagedocumentatie - Typepad...2014/06/18 · Informatica is niet meer weg te denken in onze huidige...
Stagedocumentatie
NICOLAS PARADIS
PROFESSIONELE BACHELOR TOEGEPASTE INFORMATICA 2013-2014 EXAMENPERIODE JUNI 2014
2
Voorwoord Het doel van de bachelor in de Toegepaste informatica is om mensen op te leiden tot IT-professionals,
die een verantwoordelijkheid dragen binnen een bedrijf. Als student is het dus noodzakelijk om de
verworven kennis en competenties aan te vullen met werkveldervaring. Velen lopen tijdens het derde
jaar een stage binnen een bedrijf, als navolging van hun bachelorproef.
In mijn geval is de situatie wat anders. Na een succesvol IT-project, uitgevoerd voor het bedrijf
KeyTech, heb ik in het tweede semester van deze derde fase gekozen voor het buitenland.
Dankzij het uitwisselingsprogramma Erasmus heb ik kunnen studeren en stage lopen in de
Fachhochschule Brandenburg. Zoals de naam al verklapt, is deze universiteit gelegen in de stad
Brandenburg an der Havel, te Duitsland.
Over internationale uitwisseling hoort men vaak dat het vele positieve aspecten en ervaringen met
zich meebrengt en dat kan ik alleen maar beamen! Ik heb er geleerd zelfstandig en gedreven te werken,
afwisselend in teamverband. Planning en stiptheid draagt men in Duitsland hoog in het vaandel, dat
was ook het geval in mijn project.
Daarnaast vulden cultuur en evenementen ook de drukke planning aan. Het was een bijzondere,
boeiende en leerrijke ervaring. Ik kan het iedere toekomstige student dan ook aanraden.
Hierbij wil ik dan ook alle mensen bedanken die dit voor mij mogelijk maakten.
Nicolas Paradis
3
Inhoudsopgave
Voorwoord .............................................................................................................................................. 2
Inleiding ................................................................................................................................................... 4
Overzicht van specifieke termen of afkortingen ..................................................................................... 5
Deel 1: Beschrijving van de opdracht ...................................................................................................... 6
1.1 Het project GesundheitsKiosk ....................................................................................................... 6
1.2 Doelstellingen ................................................................................................................................ 6
1.3 Mijn opdracht ................................................................................................................................ 7
Deel 2: Technische uitwerking .............................................................................................................. 10
Deel 3: Reflectie en evaluatie van het resultaat ................................................................................... 13
Deel 4: Persoonlijk ontwikkelingsplan ................................................................................................... 14
Bronnenoverzicht .................................................................................................................................. 16
Bijlagen .................................................................................................................................................. 17
4
Inleiding Informatica is niet meer weg te denken in onze huidige maatschappij. Mensen zijn het gewoon om met
computers, tablets, smartphones, … te werken. Vaak zijn deze toestellen verbonden met het internet.
Dit biedt uiteraard mogelijkheden in verschillende sectoren waaronder verkoop & marketing, de
industrie, de banksector … Het is echter zo dat IT in heel wat domeinen nog niet optimaal wordt ingezet
om processen te verbeteren.
Er is dus nog een lange weg te gaan en ook in Duitsland probeert men die digitale kloof te dichten.
BürgerServiceNetz e.V., kortweg BSN, is een concept dat gegroeid is uit de Fachhochschule
Brandenburg en heeft als doel verschillende burgerdiensten (digitaal) bij elkaar te brengen.
De meeste mensen kennen thuisbankieren bijvoorbeeld, maar er zijn nog vele andere online-
mogelijkheden, die tot op heden nog onbenut zijn. BSN probeert hierop in te spelen en als het ware
een nieuwe dimensie te geven aan het thuis-internetten.
BSN overkoepelt meerdere projecten, waarin vaak studenten actief meewerken. De projecten zijn
gelinkt aan verschillende sectoren. Eén van die projecten is de BSN GesundheitsKiosk, ook wel Health
Kiosk genaamd. In dit project mocht ik actief meewerken gedurende vier maanden.
5
Overzicht van specifieke termen of afkortingen Hieronder staan een aantal specifieke termen verklaard die in dit project worden gebruikt. Vaak zijn
het termen die mensen uit de wereld van informatica reeds kennen.
CMS: Contentmanagementsysteem
Dit is een softwaretoepassing om op een eenvoudige manier, zonder technische kennis,
inhoud op het internet te plaatsen.
Bijvoorbeeld: een tekst en een afbeelding op een website plaatsen.
Typo3
Een open-source CMS, actief sinds 1998. Typo3 wordt vaak gebruikt in Duitsland en heeft
een vrij steile leercurve.
Alternatieven: WordPress of Joomla
Normalisatie
Databasenormalisatie is een techniek om een databank te ontwerpen. Hierbij let men vooral
op dat dezelfde data niet meerdere keren wordt vastgelegd.
Lightbox
Lightbox is een venster dat kan worden opgeroepen in de browser. Het wordt vaak opgebouwd
met de scripttalen CSS, HTML en vaak Ajax. Zo’n venster kan extra informatie en opties
bevatten voor de gebruiker.
Bijvoorbeeld: bij het klikken van een info-knop verschijnt een klein half-transparant venster
met meer uitleg over het aangeklikte item.
Ajax: Asynchronous JavaScript And XML
Met Ajax kunnen opgevraagde gegevens op een asynchrone manier worden opgevraagd. Een
webpagina hoeft dus niet in zijn geheel te verversen bij een nieuwe opvraging.
SQL-injectie
Een SQL-injectie is een methode dat een gebruiker kan gebruiken om ongewenste SQL-query’s
uit te voeren. Een grondige controle op de invoer van gegevens in een databank is
noodzakelijk.
SWOT-analyse
SWOT ofwel Sterkte-zwakteanalyse is een model om interne zwaktes en sterktes in kaart te
brengen, samen met de externe kansen en bedreigingen.
6
Deel 1: Beschrijving van de opdracht Dit hoofdstuk bevat de algemene beschrijving en de doelstellingen van het project, waaraan ik heb
meegewerkt. Daarnaast is er ook een overzicht van de taken die ik heb uitgevoerd.
1.1 Het project GesundheitsKiosk BSN GesundheitsKiosk (Health Kiosk) is een platform (in ontwikkeling) dat
artsen, medische assistenten, … de mogelijkheid biedt om in de toekomst
medische gegevens van patiënten op te slaan en te raadplegen.
Het project staat onder leiding van Professor Dietmar Wikarski.
In de eerste plaats dient de GesundheitsKiosk om vitale waarden van
patiënten te meten, met moderne digitale apparatuur en automatisch in
een beveiligde omgeving op te slaan. Nadien kan men, onafhankelijk van
stad, deelstaat of medische instelling, op een eenvoudige en gestructureerde manier de meetwaarden
raadplegen.
De waarden van bloeddruk, gewicht, suikerspiegel, bloedarmoede en zuurstofgehalte zullen worden
ondersteund.
Het platform zal bovendien nog heel wat meer mogelijkheden bieden. Zo kan men ook
patiëntendossiers bijhouden. Zo’n patiëntendossier mag zeer ruim worden opgevat: medisch
beeldonderzoek, allergieën, ziekten, medische familiegeschiedenis, vaccinaties tot zelfs
fitnessschema’s kunnen worden opgeslagen.
Een medicatieplan is eveneens een beschikbare optie. De patiënt zal in dit onderdeel kunnen
raadplegen welke medicatie hij moet nemen, op welke tijdsstippen en hoelang.
Tot slot is er ook nog de rubriek noodgegevens. Hierin zullen de voornaamste zaken zoals gebruikte
medicatie, allergieën, belangrijke diagnoses worden bewaard. Hieraan zal er een mobiele website
gelinkt zijn, die enkel beveiligd te raadplegen zal zijn via een QR-code. Elke patiënt zal zo’n QR-code op
zijn medische verzekeringskaart hebben. Het doel is om een snel overzicht te bieden van cruciale data
in geval van nood. De mobiele website verhoogt de kans op een snelle en aangepaste hulp.
1.2 Doelstellingen De BSN GesundheitsKiosk is een project dat heel wat voordelen biedt en zo ook diverse doelstellingen
kan realiseren.
Eerst en vooral: centralisatie en digitalisering. Het platform zal alle belangrijke gegevens van patiënten
groeperen en zorgt er ook voor dat deze, op een beveiligde manier, beschikbaar zullen zijn bij
verschillende medische instellingen en instanties. Momenteel is het namelijk zo dat in Duitsland
gegevens per arts of hooguit per gemeente beschikbaar zijn. Er bestaan reeds kleine initiatieven om
enkele databanken te bundelen, maar een modern, nationaal systeem ontbreekt.
Verder is er ook nog vereenvoudiging. Het systeem moet toegankelijk zijn voor mensen met diverse
achtergrond en leeftijd. Daarom zal een simpele, efficiënte structuur worden gebruikt voor de website.
Bovendien is het de bedoeling om naast eenvoudig, ook platformonafhankelijk te
zijn. Of het nu iOS, Windows of Android is, het zou geen verschil mogen maken. De
website zal sowieso bereikbaar zijn voor elk systeem, maar daarenboven zullen ook
de medische metingen met verschillende besturingssystemen mogelijk zijn.
7
1.3 Mijn opdracht De GesundheidsKiosk is reeds verschillende jaren in ontwikkeling. Enerzijds was het project lange tijd
in de opstartfase. Men moest nagaan welke doelstellingen men wilt bereiken, wat de scope is, …
Anderzijds lag de focus op de ontwikkeling van de back-end. Zo was het reeds mogelijk om via
Bluetooth randapparatuur te linken en automatisch metingen (gewicht en hartslag) te laten uitvoeren.
De back-end was echter nog niet afgewerkt en daarenboven was er nog heel wat werk aan de front-
end.
De taken die ik de afgelopen vier maanden heb gekregen en uitgevoerd, zijn zeer uiteenlopend
geweest. Hieronder een overzicht van wat ik allemaal heb gedaan.
1. Onderzoek en analyse van het project (10/02 19/02)
In het begin van mijn stage moest ik de bestaande documentatie en ideeën analyseren
en bijsturen. BSN vond het belangrijk om een frisse visie van een buitenstaander te
hebben over het project. Deze taak duurde anderhalve week.
Het is bovendien ook normaal dat ik deze taak had. Ik moest immers weten hoe alles
(theoretisch) in mekaar zit, wat de scope is, wat de doestellingen zijn.
2. Analyse van het technische gedeelte (20/02 26/02)
Tijdens deze fase moest ik vooral de technische zijde analyseren. Ik had immers totaal geen ervaring
met een CMS, zoals Typo3, of de werking van drivers voor draadloze Bluetooth-communicatie. De
eerder ontwikkelde “Vital Data Manager”, die instaat voor communicatie met randapparatuur was
helemaal nieuw voor mij. Ik moest mij dus als het ware inwerken om het platform beter te begrijpen.
3. Diverse taken (27/02 16/03)
Deze periode bundelt een aantal diverse kleinere taken. Ik heb toen extra dagen (incl.
weekend) intensief gewerkt om alles te kunnen voltooien. De verschuiving van
werkdagen is het gevolg van de welkomweek voor Erasmus-studenten. Gezien in
Duitsland het 2de semester start midden maart, zijn er toen enkele dagen
weggevallen uit de werkweek ten voordele van culturele activiteiten.
Een gedetailleerde, technische oplossing leveren voor de implementatie van meertaligheid op
het platform.
Helpen bij het leveren van inhoud voor de front-end.
Zoeken naar passende, rechten-vrije illustraties. Deze moeten toekomstige gebruikers
op een heldere manier uitleggen hoe men het platform moet gebruiken.
Het controleren en verbeteren van Engelse teksten.
De draadloze Bluetooth-connectie tussen randapparatuur en centrale computer, waarop de
GesundheitsKiosk draait, controleren en testen.
Sommige apparaten hadden namelijk verbindingsproblemen, andere dan weer niet.
Eerste stappen zetten voor de reorganisatie van de SQL-databank.
Ik zocht antwoorden op vragen als “Welke tabellen kunnen geschrapt worden?” en “Welke
tabellen worden uitgebreid?”.
8
De databankconnectie tussen databank en website voltooien. Hierdoor kunnen gegevens
(gedeeltelijk) aangepast en toegevoegd worden.
4. Ontwerpen en aanmaken van een nieuwe databank (17/03 26/03)
Uit eerdere analyse (zie ‘diverse taken’) bleek dat de bestaande databank helemaal
niet goed was ontworpen. Vaak doken dezelfde gegevens meerdere keren op in
eenzelfde databank. Van normalisatie was er dus geen sprake. Bovendien klopten de
relaties tussen de verschillende tabellen niet.
Tot slot is er in dit project ook nog een extra moeilijkheid: alles draait om persoonsgevoelige gegevens.
Een eis is om die persoonsgegevens, zoals naam of adres, afgesplitst te houden van de overige data.
De aanmaak van een gloednieuwe databank drong zich op, rekening houdend met deze specifieke eis.
Het nieuwe ontwerp is duidelijker en eenvoudiger, maar voldoet ook voor de toekomst. Hoewel een
ontwerpweergave zou doen vermoeden dat het een niet-relationele databank is, is het dat wel.
De aanpassingen en vernieuwingen die in deze stap zijn uitgevoerd, kan men terugvinden in bijlage 8
en 9. Uitzonderlijk staan ook de afgesplitst tabellen voor de persoonsgegevens aangeduid.
5. Aanmaken en aanpassen van de rubriek ‘Notfalldaten’ (27/03 13/04)
De rubriek ‘Notfalldaten’ bevat alle gegevens die belangrijk zijn wanneer een patiënt in nood is.
Oorspronkelijk stond er beknopt overzicht van deze noodzakelijke items (Zie bijlage 10). Na research
hierover bleek dat wat we hadden, onvoldoende was.
Ik ging aan de slag met de resultaten van de research en breidde de databank uit. Nadien begon ik de
pagina ‘Notfalldaten’ volledig opnieuw op te bouwen. Sommige items kregen een nieuwe subpagina,
andere werden gegroepeerd. Zo werd de beschikbare informatie sterk uitgebreid, maar toch bleef het
geheel overzichtelijk. Details en bewerkingen zijn namelijk op te roepen via een lightbox, zoals men
kan zien in bijlage 12.
6. Volledige herwerking van de rubriek ‘Medikamentenplan ’ (14/04 17/04)
Ook na verdere research bleek dit onderdeel niet volledig aan de vereisten te voldoen van
een goede tool (Zie bijlage 13). De pagina kreeg een vernieuwd, strakker uiterlijk.
Het raadplegen van welke medicatie men moet nemen, hoe lang en op welke tijdsstippen
kan dus eenvoudiger. Extra details werden eveneens toegevoegd. Deze kunnen
opgeroepen worden met een lightbox.
7. Aanmaken van de rubriek ‘Patientenakten’ (18/04 04/05)
Deze rubriek heeft als doel het herbergen van patiëntengegevens zoals bijvoorbeeld allergieën,
ziekten, medische familiegeschiedenis, vaccinaties, trainingsschema’s bij fitnessen, …
Oorspronkelijk was dit deel van het platform zeer beperkt. Slechts raadplegingen bij een arts werden
op 1 webpagina bijgehouden. Een connectie met de databank bestond zelfs niet. Om de
patiëntengegevens allemaal te kunnen bijhouden, waren heel wat nieuwe pagina’s en nieuwe functies
nodig. Dit werk nam een halve maand in beslag.
Het belang van het patiëntendossier is aanzienlijk groter geworden in het platform.
9
8. Maken van een mobiele website (05/05 11/05)
Zoals eerder werd vermeld, zal er ook een mobiele website worden ingezet. Deze site bevat alle
noodgegevens van een patiënt, maar zonder gevoelige data zoals naam, geboortedatum of
rijksregisternummer. De bedoeling is dus om anoniem te blijven.
De site kan namelijk alleen via een persoonlijke QR-code worden opgeroepen,
die elke patiënt op zijn medische verzekeringskaart zal hebben. Uiteraard zijn
de noodgegevens te raadplegen via verschillende browsers. Een QR-scanner
is ook vereist. De technische ontwikkeling van het QR-gedeelte zal samen met
een andere student worden uitgevoerd.
9. Oplossen bugs (12/05 31/05)
In de code van het platform waren een aantal fouten geslopen. Zo zagen bepaalde stijlelementen er
niet correct uit in verschillende (moderne) browsers. Ook werden niet altijd alle functies correct
opgeroepen. Het oplossen van deze bugs verloopt tussentijds, tot het einde van de maand mei.
10. Uitbreiding bestaande databank (19/05 31/05)
De recente uitbreidingen van het platform hebben uiteraard gevolgen: de nieuwe databank moest
worden bijgewerkt. Een aantal nieuwe tabellen moet worden toegevoegd en ook bestaande tabellen
moeten sterk worden uitgebouwd.
Om de nieuwe structuren duidelijk te houden, zowel voor mezelf, als voor de mensen die me in dit
project opvolgen, heb ik een Engelstalig document opgesteld waarin de functies van alle tabellen
worden uitgelegd. Dit is terug te vinden als Bijlage 19.
In verschillende pagina’s moesten ook de connecties met de databank worden opnieuw geschreven.
Tijdens deze stap blijft de afsplitsing tussen persoonsgegevens (naam, adres, …) en overige data
(meetdata, patiëntendossiers, ...) behouden.
11. Documenteren en afwerken (01/06 08/06)
De laatste week dient vooral om de puntjes op de i te zetten. Zaken, zoals onder andere onafgewerkte
webpagina’s en SQL-statements worden afgewerkt
Zo heb ik in deze tijdsperiode een upload-systeem voor afbeeldingen gemaakt. Een arts kan
bijvoorbeeld röntgenfoto’s toevoegen aan een patiëntendossier.
Documenteren is uiteraard ook belangrijk. Tijdens deze week verzamel ik alle informatie over mijn
prestaties en afgeleverde producten en documenteer ik deze.
10
Deel 2: Technische uitwerking In het vorige deel had ik algemeen mijn uitgevoerde taken beschreven. In dit hoofdstuk ga ik
meer in op de technische kant en resultaten van die taken. De gebruikte programmeertalen,
gebruikte methodes, … zijn in dit hoofdstuk terug te vinden.
1. Onderzoek en analyse van het project (10/02 19/02)
2. Analyse van het technische gedeelte (20/02 26/02)
Zowel voor het algemeen onderzoek van het project als de analyse van het technische gedeelte was
er geen technische uitwerking vereist. Het is natuurlijk wel zo dat ik met beide taken intensief bezig
was, vooral tijdens de analyse van het technische gedeelte was veel inzicht nodig.
Ik heb een technisch document opgesteld om alle (Duitstalige) informatie uit te klaren en te begrijpen.
Dit is terug te vinden in de bijlagen (bijlage 1).
3. Diverse taken (27/02 16/03)
In deze tijdsperiode heb ik uiteenlopende taken uitgevoerd, zo ook met diverse technische
uitwerkingen.
De implementatie van meertaligheid gebeurde niet in deze tijdsperiode, het aanreiken van een
stappenplan echter wel. Ik heb me moeten verdiepen in Typo3. Het is een CMS dat ik eerder
nog nooit had gebruikt. Ik had er zelfs nog nooit van gehoord.
Typo3 staat gekend als een technisch CMS met hoge leercurve.
Het oplossen van de problemen met de randapparatuur vereiste aanpassingen in de
configuratie en foutafhandeling. Het bijwerken van de drivers, net als de configuratie,
gebeurde in C. De code hiervan mag helaas niet worden vrijgegeven.
Om de connectie tussen databank en site te voltooien, heb ik gebruik gemaakt van PHP en
SQL. Dit gebeurde toen nog pagina per pagina. Het grote nadeel is dat wanneer er iets
verandert met die connectie, dit per pagina moet worden aangepast.
4. Ontwerpen en aanmaken van een nieuwe databank (17/03 26/03)
Het eerste visuele ontwerp van de databank heb ik op papier gemaakt. Voor het aanmaken van de
nieuwe databank werd gebruik gemaakt van de open-source tool MySQL Workbench. De databank zelf
werd opgebouwd met MySQL. Ik heb alleen toegang tot de databank waarin data zoals meetgegevens,
patiëntendossiers, … worden bijgehouden. Het is dan ook hieraan dat ik werk.
Een andere databank bevat slechts de persoonsgegevens van patiënten. Dit is essentieel om privacy
en veiligheid te garanderen. In geval van een hack, zouden de gegevens op die manier anoniem blijven.
Op de ontwerpfoto’s (bijlage 8) staan ook de tabellen voor persoonlijke gegevens, maar die worden in
de realiteit dus niet gebruikt. Ze zijn in dit geval louter ter illustratie.
11
5. Aanmaken en aanpassen van de rubriek ‘Notfalldaten’ (27/03 13/04)
De pagina’s werden geïmplementeerd in Typo3. Het Typo3-systeem zorgt ervoor dat de
algemene lay-out niet opnieuw hoeft te worden opgebouwd. Deze lay-out werd tijdens
een eerder stadium van het project reeds gemaakt.
Het ophalen van gebruikersdata gebeurt in verschillende, aparte PHP-pagina’s, aan de hand van SQL-
statements. Voor deze rubriek werd gekozen om gebruik te maken van tabbladen. Deze tabbladen,
samen met het weergeven van de data vereist naast PHP ook HTML en CSS (versie 3).
Dit heb ik van nul moeten opbouwen. Elk tabblad bevat totaal andere informatie en is gekoppeld aan
een PHP-pagina. Bovendien wordt er ook gebruik gemaakt van Ajax-code om het onnodig laden van
data te voorkomen en de performantie te verbeteren.
In deze stap worden stilaan alle statements met de databank ter vereenvoudiging gecentraliseerd.
Slechts 1 bestand bevat vanaf nu ook de connectie-instellingen met de databank.
Tot slot was mijn taak ook om een nieuw type lightbox te ontwerpen. Tot op dat moment moest elk
venstertje een eigen configuratie krijgen, wat bijzonder inefficiënt was en bovendien ook moeilijk. De
nieuwe versie maakt onder andere gebruik van JavaScript en CSS.
6. Volledige herwerking van de rubriek ‘Medikamentenplan ’ (14/04 17/04)
Ook dit onderdeel werd in Typo3 geïmplementeerd. Het opvragen van data uit de databank en het
weergeven ervan gebeurt ook via PHP. HTML en CSS geven het uiterlijk en de indeling weer.
De eerder ontworpen lightbox kon, zonder al te veel moeite, opnieuw worden hergebruikt.
7. Aanmaken van de rubriek ‘Patientenakten’ (18/04 04/05)
Deze rubriek vereiste dezelfde technische uitwerking als voorgaande onderdelen. In dit
geval dienden er veel nieuwe pagina’s aangemaakt te worden, wat de langere
ontwikkeltijd verklaart.
Alle statements met de databank worden centraal bijgehouden in hetzelfde document
waar eerdere code voor de noodgegevens en het medicatieplan stond.
Om alles verstaanbaar te houden, is er telkens een duidelijke commentaarlijn die aangeeft over welk
onderdeel de code gaat.
8. Maken van een mobiele website (05/05 11/05)
De gehele mobiele lay-out werd opgebouwd door middel van CSS, HTML en JavaScript.
PHP zorgt er dan weer voor dat men per pagina stukken lay-out kan hergebruiken. Ook kan men via
PHP data uit de databank halen. Sommige deeltjes PHP zijn identiek met de algemene website. In de
toekomst kan ook de mobiele website gebruik maken van het centrale bestand, met SQL-statements,
van de hoofdwebsite.
Er wordt voor de mobiele website echter geen gebruik gemaakt van het Typo3-systeem. Beiden zijn
qua beheer dan ook volledig onafhankelijk.
12
9. Oplossen bugs (12/05 31/05)
De oplossen van bugs gebeurde in verschillende lagen van de website. Zo werden aanpassingen in CSS
en HTML doorgevoerd om problemen met stijlelementen, zoals tabellen, buttons of titels, op te lossen.
Ook in de PHP-code werden een aantal foutjes opgelost.
10. Uitbreiding bestaande databank (19/05 31/05)
De databank-uitbreidingen gebeuren via MySQL. Ook in dit geval wordt er gebruik gemaakt van de tool
MySQL Workbench.
Tijdens deze taak heb ik ook gebruik gemaakt van PHP. Ik moest namelijk op verschillende webpagina’s
de SQL-statements bijwerken. In een aantal gevallen werden zowel de SQL statements (tegen SQL-
injectie) als de PHP-pagina’s (authenticatie) beter beveiligd en efficiënter.
11. Documenteren en afwerken (01/06 08/06)
Deze laatste afwerkingen gaan van databank-aanpassingen tot het herschrijven van titels
op de webpagina’s. Het is m.a.w. zeer uiteenlopend, vaak zonder al te veel technische
ingrepen.
Het upload-systeem voor afbeeldingen is een complexer gedeelte. Er wordt gebruik gemaakt van PHP
en SQL. Verschillende veiligheidsmaatregelen zijn ingebouwd. Zo wordt er eerst gecheckt op het type
bestand. Alles wat geen afbeelding is, wordt geweerd. Verder wordt er ook nagekeken of het
opgeladen bestand niet te groot is. Indien de grens van 3MB wordt overschreden, wordt het proces
afgebroken. Deze grens is eenvoudig aan te passen door de webbeheerder.
Tot slot wordt er nog extra controle uitgevoerd om SQL-injectie tegen te gaan.
13
Deel 3: Reflectie en evaluatie van het resultaat Zoals eerder beschreven, is dit project al verschillende jaren aan de gang en zal het ook dit jaar nog
niet volledig klaar zijn. Ik geloof wel dat ik een grote positieve inbreng aan het project heb geleverd.
Eerst en vooral heb ik veel bijgedragen aan de technische kant van de zaak. Hoewel mijn
afstudeerrichting normaal gezien netwerken is, heb ik tijdens deze stage bijzonder veel
geprogrammeerd. De databank is nu volledig anders opgebouwd dan bij mijn aankomst. Het is ook
meer uitgebreid, zonder daarbij nutteloze zaken te bevatten.
Een ander aspect waar ik bijzonder tevreden mee ben, is de website. In het begin vertelde men me dat
de site vrij snel in mekaar was gezet om toch maar een ‘front-end’ te hebben. Iets wat toekomstige
gebruikers reeds konden bewonderen tijdens een medische conferentie in Potsdam. De website die ik
achterlaat, is echter amper te vergelijken met de zogenaamde ‘mockup’-site. Er zijn heel wat functies
en mogelijkheden die nu wel werken, ik heb talrijke nieuwigheden geïmplementeerd, de eerder
gebruikte code heb ik vereenvoudigd, …
Wat wel beter kon, is de manier van plannen binnen het project. Ik had al tijd en moeite gestopt in de
oudere databank en webpagina’s (bijvoorbeeld noodgegevens). Dit was uiteraard in overeenstemming
met de opdrachtgever. Helaas bleek na research dat die ‘informatiebundels’ op de website
onvoldoende uitgebreid en overzichtelijk waren. Het resultaat was dat ik niet veel code kon
hergebruiken en dus een heel stuk opnieuw moest maken.
Dit was iets dat ik helaas zelf niet in handen had. Een medestudente deed namelijk die research en de
resultaten kwamen een stuk later uit de bus dan verwacht.
De conclusie is dat het resultaat positief is. Ik ben fier op het werk dat ik geleverd heb tijdens deze vier
maanden en als ik de mondelinge feedback van mijn verantwoordelijke en medewerkers/studenten
mag geloven, zijn zij dat ook.
De schriftelijke feedback is rechtstreeks van mijn verantwoordelijke uit naar de cel internationalisatie
in Brussel gestuurd.
Het project is er een heel stuk op vooruit gegaan en is klaar om verder gezet te worden.
14
Deel 4: Persoonlijk ontwikkelingsplan “Al doende leert men”, een befaamd spreekwoord dat ik alleen maar kan beamen.
Gedurende deze driejarige IT-opleiding heb ik heel wat competenties verworven, maar
de praktijk brengt bijzonder veel bij.
1. Algemene competenties, business skills en soft skills
Mijn algemene skills zijn er tijdens deze Erasmus-ervaring natuurlijk goed op vooruit gegaan.
Gedurende mijn studierichting Latijn-Wetenschappen kwam ik al in contact met verschillende, vooral
oudere, culturen. Nu heb ik kennis gemaakt met vele nieuwe mensen en nieuwe hedendaagse
culturen. Zo kwam ik in contact met Duitsers, Mexicanen, Polen, Oekraïners, Tsjechen, Chinezen, …
Kortom, mensen die een andere achtergrond hebben dan wat ik in België, in mijn eigen omgeving,
gewoon ben. Deze positieve contacten gelden eveneens op professioneel vlak. Ik heb de relaties met
mijn medestudenten/medewerkers altijd goed onderhouden, ook met de opdrachtgever.
Bovendien zorgde deze internationale uitwisseling er ook voor dat mijn talenkennis actief werd
gestimuleerd. De Engelse taal was hier bijzonder nuttig, maar ondertussen is mijn Duits ook sterk
verbeterd. Het is zelfs zo dat ik tijdens meetings nu meepraat in het Duits, terwijl ik vroeger alleen een
beetje basiskennis had.
Tevens kwam deze uitwisseling mijn zelfstandigheid ten goede. Ik heb binnen het project zelf mijn
opgelegde taken kunnen uitvoeren, zonder teamwerking achter wege te laten.
Het speciale aan een Erasmus-stage is dat men in het buitenland werkt en leeft. Dit heeft er evenzeer
voor gezorgd dat deze vaardigheid sterker is geworden.
2. IT-competenties
Deze stageperiode heeft mijn IT-skills op een positieve manier beïnvloed.
Eerst en vooral waren de regelmatige, stipte meetings nieuw voor mij. Zowat elke week kwamen
medestudenten, opdrachtgever en ik bij elkaar om te bespreken wat er reeds voltooid was en wat er
nog op het programma stond. Kritiek of verbetertips waren geen taboe en gelukkig maar. Zo kon
iedereen ook echt vooruit gaan in het project.
Daarnaast zijn ook mijn programmeercompetenties er natuurlijk op vooruit gegaan. In grote mate op
vlak van websiteontwikkeling (HTML, CSS, PHP, JavaScript), maar ook in kleinere mate C. Verder is ook
mijn kennis in databankontwikkeling verbeterd. Ik heb tijdens het programmeren altijd geprobeerd
om zo efficiënt en eenvoudig mogelijk te werken. Zo staan er in mijn code regelmatig
commentaaraanduidingen, gebruik ik consistente naamgevingen en hergebruik ik code waar mogelijk.
Helaas heb ik tijdens deze stageperiode mijn netwerk- en systeemcompetenties niet kunnen benutten
en verbeteren.
Ik heb tijdens mijn opleidingsjaren informatica altijd geleerd dat documenteren uiterst belangrijk is.
Wanneer iemand anders jouw werk verderzet, moet deze persoon weten waarover het gaat. In dit
project kon ik proefondervindelijk vaststellen hoe cruciaal dit is. Zo moest ik aan de hand van
documentatie van mijn voorgangers mezelf inwerken. Elke aanpassing die ik doorvoerde, moest ik dan
toelichten zodat mijn opvolgers alles zouden begrijpen.
15
3. Toekomst
Zoals in het begin aangehaald, ben ik ervan overtuigd dat men al doende heel wat leert. Ik ben klaar
om in een professionele omgeving mee te werken en daar nog heel wat extra ervaringen op te doen.
Het vakgebied IT staat gekend voor de permanent bijscholing. Ik heb ook nog plannen om verdere
certificaten te behalen, zowel bij Cisco als bij Microsoft.
4. SWOT-analyse
Aan de hand van de gekende competenties, kan men een SWOT-analyse samenstellen.
Verlegen
Ik moet mensen beter kennen
om vlotter met hen om te gaan.
Leiding nemen
Ik verkies teamwerk of
leiderschap met beperkte sociale
hiërarchie.
Punctueel
Ik houd alles netjes en geordend
bij. Ik respecteer afspraken.
Zelfstandig
Ik werk autonoom in
teamverband.
Doorzetter
Ik zet door, ook als het tegen zit.
Sterktes Zwaktes
Net afgestudeerd
Ik ben zeer flexibel en niet vast-
geroest aan een bedrijfsfilosofie.
Altijd up-to-date
IT is een branche waar permanente
vorming mogelijk is.
Concurrentie
Goedkopere werkkrachten kunnen
leiden tot werkafname of
jobverlies.
Gebrek aan ervaring
Ik heb nog niet genoeg ervaring in
professionele omgevingen.
Kansen
Sterktes
Bedreigingen
Sterktes
16
Bronnenoverzicht Tijdens mijn stage heb ik gebruik gemaakt van heel wat online bronnen. Dit is een overzicht met de
voornaamste bronnen:
Awesome Ajax Lightbox and Modal Dialog Solutions
Geraadpleegd via http://www.1stwebdesigner.com/freebies/ajax-lightbox-modal-dialog-solutions
Dynamic Drive DHTML Scripts- Ajax Includes Script
Geraadpleegd via http://dynamicdrive.com/dynamicindex17/ajaxincludes.htm
Dynamically selecting a tab/ loading an external page
Geraadpleegd via
http://dynamicdrive.com/dynamicindex17/ajaxtabscontent/ajaxtabs_suppliment.htm
Tabs | jQuery UI
Geraadpleegd via http://jqueryui.com/tabs/#ajax
PHP Tutorials Uploading Storing an Image inside a MySQL Database Part 1 + Part 2
Geraadpleegd via http://youtube.com/watch?v=o-0bfleqE2g
Geraadpleegd via http://youtube.com/watch?v=pMLc4IXmYfg
Ajax + PHP validation and call Javascript function inside PHP validation
Geraadpleegd via http://stackoverflow.com/questions/18138377/ajax-php-validation-and-call-
javascript-function-inside-php-validation
Create a Lightbox effect only with CSS – no javascript needed
Geraadpleegd via http://emanueleferonato.com/2007/08/22/create-a-lightbox-effect-only-with-css-
no-javascript-needed/
PHP: getimagesize – Manual
Geraadpleegd via http://www.php.net/manual/en/function.getimagesize.php
MySQL BLOB using PHP
Geraadpleegd via http://phppot.com/php/mysql-blob-using-php/
Making Web, Mobile friendly
Geraadpleegd via http://mobifreaks.com
Pure Javascript, HTML 5 & CSS3 Tabs
Geraadpleegd via http://www.my-html-codes.com/javascript-tabs-html-5-css3
Delete button and confirmation Geraadpleegd via http://stackoverflow.com/questions/16962280/delete-button-and-confirmation
Javascript submit form not working on Firefox Geraadpleegd via http://www.daniweb.com/web-development/javascript-dhtml-
ajax/threads/411964/javascript-submit-form-not-working-on-firefox
Upload images to mysql database Geraadpleegd via http://daniweb.com/web-development/php/code/301923/upload-images-to-mysql-
database
17
Bijlagen Hieronder kan men een lijst der bijlagen terugvinden.
Bijlage Titel
1 Documentatie BSN (Engelstalig)
2 Documentatie Typo3 meertaligheid (Engelstalig)
3 Vitaldatamanager
4 Overzicht van alle gehouden meetings
5 Notities tijdens meetings
6 Takenlijsten
7 Presentatie meeting 7 maart 2014
8 Eerste fases van de nieuwe databank
9 Finale afwerking databank
10 Situatie ‘Notfalldaten’ na eerste herwerking op 15 maart 2014
11 Situatie ‘Notfalldaten’ na grondige herwerking
12 Definitief vernieuwde ‘Notfalldaten’
13 Situatie ‘Medikamentenplan’ op 7 april 2014
14 Definitief vernieuwde ‘Medikamentenplan’ op 17 april 2014
15 Weergave van de mobiele site voor noodgegevens (Notfalldaten) op 11 mei
2014
16 Uploadsysteem
17 POST Instructies pagina
18 Code webpagina noodgegevens
19 Databank documentatie
20 PowerPoint presentatie juni 2014
Bijlage 1: Documentatie BSN (Engelstalig) Dit is het resultaat van de analyse van de Duitstalige projectinformatie. Het heeft me geholpen om het
gehele project beter te begrijpen, zowel qua doelstellingen en scope als qua technische werking.
Documentation BSN 1. The project
In this first step I need to discover what kind of project “Health Kiosk” is. I’ve analyzed and read the
documents that my German colleges had composed earlier. The result of my research is summarized
below:
Today internet is used everywhere. People are familiar with computers, tablets, smartphones … and all
these devices are ‘connected’ with the internet. This offers a lot of opportunities in different domains,
including the medical sector. This is very important.
In many countries, over the whole world, the mean age of people increases. This means that people live
longer. At the same time there is a decrease of births. The result is an unbalanced demographic
situation.
Healthcare is an essential factor in this demographic transition. More and more doctors will be
necessary in the future. At the moment these doctors are spending a lot of time on measuring and
processing manually the medical parameters of their patients.
The Health Kiosk (BSN Gesundheitskiosk) is a computer application that helps doctors, nurses, medical
assistants … measuring medical parameters, such as weight or blood pressure. The results of the
measurements are automatically send to and stored in a secured database. This means that all these
results can be consulted later on, which largely can improve the medical assistance.
The application uses different sensors/devices to measure these parameters. This is completely
wireless. The project started as a real kiosk, but will be extend to different mobile hardware (iPad with
iOS, Surface with Windows 8, Android tablet, Windows computer…).
Architecture
Health Kiosk is divided into different parts (data store, webserver) as you can see in the scheme below.
The connections between the data store, as well as the data store itself, need to be secured.
The Content Management System that is used is TYPO3.
2. Technical working
The Health Kiosk is a project that has been developed during several years in the Fachhochschule
Brandenburg and it’s still in evolution. My job is to contribute in the different evolution stages of this
project.
2.1 Connection agent-manager In part 1 of this document, you could already read that specific devices will be used to measure blood
pressure, weight and so on. These devices need to communicate their results.
The ISO/IEEE 11073 standard makes communication between devices (sensors) and extern computer
systems possible. The main goal of this standard is a plug & play-connection, which can send all the
medical data from the devices, in a structured and efficient way to the computers. The computer that
communicates with the device becomes a ‘manager’, the medical sensor becomes an ‘agent’.
Different devices are supported with this ISO-standard: Weight scale, blood pressure monitor,
electrocardiograph …
In this project the goal is that we can measure the following parameters:
Blood pressure
Weight
Blood sugar
Blood clotting
Oxygen saturation
At the moment, we can only use the blood pressure device. The weighting scale is not pairing yet
with the computer.
Data transmission
In this paragraph you can find, as example, how a weight scale (agent) communicates with the computer
(manager), according to the ISO IEEE 11073 standard.
1. After the start-up of the agent, a connection is set up between agent and manager.
2. The manager sends its standard configuration to the agent. When the configuration of the
manager is unknown, an advanced configuration is requested. The agent sends its advanced
configuration to the manager.
3. The connection is established and both devices are ready to send and receive vital data.
Manager and agent are in active-mode.
4. The manager asks the agent the MDS Object attributes with the ‘Remote Operation Invoke’
command. Then the agent sends its MDS Object attributes with the command ‘Remote
Operation Response’.
5. In this step the measured vital data is transferred. When the transfer was successful, the
manager sends a confirmation to the agent. Thereafter, other measured data can be send.
The data transmission can be executed in a different way when another agent is used.
Communication protocol
The connection between an agent and a manager needs to be in accordance with the ISO IEEE
11073 standard. The Bluetooth Health Device Protocol (HDP) is a perfect protocol for the
transmission of medical data.
Drivers
Some devices use specific, proprietary protocols to send and receive data. Unfortunately, in that case,
this devices can’t be connected with every manager. Drivers, that adapt the proprietary data to data in
the ISO IEEE 11073 standard, need to be created.
A Software Development Kit (11073-SDK) has been created by Prisma GmbH and can be used for the
creation of the drivers. The SDK is compatible with Windows and Linux.
The SDK consists of different components:
1. Agent component
2. Manager component
3. Message Handler component
4. PHD component
5. ACSE component
6. Mder component
The driver needs to be written in Java, which means that the driver is platform independent.
2.2 Vital data-manager The vital data-manager is responsible for receiving and managing data send by the agents.
Installation
The first thing to know is that the following components are required to run the manager:
- Windows or Linux OS
- Bluetooth Stack
o Windows: Microsoft Bluetooth Stack
o Linux: BlueZ-Package
- Webserver (e.g. Apache)
- MySQL Database
- Java Runtime Environment
The use of the vital data-manager on Windows requires the presence of Cygwin. This software provides
native integration of Windows-based applications and resources with the respective Unix-environment
applications and resources.
The second step is to put the whole directory of the manager in the root directory (C:\) and adapt
configuration files. The first file to adapt is DB.properties. Change the parameters of the database
connection to your settings. Each device has his own directory. There you can find also a properties-file.
Here the MAC-address of the using medical devices needs to be entered.
Usage
The medical devices need to be connected with the computer, using Bluetooth. Click on
ManagerServer.bat to start the manager. Use ManagerServer - Logging.bat to start the manager and
keep logs in a logfile.
Now the file Treiber.bat, which is linked to the drivers, keeps asking the medical devices to send their
data to the manager. When a device is connected and used, the data will appear in the website (GUI).
The source code (kernel) of the vital data-manager is not public/open, which means I cannot watch,
learn and adapt the existing code. Modifications must be done by Mr. P. Emmermacher (Prisma GmbH).
Configuration files are accessible.
2.3 Graphical User Interface (18/02) The graphical part of the project is a website, running on the Typo 3-framework. Typo 3 is Content
Management System: you can publish, edit and modify content in one central interface. Like in many
similar systems, every web page is modular, which means that different, individual components form
one page together. The advantage is that you can edit one component, e.g. the menu, and the changes
are visible on al web pages.
Img. 1: Start page BSN Gesundheitskiosk (2014.02.20)
Img. 2: Start page BSN Gesundheitskiosk (2014.03.07)
When you want to run a website, you need a web service. In this case, we use the free open source
platform XAMPP. XAMPP can launch and manage different services: HTTP server, MySQL database …
The next step is to run the website on a webhosting, which is publicly accessible for everyone.
Database
The database of the website is made in SQL and can be run on the phpMyAdmin-framework. In PHP-
files we link to the database and get the requested data. In the future, we will adapt these pages: we
will work in layers. This provides a more efficient and secure system.
Due to other security reasons, the users of the website are put in another, separate database. In the
ERD-model, we put the userDB and dataDB together to get a better overview.
I analyzed the existing way of working and redesigned the database. Normalization is now correctly
used. I also added relationships between the different columns.
One of my upcoming tasks is to complement the database with new, required columns.
Img. 1: General overview [ERD] of the database (2014.03.17)
Multilingual
This project is not only interesting for Germany, but also for many other countries.
A support for a multilingual site is recommended. With Typo 3 this is possible.
Extensions can, similar to a browser, add some interesting functionality, including
multilingualism.
On every page a menu will appear where you can choose the language.
I found out how the installation of such a plugin works.
Bijlage 2: Documentatie Typo3 meertaligheid (Engelstalig) Hieronder staan alle uit te voeren stappen om de Typo3-site geschikt te maken voor meerdere talen.
TYPO3 multi language The Typo3-systems offers the possibility to install extensions. These small programs can offer extra,
useful functions. In this document, you can find step-by-step explication how to make a Typo3 website
ready for multiple websites.
1. Install the extension “Static Info Tables”
Download and install the extension “Static Info Tables” 1 in the extension manager. The add-on will
expand the typo3 database with countries, languages … After installing, include static in your main
typoscript template (see image under chapter 8: Realurl and multilanguage). Without installing this add-
on, the localization tab in TemplaVoila will not appear.
Please adapt the PHP.ini by changing the maximum execution time (max_execution_time) from 30 to
90 or higher. This can avoid errors while installing.
2. Create website languages
Go via List and click on the logo
of Typo3. There create the
wanted languages. Fill in
language, ISO code and flag. We
use English as default in this
example. You don’t need to
define that language. Look at
the id’s of the languages which
you can see if you hover with
the mouse over the symbol.
Those IDs will be used later in
Realurl.
3. Check if langdisable is in Templavoila data source
This code is in the data structure of a Templavoila template. You can verify that in the DS record.
<meta>
<langDisable>1</langDisable>
</meta>
1 http://typo3.org/extensions/repository/view/static_info_tables
4. Define the languages in Typoscript.
In the setup of the main Typoscript template the following code has been put. In our example our default
language is English and we included Spanish, German, Dutch, French and Portuguese. The IDs have to
be identic to the created web languages. The default language has uID 0.
config.linkVars = L
config.uniqueLinkVars = 1
config.sys_language_overlay = content_fallback
config.language = en
config.locale_all = en_EN
config.htmlTag_langKey = en-EN
config.sys_language_uid = 0
[browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="en"
[globalVar = GP:L = 2]
config.language = es
config.locale_all = es_ES
config.htmlTag_langKey = es-ES
config.sys_language_uid = 2
[globalVar = GP:L = 2] && [browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="es"
[globalVar = GP:L = 3]
config.language = de
config.locale_all = de_DE
config.htmlTag_langKey = de-DE
config.sys_language_uid = 3
[globalVar = GP:L = 3] && [browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="de"
[globalVar = GP:L = 4]
config.language = nl
config.locale_all = nl_NL
config.htmlTag_langKey = nl-NL
config.sys_language_uid = 4
[globalVar = GP:L = 4] && [browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="nl"
[globalVar = GP:L = 5]
config.language = fr
config.sys_language_uid = 5
config.locale_all = fr_FR
config.htmlTag_langKey = fr-FR
[globalVar = GP:L = 5] && [browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="fr"
[globalVar = GP:L = 6]
config.language = pt
config.locale_all = pt_PT
config.htmlTag_langKey = pt-PT
config.sys_language_uid = 6
[globalVar = GP:L = 6] && [browser = msie]
config.htmlTag_setParams = xmlns="http://www.w3.org/1999/xhtml"
xmlns:v=”urn:schemas-microsoft-com:vml” xml:lang="pt"
[global]
More information about XHTML and the language in TYPO3, can be find on the Wiki of Typo32.
For now just copy it and adjust to your languages. Don’t forget to end with [global]! Without realurl
installed your URLs will now be something like www.yoursite.com/index.php?id=1&L=2 , where L=2
means that you get the Spanish version of the page.
5. Put the default language and flag in TSConfig
On your root page edit the page properties. Under Options include in TSConfig:
mod.SHARED.defaultLanguageLabel = English
mod.SHARED.defaultLanguageFlag = gb.gif
This sets the default language on English and uses the English flag in the backend.
6. Create new page translation and page content
Click via Page on the page where you wish to create a new translation. There choose the localization
view tab and create a new page translation.
After that you can fill in the page title for that language.
By creating a new webpage, it will be possible to choose the language for that page.
2 http://wiki.typo3.org/XHTML
7. Creating a language selector on the typo3 website
For the language selector, you can install in the extension sr_language_menu 3. No configuration is
needed if your default language is English. If not change in constant editor the default language and
country. For example for German:
plugin.tx_srlanguagemenu_pi1.defaultLanguageISOCode = DE
plugin.tx_srlanguagemenu_pi1.defaultCountryISOCode = DE
You can add this extension as a plugin on your pages via page content or you could map it with
TemplaVoila. By mapping it appears on each page. To do that create a sysfolder. You can call it
“elements”. In the sysfolder, create page content and choose “Language Selection”. Select the
languages from the globe level and choose between a dropdown list or flags.
Note: you do not need to add the default language.
In the TemplaVoila html template you can add for example:
<div id="language-selector"><!-- languages --></div>
Go via List to the TemplaVoila storage folder, click on the TO icon before your template and
then Templavoila, modify DS/TO.
Add a new data element language.
Choose as mapping type Element and as Editing Type “Typoscript object path”, fill in after
update lib.language.
3 http://typo3.org/extensions/repository/view/sr_language_menu
Update, click on map, choose as Mapping Window “mode: html source” and click on the new created
div. Then click SET and “save as” to overwrite the TemplaVoila template.
Now, in your Typoscript template add the following under setup:
lib.language = RECORDS
lib.language.tables = tt_content
lib.language.source = 62
The number needs to correspond with the ID of the page content element. You can see the ID by
hovering with the mouse over the icon before the Language menu item under the folder elements as
stated above.
When you’re set and done clear all cache.
If you now check on the frontend of your site the language selector should be visible and working.
The language selector will of course only appear when the page translations are available.
The only thing to do now is putting it on the right place in the design. Add this in your CSS:
#language-selector {
left: 500px;
top:100px;
position:absolute;
z-index:10;
}
8. Realurl and multilanguage
To change your URL, to make the more readable you can install the extension Realurl 4.
After installing uncheck “Enable automatic configuration” in the extension manager at the realurl
extension. In the main Typoscript template the following code needs to be put under setup:
tx_realurl_enable = 1
baseURL = http://www.yourwebsite.com/
simulateStaticDocuments = 0
prefixLocalAnchors = all
More info about the needed .htaccess file at the root of TYPO3 folder 5 is absolute necessary.
The pre-configuration of the extension CB Realurl 6 is good enough. It includes configuration for some
popular extensions like tt_news.
You can also chose the option to create manually a realurl configuration and include it in the file
localconf.php.
Install cbrealurl in the extension manager and include static in your main Typoscript template.
Now you need to alter the file realurl.php in the extension cbrealurl with your languages. Unfortunately
this needs to be done in PHP instead of an editor.
4 http://typo3.org/extensions/repository/view/realurl 5 http://www.training-typo3.com/2008/12/09/installation-of-typo3-for-newbies-part-1-ftp-htaccess-and-chmod/ 6 http://typo3.org/extensions/repository/view/cbrealurl
Click on the extension manager, click on “Cannonbose RealURL Configuration Helper” then choose “Edit
files”.
You see there the languages defined when you scroll down a little. Default are some other languages
defined than you see in the image above. In this example our default language is English and we
included Spanish, German, Dutch, French and Portuguese. The IDs have to be identic to the created web
languages.
In the URL you now will get http://www.yoursite.com/site/ for English and for the other languages it will
become http://www. yoursite.com/es/site/, http://www. yoursite.com/de/site/ etc.
If you do see the message “SAVING IS DISABLED” instead of the save button go to the install manager
first, find in all configuration “[noEdit]” (use ctrl-F in Firefox to search), uncheck it and then scroll down
totally and click on “Write to localconf.php”.
Source:
TYPO3 multi language, December 15, 2008 (http://training-typo3.com/2008/12/15/typo3-multi-language)
Bijlage 3: Vitaldatamanager De exacte code van de datamanager kan helaas niet worden vrijgegeven. Een aantal screenshots van
het programma (o.a. configuraties) worden hier weergegeven.
Bijlage 4: Overzicht van alle gehouden meetings Hieronder kan u een tabel terugvinden van alle gehouden meetings, samen met het uur van aanvang
en uur van afronding.
Datum Start Einde
10 februari 2014 9 uur 11 uur
12 februari 2014 9 uur 10 uur
14 februari 2014 10 uur 12 uur
17 februari 2014 9:30 uur 11:30 uur
19 februari 2014 10 uur 12 uur
20 februari 2014 10 uur 12:30 uur
25 februari 2014 10 uur 12 uur
27 februari 2014 10 uur 12:15 uur
3 maart 2014 10 uur 12 uur
7 maart 2014 10 uur 12:15 uur
17 maart 2014 10 uur 11:45 uur
21 maart 2014 15 uur 16:30 uur
28 maart 2014 11 uur 12:30 uur
3 april 2014 10 uur 12 uur
8 april 2014 10 uur 11:30 uur
15 april 2014 10 uur 11:45 uur
22 april 2014 9:30 uur 11 uur
25 april 2014 10 uur 11 uur
2 mei 2014 10 uur 11:15 uur
8 mei 2014 14 uur 15:15 uur
15 mei 2014 14 uur 15:30 uur
28 mei 2014 14 uur 16 uur
6 juni 2014 15 uur 16:30 uur
10 juni 2014 10:30 uur 11:40 uur
Bijlage 5: Notities tijdens meetings Gedurende verschillende meetings heb ik notities bijgehouden van wat er werd besproken. In vele
gevallen was het echter zo dat er mondeling afspraken werden vastgelegd.
Meetings
12/02/14
Folder
QR: site
Thomas Jacob: verantw. site
Naumann: telecom earlier, now project
Sebastian Keideweiss: typo3
Next: room 317? Nee, bureau
VRAGEN?
Erik Rauchstein
Phillip Emmermacher
Tobias
tekst maken kort: manuals voor gebruiken toestellen. V.b.: hoe bloeddruk nemen ed.
17/02/14
Service
Find links in third column: general (external) services
V.b. Doctor, medical stations?
Internet tests
Find headlines and websites (tests)
Donderdag 10u
Teksten
17/03/14
CeBIT
- Android Stick Smart-TV (COL Tech)
- Home-automatisation: Power management (Dawon DNS)
- In general
Results Putri
Hand-out
o Notfalldaten
o Design
Link to info about required fields
o Broadcast
Card with QR-code, where link to notfalldaten saved is. This card can be used in case of emergency
(scan QR)
To do: communicatie met Emmermacher in BSCW plaatsen
Next meeting: Friday 21, at 3PM. Room: 321
25/04/14
- Adapting existing webpages (Patientenakte, Medikamentenplan)
- Creating new webpages (Patientenakte)
- Finishing mobile webpage (Notfalldaten)
- Creation and adaptations in database
- Finishing documentation database
- Testing devices with Windows 7-computer
- Implementing Multilanguage-system (with Tobias, Typo3)
Vervolg
In de meetings die erna volgden, werd besloten om te werken met een duidelijk afgebakende ‘Task
list’. Alle uit te voeren taken werden daar opgesomd, samen met de prioriteit en deadline.
Deze takenlijsten zijn eveneens terug te vinden in de bijlagen.
Bijlage 6: Takenlijsten Na een aantal weken werd besloten om alle uit te voeren taken te groeperen en te voorzien van een
prioriteit en deadline.
03/04/14
15/04/14
Bijlage 7: Presentatie meeting 7 maart 2014 Dit is een tussentijdse presentatie die ik tijdens een meeting (op 7 maart) heb gegeven.
Bijlage 8: Eerste fases van de nieuwe databank De eerste aanpassingen, op 20 maart 2014.
De tweede rij aanpassingen in de databank, op 26 maart 2014.
Bijlage 9: Finale afwerking databank Deze screenshot toont hoe de databank is opgebouwd. Er zijn weinig relaties tussen de verschillende
tabellen te zien op deze afbeelding. Dit komt omdat de persoonsgegevens in een aparte databank
zitten. De link tussen de twee databanken gebeurt via het beveiligde Typo3-systeem.
Bijlage 10: Situatie ‘Notfalldaten’ na eerste herwerking op 15 maart 2014 Alle noodgegevens worden op 1 pagina weergegeven. De nieuw toegevoegde plusjes zorgen ervoor
dat men nieuwe data kan toevoegen.
Bijlage 11: Situatie ‘Notfalldaten’ na grondige herwerking Startpagina van de noodgegevens. Nog niet alle tabbladen werken correct, waardoor er nog geen
testgegevens kunnen worden gebruikt.
Bijlage 12: Definitief vernieuwde ‘Notfalldaten’ Deze startpagina geeft een kort overzicht weer van noodgegevens. Wanneer men op een element klikt,
wordt men automatisch naar het juiste tabblad doorverwezen.
Alle items worden zelfstandig geüpdatet.
Hieronder een screenshot van het tabblad “diagnosen”. Een algemeen overzicht van gestelde
diagnoses door artsen wordt hier weergegeven.
Indien men meer informatie wenst te verkrijgen (van bijvoorbeeld een diagnose), of wijzigingen wenst
aan te brengen, kan men op informatie-icoontje klikken. Een lightbox zal dan verschijnen.
Dankzij het gebruik van HTML5 kan er gebruik gemaakt worden van extra nieuwe functies, zoals een
kalender indien men een datum moet opgeven. Bij het gebruik van oudere browsers kan men gewoon
een datum zelf ingeven.
Bijlage 13: Situatie ‘Medikamentenplan’ op 7 april 2014 Het medicatieplan geeft een overzicht van welke medicatie een patiënt wanneer moet nemen en in
welke aantallen.
Het aanpassen van gegevens gebeurt in 1 lightbox. Het vertraagt nodeloos de webpagina gezien alle
invoervelden, ook de niet-aangepaste, worden geüpdatet na bevestiging.
Bijlage 14: Definitief vernieuwde ‘Medikamentenplan’ op 17 april 2014 Het nieuwe medicatieplan is moderner en eenvoudiger dankzij de icoontjes. Elk item kan ook
afzonderlijk worden bewerkt door op het informatie-icoontje te klikken.
Bijlage 15: Weergave van de mobiele site voor noodgegevens (Notfalldaten) op 11 mei 2014 In geval van nood kan een omstaander de QR-code inscannen van een verzekeringskaart. Deze linkt
door naar deze mobiele website waar men anoniem noodgegevens, zoals allergieën of gebruikte
medicatie kan raadplegen.
Bijlage 16: Uploadsysteem Eén van de functies van het patiëntendossier is het bijhouden van medische beeldonderzoeken.
Wanneer een nieuw onderzoek wordt toegevoegd, kan een afbeelding (bijvoorbeeld een röntgenscan)
worden meegegeven via het uploadsysteem.
Automatisch wordt
er nagekeken of
het bestand wel
een afbeelding is.
In de PHP-code worden er ook verschillende veiligheidschecks uitgevoerd om te zware bestanden te
weren, maar ook om alles wat geen afbeelding is, weg te houden.
Bijlage 17: POST Instructies pagina De code die instaat voor het invoegen, aanpassen en verwijderen van data staat hieronder beschreven
(statements.php). In totaal gaat het over 650 lijnen code.
Deze centrale pagina is toegankelijk voor verschillende webpagina’s: alles van noodgegevens,
patiëntendossier en medicatieplan.
<?php
/*
This documents containts the SQL-statements (POST-requests) from webpages to the
Database.
Every part of code has been indicated with comment.
*/
$db = getDB();
$db2 = getDB();
//UserID: Get the ID of the logged-in user (via Typo3!)
$hash = $GLOBALS["TSFE"] -> fe_user -> user["uid"];
/**
* ALLERGIE
*/
//Add a new allergie
if (isset($_POST['addAll'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "INSERT INTO Allergie
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', '$p4', '$p5', '$p6')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Get requested allergie
if (isset($_GET['requestAll'])) {
$id = $_POST['idAll'];
$sql1 = "SELECT allergie, reaktion, fremdbefund FROM Allergie WHERE NotID = $hash && id
= $id";
$result1 = $db -> query($sql1);
$row = $result1 -> fetch_assoc();
$param1 = $row[allergie];
$param2 = $row[reaktion];
$param3 = $row[fremdbefund];
}
function getAllergie() {
$sql1 = "SELECT id, allergie, reaktion, fremdbefund, allergentyp, zuerstBeob,
allergencode FROM Allergie WHERE uID = $hash";
$result1 = $db -> query($sql1);
}
function getDiagnose() {
$sql1 = "SELECT Diagnose.id, beschreibung, fremdbefund, datum, icd, gruppe
FROM Diagnose
LEFT OUTER JOIN ICD
ON Diagnose.ICD_id = ICD.id
WHERE uID = $hash";
$db = getDB();
$result1 = $db -> query($sql1);
$sql2 = "SELECT *
FROM ICD";
$result2 = $db -> query($sql2);
}
//Update an existing allergie
if (isset($_POST['editAll'])) {
$id = $_POST['idAll'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "UPDATE Allergie
SET allergie='$p1', reaktion='$p2', fremdbefund='$p3',
allergentyp='$p4', zuerstBeob='$p5', allergencode='$p6'
WHERE id='$id' AND uId='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete an allergie
if (isset($_POST['deleteAll'])) {
$id = $_POST['idAll'];
$sql = "DELETE FROM Allergie
WHERE id=$id AND NotId=$hash";
$db -> query($sql);
}
/**
* MEDIZINISCHE BILDGEBENDE UNTERSUCHUNG
*/
//Add a new image research
if (isset($_POST['addBildUnt'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
//Image-upload: addslashes prevents SQL-injection
$image1 = addslashes(file_get_contents($_FILES['param4']['tmp_name']));
$image_size = getimagesize($_FILES['param4']['tmp_name']);
$image_filesize = filesize($_FILES['param4']['tmp_name']);
if ($p1 != NULL && $image1 != NULL) {
// Check if the uploaded file is an image
if ($image_size == FALSE)
{
echo "<script type='text/javascript'>alert('Please upload an
image!');</script>";
}
// Check if the uploaded image not to big is
elseif ($image_filesize > '3145728') {
echo "<script type='text/javascript'>alert('Your image must be maximum
3MB!');</script>";
}
// Execute statement
else {
$sql = "INSERT INTO BildUntersuching
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', '$image1')";
$db -> query($sql);
}
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an image research
if (isset($_POST['editBildUnt'])) {
$id = $_POST['idBildUnt'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$image1 = addslashes(file_get_contents($_FILES['param4']['tmp_name']));
$image_size = getimagesize($_FILES['param4']['tmp_name']);
$image_filesize = filesize($_FILES['param4']['tmp_name']);
$p5 = $_POST['param5'];
if ($p1 != NULL && $image1 != NULL) {
// Check if the uploaded file is an image
if ($image_size == FALSE)
{
echo "<script type='text/javascript'>alert('Please upload an
image!');</script>";
}
// Check if the uploaded image not to big is
elseif ($image_filesize > '3145728') {
echo "<script type='text/javascript'>alert('Your image must be maximum
3MB!');</script>";
}
// Execute statement
else {
$sql = "UPDATE BildUntersuching
SET zeit='$p1', beschreibung='$p2', typ='$p3',
vorschau='$image1'
WHERE id='$id' AND uId='$hash'";
$db -> query($sql);
}
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete an image research
if (isset($_POST['deleteBildUnt'])) {
$id = $_POST['idBildUnt'];
$sql = "DELETE FROM BildUntersuching
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* MEDIKATION
*/
//Add a new medication
if (isset($_POST['addMed'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "INSERT INTO Medikament
VALUES (NULL, '$p1', '$p2', '$p3', '$p4', '$p5')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update a medication
if (isset($_POST['editMed'])) {
$id = $_POST['idMed'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
//*, vorschau='$p4'*/
if ($p1 != NULL && $p3 != NULL) {
$sql = "UPDATE Medikament
SET handelsname='$p1', wirkst_menge='$p2',
freisetzung='$p3', darreichungsform='$p4', applikationsweg'$p5'
WHERE id='$id' AND uId='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a medikation
if (isset($_POST['deleteMed'])) {
$id = $_POST['idMed'];
$sql = "DELETE FROM Medikament
WHERE id=$id AND uID=$hash";
$db -> query($sql);
echo "<script type='text/javascript'>alert('Delete Medikation $id from user
$hash.');</script>";
}
/**
* DIAGNOSE
*/
//Add a new diagnose
if (isset($_POST['addDia'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "INSERT INTO ICD
VALUES (NULL, '$p1', '$p2')";
$db -> query($sql);
$id = $db -> insert_id;
$sql2 = "INSERT INTO Diagnose
VALUES (NULL, '$hash', '$p3', '$p5', '$p4', '$id')";
$db2 -> query($sql2);
} elseif ($p6 != NULL && $p3 != NULL) {
$sql = "INSERT INTO Diagnose
VALUES (NULL, '$hash', '$p3', '$p5', '$p4', '$p6')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update a diagnose
if (isset($_POST['editDia'])) {
$id = $_POST['idDia'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
//*, vorschau='$p4'*/
if ($p1 != NULL && $p3 != NULL) {
$sql = "UPDATE Diagnose
SET beschreibung='$p3', datum='$p4', fremdbefund='$p5'
WHERE id='$id' AND uId='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a diagnose
if (isset($_POST['deleteDia'])) {
$id = $_POST['idDia'];
$sql = "DELETE FROM Diagnose
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* ERKRANKUNG
*/
//Add a new disease
if (isset($_POST['addErkrank'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
if ($p4 == "") {
$sql = "INSERT INTO Erkrankung
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', NULL, '$p5', '$p6')";
} else {
$sql = "INSERT INTO Erkrankung
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', '$p4', '$p5', '$p6')";
}
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing disease
if (isset($_POST['editErkrank'])) {
$id = $_POST['idErkrank'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
if ($p4 == "" || $p4 == "0000-00-00" ) {
$sql = "UPDATE Erkrankung
SET erkrakung='$p1', status='$p2', start='$p3', ende=NULL,
artAusgangs='$p5', notiz='$p6'
WHERE id='$id' AND uId='$hash'";
} else {
$sql = "UPDATE Erkrankung
SET erkrakung='$p1', status='$p2', start='$p3', ende='$p4',
artAusgangs='$p5', notiz='$p6'
WHERE id='$id' AND uId='$hash'";
}
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a disease
if (isset($_POST['deleteErkrank'])) {
$id = $_POST['idErkrank'];
$sql = "DELETE FROM Erkrankung
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* MEDIZINISCHE GERÄTE
*/
//Add a new medical device
if (isset($_POST['addMedG'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
$p9 = $_POST['param9'];
$p10 = $_POST['param10'];
$p11 = $_POST['param11'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "INSERT INTO Geraete
VALUES (NULL, '$p1', '$p2', '$p3', '$p4', '$p5', '$p6', '$p7', '$p8',
'$p9')";
$db -> query($sql);
$id = $db -> insert_id;
$sql2 = "INSERT INTO PersGeraete
VALUES (NULL, '$hash', '$p10', '$id')";
$db2 -> query($sql2);
} elseif ($p11 != NULL && $p10 != NULL) {
$sql = "INSERT INTO PersGeraete
VALUES (NULL, '$hash', '$p10', '$p11')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing medical device
if (isset($_POST['editMedG'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
$p9 = $_POST['param9'];
$p10 = $_POST['param10'];
$p11 = $_POST['param11'];
$p12 = $_POST['param12'];
$id = $_POST['idPMedG'];
$id2 = $_POST['idMedG'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL) {
$sql = "UPDATE Geraete
SET hersteller='$p1', geraet='$p2', modell='$p3',
beschreibung='$p4', seriennummer='$p5', anatomischPos='$p6', telefon='$p7', email='$p8',
notiz='$p9'
WHERE id='$id2'";
$db -> query($sql);
$sql2 = "UPDATE PersGeraete
SET datum='$p10'
WHERE id='$id' AND uId='$hash'";
$db2 -> query($sql2);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a medical device
if (isset($_POST['deleteMedG'])) {
$id = $_POST['idPMedG'];
$sql = "DELETE FROM PersGeraete
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* SCHWANGERSCHAFT
*/
//Add a new pregnancy
if (isset($_POST['addSchw'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
if ($p1 != NULL && $p3 != NULL) {
$sql = "INSERT INTO Schwangerschaft
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', '$p4', '$p5')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing pregnancy
if (isset($_POST['editSchw'])) {
$id = $_POST['idSchw'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
if ($p1 != NULL && $p3 != NULL) {
$sql = "UPDATE Schwangerschaft
SET titel='$p1', beschreibung='$p2', relevant='$p3',
status='$p4', erstellt='$p5'
WHERE id='$id' AND uId='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a pregnancy
if (isset($_POST['deleteSchw'])) {
$id = $_POST['idSchw'];
$sql = "DELETE FROM Schwangerschaft
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* FESTE NAHRUNG UND GETRÄNKE
*/
//Add a new eat/drink
if (isset($_POST['addNagGet'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL && $p4 != NULL) {
$sql = "INSERT INTO NahrungGetraenke
VALUES (NULL, '$hash', '$p1', '$p2', '$p3', '$p4', '$p5', '$p6',
'$p7')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing eat/drink
if (isset($_POST['editNagGet'])) {
$id = $_POST['idNagGet'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
if ($p1 != NULL && $p2 != NULL && $p3 != NULL && $p4 != NULL) {
$sql = "UPDATE NahrungGetraenke
SET datum='$p1', nahrung='$p2', portion='$p3',
portionsgroesse='$p4', energie='$p5', ernaehrungsinfo='$p6', hinweis='$p7'
WHERE id='$id' AND uID='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a eat/drink
if (isset($_POST['deleteNagGet'])) {
$id = $_POST['idNagGet'];
$sql = "DELETE FROM NahrungGetraenke
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* SPORTLICHE BETÄTIGUNG
*/
//Add a new sportactivity
if (isset($_POST['addSportBet'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
if ($p1 != NULL && $p2 != NULL && $p4 != NULL && $p5 != NULL) {
$sql = "INSERT INTO Sportbetaetigung
VALUES (NULL, '$p1', '$p2', '$p3', '$p4', '$p5', '$p6', '$p7',
'$p8', '$hash')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing sportactivity
if (isset($_POST['editSportBet'])) {
$id = $_POST['idSportBet'];
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
if ($p1 != NULL && $p2 != NULL && $p4 != NULL && $p5 != NULL) {
$sql = "UPDATE Sportbetaetigung
SET zeit='$p1', aktivitaet='$p2', titel='$p3',
entfernung='$p4', dauer='$p5', anzahlSchritten='$p6', verbKal='$p7', notiz='$p8'
WHERE id='$id' AND uID='$hash'";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a sportactivity
if (isset($_POST['deleteSportBet'])) {
$id = $_POST['idSportBet'];
$sql = "DELETE FROM Sportbetaetigung
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
/**
* IMPFUNG
*/
//Add a new vaccination
if (isset($_POST['addImpfung'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
$p9 = $_POST['param9'];
$p10 = $_POST['param10'];
$p11 = $_POST['param11'];
if ($p1 != NULL && $p2 != NULL && $p5 != NULL && $p9 != NULL) {
//Add new vaccination (general)
$sql = "INSERT INTO Impfung
VALUES (NULL, '$p1', '$p5', '$p9')";
$db -> query($sql);
$id = $db -> insert_id;
//Add personal information about vaccination
$sql2 = "INSERT INTO PersImpfung
VALUES (NULL, '$hash', '$p2', '$p3', '$p4', '$id', '$p7',
'$p8', '$p10', '$p11')";
$db2 -> query($sql2);
} elseif ($p11 != NULL && $p10 != NULL) {
$sql = "INSERT INTO PersImpfung
VALUES (NULL, '$hash', '$p10', '$p11')";
$db -> query($sql);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Update an existing vaccination
if (isset($_POST['editImpfung'])) {
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$p3 = $_POST['param3'];
$p4 = $_POST['param4'];
$p5 = $_POST['param5'];
$p6 = $_POST['param6'];
$p7 = $_POST['param7'];
$p8 = $_POST['param8'];
$p9 = $_POST['param9'];
$p10 = $_POST['param10'];
$p11 = $_POST['param11'];
$id = $_POST['idPImpfung'];
$id2 = $_POST['idImpfung'];
if ($p1 != NULL && $p2 != NULL && $p5 != NULL && $p9 != NULL) {
$sql = "UPDATE Impfung
SET name='$p1', impfstoff='$p5', hersteller='$p9'
WHERE id='$id2'";
$db -> query($sql);
$sql2 = "UPDATE PersImpfung
SET datumGabe='$p2', abfolge='$p3', unerwEreignis='$p4',
wieVerabreicht='$p7', koerperteil='$p8', lotNr='$p10', hinweis='$p11'
WHERE id='$id' AND uID='$hash'";
$db2 -> query($sql2);
} else {
echo "<script type='text/javascript'>alert('An error occurred: please fill in
the required fields correctly.');</script>";
}
}
//Delete a personal vaccination
if (isset($_POST['deleteImpfung'])) {
$id = $_POST['idPImpfung'];
$sql = "DELETE FROM PersImpfung
WHERE id=$id AND uID=$hash";
$db -> query($sql);
}
?>
Bijlage 18: Code webpagina noodgegevens De webpagina (zie bijlage 12: Definitief vernieuwde ‘Notfalldaten’) met verschillende tabbladen
bestaat uit 1 pagina waarin verschillende PHP-pagina’s worden gelinkt. Deze structuur is
samenhangend met het tabbladen-systeem.
Bovenaan staan de 2 andere pagina’s ingevoegd. De eerste (connect.php) bevat alle
configuratiegegevens voor de database. De tweede (statements.php) bevat de instructies om data in
te voegen, aan te passen of te verwijderen (zie bijlage 17: POST Instructies pagina).
<?php
include "connect.php";
include "statements.php";
?>
<div id="benutzerdaten">
<div id="tabContainer">
<div class="tabs">
<ul id="countrytabs">
<li>
<a href="/fileadmin/php/Notfalldaten/Start.php"
class="selected" rel="#default"> Start </a>
</li>
<li>
<a href="/fileadmin/php/Notfalldaten/Diagnose.php"
rel="countrycontainer" id="favorite"> Diagnosen </a>
</li>
<li>
<a href="/fileadmin/php/Notfalldaten/Medikation.php"
rel="countrycontainer"> Medikation </a>
</li>
<li>
<a href="/fileadmin/php/Notfalldaten/Allergie.php"
rel="countrycontainer"> Allergien </a>
</li>
<li>
<a href="/fileadmin/php/Notfalldaten/Hinweise.php"
rel="countrycontainer"> Besondere Hinweise </a>
</li>
<li>
<a href="/fileadmin/php/Notfalldaten/WeitereInfo.php"
rel="countrycontainer"> Weitere Information </a>
</li>
</ul>
</div>
<div id="countrydivcontainer" class="tabscontent">
<?
include "Notfalldaten/Start.php";
?>
</div>
<script type="text/javascript">
var notfalldaten = new ddajaxtabs("countrytabs", "countrydivcontainer")
notfalldaten.setpersist(true)
notfalldaten.setselectedClassTarget("link")//"link" or "linkparent"
notfalldaten.init()
</script>
</div>
</div>
Bijlage 19: Databank documentatie
Database documentation This documents describes the different tables of the database “Gesundheidskiosk”.
Personal data
Personal data, like logins, names and so on, are kept in a separate database. The connection between
these two databases is made in Typo3. Every authentication passes the user ID trough the webpage.
Medikamentenplan
The area of the old diagram has been split up in the blue area Medikamentplan and the violet area
Medikament.
In this blue area you can find 2 tables. First of all: Medikamentenplan. All the relevant data for using
medication (e.g. the dosis, time of use, start- and end date) are in this table. The second table is
MedStatus. In this small table fixed statuses of the plan will be stored. (e.g. In use, future or
completed).
Medikament
The violet area only contains 1 table: Medikament
In the redesign of the database, it became clear that this table has an important role in the whole
project. All the relevant, general information about medication will be stored in this table. (e.g.
manufacturer, code, way of use, info about active ingredient, ..) That’s why the table is from now on
standalone and can be easily “re-used” in different contexts.
Weitere daten
This orange area contains the tables that is used to store data for i.e. the patient file and the
emergency data.
BildUntersuchung is used to store image screenings (patient file). Important to know is that the table
contains a field to store an image and a small image (preview). The image and the timestamp fields are
mandatory. The preview is created automatically during the upload of the image.
Termin stores the appointments you have with a doctor. Time and date is mandatory, status, goal and
duration are not.
Allergie table is used to store different allergic reactions. This information is used in the patient file
and the emergency data.
Behandlung keeps the name and status of a remediation. Also (short) notes can be kept in the table.
Operativeeingriff is a small table that stores operations.
Diagnose keeps the different diagnosis (i.e. a flu). Personal, detailed information is stored in that table.
Linked to that is the table ICD. ICD stores in the different general ICD categories and the name of that
category.
Erkrankung keeps the diseases stored. The disease and the status are mandatory. Start and end date
can also be added. This table keeps general diseases stored, for example a heart disease.
Schwangerschaft stores all the relevant information of pregnancy. The details (titel, relevant date,
status …) is used in the patient file. The emergency card only has a link to this page if the patient is
pregnant.
Familiengeschichte. Brothers, sisters or parents with a genetic disease can have an impact on a patient.
This information is stored here. The disease and affinity are mandatory fields.
Sportbetaetigung. Sport activities can be positive on the health state. Activities like swimming, walking
and running can be kept in the patient file. You can store the activity name, duration, notes, distances
and so on.
Impfung stores general vaccinations. This is linked with PersImpfung. Here is the personal data kept.
(I.e. date of vaccination, who did the vaccination, which part of the body was involved, and so on).
Geraete keeps in general the medical devices stored. You can give up the name of the device, the
manufacturer, serial number, telephone, email, model, notes …
The PersGeraete table is linked to store the date of use of a device.
NahrungGetraenke. Food and beverages are also important to keep your health in a good condition.
The patient file offers the possibility to store all what a patient eats or drinks. You can also add the
portions, energetic values, date of eating/drinking and so on.
Vitaldaten
This green area contains all the tables we use to store results of measurements. You can find the tables
VDblutgerinnung (blood clotting), VDnormalwert (normal values), VDgewicht (weight), VDblutdruck
(blood pressure), VDsauerstoffsettigung (oxygen saturation), VDblutzucker (blood sugar).
Each table has of course its own specific elements.
Bijlage 20: PowerPoint presentatie juni 2014 De presentatie die ik zal geven ter verdediging van mijn bachelorproef op 20 juni 2014.