I
T FACULTEI
APPEN CH NS
IEURSWE EN TE G N
Vakgroep Elektronica en informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout Faculteit Ingenieurswetenschappen
Een drupalmodule voor het registreren van treinvertragingen
Klaas Millet, Niels Hulstaert
Promotor : prof. dr. ir. Koen De Bosschere Begeleiders : Andy Georges, Kenneth Hoste
Scriptie ingediend tot het behalen van de academische graad van Master in de Toegepaste Informatica
Academiejaar 2007-2008
TOELATING TOT BRUIKLEEN
De auteurs geven de toelating deze scriptie voor consultatie beschikbaar te stellen en delen van het werk te kopi¨eren voor persoonlijk gebruik. Elk ander gebruik valt onder de bepaling van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit dit werk. 2 juni 2008
Klaas Millet, Niels Hulstaert
iii
Universiteit Gent Faculteit Ingenieurswetenschappen Vakgroep Elektronica en informatiesystemen Voorzitter: prof. dr. ir. Jan Van Campenhout
Een drupalmodule voor het registreren van treinvertragingen
Klaas MILLET, Niels HULSTAERT
Promotor : prof. dr. ir. Koen De Bosschere Begeleiders : Andy Georges, Kenneth Hoste
Scriptie ingediend tot het behalen van de academische graad van Master in de Toegepaste Informatica Academiejaar 2007-2008
Samenvatting Naar aanleiding van de talrijke vertragingen waarmee de treinreiziger tegenwoordig geconfronteerd wordt, groeide het idee om een website te ontwikkelen waar reizigers hun opgelopen vertragingen zouden kunnen ingeven. Naast het ingeven van vertragingen, moest deze website ook grafieken genereren op basis van de gebruikersinvoer. Ter controle werd ook een beheerssectie ontwikkelde die de gebruikerinvoer ten alle tijde moet kunnen reguleren. Voor de opbouw van deze website werd gebruik gemaakt van het Content Management Systeem Drupal. Voor dit CMS werden modules ontwikkeld die de benodigde functionaliteit implementeren. Trefwoorden Treinvertragingen, Drupal, module
Dankwoord In de eerste plaats willen wij onze twee begeleiders, Andy Georges en Kenneth Hoste, bedanken. Dankzij hun talloze suggesties en opbouwende kritiek kunnen we met tevredenheid op onze verwezenlijkingen terugkijken. Het is namelijk geen evidentie om in een e´ e´ njarige opleiding op een relatief korte tijd een eindwerk af te leveren. Verder willen wij onze promotor – en tevens “bezieler” van onze opleiding – professor Koen De Bosschere bedanken. We hebben allebei veel bijgeleerd tijdens deze kennismaking met de boeiende wereld van de informatica. Hierdoor waren we in staat om dit actueel onderwerp zo goed mogelijk uit te werken. Dank ook aan de mensen die onze website wilden “testen” en ons hierbij interessante feedback gaven. Hierbij mag zeker de auteur van spoorvreter.be niet vergeten worden. Ook bedanken we Peter voor zijn advies over hoe we het best gegevens ophaalden van de NMBS-website. Klaas bedankt voorts: ouders, broers, zussen en alle overige mensen die me steeds gesteund hebben. Hierbij verdient mijn vriendin Tilly zeker een speciale vermelding. Niels bedankt tevens: ouders (nu was het echt de laatste thesis), broer en familie, de Battlecar Relaxtecy-bandleden, mijn eeuwige sterre Nele en bij uitbreiding iedereen die mij gunstig gezind is.
Klaas Millet en Niels Hulstaert
iv
Inhoudsopgave 1
2
3
Inleiding 1.1 Treinvertragingen . . . . . . . . . . . . . . . . . . 1.2 Het gebruik van een Content Management Systeem 1.2.1 Drupal . . . . . . . . . . . . . . . . . . . 1.3 Het Drupalframework . . . . . . . . . . . . . . . . 1.3.1 De Drupal technologie stack . . . . . . . . 1.3.2 De Drupal core . . . . . . . . . . . . . . . 1.3.3 Administratieve interface . . . . . . . . . . 1.3.4 Nodes . . . . . . . . . . . . . . . . . . . . 1.3.5 Modules . . . . . . . . . . . . . . . . . . 1.3.6 Hooks . . . . . . . . . . . . . . . . . . . . 1.4 Drupal- en PHP-functionaliteit . . . . . . . . . . . 1.4.1 Gebruik van de Drupal-functionaliteit . . . 1.4.2 PHP-functies . . . . . . . . . . . . . . . . 1.5 Opbouw van de scriptie . . . . . . . . . . . . . . . Opbouw van de applicatie 2.1 Doelstelling . . . . . . . . . . . 2.2 Vereisten . . . . . . . . . . . . 2.2.1 Gebruikersvereisten . . 2.2.2 Beheerder-requirements 2.2.3 Applicatie-architectuur . 2.3 Use-case diagram . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
1 1 3 4 5 5 5 5 6 6 6 7 7 8 9
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
10 10 10 12 13 14 15
Applicatiebespreking 3.1 Databank . . . . . . . . . . . . . . . 3.2 Invoer van vertragingen/afschaffingen 3.2.1 Traject ingeven . . . . . . . . 3.2.2 Treinenoverzicht . . . . . . . 3.2.3 Overstappen ingeven . . . . . 3.2.4 Vertraging ingeven . . . . . . 3.2.5 Afschaffing bevestigen . . . . 3.3 Gegevensweergave . . . . . . . . . . 3.3.1 Grafieken . . . . . . . . . . . 3.3.2 Persoonlijke statistieken . . . 3.4 Beheer van de website . . . . . . . . 3.4.1 NMBS Stationsbeheer . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
17 17 19 19 20 22 23 24 25 25 32 34 34
. . . . . .
. . . . . .
v
vi
Inhoudsopgave 3.4.2 3.4.3 3.4.4
NMBS Vertragingsbeheer . . . . . . . . . . . . . . . . . . . . . . . . . . . NMBS Gebruikersbeheer . . . . . . . . . . . . . . . . . . . . . . . . . . . . NMBS Afschaffingsbeheer . . . . . . . . . . . . . . . . . . . . . . . . . . .
35 37 38
Besluit en toekomstperspectieven
39
Bibliografie
41
A Appendix A.1 Broncode: interactie NMBS-website . . . . . . . A.2 Gebruikersmogelijkheden . . . . . . . . . . . . . A.2.1 Ingeven van treinvertragingen . . . . . . A.2.2 Bekijken van de persoonlijke statistieken A.2.3 Opvragen van grafieken . . . . . . . . . A.3 Beheersmogelijkheden . . . . . . . . . . . . . . A.3.1 Nmbs Vertraginsgbeheer . . . . . . . . . A.3.2 Nmbs Stationsbeheer . . . . . . . . . . . A.3.3 Nmbs Gebruikersbeheer . . . . . . . . . A.3.4 Nmbs Afschaffingsbeheer . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
43 43 44 44 54 58 62 63 67 70 71
1
Inleiding 1.1
Treinvertragingen
Vertragingen waarmee treinreizigers geconfronteerd worden, zijn een vrij actueel thema. Nog onlangs was er immers heel wat discussie over de vernieuwde treinregeling die sinds 10 december 2007 in voege is. Volgend citaat van Martine Taelman in een vraag aan federaal minister Inge Vervotte illustreert dit: “De nieuwe dienstregeling zorgt voor vele vertragingen, vooral tijdens de spitsuren. De verbinding via Antwerpen die nu vaker wordt gebruikt, is voor de gebruikers geen valabel alternatief. Ook voor andere lijnen regent het klachten. Heel wat reizigers hebben te kampen met moeilijke aansluitingen, treinen die afgeschaft worden, grote vertragingen, slechte communicatie bij lastminutewijzigingen.”[1] De stiptheidsproblemen die de Nationale Maatschappij der Belgische Spoorwegen (NMBS) ondervindt worden duidelijk ge¨ıllustreerd door een onderzoek van de BTTB voor het jaar 2007: “De Bond van Trein-, Tram- en Busgebruikers (BTTB) en zijn Franstalige tegenhanger Association des Clients des Transports Publics (ACTP) stellen vast dat de stiptheid van de treinen erop achteruit gaat: 65% van de meer dan 10.000 geregistreerde treinritten verliep met vertraging.”[2] Een dergelijk gebrek aan stiptheid is allerminst nieuw, dit mag blijken uit een verslag van de plenaire zitting van de senaat op 29 oktober 1998 waarbij mevrouw Jeanmoye de bevoegde minister van vervoer (minister Daerden) interpelleert over de vertragingen bij de Nmbs: “Op 28 mei reeds hebben wij u ge¨ınterpelleerd over de vertragingen bij de NMBS. De situatie is er sindsdien niet op verbeterd en er komt meer en meer protest van de reizigers. U kondigt financi¨ele sancties aan ten aanzien van de NMBS in verhouding tot het percentage vertragingen van meer dan vijf minuten. Door die vertragingen dreigen de gebruikers het openbaar vervoer de rug toe te keren, zodat de files op onze wegen nog zullen toenemen.”[3] Uit bovenstaande mag blijken dat de stiptheid van de treinen een groot pijnpunt is van de NMBS. De NMBS berekent zelf ook de stiptheidscijfers van de treinen. Sinds dit jaar werd beslist om deze cijfers per trimester bekend te maken.1 Op een specifieke manier houdt Infrabel (de onafhankelijke infrastructuurbeheerder van het Belgische spoorwegnet) de vertragingen en de oorzaken van de vertragingen bij. 1 Voorheen
gebeurde dit per jaar.
1
Hoofdstuk 1. Inleiding
2
Er worden een aantal parameters bijgehouden. Allereerst is er het globale stiptheidcijfer. Dit stiptheidcijfer is gebaseerd op de gemeten vertraging in het eindstation van een bepaalde lijn. Hiernaast heeft Infrabel dit jaar ook besloten rekening te houden met eventuele weggewerkte of opgelopen vertragingen die zich tijdens de treinreis hebben voorgedaan, omdat deze betrekking hebben op de reizigers die uitstappen v´oo´ r het eindstation. Als gevolg hiervan meet Infrabel de stiptheid ook tijdens de treinreis, weliswaar slechts in 93 meetpunten op het treinnetwerk. Ook heeft Infrabel een methode uitgewerkt om de stiptheidsgraad te linken aan het aantal reizigers aan boord van de trein. Door deze methode wordt de vertraging van een trein met vele reizigers anders behandeld dan de vertraging van een trein met minder reizigers. De treinen worden in vier groepen onderverdeeld en gewogen op basis van hun aankomstuur en hun reisweg. De vier groepen zijn de volgende: 1. tijdens het spitsuur in Brussel 2. tijdens het spitsuur in Antwerpen-Centraal, Gent-Sint-Pieters, Charleroi-Zuid of Luik-Guillemins 3. tijdens het spitsuur in de rest van het land 4. tijdens de daluren en in het weekend in het hele land Naast het globale stiptheidscijfer wordt er ook rekening gehouden met het aantal verzekerde aansluitingen. Aangezien veel reizigers op een andere trein moeten overstappen om hun bestemming te bereiken, heeft Infrabel ervoor gekozen om het aantal geslaagde aansluitingen te meten. In de 10 voornaamste overstapstations (volgens Infrabel) van het land wordt nagegegaan hoeveel voorziene aansluitingen (met een overstaptijd van minstens 4 minuten en maximum 20 minuten) er daadwerkelijk worden gehaald. In deze meting beschouwt men de volgende stations: Antwerpen-Centraal, Bergen,Brugge, Charleroi, Gent-Sint-Pieters, Leuven, Luik, Mechelen, Namen en Zottegem. Ondanks de recente inspanningen die de NMBS lijkt te doen om nauwkeurigere en transparantere informatie te verschaffen inzake stiptheid, kunnen we ons de vraag stellen of de door de NMBS verschafte cijfers effectief een re¨eel beeld schetsen van de werkelijke vertragingen. Het is immers zo dat Infrabel vertragingen pas effectief meerekent indien de trein meer dan vijf minuten vertraging heeft bij aankomst [4]. Bovendien valt de vertraging enkel gedetailleerd te raadplegen voor de acht volgende verbindingen: 1. IC A Oostende-Eupen 2. IC B Brussel-Amsterdam 3. IC C Antwerpen-Kortrijk 4. IC D Herstal-Doornik 5. IC E Knokke / Blankenberge - Hasselt / Tongeren 6. IC J Brussel-Luxemburg 7. IC H Schaarbeek-Moeskroen 8. IC I Antwerpen - Charleroi
Hoofdstuk 1. Inleiding
3
Voor de vele kleine treinverbindingen wordt er dus geen gedetailleerde informatie vrijgegeven. Daarenboven is het globale stiptheidscijfer ook minder relevant voor treinreizigers op de kleinere verbindingen, aangezien deze zoals al aangegeven, minder “wegen” bij de stiptheidsmeting. Vanuit die optiek dachten we dat het interessant was een webapplicatie te ontwikkelen die het moest mogelijk maken om zonder onderscheid de vertragingen op specifieke reizigertrajecten te meten. In deze applicatie kan er informatie in verband met vertragingen opgevraagd worden voor zowel tussenstations als eindstations. Bovendien moet deze applicatie ook voor de kleinere lijnen specifieke vertragingsinformatie kunnen weergeven. Hoe dan ook is het een feit dat de treinvertragingen veel reizigers bezighouden. Dit blijkt alleszins wanneer we enkele sites op het net bekeken. Zo bestaan er toch enkele blogs die hun belevenissen als treinreiziger delen met de rest van de wereld. Hierbij bemerken we vaak ook speciale aandacht voor de vertragingen waarmee men als reiziger wordt geconfronteerd. Op http://spoorvreter. be bijvoorbeeld beschrijft de auteur vrij regelmatig hoeveel vertragingen hij op zijn trajecten heeft ondervonden. Ook andere bloggers (http://oomss.wordpress.com/, http://www.goegestapt. be/FR_Perrongeluk.html) vergeten de opgelopen vertragingen allerminst te vermelden. Door het ontwikkelen van deze applicatie hopen we een gecentraliseerd overzicht te kunnen verkrijgen van de Belgische treinvertragingen. Het idee zelf is niet nieuw. We merkten immers dat er in Nederland reeds een website bestaat waarop treinreizigers hun vertragingen kunnen registreren (http://www.treinvertragingen.nl). Deze site lijkt ons echter te beperkt uitgewerkt om een relevant beeld te schetsen van de werkelijke treinvertragingen. In onze webapplicatie wensten we toch heel wat meer functionaliteit aan te bieden.
1.2
Het gebruik van een Content Management Systeem
We opteren ervoor gebruik te maken van een web content management systeem (CMS). Een dergelijk systeem laat het toe om op een relatief eenvoudige wijze websites te bouwen en zo gegevens op het internet te publiceren. Douglas, Little en Smith formuleren het als volgt: “A content management system, or CMS, is an application that can be used to deal with various methods of web publishing. A CMS can generally be customized by adding or removing specific features, so that the end result is only those features that you want for your community. Features included with a CMS can include file management, photo galleries, private messaging, discussion forums, articles, polls, and much more...”[5] Voor onze webapplicatie wensen we gebruik te maken van een CMS omwille van de reeds ingebouwde nuttige functionaliteit in een dergelijk systeem. De ingebouwde mogelijkheden van een dergelijk systeem lijken ons van pas te komen bij de uitbouw van onze website. Onze bedoeling is immers het ontwikkelen van een door de gebruiker aangedreven applicatie waarbij later op eenvoudige wijze extra functionaliteiten zoals een forum, blogs of nieuwsberichten kunnen toegevoegd worden. Een CMS biedt het voordeel dat heel wat van deze functionaliteiten reeds standaard aanwezig zijn wat het in de toekomst makkelijker zal maken om de website verder te ontwikkelen. Een dergelijk systeem biedt voorts het voordeel dat we er van uit kunnen gaan dat de ge¨ımplementeerde functionaliteiten degelijk getest zijn en dus ook goed werken.
Hoofdstuk 1. Inleiding
1.2.1
4
Drupal
Voor ons eindwerk hebben we specifiek gebruik gemaakt van het Drupal content management systeem. Dit CMS laat toe op een eenvoudige manier inhoud (zoals teksten, afbeeldingen, bestanden en audio) te beheren en te publiceren op het web. Het is een platform dat kan uitgebreid worden met verscheidene – al dan niet zelf geschreven – modules. Drupal bevat bovendien ook een aantal API’s die webdevelopers toelaten op een effic¨ıente en snelle wijze webapplicaties te bouwen. Drupal is een open source systeem 2 , dat zijn oorsprong vindt in een kleine nieuwssite opgericht door Dries Buytaert in het jaar 2000. Deze nieuwssite die bedoeld was om met kotgenoten te communiceren evolueerde langzaam maar zeker tot het content management zoals we het de dag van vandaag kennen 3 . Het wordt gekenmerkt door de grote gemeenschap van gebruikers en developers die ervoor zorgen dat dit systeem blijft bestaan en verder evolueert. Drupal dat beschikbaar is onder de GNU General Public License [6] blijkt heden ten dage in de lift te zitten, steeds meer websites worden er immers mee opgebouwd. Bekende websites die gebruik maken van Drupal zijn ondermeer deze van Acquia 4 , Amnesty International, Ubuntu, MTV UK... Een belangrijke reden die onze keuze voor Drupal bepaalde, is het open source karakter van dit systeem. Er waren echter ook andere zaken die onze voorkeur bepaalden. Zo bleken de mogelijkheden van Drupal heel uitgebreid. Ondanks de relatief kleine basis van dit systeem in vergelijking met andere CMS’en5 , bleek Drupal toch heel krachtig. Hoewel we een zekere aanpassingsperiode nodig hadden om te wennen aan het CMS, kwam de structuur van het systeem ons al gauw als vrij logisch over. Door het systeem van modules leek het ons dan uiteindelijk interessant om de applicatie, die wij wensten te ontwikkelen, binnen Drupal te integreren. Een groot voordeel bij Drupal leek ons ook het feit dat er reeds een grote gemeenschap is ontstaan rond dit systeem, wat toch duidt op een zekere betrouwbaarheid. Bovendien kon deze gemeenschap ons van pas komen indien we problemen ondervonden tijdens het ontwikkelen van onze webapplicatie binnen de Drupalomgeving. Alvorens we definitief besloten Drupal te gebruiken, informeerden we ons toch nog over enkele andere open source systemen zoals Joomla [7] en CakePHP [8]. Dit laatste is meer een PHP-framework6 dat gebruik maakt van het model-view-controller model 7 . Op zich leek dit wel een degelijk systeem, maar we misten een beetje de functionaliteiten die je bij een CMS standaard hebt. Joomla en Drupal leken ons qua opzet vrij gelijkaardig. Uiteindelijk werd de keuze voor Drupal bepaald door het meer gemeenschapsgerichte karakter van dit systeem, aangezien onze webapplicatie zich toch op een zekere gemeenschap van treingebruikers zal richten. Bovendien hadden we het gevoel dat Drupal misschien toch ook iets meer mogelijkheden biedt dan Joomla. Vooral naar gebruikersbeheer toe leek Drupal ons interessanter. Misschien werd onze keuze ook wel enigszins be¨ınvloed door chauvinistische motieven. Het feit dat Drupal opgericht is door een Belgische student die zijn doctoraat behaalde aan de Universiteit van Gent pleitte immers zeker niet in het nadeel van dit CMS. Dit neemt echter niet weg dat Drupal gewoon een uitstekend systeem is dat zeer goed aansluit bij hetgeen wij voor ogen hadden. 2 Volgens
Van Dale: software waarvan de broncode voor iedereen beschikbaar is en door iedereen te veranderen.[9] informatie over de geschiedenis van Drupal: http://drupal.org/node/769. 4 Een in Boston gevestigd bedrijf dat opgericht werd eind 2007 dat professionele, commerci¨ele Drupal ondersteuning zal aanbieden in de vorm van diensten en software. E´en van de co-founders is Dries Buytaert. 5 Zo is het aantal lijnen code bij Drupal beduidend kleiner dan bij Joomla. 6 PHP: Hypertext Preprocessor. 7 Structuur (of patroon) dat het ontwerp van complexe toepassingen opdeelt in drie eenheden met verschillende verantwoordelijkheden: Datamodel (Model), Datapresentatie (View) en Applicatielogica (Controller). Het scheiden van deze verantwoordelijkheden bevordert de leesbaarheid en herbruikbaarheid van code.[10] 3 Meer
Hoofdstuk 1. Inleiding
1.3
5
Het Drupalframework
Drupal is ontstaan vanuit het idee dat dit systeem moest kunnen draaien op goedkope webhosting. Anderzijds was het wel de bedoeling een systeem te ontwerpen dat ook complexe, uitgebreide websites kon ondersteunen. De opbouw van het systeem moet dan ook vanuit deze optiek bekeken worden [11].
1.3.1
De Drupal technologie stack
De technologie stack van Drupal bestaat uit vier componenten: • de programmeertaal • de databank • de webserver • het besturingssysteem Drupal draait perfect op de LAMP stack. LAMP is een acroniem van het besturingssysteem Linux, de webserver Apache, de databaseserver MySQL en de scripttaal PHP [12]. Het is Open Source software die vaak samen gebruikt worden om dynamische websites te draaien. Deze LAMP stack is uitgegroeid tot van de meest gebruikte Webplatformen. Drupal ondersteunt echter niet alleen de software van de LAMP stack. Zo kan gelijk welke webserver die ook ondersteuning biedt aan PHP, Drupal ondersteunen. Ook het gebruik van Apache als webserver of MySQL als databank is niet verplicht. De scripttaal PHP is wel essentieel voor Drupal. Dit Content Management Systeem is immers geschreven in PHP. Aangezien deze scripttaal vrij eenvoudig te leren valt, is veel code geschreven door beginners en bijgevolg is de kwaliteit hiervan dan ook niet altijd aanvaardbaar. Toch kan PHP gebruikt worden om goede code te schrijven. Zo is alle kerncode van Drupal geschreven volgens strikte programmeerstandaarden. Voorts dient nog vermeld dat de Drupal een databankabstractielaag aanbiedt waarmee er kan gecommuniceerd worden met de databank. Deze abstractielaag past de SQL-queries aan zodanig dat verschillende soorten databanken kunnen gebruikt worden, zonder dat de code dient aangepast te worden. De meest geteste databanken hiervoor zijn MySQL en PostgreSQL.
1.3.2
De Drupal core
Een licht maar krachtig framework vormt de core van Drupal. Deze core verzorgt de basisfunctionaliteit die gebruikt wordt om andere delen van het systeem te ondersteunen. De core omvat code die het Drupal systeem toelaat te reageren wanneer het een request ontvangt en een bibliotheek met vaak gebruikte functies zoals drupal set message() of form set error(). Tot slot zijn in deze core ook de modules vervat die basisfunctionaliteit zoals taxonomie8 en gebruikersbeheer bieden.
1.3.3
Administratieve interface
De administratieve interface in Drupal is sterk ge¨ıntegreerd met de rest van de Drupalsite. De eerste gebruiker die zich registreert wordt automatisch beheerder en verkrijgt aldus volledige toegang tot de website. Na het inloggen als gebruiker, verschijnt er een beheerderslink binnen het gebruikersblok. Door hierop te klikken komt de gebruiker in het administratief gedeelte van de website. 8 Dit
is Drupals systeem om inhoud onder te verdelen in categori¨en.
Hoofdstuk 1. Inleiding
1.3.4
6
Nodes
Inhoudstypes in Drupal zijn allemaal afgeleid van e´ e´ n basistype dat aangeduid wordt als een node. Alle inhoudstypes, of het nu een blog of een nieuwsbericht is, bestaan uit eenzelfde onderliggende datastructuur. Een dergelijke opbouw bevordert het toevoegen van functionaliteit aan verschillende types inhoud. Nodes bevatten ook een aantal vaste gedragseigenschappen die alle inhoudstypes overerven. Zo kan bijvoorbeeld gelijk welke node op de voorpagina weergegeven worden.
1.3.5
Modules
Drupal is modulair opgebouwd wat inhoudt dat de functionaliteit van dit systeem vervat zit in modules, die ingeschakeld of uitgeschakeld kunnen worden9 .Dit heeft als voordeel dat de beheerder eenvoudig zelf kan bepalen hoeveel functionaliteit er wordt toegevoegd aan de website. Drupal maakt gebruik van het inversion of control ontwerp mechanisme. Het basisprincipe hierbij is dat het framework op de hoogte is van de modulaire functionaliteit en deze zelf aanroept wanneer dit nodig blijkt [13]. Om dit principe te kunnen verwezenlijken wordt er in Drupal gebruik gemaakt van zogenaamde hooks.
1.3.6
Hooks
Het Drupal module systeem is gebaseerd op het concept van hooks [14], die beschouwd kunnen worden als interne Drupal events. Bij het schrijven van een module moeten de benodigde hooks ge¨ımplementeerd worden. Deze laten de modules toe te “communiceren” met de Drupal core. Als Drupal de interventie wenst van modules, zal het framework controleren welke modules een specifieke hook implementeren en voor elke module in de resulterende verzameling de betreffende hook opvragen. Voorbeeld 1.1. Een hook die heel vaak gebruikt werd in onze module is hook validate(). Deze wordt gebruikt om na te gaan of een bepaalde node geldig is. Als we in onze module een webformulier willen aanmaken kunnen we volgende functienaam gebruiken om deze pagina te defini¨eren: traject ingeven(). Als we nu willen maken dat Drupal deze functie ook effectief valideert moeten we een hook gebruiken. Deze hook wordt in dit geval gecre¨eerd door volgende functie: traject ingeven validate(). Indien deze validatehook toegevoegd is zorgt dit ervoor dat na het indrukken van een “submitknop” de invoer van het webformulier eerst gevalideerd wordt in de validatiefunctie alvorens over te gaan naar de hook submit functie. (die in dit geval de naam traject ingeven submit() zou hebben.) Indien de validatie faalt kan de ontwerper aan de hand van de form set error-functie ervoor zorgen dat er een foutboodschap op het scherm verschijnt en dat er dus niet overgegaan wordt naar de submitfase. De gebruiker blijft dan op de pagina van gegevensinvoer.
9 Met
uitzondering dan van enkele core modules die essentieel zijn om de goede werking van de website te handhaven.
Hoofdstuk 1. Inleiding
1.4 1.4.1
7
Drupal- en PHP-functionaliteit Gebruik van de Drupal-functionaliteit
Opbouw van de module Het opbouwen van onze modules gebeurde op basis van een tutorial op de Drupalwebsite die zich specifiek richtte op het cre¨eren van modules. Bij het cre¨eren van onze module maakten we dan ook gebruik van heel wat ingebouwde Drupalfuncties. Zo gebruikten we een eerste functie om de permissies in te stellen voor onze module. Ook heel wat uitleg die op de verschillende pagina’s staat, wordt in het begin van de module gedefinieerd in een specifieke helpfunctie die standaard aanwezig is. Ook de verschillende menu-items, met de juiste verwijzingen naar de verscheidene pagina’s, kunnen met behulp van een standaardfunctie ge¨ımplementeerd worden. Overigens zijn de aangemaakte pagina’s in feite allemaal specifieke functies die opgeroepen worden door de voorheen gedeclareerde menu-items. In die menu-items wordt dan ook telkens aangeduid welke authenticatierechten vereist zijn om dit specifieke menu-item te kunnen raadplegen. Voorts kan er nog ingesteld worden of een menu-item effectief dient weergegeven te worden, waar het menu-item moet geplaatst worden en of een menu-item het kind of de ouder is van een ander menu-item. Specifieke functies Naast de meer algemene functies die we nodig hadden om een basismodule op te bouwen maakten we gebruik van meer specifieke functies om de module te cre¨eren naar de vooropgestelde behoeften. Zo moesten er heel wat formulieren aangemaakt worden. Voor deze webformulieren maakten we geen gebruik van standaard HTML-code. De webformulieren werden immers aangemaakt met behulp van de ingebouwde formfuncties die door de forms api beschreven worden [15]. Niet alle mogelijkheden van deze forms zijn altijd even goed beschreven op de Drupalwebsite, toch slaagden we erin de benodigde form-functionaliteiten op een consistente manier te implementeren in de modules. De gegevensinvoer van de webformulieren diende veelal om informatie op te vragen of in te voeren van de Drupaldatabank. Hiervoor werd gebruik gemaakt van SQL-statements die voldeden aan de vereisten van Drupal. Een functie waarvan we ook vaak gebruik maakten is de drupal set message-functie. Deze liet ons toe op een eenvoudige wijze een statusbericht of foutmelding weer te geven. Een gelijkaardige functie is de form set error-functie die specifiek bedoeld is voor het genereren van foutboodschappen bij webformulieren. Voorts werd ook gebruik gemaakt van een batch die toeliet gegevens uit een CSV-bestand te importeren. Dit is het geval bij de optie stationsbeheer in de beheerssectie van de website. Ook werd de animatie van deze batch gebruikt bij het invoeren van de vertraging en het opvragen van de specifieke grafieken10 . Tot slot dienen we ook nog de Javascript-functie tableselect te vermelden die we gebruikten binnen het menu “Vertragingsbeheer”. Ook deze functie was standaard aanwezig in Drupal en laat toe alle aanwezige checkboxes te selecteren. 10 Deze animatie werd om esthetische redenen toegevoegd. Het opvragen van de trajecten lijkt volgens ons op die manier dynamischer over te komen.
8
Hoofdstuk 1. Inleiding Mollom
Naast de core modules die standaard aanwezig zijn in Drupal installeerden we ook nog de Mollommodule [16]. Mollom is een platform waarbij nagegaan wordt of de ingevoerde gegevens op een website spam (ongeweste post) of ham (gewenste post) zijn. Het is mogelijk dat dit systeem niet zeker is of de gegevensinvoer gewenst of ongewenst is. Vervolgens zal Mollom de analyse van de postgegevens terugsturen naar de website. Indien een post gemarkeerd wordt als Ham, zal deze door de website geaccepteerd worden. Indien gemarkeerd als Spam zal de website de post verwerpen. In het geval van onzekerheid zal Mollom een captcha-afbeelding meesturen om na te gaan of de gebruiker geen spambot is [17]. Het systeem biedt een aantal duidelijke voordelen. De controle op de gebruikersinvoer gebeurt extern bij Mollom. Indien er toch spam toegelaten wordt op je website kan dit gemeld worden aan Mollom. Hierdoor verkrijgt Mollom heel wat data waardoor er een goede gewogen beslissing kan gemaakt worden of de gebruikersinvoer als hetzij Spam hetzij Ham moet gemarkeerd worden [17]. Deze module leek ons vooral interessant voor controle bij de gebruikersregistratie. Ook in een latere fase, wanneer we een forum of iets dergelijks zouden willen installeren, kan deze Mollom-module zeker van pas komen.
1.4.2
PHP-functies
Aangezien Drupal geschreven is in PHP, hebben we onze modules veelvuldig gebruik gemaakt van PHP-functies [18]. In onderstaande tabel geven we een overzicht van een aantal door ons frequent gebruikte PHP-functies. We vermelden enkel de functie-naam (zonder argumenten) en een korte beschrijving. Functie
Omschrijving
mktime date time strtotime empty explode implode split list isset db fetch array
zet een tijdstip om naar een UNIX timestamp zet een timestamp om naar een te specificeren tijdsformaat geeft de huidige tijd in timestamp-formaat terug zet een tijdsformaat om naar een UNIX timestamp geeft “true” of “false” terug als een array al dan niet leeg is splitst een string op basis van een karakterreeks op in een array van strings voegt een array samen tot een string met een bepaalde string als “lijm” zet een string a.d.h.v. een reguliere uitdrukking om in een array kent de elementen van een array toe aan gespecificeerde variabelen geeft “true” of “false” terug als een (sessie)variabele al dan niet gedeclareerd is gegevens uit een database worden opgehaald en in een array geplaatst Tabel 1.1: Veel gebruikte PHP-functies.
Hoofdstuk 1. Inleiding
1.5
9
Opbouw van de scriptie
In deze scriptie zullen we eerst de opbouw van de ontwikkelde webapplicatie bespreken. Hierbij worden eerst de gewenste doelstellingen van de applicatie aangegeven, waarna er meer aandacht komt voor de specifieke noden van de gebruiker en de beheerder. Daarnaast wordt er ook kort aandacht besteed aan de betrouwbaarheid van de gegevens die gebruikt worden. Tot slot wordt in dit hoofdstuk, aan de hand van een use-case diagram, de verschillende mogelijkheden van de ontworpen applicatie beknopt besproken (zie Hoofdstuk 2). Het hier opvolgende hoofdstuk richt zich dan specifiek naar de applicatie zelf. Na een overzicht van de databankstructuur worden de mogelijkheden van de applicatie, voor zowel gebruiker als beheerder, uitgebreid toegelicht (Hoofdstuk 3). Tot slot wordt aangegeven in hoeverre de applicatie aan de oorspronkelijke doelstellingen voldoet waarbij ook de eventuele toekomstige ontwikkelingen vermeld worden.
Opbouw van de applicatie 2.1
2
Doelstelling
Het doel van onze webapplicatie is tweeledig. Ten eerste is het de bedoeling dat de treinreiziger aan de hand van de ingegeven vertragingen en afschaffingen een beeld krijgt van de werkelijke reisduur op een bepaald traject. Hoe meer mensen actief gebruik maken van de applicatie, hoe realistischer dit beeld zal zijn. Een pendelaar kan dan, aan de hand van de verkregen informatie over zijn voorkeurstraject, eventueel opteren om een vroegere of latere trein te nemen. De applicatie verschaft met andere woorden additionele info over een traject, die de NMBS zelf niet vrijgeeft. Ten tweede is het de bedoeling om de persoonlijke statistieken van een pendelaar bij te houden, al dan niet met het oog op compensaties van de NMBS. Door die gegevens op te slaan en nadien ook te tonen in tabellen en grafieken, krijgt de gebruiker een duidelijk overzicht van zijn opgelopen vertragingen, afschaffingen en van zijn reisgedrag in het algemeen.
2.2
Vereisten
De vereisten voor de applicatie zijn afhankelijk van de functie van de gebruiker, in dit kader ook wel actor genoemd. Enerzijds is er de gebruiker, waarbij we nog een onderscheid maken tussen de geregistreerde (actieve) gebruiker1 en de niet-geregistreerde (passieve) gebruiker. Anderzijds is er de beheerder, die het geheel moet co¨ordineren. We bespreken de noden van deze twee actoren dan ook afzonderlijk. Verder heeft de applicatie, onafhankelijk van de actoren, ook een aantal vereisten. We denken hierbij bijvoorbeeld aan de interactie met de NMBS-website. Aan de hand van de vereisten die in de volgende sectie besproken worden, stellen we vervolgens een use-case diagram op (zie Sectie 2.3). Dit schematisch overzicht vormt het skelet van de applicatie. De verschillende onderdelen van het diagram worden ten slotte kort besproken. Voor de specifieke vereisten beschreven worden, overlopen we eerst de gebruikte terminologie; • Lijn: Met een (spoor)lijn wordt een aantal stations bedoeld die met elkaar verbonden zijn door een spoorweg. Alle Belgische spoorlijnen zijn genummerd; zo verbindt bijvoorbeeld lijn 50A Brussel met Oostende, met o.a. Gent-Sint-Pieters, Landegem, Hansbeke en Bellem als tussenstations [19]. Het begin- en eindstation van deze lijn is respectievelijk Brussel-Zuid en Oostende. 1 Een geregistreerde gebruiker die niet ingelogd is heeft uiteraard dezelfde toegangsrechten als een niet-geregistreerde gebruiker.
10
Hoofdstuk 2. Opbouw van de applicatie
11
• Traject: Aangezien de term traject frequent gebruikt wordt in de bespreking, is het van belang om duidelijk te stellen wat wij daaronder term verstaan. Algemeen is een traject de weg die de pendelaar tussen vertrek- en aankomststation per trein aflegt. Als de treinreiziger onderweg e´ e´ n of meerdere keren moet overstappen, spreken we van een onrechtstreeks traject, in het andere geval van een rechtstreeks traject. Bij een onrechtstreeks traject (met overstappen dus) wisselt de pendelaar met andere woorden van lijn. Omdat we in het vervolg het vooral over trajecten zonder overstappen zullen hebben, vermelden we voor de eenvoud “rechtstreeks” niet altijd. Indien een onrechtstreeks traject besproken wordt, zal dit steeds nadrukkelijk vermeld worden. • Traject- of treindetails: Met behulp van de trajectdetails kan door de applicatie een onderscheid gemaakt worden tussen de verschillende rechtstreekse trajecten. We beschouwen de volgende details: – Vertrek- en aankomststation – Vertrek- en aankomstdatum – Vertrek- en aankomstuur – Reisduur – Treinsoort De verschillende treinsoorten die de NMBS onderscheidt2 zijn de volgende [20]: – IC: InterCity; exprestrein die alleen op de allerbelangrijkste stations stopt. – IR: InterRegio; exprestrein die op de belangrijkere stations stopt. – L: Lokale trein; stopt op (bijna) alle stations. – CR: CityRail; voorstadstrein rond Brussel, stopt op de meeste stations. – P: Piekuurtrein; trein die enkel tijdens de piekmomenten spoort. – ICT: Toeristentrein: trein die rijdt op piekmomenten naar toeristische bestemmingen. • Trajectspecificatie: Hieronder verstaan we de hoeveelheid invoer die de applicatie van een gebruiker vergt om een traject te specificeren aan de hand van de trajectdetails. Zoals verder besproken wordt, hoeft de gebruiker niet eigenhandig alle trajectdetails in de geven. • Trajectregistratie: Dit is de ingevoerde vertraging of afschaffing die door een bepaalde geregistreerde gebruiker werd ingevoerd. • Trajectinformatie: Hiermee bedoelen we het geheel van de trajectregistraties binnen een beschouwde periode van een bepaald traject. Opmerking 2.1. Aan de hand van de voorbeeldlijn 50A maken we volgende belangrijke opmerking; de (rechtstreekse) trajecten Oostende - Landegem en Oostende - Bellem worden als afzonderlijke trajecten beschouwd, ook al zijn ze onderdeel van dezelfde lijn en hebben ze gemeenschappelijke stations. Een rechtstreeks traject wordt namelijk bepaald door de trajectdetails, en de twee beschouwde trajecten hebben een verschillend eindstation (Landegem en Bellem respectievelijk). 2 De
Extra-treinen die ingezet worden bij festivals, concerten en andere evenementen laten we buiten beschouwing.
Hoofdstuk 2. Opbouw van de applicatie
2.2.1
12
Gebruikersvereisten
We beginnen deze sectie met twee voorbeelden om de vereisten voor de gebruiker in te verduidelijken. Voorbeeld 2.1. Een gebruiker heeft op 05/05/2008 het traject Oostende - Aalter afgelegd. De ICtrein van 16.05u - 16.31u (reisduur 26 min.) is met 5 minuten vertraging aangekomen te Aalter. De gebruiker wil zijn opgelopen vertraging registreren en hij wil nadien ook al zijn trajectregistraties kunnen opvragen. Voorbeeld 2.2. Een pendelaar wil volgend weekend met de trein naar zee (traject Gent-Sint-Pieters - Knokke). Hij zou willen weten wat de gemiddelde vertragingen zijn van de treinen die rond 10 uur vertrekken. Indien het traject kan afgelegd worden met verschillende treinsoorten, wil hij die ook kunnen vergelijken met elkaar. Vertragingen/afschaffingen ingeven Een gebruiker moet op een gebruiksvriendelijke manier opgelopen vertragingen en afschaffingen kunnen ingeven. Hiermee bedoelen we het volgende: • Minimale invoer: De applicatie mag niet enkel toegankelijk zijn voor de doorwinterde pendelaar, ook de occasionele treinreiziger moet op eenvoudige wijze trajectinformatie kunnen ingeven. We gaan er met andere woorden vanuit dat de gebruiker die een vertraging/afschaffing wil invoeren trajectdetails zoals treinsoort en excact vertrek- en aankomstuur niet uit het hoofd kent. Het absolute minimum aan informatie dat een gebruiker van onze applicatie dient te weten is het vertrek- en eindstation3 en de datum, met bijhorend richttijdstip, waarop de trein gespoord heeft. Met richttijdstip bedoelen we een tijdstip omstreeks het exacte vertrektijdstip van de trein. • Minimale invoertijd: Het aantal pagina’s dat een gebruiker moet doorlopen tot zijn vertraging/afschaffing geregistreerd wordt, dient tevens beperkt te blijven. • Foutieve invoer: De gebruiker moet de mogelijkheid hebben om, zowel tijdens als na het registratieproces, foutieve invoer te corrigeren. Tijdens de registratie moet de gebruiker bijvoorbeeld kunnen terugkeren naar een vorige pagina, nadien moet de ingegeven vertraging kunnen gewijzigd worden. Gegevens opvragen Aangezien de applicatie als doel heeft trajectinformatie te bekomen, is de gegevensweergave een belangrijk onderdeel van het gebruikersgedeelte. Er moet hierbij met een aantal aspecten rekening gehouden worden: • Invoer: Als de gebruiker informatie over de vertragingen en afschaffingen van een bepaald traject wil opvragen, moet het traject eerst gespecificeerd worden. Zoals bij een vertraging of afschaffing ingeven mag die specificatie niet te veel tijd kosten. Het is tevens aan te raden dat de gegevensopvraging in de mate van het mogelijke analoog is aan de gegevensregistratie. We bedoelen hiermee dat een gebruiker die reeds een vertraging of afschaffing heeft geregistreerd in staat moet zijn om zonder problemen vertragingsgrafieken op te vragen, en omgekeerd. 3 Door
de autocomplete-functie (zie Sectie 3.2.1) is het zelfs niet nodig om de volledige stationsnaam te kennen.
Hoofdstuk 2. Opbouw van de applicatie
13
• Privacy: De privacy van de gebruiker moet bewaard blijven; gebruikers mogen geenszins informatie over de andere geregistreerde gebruikers kunnen opvragen. Trajectinformatie dient dus anoniem weergegeven te worden4 . • Persoonlijke registraties: Een gebruiker moet de mogelijkheid hebben om enkel zijn persoonlijke trajectregistraties te bekijken. Dit is een eerste reden om te stellen dat gebruikers zich eerst moeten registreren alvorens vertragingen/afschaffingen in te kunnen geven. “Passieve” gebruikers, die enkel trajectinformatie willen opvragen, hoeven uiteraard niet geregistreerd te zijn. • Dataspecificatie: Bij de weergave van trajectinformatie moeten de parameters (tijdsinterval, labels van de assen) duidelijk gespecificeerd worden. De gebruiker moet ook de mogelijkheid hebben om een aantal van die parameters (zoals weergave, de beschouwde periode) zelf aan te passen. • Datavisualisatie: De gebruiker heeft baat bij een relevante en visueel aantrekkelijke datavisualisatie. Daarom is het belangrijk om de opgevraagde trajectinfomatie op een aantal verschillende manieren weer te geven, door middel van grafieken, diagrammen en tabellen. Het ophalen en verwerken van de gegevens mag niet te veel tijd kosten. Het is beter dat de visualisaties tevens geen bijkomende installaties5 van de gebruiker vergen. Bovenstaande vereisten zorgen ervoor dat de al dan niet geregistreerde gebruiker vlot met de applicatie overweg moet kunnen. De taak van de beheerder bestaat er dan in om de invoer van de verschillende gebruikers in goede banen te leiden. We bespreken dit in de volgende sectie.
2.2.2
Beheerder-requirements
De beheerder fungeert als moderator; aangezien de applicatie gebaseerd is op gebruikersinvoer, is het noodzakelijk om in de mate van het mogelijke misbruik of foutieve invoer tegen te gaan. Voorts moet de beheerder in staat zijn updates (beveiliging, nieuwe CMS-versie, enz..) door te voeren, zonder hiervoor op de hoogte te moeten zijn van de broncode van de module. We bespreken kort de benodigdheden waarover de beheerder moet beschikken om zijn taak naar behoren te volbrengen. Probleemstellingen Zoals reeds gezegd moet een gebruiker zich eerst registreren voor hij vertragingen of afschaffingen kan ingeven. Op die manier kunnen de ingaven specifiek per gebruiker bijgehouden worden. Er kunnen zich een aantal probleemscenario’s voordoen die beheerder effici¨ent moet kunnen oplossen. We illustreren dit aan de hand van een aantal voorbeelden. Voorbeeld 2.3. Een gebruiker heeft een vertraging ingegeven voor een specifiek traject waarvoor reeds vertragingen werden geregistreerd. De beschouwde vertraging wijkt echter heel wat af van hetgeen andere gebruikers hebben ingevoerd. De beheerder wil alle registraties voor dit traject bekijken om aan de hand daarvan te afwijkende vertraging al dan niet goed te keuren.
4 Zoals 5 We
verder besproken wordt, kunnen geregistreerde gebruikers wel enkel hun persoonlijke registraties bekijken. doelen hierbij op bv. flash-grafieken.
Hoofdstuk 2. Opbouw van de applicatie
14
Voorbeeld 2.4. Gebruiker A heeft een traject als afgeschaft geregistreerd, terwijl gebruiker B voor hetzelfde traject reeds een vertraging had ingegeven. De beheerder wil nagaan of er nog gebruikers een vertraging of afschaffing voor het beschouwde traject geregistreerd hebben. Indien er (bvb.) 6 verschillende gebruikers een vertraging ingevoerd hebben, wil de beheerder de afschaffing ingegeven door gebruiker A verwijderen. De vereisten om als beheerder bovenstaande problemen op te lossen zijn de volgende: • Conflicterende invoer: Indien een aantal gebruikers een vertraging ingeven voor dezelfde trein, wordt voor de vertragingsgrafieken het gemiddelde berekend. Waarden die niet binnen een statistisch verantwoord interval van dat gemiddelde liggen (zie Sectie 3.2.4), moeten door de beheerder opgevraagd en ge¨evalueerd kunnen worden. Hetzelfde geldt voor conflicterende afschaffingen en vertragingen; als de ene gebruiker een bepaalde trein als afgeschaft opgeeft en een andere voert voor diezelfde trein een vertraging in, moet de beheerder de ingaven voor dat traject kunnen analyseren. • Gebruikersbeheer: Een gebruiker kan om allerlei redenen malafide data ingeven6 . De beheerder moet daarom alle invoer van een bepaalde geregistreerde gebruiker kunnen bekijken en – in het slechtste geval – de ingegeven data verwijderen en die persoon blokkeren. Updates De beheerder moet tevens in staat zijn aanpassingen door te voeren om de website up to date te houden. Vooral beveiligingsupdates zijn van cruciaal belang voor de correcte werking van de applicatie. Het is met andere woorden belangrijk om over een goed content management systeem te beschikken, waarmee de beheerder zonder al te veel voorkennis overweg kan. Momenteel zijn wij nog de beheerders, maar in de toekomst zou het beheer even goed aan iemand anders kunnen overgelaten worden.
2.2.3
Applicatie-architectuur
Interactie met de NMBS De beheerder moet in principe zijn taak kunnen uitvoeren zonder kennis van de broncode van de applicatie; gegevensverwerking, gegevensweergave, registratie, enz... gebeurt allemaal in de “black box” van de applicatie. E´en van de belangrijkste componenten hierbij is de interactie met de NMBSwebsite. De gebruiker moet, als hij een vertraging of afschaffing wil ingeven, kunnen kiezen uit trajecten van de huidige dienstregeling van de NMBS. Hoe dit gebeurt is voor de gebruiker niet van belang, de informatie moet alleen up to date zijn. Gegevensopslag De invoer van de gebruiker moet op een effectieve manier bijgehouden worden in een databank. Hiermee bedoelen we dat er geen data dubbel mag opgeslagen worden. Een MySQL-database, in combinatie met PHP wordt veel gebruikt bij webapplicaties zoals de onze.
6 Een
gefrustreerde pendelaar kan bijvoorbeeld een tiental minuten bij zijn opgelopen vertraging tellen.
15
Hoofdstuk 2. Opbouw van de applicatie
2.3
Use-case diagram
Aan de hand van al de verschillende vereisten werd onderstaand diagram opgesteld. We beschouwen zoals reeds vermeld drie types actoren; de geregistreerde en de anonieme gebruiker langs de ene kant, de beheerder van de applicatie aan de andere kant. Een niet-geregistreerde gebruiker kan enkel grafieken opvragen, terwijl een geregistreerde gebruiker naast vertragingen en afschaffingen ingeven ook zijn persoonlijke statistieken kan bekijken. De acties die enkel de beheerder kan ondernemen werden aan de applicatie toegevoegd om de gebruikersinvoer te modereren.
G ra fie ke n o p vra g e n
A n o n ie m e g e b ru ike r P e rso o n lijke sta tistie ke n
In lo g g e n /R e g istre re n
V e rtra g in g /A fsch a ffin g in g e ve n
S ta tio n sb e h e e r
B e h e e rd e r V e rtra g in g sb e h e e r
A a n g e m e ld e g e b ru ike r G e b ru ike rsb e h e e r
A fsch a ffin g sb e h e e r
Figuur 2.1: Use-case diagram van de applicatie met de verschillende actoren (groen) en de verschillende cases (blauw).
We bespreken kort de verschillende functies van de applicatie aan de hand van bovenstaand schema. In het volgende hoofdstuk wordt elke component dan uitvoerig besproken.
Hoofdstuk 2. Opbouw van de applicatie
16
• Inloggen/Registreren: De gebruikerslogin behoort tot de standaard Drupal-functionaliteit. Een nieuwe gebruiker kan zich laten registreren door een emailadres, gebruikersnaam en paswoord in te geven. Reeds geregistreerde gebruikers moeten zich inloggen om toegangsrechten te krijgen tot ondermeer hun persoonlijke statistieken. • Grafieken opvragen: Al dan niet geregistreerde gebruikers kunnen de reeds ingevoerde trajectinformatie van een bepaald traject opvragen. Hierbij kan men kiezen uit drie grafiek-klassen. Grafieken 1 verschaft informatie over een specifiek traject, terwijl Grafieken 2 en Grafieken 3 de ingevoerde vertragingen voor alle trajecten tussen een bepaald vertrek- en aankomststation tonen. Hierdoor kan de gebruiker op overzichtelijke wijze de verschillende treinen die sporen tussen twee stations vergelijken. Voor verdere uitleg omtrent de verschillende grafiek-klassen en voorbeeldgrafieken verwijzen we naar Sectie 3.3.1. • Persoonlijke statistieken: Ingelogde gebruikers kunnen hier hun reeds ingevoerde trajectregistraties oproepen. Zoals wordt besproken in Sectie 3.3.2, bestaat Persoonlijke statistieken uit de tabbladen Recente lijnen, Ingevoerde vertragingen/afschaffingen, Extra en Jaarstatistieken. We verschaffen de gebruiker dus een uitgebreid aanbod om zijn persoonlijke registraties weer te geven. • Vertraging/afschaffing ingeven: Het “hart” van de applicatie; hoe meer mensen een bepaald traject registreren, hoe dichter de gemiddelde vertraging bij de werkelijke vertraging van dat traject zal aanleunen. Om over de recentste dienstregeling te beschikken, wordt er telkens een verbinding opgezet met de NMBS-website. De gebruiker heeft na invoeren van een aantal trajectdetails de keuze uit een aantal treinen, waarna zijn vertraging of afschaffing van de door hem geselecteerde trein geregistreerd wordt (zie Sectie 3.2). • Stationsbeheer: Met deze functie kan de beheerder de tabel nmbs stations uit de databank bewerken (zie Sectie 3.1). Een lijst van beschikbare stations kan als CSV-bestand ge¨ımporteerd worden, nieuwe stations kunnen toegevoegd worden, voormalige stations kunnen verwijderd worden en stationsnamen kunnen gewijzigd worden (zie Sectie 3.4.1). Aangezien de gebruiker enkel een station kan ingeven dat in nmbs stations voorkomt, kan de beheerder met behulp van deze functie de gebruikersinvoer in goede banen leiden. • Vertragingsbeheer: Hier kan de beheerder al de afwijkende vertragingen bekijken. Hij kan vervolgens de beschouwde afwijkende vertraging al dan niet goedkeuren (zie Sectie 3.4.2). • Gebruikersbeheer: Met Gebruikersbeheer kan de beheerder alle ingegeven vertragingen en afschaffingen van een bepaalde gebruiker weergeven. Dit is bijvoorbeeld handig als een gebruiker opvallend veel afwijkende vertragingen ingeeft. Indien nodig kan een gebruiker, samen met zijn invoer, geblokeerd en verwijderd worden (zie Sectie 3.4.3). • Afschaffingsbeheer: Hier worden de afschaffingen die conflicteren met ingevoerde vertragingen weergegeven. Aan de hand van een gedetailleerde weergave van al de registraties van het beschouwde traject kan de beheerder dan beslissen om de trein al dan niet als afgelast te registreren (zie Sectie 3.4.4).
3
Applicatiebespreking 3.1
Databank
De structuur van de MySQL-databank is weergeven in Figuur 3.1. Hierbij beschouwen we enkel de tabellen van onze module en de users-tabel1 . De grijze velden zijn de primaire sleutels en de pijlen stellen de vreemde sleutels voor. De overige tabellen die Drupal automatisch installeert zijn niet relevant in deze bespreking. n m b s _ s ta tio n s
n m b s _ o v e rzic h t
n m b s _ v e rtra g in g e n
s ta tio n id
in t
o v e rzich tid
in t
ve rtra g in g id
in t
nam e
v a rch a r
v e rtre kp la a ts id
in t
o ve rzich tid
in t
a a n ko m stp la a tsid
in t
ve rtra g in g
in t
n m b s _ g e b ru ik e rs tra je c te n
v e rtre kd a tu m
in t
u id
in t
g e b ru ik e rtra jc tid
in t
v e rtre ku u r
in t
a fw ijkin g
va rch a r
ve rtre k p la a ts id
in t
a a n ko m std a tu m
in t
a a n ko m s tp la a ts id
in t
a a n ko m stu u r
in t
u id
in t
duur
in t
tre in so o rt
va rch a r
v e rsie
va rch a r
n m b s _ a fs c h a ffin g e n
n m b s _ tra je c t
a fs ch a ffin g id
in t
tra je ctid
in t
o v e rz ich tid
in t
tra je ct
va rch a r
u id
in t
u id
in t
u s e rs u id
in t
nam e
va rch a r
Figuur 3.1: Schematisch overzicht van de databankstructuur: de primaire sleutels zijn in grijs weergegeven. Bij de tabel users worden enkel de relevante velden getoond. 1 Enkel
de velden userid en name van users zijn van belang voor onze modules.
17
Hoofdstuk 3. Applicatiebespreking
18
We overlopen kort de verschillende tabellen: • nmbs stations: In deze tabel kunnen de stationsnamen op een aantal manieren ingeladen en gewijzigd worden (zie Sectie 3.4.1). Aan de hand daarvan wordt de stationsinvoer gevalideerd en kunnen we de autocomplete-functie aanbieden. Elk station heeft een naam en een id. • nmbs gebruikerstrajecten: Deze tabel bewaart de voorkeurtrajecten van een bepaalde gebruiker. • nmbs overzicht: Deze tabel bevat de eigenlijke trajecten. De data worden met de PHPfunctie mktime(uur, minuut, seconde, maand, dag, jaar)2 opgeslagen als een UNIX timestamp3 . Het versienummer wordt ook bijgehouden. Momenteel is dit “v1”, maar bij een nieuwe dienstregeling kan dit eventueel aangepast worden om bijvoorbeeld na te gaan of de treinen al dan niet stipter sporen. Verder worden ook nog per traject het vertrek- en aankomststation, de reisduur en de treinsoort opgeslagen. • nmbs vertragingen: De ingegeven vertragingen worden per gebruiker bijgehouden; verscheidene gebruikers kunnen namelijk een vertraging ingeven voor hetzelfde traject (= hetzelfde overzichtid). Bij “Persoonlijke statistieken” (zie Sectie 3.3.2) kan de gebruiker zijn zelf ingegeven vertragingen opvragen en vergelijken met de gemiddelde vertraging van een bepaald traject. Het veld afwijkend wordt besproken in Secties 3.2.4 en 3.4.2. • nmbs afschaffingen: De tabel afschaffingen is analoog aan nmbs vertragingen in die zin dat de afschaffingen per traject (overzichtid) en per gebruiker (uid) worden bewaard. • users: Deze tabel wordt door Drupal gegenereerd en bevat allerlei informatie over de geregistreerde gebruikers. • nmbs traject: In deze tabel worden trajecten met overstappen opgeslagen; het veld traject bevat de stationid’s van de verschillende stations van het traject, gescheiden door “;”. We maken nog geen gebruik van de tabel, maar het leek ons nuttig om de trajecten met overstappen per gebruiker op te slaan. We komen hier op terug bij de uitbreidingsmogelijkheden. De tabellen worden tijdens het installeren van de nmbs-module door nmbs module.install aangemaakt [21]. De functie nmbs module install() installeert de functie nmbs schema() waarin de verschillende tabellen gedefinieerd worden. Na desinstallatie van de nmbs-module kunnen de tabellen verwijderd worden door de functie nmbs module uninstall(). Voorbeeld 3.1. Ten slotte beschouwen we als voorbeeld de query die de overzichtid’s ophaalt van de trajecten die een bepaalde gebruiker ($user) in de maand en het jaar van $aankomstdatum heeft ingevoerd: $result = db query(‘‘SELECT nmbs afschaffingen.overzichtid AS ‘overzichtid’ FROM {nmbs overzicht} INNER JOIN {nmbs afschaffingen} USING (overzichtid) WHERE MONTH(FROM UNIXTIME(aankomstdatum))=‘%d’ AND YEAR(FROM UNIXTIME(aankomstdatum))=‘%d’ AND uid=‘%d’ GROUP BY overzichtid ORDER BY aankomstdatum, aankomstuur, vertrekplaatsid, aankomstplaatsid’’, $aankomstdatum, $aankomstdatum,$user->uid); 2 Voor
de vertrek- en aankomsturen hebben we als standaard-datum 1 januari 2000 genomen (mktime(uur, minuut, seconde, 1, 1, 2000). 3 UNIX timestamp: het aantal seconden verlopen sinds 1 januari 1970
19
Hoofdstuk 3. Applicatiebespreking
3.2
Invoer van vertragingen/afschaffingen
Een essentieel onderdeel van onze website is uiteraard het ingeven van de vertragingen voor een specifiek traject. We cre¨eerden hiervoor in onze module enkele pagina’s.
3.2.1
Traject ingeven
Onderstaand schema verduidelijkt de pagina “Traject ingeven”. Op deze pagina dient de gebruiker – zoals de naam van de pagina doet vermoeden – zijn traject en datum van vertrek aan te geven. Hierbij kan de gebruiker de keuze maken of hij e´ e´ n van de voorkeurtrajecten selecteert of dat hij een nieuwe vertrekplaats en eindbestemming invoert. Hierbij kan aangevinkt worden om het nieuwe traject op te slaan als e´ e´ n van de voorkeurtrajecten. !"#$%"&$'()*+&$' !11#%"2#)$#(3"4$ )"'"4$"#"*
!"#$#"%&'(($) "* "+*,-")$"..+*/ +*/"0"*
5($2. "* #+46$22# 0(* 0"#$#"% ((*,2+,"*
74$+"8 9 !"#$#(/+*/ 9 7:)46(::+*/
,)-.$&()*+&$' !",%#$%&*% ,%,%#%"4 :$&*%" )" 4%44)%#'&)'5%(%" ,%4/$-%"
!+ ,%%" #$$&-%.&/&'0%1/ 2%&/&%-3(''/4 %" %)"*5%4/%66)", #'()*%&%"
!"#$%& #'()*%&%"
7$"/&$(%&%" $8 4/'/)$"4"'6%" )",%,%#%" 9)0" 7$"/&$(%&%" $8 4/'/)$"4"'6%" )" *'/'5'"- ''":%9), 9)0" 7$"/&$(%&%" $8 4/'/)$"4"'6%" #%&41;)((%"
2'()*'/)% ,%4('',*B
!+ 1;%1-5$C #$$&-%.&4/&'0%1/ $34(''" ''",%#)"-/ ??A D34(''" )" *'/'5'"- #'" #$$&-%.&4/&'0%1/ E
<=>< 4/'/)$"4"'6%" .)/ #$$&-%.&/&'0%1/ $3,%4(''" !+'841;'88)", ''",%*.)* ? 4%44)%$50@ '841;'88)", ??A /&.% <=>< ?4%44)%$50@ '841;'88)", ??A 8'(4% 7$"/&$(%&%" $8 ,%4%(%1/%%&*% *'/.6 &%%*4 #$$&5)0 )4@
2' () * ,% '/)% 4(' ")% ', / *
;12$."',+*/<
Figuur 3.2: Schematisch overzicht van de trajectingave-pagina.
Op de pagina “Traject ingeven” dient de gebruiker de vertrekplaats en de eindbestemming van zijn traject op te geven. Ook een specifieke datum en richtuur moet aangeduid worden. Voorts worden op deze pagina ook nog twee opties aangegeven naargelang de gebruiker de vertraging voor een specifiek traject of de afschaffing van een specifieke trein wil ingeven. Tot slot hebben we om het de gebruiker iets eenvoudiger te maken de ingebouwde autocomplete functie gebruikt in de invoervelden voor de vertrekplaats en de eindbestemming. Deze functie wordt in Drupal standaard gebruikt bij onder meer het invoeren van de gebruikersnaam. In onze module hebben we een nieuwe autocompletefunctie aangemaakt opdat deze ook zou werken voor stationsnamen. Op zich was dit vrij eenvoudig, maar het gebrek aan documentatie voor Drupal 6 omtrent deze functie zorgde voor enige vertraging tijdens de implementatie ervan. Wanneer de gebruiker een traject heeft ingevoerd wordt hij doorgestuurd naar de pagina “Treinenoverzicht”. Alvorens dit gebeurt wordt de invoer van de gebruiker wel gecontroleerd. Hiervoor bestaat in Drupal de “validatiefunctie” die specifiek kan gebruikt worden om de gebruikersinvoer te controleren.
Hoofdstuk 3. Applicatiebespreking
20
Deze validatiefunctie wordt uitgevoerd voor de “submitfunctie” van de pagina. In de validatiefunctie van deze pagina controleren we een aantal zaken. Indien er geen voorkeurstraject geselecteerd werd, wordt er nagegaan of er effectief een vertrekplaats en eindbestemming werd ingevoerd. Indien dit het geval is, wordt gecontroleerd of de ingevoerde stationsnamen effectief in de databank aanwezig zijn4 . Het feit dat we enkel stationsnamen gebruiken die reeds in de databank aanwezig zijn garandeert de beheerder van de website dat de invoer qua stationsnamen zeker correct is. Naast het controleren of de ingevoerde stationsnamen effectief in de databank aanwezig zijn, gaan we ook na of niet tweemaal hetzelfde station is ingegeven. Voorts hebben we ook ingesteld dat de ingevoerde datum nooit een datum uit de toekomst kan zijn aangezien men de vertragingen pas mag ingeven als de trein effectief gereden heeft. Tot slot stellen we in de validatiefunctie reeds enkele sessie-objecten in die we op latere pagina’s nog nodig hebben. Hierbij denken we bijvoorbeeld aan het sessie-object dat aanduidt of de gebruiker een afgeschafte trein of een vertraging wil ingeven. Andere sessie-objecten bevatten dan weer de stationsnamen. Indien bepaalde gegevens niet als correct gevalideerd worden in de validatiefunctie wordt er een foutmelding weergegeven. In het andere geval wordt er overgegaan naar de submitfunctie. In deze submitfunctie worden de overige sessieobjecten aangemaakt die nodig zijn om de specifieke trein op te vragen (vb. datum, richtuur). Ook wordt er nagegaan of een ingevoerd traject moet opgeslagen worden als een voorkeurstraject5 . Vervolgens hebben we in de submitfunctie ook gebruik gemaakt van de batchfunctie die standaard in Drupal aanwezig is. In principe gebruiken we die batchfunctie niet echt om gegevens te verwerken. Eerder hebben we deze ge¨ımplementeerd omdat de overgang naar de volgende pagina ons op die manier dynamischer leek over te komen6 .
3.2.2
Treinenoverzicht
Zoals de naam reeds laat vermoeden, wordt op de treinenoverzichtpagina de treinen weergegeven die op een bepaalde datum rijden. De gegevens die op deze pagina te zien zijn, worden rechtstreeks opgehaald van de NMBS-website. Om de gegevens op te halen gebruikten we de PHP-klasse Curl. Met deze klasse haalden we de inhoud op van de NMBS-website. Vervolgens gebruikten we de functie explode om de pagina volledig op te splitsen tot de benodigde informatie in sessievariabelen kon opgeslagen worden. Voor de broncode van de gegevensophaling verwijzen we naar de Appendix (Sectie A.1). 4 Hierbij
gaan we er dus vanuit dat de stationsnamen door de beheerder met behulp van het menu stationsbeheer zijn toegevoegd. 5 Hierbij gaan we wel na of het traject nog niet opgeslagen is als voorkeurstraject. Indien dit het geval is, wordt de databank ongemoeid gelaten. 6 Met dynamischer doelen we op het feit dat de gebruiker door deze animatie het idee krijgt dat de overgang naar de volgende pagina vlotter verloopt.
21
Hoofdstuk 3. Applicatiebespreking
:173$+01%)+$#
!"#$%#%&'#"($)*+ !"#$"#%"& '&(")*"#+" ("(")"&,."/ 01#2 31',/" 45('&5 *4652"& )5& &78,$"8,'/" 7-8-)- 91"#:,/#'&(- ;5('&5 "<42*+"& "& $""#(")"& '& /58"2)*#7 7"/ )"#,=6'22"&+" /#53"=/"&-
2' !5
,-.$/-+$#01%)+$# B&)*"# )52'+"#"&
+5
/'
0*&/#*2"#"& *A (","2"=/""#+" +5/17 #""+, )**#8'3 ',-
>#53"=/ ,"2"=/"#"& ?'=6/11# $'3@'("&
!5 2'+ 5/ '"
&' "/ (" ,25 5( +
" "(
,2 5
5(
+
C$'/=6 05," DE")",/'("&D F'3@'("& )5& 6"/ #'=6/11# 8#"5%G 05," DC"2"=/'" +**#(")"&D BH 5A(",=65A/" /#"'& BH *)"#,/544"& IIJ (""& *)"#,/544"& ,"2"=/"#"& KLCK "#/$"#)+ %--" -06)*-00$%4 7#'#6+$4#% KLCKBH #""+, *)"#,/544"& (","2"=/""#+ (""& /#53"=/ 7"/ *)"#,/544"& 7""# ,"2"=/"#"& KLCKBH /#53"=/ 7"/ *)"#,/544"& "& &*( (""& /#53"=/ 7"/ *)"#,/544"& (","2"=/""#+ 8#/$"#)+ %--" &'#"6+-99#% KLCK 8#/$"#)+ %--" '#"+"-4$%4 $%4#'#%
2&1+3#./$%45
Figuur 3.3: Schematisch overzicht van de treinenoverzicht-pagina.
Aanvankelijk gebruikten we de informatie van de internationale treinplanner omdat we gemerkt hadden dat de juiste informatie van deze site kon opgeroepen worden met behulp van een querystring [22]. Bovendien leek het ons ook interessant die website te gebruiken omdat we dan op een eenvoudige manier ook eenzelfde website konden opbouwen voor onze buurlanden. Na een testperiode bleek echter dat de informatie niet geheel correct was. Vooral de treinsoorten die aangegeven werden, klopten vaak niet. Ook werden soms bepaalde treinen niet weergegeven. Uiteindelijk bleek het toevallig ook zo te zijn dat diezelfde querystring (die we gebruikten op de internationale treinplanner) ook toepasbaar was op de offici¨ele NMBS-website [23], wat het mogelijk maakte om de gegevens van deze site op te halen. Voordeel van deze manier van ophalen is de normaliter adequate informatie die verkregen wordt. Ook als de treinregelingen wijzigen zou de informatie op de website nog steeds actueel moeten zijn. Bovendien viel van de NMBS-website ook het specifieke treinnummer van de treinsoort af te lezen.Voorts liet de NMBS-website ons ook toe om treininformatie op te halen aan de hand van een richtuur. Aan de hand van dit richtuur wordt immers een keuzelijst weergegeven van een aantal treinen rond een bepaalde tijdsperiode. De optie “richttijd wijzigen” tot slot zorgt er voor dat de richttijd in de querystring aangepast wordt waarna de juiste informatie van de NMBS-site wordt opgehaald. Ook bij dit treinenoverzicht werden een aantal controlemechanismen ingebouwd. Zo werd ook hier ingesteld dat enkel treinen die aangekomen zijn kunnen geselecteerd worden. Voorts hielden we er ook rekening mee dat gebruikers een trein met overstappen kunnen selecteren. In dat geval wordt de gebruiker naar de pagina “Overstappen ingeven” doorgestuurd. In de module werd ook ingesteld dat er geen trajecten met overstappen kunnen geselecteerd worden, indien de gebruiker een afgeschafte trein wil aanduiden of indien de gebruiker reeds een traject met overstappen geselecteerd heeft. Opmerking 3.1. In de praktijk kan het uiteraard voorkomen dat een gebruiker een traject met overstappen neemt waarbij er een trein afgeschaft werd. Een persoon wil bijvoorbeeld de trein nemen van Kortrijk naar Brussel-Centraal. Eerst neemt deze dus de trein van Kortrijk naar Gent-Sint-Pieters. Vervolgens merkt de persoon dat de trein van Gent-Sint-Pieters naar Brussel-Centraal, die normaal
22
Hoofdstuk 3. Applicatiebespreking
genomen zou worden, afgeschaft is. Vervolgens moet die persoon dus een latere trein nemen van GentSint-Pieters naar Brussel. De reden dat we het niet toelaten aan een gebruiker om in een traject met overstappen een afgeschafte trein in te geven, heeft te maken met het feit dat de gebruiker normaal een andere trein heeft genomen om op bestemming te geraken. Dus verwachten we dat de reiziger in het geval van een traject met overstappen de treinen ingeeft die effectief genomen zijn. Indien de gebruiker een trein niet kon nemen omdat deze afgeschaft was, kan deze alsnog later toegevoegd worden. Hoe dan ook lijkt het interessant, naar de toekomst toe, om na te gaan hoe er eventueel op een betere manier met een dergelijke situatie kan worden omgegaan. Ook is het interessant na te denken over hoe er moet omgegaan worden met gemiste aansluitingen. Zo kan het gebeuren dat een reiziger die een traject heeft met overstappen heel wat later op zijn bestemming aankomt, door het missen van een aansluiting. De latere trein die dan genomen wordt heeft dan misschien geen vertraging, toch verliest de reiziger heel wat tijd. Hoe dit kan ge¨ımplementeerd worden, zal de toekomst moeten uitwijzen. Na het eventuele ingeven van overstappen en het selecteren van een specifiek traject wordt de gebruiker dan doorgestuurd naar hetzij de pagina “Vertraging ingeven” hetzij de pagina “Afschaffing bevestigen”, naargelang de keuze die gemaakt werd op de pagina “Vertraging ingeven”.
3.2.3
Overstappen ingeven 5,60!*+,"-*!$ @*$*&,(%($$8 A > ')-*-);%*$*&,( @*$*&,(%($$8 B > ))-%*) ,')-%*$""+$$*% -)3&-)0* *2$!"$"/%$23!-4*
&'(!)'*!$+,"-*!$
Overstappen !"#$%$" !" #$%&% '$( ))( $$(*$+ ,')-%*$"")( ," "$.&($ *-)&()(,')-/&01* 2,-3)( )- ')+3)( .)0-)4)-35 6) ')+3)( 2,-3)( &(.)'7+3 8#' $7*,0,8"+)*)
9(',)'$+&3)-)(
9: %*$*&,(%($$8 &% $$(2)/&. &( 3) 3$*$#$(; 9: .))( *2)) 3)/)+<3) %*$*&,(%($8)( 9: ,')-%*$""+$$*% => ')-*-); ,< )&(3%*$*&,(
+& ?$
3$
. *&)
)%
+$$
.3
?$+&3$*&) (&) * .)%+$$.3
./,*0$()!"#1
Figuur 3.4: Schematisch overzicht in het geval een traject met overstappen wordt ingegeven.
Indien de gebruiker een traject selecteert met overstappen zal hij automatisch doorgestuurd worden naar de pagina “Overstappen ingeven”. Deze pagina genereert een aantal velden naargelang het aantal overstapplaatsen. Deze velden moet de gebruiker dan invullen. Op basis van deze ingevoerde overstapplaatsen kan de gebruiker dan traject per traject de vertraging kunnen invullen. Eens de gebruiker deze overstapplaatsen heeft ingevuld kan hij logischerwijs binnen dit traject wel geen trajecten meer selecteren met overstappen. Ook in deze pagina werden overigens een aantal controlemechanismen verwerkt. Zo zorgen we er ook hier voor dat de gebruiker enkel stationsnamen kan ingeven die reeds in de databank aanwezig zijn. Voorts kan een gebruiker nooit een vertrekstation of eindstation als overstapplaats ingeven. Ook kan eenzelfde station nooit meerdere keren als overstapplaats worden aangeduid.
23
Hoofdstuk 3. Applicatiebespreking
3.2.4
Vertraging ingeven
Op deze pagina komt men terecht na de selectie van de correcte trein op de pagina “Treinenoverzicht”. Hier dient de gebruiker de specifieke vertraging bij aankomst in te vullen die werd opgelopen. Wanneer de gebruiker een traject selecteerde met meerdere overstappen kan er ook een tweede veld verschijnen waar de gebruiker de vertrekvertraging van de trein dient aan te geven. Dit is het geval wanneer een gebruiker een trein selecteert die normaal vroeger vertrekt dan de voorgaande trein (waarvoor de vertraging werd ingevuld). Op basis van de ingevoerde vertrekvertraging wordt dan nagegaan of de ingevoerde vertraging aanvaard wordt. Indien een traject met overstappen aangeduid werd, zal deze pagina de gebruiker terugsturen naar de “Treinenoverzicht” pagina totdat het volledige traject ingegeven is. Hierna wordt de gebruiker doorverwezen naar de startpagina van de website. Uiteraard controleren we op deze pagina ook of de invoer effectief numeriek is. Ook werd ingesteld dat de ingevoerde vertragingen positief dienen te zijn. Vervolgens dient de invoer op een correcte manier opgeslagen te worden in de database. Om de gegevens op te slaan in de databank maakten we gebruik van de specifieke Drupal SQL-statements die eigenlijk vrij gelijkend zijn aan standaard SQL-statements. 6-71'$,-(.$'"
!%*'+%$'",-(.$'"
!"#$#%&'(& '(&")"( !" #$"%& ''( #')*$"+,-.'" $/0')$,#% %1& 2$-%$'& 11( $(%'"3&11(%' "'0'-34 56 7)'($%.0%' 3'33.'21".1)'-'( 89 -''0: ; 56 72'"&"'<,," (.',#' &"'.( 2"$'0'" %1( 11(<$+3&,," 2$".0' &"'.(: ; 2'"&"'<2'"&"10.(0 .(2$'"'( %+2 &'=&*.'-% > >
5(2$'" 21-.%'"'(
56 72'"&"'<,," (.',#' &"'.( 2"$'0'" %1( 11(<$+3& 2$".0' &"'.(: ; ?"'@"'( 21( (.',# 2'"&"'<,," $/ )13.3 21( 2$".0' 2'"&"'<,," $/0'&'-% +'& 2'"&"'<2'"&"10.(0 > 56 72'"&"'<2'"&"10.(0 .3 (,+'".'<: 56 711(<$+3&2'"&"10.(0 .3 (,+'".'<:
A1
-.%
1
0 &.'
'3
- 11
0%
B'/1-'( 21( )'($%.0%' 21".1)'-'(4 C'0'2'(3 $/3-11( .( %1&1)1(< .(%.'( ($0 (.'& 11(#'D.04 5(%.'( "''%3 2'"&"10.(0 .(0'2$'"%E ,/%1&' 21( 2$".0' .(0'2$'"%' 0'0'2'(34 B.F .(0'2$'"%' 2'"&"10.(0 $$< 3&1(%11"%1*#.F<.(0 )'/1-'(4 56 70'+.%%'-%' 2'"&"10.(0 G 3&1(%11"%1*#.F<.(0 H .(0'2$'"%' 2'"&"10.(0 I 0'+.%%'-%' 2'"&"10.(0 J 3&1(%11"%1*#.F<.(0:; 1*#.F<.(0 9 *1-3'K > !LM! ; 1*#.F<.(09&",'K > 56 7&"1F'?& +'& $2'"3&1//'(: ; 3"+'#".$ (%%# $#"'("(0)"#4'.5$
> A1-. %1&.' (.'& 0'3 -110 %
/0-$1"*+'(&2
Figuur 3.5: Schematisch overzicht van de vertragingsingave-pagina.
Voor het opslaan in de databank definieerden we een nieuwe functie, om de module zelf iets overzichtelijker te houden. In deze functie cre¨eren we de nodige variabelen om op te slaan in de databank. Zo worden de stationsnamen omgezet naar de overeenkomstige id’s uit de nmbs stationstabel. Omdat we ervoor opteerden om data en tijdstippen op te slaan in UNIX-formaat, gebeurt de omzetting naar UNIX timestamp ook in deze functie. Wanneer alle variabelen aangemaakt zijn gaan we na of de variabelen reeds aanwezig zijn in de tabel nmbs overzicht. Indien dit niet het geval is maken we een nieuwe record aan in deze tabel. Zijn de benodigde gegevens wel al aanwezig, dan wordt enkel het overzichtid van de record opgevraagd. Hierna maken we in de nmbs vertragingentabel een record aan met de ingegeven vertraging en een verwijzing naar het id van de record in de nmbs overzichttabel.
Hoofdstuk 3. Applicatiebespreking
24
In deze functie gaan we ook nog na of de ingevoerde vertraging niet teveel afwijkt van vorige ingevoerde vertragingen voor het geselecteerde traject. Dit gebeurt aan de hand van de standaardafwijking v ! u u1 N 2 s=t ∑ (xi − x)¯ N i=1 die bepaald wordt vanaf de derde vertragingsregistratie voor een specifiek traject. Aan de hand hiervan bepalen we een interval I I = [x¯ − s ; x¯ + s] waarbinnen de ingevoerde vertraging als normaal beschouwd wordt. Indien de ingevoerde vertraging teveel afwijkt wordt dit dan ook als dusdanig opgeslagen in nmbs vertragingen. Voorts dient nog vermeld dat elke gebruiker slechts e´ e´ n vertraging mag invoeren per specifiek traject. Bij elke vertragingsinvoer wordt dan ook nagegaan of de gebruiker nog geen vertraging invoerde. Indien dit het geval is, wordt de oude ingevoerde vertraging vervangen door de nieuwe. Ook de standaardafwijking wordt dan opnieuw berekend. Tot slot wordt ook elk traject opgeslagen in de databank. Bij een traject met overstappen worden dan het gebruikersid en alle overzichtid’s, gescheiden door een komma, opgeslagen in de tabel nmbs trajecten. Voorlopig gebeurt er nog niet echt iets met deze gegevens. Deze werden vooral toegevoegd opdat de mogelijkheid zou bestaan hier later eventueel bepaalde informatie over weer te geven op de website.
3.2.5
Afschaffing bevestigen
De pagina “Afschaffing bevestigen” wordt enkel weergegeven indien de optie “Afgeschafte trein ingeven” werd aangeduid op de pagina “Traject ingeven”. Op deze pagina kan enkel bevestigd worden of de specifiek geselecteerde trein effectief afgeschaft werd. Indien dit het geval is, wordt net als op de pagina “Vertraging ingegeven” nagegaan of het overzichtid voor dit specifieke traject nog niet aanwezig is in de databank. Indien dit niet het geval is wordt een nieuwe record met de benodigde variabelen aangemaakt. Vervolgens wordt aan de tabel nmbs afschaffingen het overzichtid en het gebruikersid toegevoegd.
Hoofdstuk 3. Applicatiebespreking
3.3
25
Gegevensweergave
3.3.1
Grafieken
Google graphs Voor de vertragingsgrafieken hebben we geopteerd voor Google Graphs [24]. De gegevens worden gecodeerd in een URL, en een HTTP GET aanvraag op die URL resulteert in een URL waarop de grafiek (in PNG-formaat) te vinden is7 . Het voordeel van deze werkwijze is dat er geen bijkomend programma op de server ge¨ınstalleerd hoeft worden. Het PNG-formaat vereist ook, in tegenstelling tot flash-grafieken, geen ActiveX-besturingselement zodat alle gebruikers onmiddellijk de opgevraagde grafieken te zien krijgen. Aanvankelijk was het de bedoeling aan de hand van een module de grafieken te generen [25]. Die stond voor Drupal 6 echter nog niet op punt, vandaar de beslissing om de HTTP-requests rechtstreeks in onze grafieken-module te plaatsen. Op die manier konden we – met behulp van de online developer’s guide – de functionaliteit van google graphs ten volle benutten. Ter illustratie bespreken we kort de belangrijkste componenten van zo’n URL: http://chart.apis.google.com/chart? cht=[1]&chxr=[2]&chds=[3]&chxl=[4]&chco=[5]&chd=[6] 1. cht: grafiektype, bvg voor de grafieken en p3 voor het 3D-taartdiagram. 2. chxr: bereik van de assen instellen. 3. chds: de data schalen. De data wordt standaard relatief uitgezet t.o.v. 100, het is dus belangrijk om de maximum-waarde van de opgevraagde data mee te geven. 4. chxl: de labels van de verschillende assen. Bij Grafieken 1 en 2 moet rekening gehouden worden met het aantal dagen in de gespecificeerde maand. 5. chco: de kleur van de weergegeven data, bij een taartdiagram wordt de opgegeven RGB-waarde automatisch ge¨ınterpoleerd. 6. chd: de door te geven data. Onderlinge waarden zijn gescheiden door komma’s, series door “|”. De URL’s worden opgebouwd door een combinatie van PHP- strings en variabelen. Die variabelen bevatten de eigenlijke data die met behulp van query’s uit de database opgehaald werd. De zo bekomen string wordt ten slotte tussen HTML-tags geplaatst (
). Grafiek-klassen De gebruiker kan voor de weergave van de ingegeven vertragingen (en afschaffingen) kiezen uit drie grafiek-klassen8 : Grafieken 1, Grafieken 2 en Grafieken 3. We bespreken deze drie keuzemogelijkheden, met een aantal schermafbeeldingen ter illustratie9 , in onderstaand overzicht. 7 Men
kan tot 250 000 aanvragen per dag versturen, bij hogere aantallen moet een aanvraag (plus schatting) ingediend worden. 8 We verwijzen voor de eenvoud hier naar de klassen als 1, 2 en 3 9 De vertragingen die in de grafieken worden getoond zijn fictief en dienen louter als voorbeeld.
Hoofdstuk 3. Applicatiebespreking
26
1. Grafieken 1: Vertragingsgrafieken voor een specifieke trein van een bepaald traject. Doel: Maandinfo over een specifieke trein van een traject verkrijgen, vergelijken met treinen van dezelfde soort. Voorbeeld: Traject Gent-Sint-Pieters - Brugge in Mei 2008 vertrekuur: 17:39u. - aankomstuur: 18:02u. Treinsoort: IC Deze grafieken worden op dezelfde wijze opgevraagd als een vertraging/afschaffing (zie Sectie 3.2) ingeven; er moet namelijk een datum en een richtuur ingegeven worden. Die worden vervolgens doorgestuurd in een HTTP-request naar de NMBS-website zodat de gebruiker uit een aantal treinen kan kiezen. Door de analogie met een vertraging/afschaffing ingeven wordt een anonieme gebruiker vertrouwd met deze opvraagwijze, waardoor de drempel om zelf vertragingen of afschaffingen in te geven verkleint. Merk op dat het richtuur en de datum van opvragen kan gewijzigd worden. We hebben deze optie toegevoegd om de volgende reden; de gebruiker moet een datum selecteren waarop de desbetreffende trein gespoord heeft en de meeste treinen rijden nu eenmaal niet op alle dagen van de week. Op die manier kan het richttijdstip op eenvoudige wijze aangepast worden (zonder terug te keren naar de beginpagina). Eenmaal een specifieke trein van een bepaald traject geselecteerd, worden de desbetreffende grafieken weergegeven (van de maand van de geselecteerde datum). De belangrijkste grafiek uit deze klasse is de gemiddelde dagelijkse vertraging – weergegeven per maand – met aansluitend een taartdiagram met de gemiddelde reisduur van het traject. Verder zijn er nog een aantal bijkomende grafieken met vertragingsinformatie over de treinen van dezelfde soort als de gespecificeerde trein. Ten slotte worden ook de afschaffingen weergegeven en kan de gebruiker met een muisklik de grafieken van het omgekeerde traject bekijken. We geven een beknopt overzicht van de verschillende grafieken en andere opties.
Figuur 3.6: De gemiddelde dagelijkse vertraging van de trein uit het voorbeeld.
Hoofdstuk 3. Applicatiebespreking
27
• De gemiddelde dagelijkse vertraging: (zie Figuur 3.7) wordt zoals reeds vermeld weergeven per dag van de maand. Het is belangrijk op te merken (zie voorbeeld) dat in deze grafiek enkel vertragingen van een specifieke trein worden beschouwd. • De gemiddelde maandelijkse reisduur van het traject: (zie Figuur 3.6) hierbij worden de gemiddelde maandelijkse vertraging en de reisduur die de NMBS vooropstelt weergeven in taartdiagram. We vermelden hierbij uitdrukkelijk dat bij het berekenen van de gemiddelde vertraging enkel de dagen waarop vertragingen zijn ingegeven in rekening werden gebracht. We gaan er met andere woorden vanuit dat als een gebruiker geen vertraging heeft opgelopen, hij effectief “0” minuten vertraging ingeeft. De totale reisduur (vooropgestelde reisduur + gemiddelde vertraging) wordt in de titel van het taartdiagram weergeven.
Figuur 3.7: De gemiddelde maandelijkse reisduur van de trein uit het voorbeeld.
• De gemiddelde maandelijkse vertraging per weekdag: (zie Figuur 3.8) in deze grafiek wordt de gemiddelde vertraging van de gespecificeerde trein bekeken per weekdag (maandag tot vrijdag). Pendelaars krijgen op die manier een duidelijk overzicht van op welke dag van de week hun gebruikelijke trein gemiddeld de meeste vertraging oploopt. • De gemiddelde maandelijkse vertraging per uur van de dag (6u-21u): (zie Figuur 3.8) we kunnen hierbij uiteraard niet enkel de gespecifieerde trein beschouwen, maar alle treinen van dezelfde treinsoort van het traject. Deze laatste, meer algemene grafiek verschaft nuttige informatie over het traject; een pendelaar kan bijvoorbeeld aan de hand van deze grafiek opteren om een vroegere trein te nemen als de vertragingen aanzienlijk verschillen. • Afschaffingen: de afschafte treinen (van de beschouwde maand) van het traject worden chronologisch weergegeven in een tabel10 . • Het omgekeerde traject bekijken: door een richtuur in te geven kan een gebruiker op een snelle en eenvoudige manier de vertragingsgrafieken van een trein van het omgekeerde traject selecteren. We hebben deze funcie toegevoegd omdat veel pendelaars – weliswaar op een ander tijdstip – ook het omgekeerde traject afleggen. 10 De
afschaffingen worden niet weergeven als er nog geen vertragingen werden ingegeven.
Hoofdstuk 3. Applicatiebespreking
28
Figuur 3.8: De gemiddelde maandelijkse vertraging per weekdag, gevolgd door de gemiddelde maandelijkse vertraging per uur van de dag (6u-21u) van de beschouwde trein.
Opmerking 3.2. Ook vanaf de pagina’s “Grafieken 2” en “Grafieken 3” kunnen de grafieken van het omgekeerde traject bekeken worden. Het enige verschil is dat de gebruiker geen richtuur moet selecteren aangezien er bij “Grafieken 2” en “Grafieken 3” geen specifieke treinen beschouwd worden. De treinen worden namelijk gegroepeerd per treinsoort, en per dag of per maand. 2. Grafieken 2: Vertragingsgrafieken voor alle treinen van een bepaald traject. Doel: Maandinfo over alle treinsoorten van een traject verkrijgen, treinsoorten vergelijken met elkaar. Voorbeeld: Traject Gent-Sint-Pieters - Brugge in Mei 2008
Hoofdstuk 3. Applicatiebespreking
29
Om de grafieken van deze klasse weer te geven moeten (naast begin- en eindstation) enkel de maand en het jaar geslecteerd worden. In het staafdiagram (zie Figuur 3.10) wordt de gemiddelde dagelijkse vertraging uitgezet per treinsoort en per dag van de maand. De treinreiziger krijgt in e´ e´ n enkele grafiek dus een overzicht van de opgelopen vertragingen van die maand, waarbij we het onderscheid in treinsoorten om twee redenen gemaakt hebben. In de eerste plaats is het statistisch meer verantwoord om enkel vertragingen van treinen van dezelfde soort uit te middelen aangezien die over hetzelfde traject ongeveer dezelfde reisduur zullen hebben. Ten tweede kan de reiziger aan de hand van de grafiek beslissen met welke treinsoort hij het traject kan afleggen. Om die laatstgenoemde reden hebben we dan ook per treinsoort een taartdiagram ingevoegd (zie Figuur 3.9), waarin de vooropgestelde reisduur en de gemiddelde vertraging weergegeven worden.
Figuur 3.9: Taartdiagrammen van de gemiddelde reisduur per treinsoort. Op het beschouwde traject sporen enkel P, L en IC-treinen.
Hoofdstuk 3. Applicatiebespreking
30
Figuur 3.10: Staafdiagram van de gemiddelde dagelijkse vertraging per treinsoort. Op het beschouwde traject sporen enkel P, L en IC-treinen.
3. Grafieken 3: Vertragingsgrafieken voor alle treinen van een bepaald traject. Doel: Jaarinfo over alle treinsoorten van een traject verkrijgen, aantal ingaven bekijken. Voorbeeld: Traject Gent-Sint-Pieters - Brugge in 2008 Het staafdiagram (zie Figuur 3.11) is analoog aan dat van “Grafieken 2”, met het verschil dat de vertragingen per maand en per treinsoort berekend worden. Vervolgens geven we voor elke treinsoort het aantal ingevoerde vertragingen per maand weer (zie Figuur 3.12). De gebruiker kan zich zo een beeld vormen van het aantal geregistreerde vertragingen voor een bepaald traject zonder de privacy van andere gebruikers te schenden.
Figuur 3.11: Staafdiagram van de gemiddelde maandelijkse vertraging per treinsoort. Aangezien enkel vertraginen van treinen die reeds gereden hebben kunnen ingevoerd worden, toont de grafiek vanaf juni nog geen vertragingen.
31
Hoofdstuk 3. Applicatiebespreking
Figuur 3.12: Tabel van het aantal ingegeven vertragingen per maand en per treinsoort, gevolgd door de mogelijkheid om het omgekeerde traject te bekijken.
Opmerking 3.3. We merken nog op dat niet steeds alle grafieken van een klasse zichtbaar zijn; bij “Grafieken 1” zal de vertraging per dag van de week enkel getoond worden indien er reeds een vertraging op een weekdag werd ingegeven. We bieden de gebruiker een aantal mogelijkheden aan om via “Persoonlijke statistieken” grafieken op te vragen. We bedoelen hiermee dat door een traject te selecteren op e´ e´ n van de bij “navigatie” vermelde pagina’s, de vertragingsgrafieken van dat traject kunnen bekeken worden (zie Tabel 3.1). We gaan hier in Sectie 3.3.2 dieper op in. In onderstaande tabel worden de verschillende onderdelen van de drie grafiek-klassen samengevat. Grafieken 1
Grafieken 2
Grafieken 3
Periode
per maand
per maand
per jaar
dagelijkse vertr. vertr. per weekdag vertr. per uur
dagelijkse vertr.
maandelijkse vertr.
Staafdiagram Taartdiagram
totale reisduur
totale reisduur
#
Tabel
afschaffingen
afschaffingen
# ingevoerde vertr.
Ingevoerde vertr./afsch. Extra
Grafieken 1 Recente lijnen Ingevoerde vertr./afsch. Extra
!
!
Grafieken 1 Grafieken 2 Recente lijnen Ingevoerde vertr./afsch. Extra
Navigatie
Omgekeerd traject
!
Tabel 3.1: Samenvatting van de verschillende klassen. Met “navigatie” bedoelen we vanaf welke pagina’s de (aangemelde) gebruiker naar de beschouwde klasse kan navigeren. “Recente lijnen”, “Ingevoerde vertragingen/afschaffingen” en “Extra” zijn onderdelen van “Persoonlijke statistieken” (zie Sectie 3.3.2).
Hoofdstuk 3. Applicatiebespreking
3.3.2
32
Persoonlijke statistieken
Hier kan een geregistreerde gebruiker zijn ingegeven vertragingen en afschaffingen bekijken. We zijn van mening dat een gebruiker graag een duidelijk overzicht heeft van zijn persoonlijke ingaven, met het oog op eventuele compensaties van de NMBS. Ook kunnen langs deze weg de grafieken van de persoonlijke trajecten rechtstreeks opgevraagd worden, zonder omweg langs “Grafieken opvragen” (zie Tabel 3.1). We geven een overzicht van de vier pagina’s van “Persoonlijke statistieken” (zie de appendix voor een impressie van de website aan de hand van schermafbeeldingen): 1. Recente lijnen: op deze pagina worden vertrek- en aankomststation11 van de 20 recentste ingegeven vertragingen getabelleerd, gevolgd door de 20 recentste afschaffingen. De gebruiker heeft zo reeds een overzicht over zijn persoonlijke trajecten zonder de details (reisduur, treinsoort, enz...) te zien, wat de duidelijkheid van de pagina ten goede komt. Na een traject en een maand en/of een jaar te geselecteerd te hebben, kan hij doorklikken naar “Grafieken 2” of “Grafieken 3” om de grafieken van de beschouwde traject te bekijken (zie Tabel 3.1 of Sectie A.2.2). 2. Ingevoerde vertragingen/afschaffingen: terwijl bij “Recente lijnen” per traject enkel de stations te zien waren, worden hier alle details (zie Sectie 2.2) van de ingegeven vertragingen en afschaffingen weergegeven per maand. Naast begin- en eindstation, vertrek- en aankomsttijdstip, reisduur, treinsoort en gemiddelde vertraging wordt ook de zelf ingevoerde vertraging getoond zodat de gebruiker makkelijk zijn registratie met die van anderen kan vergelijken. De huidige maand van het huidige jaar staat als standaard-maand ingesteld. Door het veld “Wijzig de maand van het overzicht” aan te passen kunnen andere maanden bekeken worden. We hebben hier als tijdsinterval voor een maand gekozen omdat de grafieken ook per maand gegenereerd worden. Als een pendelaar dagelijks zijn trajecten invoert kan deze pagina snel onoverzichtelijk ogen; de trajecten worden namelijk chronologisch geordend, en niet volgens vertrek- en aankomststation. Om die reden hebben we het veld “Pas de weergave aan” ingevoegd. De gebruiker kan hierdoor kiezen uit drie weergave-opties: (a) Alle vertragingen/afschaffingen weergeven van deze maand: dit is de standaard-weergave. (b) Geef enkel de vertragingen/afschaffingen weer tussen vertrek- en aankomststation van het geselecteerde traject: enkel de trajecten tussen het gespecificeerd vertrek- en eindstation worden getoond. (c) Geef enkel de vertragingen/afschaffingen weer van de specifieke trein van het geselecteerde traject: enkel de ingegeven treinen op een welbepaald vertrek- en aankomstuur van een specifiek traject worden getoond. De geselecteerde weergave wordt op de pagina boven “Pas de weergave aan” nadrukkelijk getoond. De query die de gegevens uit de database ophaalt is dus afhankelijk van de weergave. Indien de gebruiker de maand van het overzicht wijzigt, blijft de geselecteerde weergave behouden. Als er in de aangepaste maand evenwel geen treinen met de welbepaalde weergave werden teruggevonden, wordt de query nogmaals uitgevoerd met de standaard-weergave (alle vertragingen/afschaffingen). Deze opmerking geldt voor alle pagina’s waarvoor de weergave kan gewijzigd worden. 11 We
beschouwen hierbij enkel verschillende trajecten, met verschillend vertrek- en eindstation.
Hoofdstuk 3. Applicatiebespreking
33
3. Extra: hier kan men alle ingaven voor een bepaald traject in een geselecteerde periode bekijken. Deze pagina is dan ook analoog aan “Ingevoerde vertragingen/afschaffingen”. Het verschil is dat de gebruiker de periode arbitrair kan kiezen, en er een vertrek- en eindstation moet gespecificeerd worden. Het veld “Traject en periode invoeren”, dat aanvankelijk opengevouwen is, minimaliseert als er vertragingen/afschaffingen opgevraagd worden. De tweede weergave-optie van de vorige pagina is hier niet van toepassing zodat er enkel kan gekozen worden tussen de eerste en de derde optie, namelijk “Alle vertragingen/afschaffingen weergeven van deze maand” en “Geef enkel de vertragingen/afschaffingen weer van de specifieke trein van het geselecteerde traject”. 4. Jaarstatistieken: de laatste pagina van “Persoonlijke statistieken” (zie Figuur 3.13) is toepasselijk een jaaroverzicht. De treinen worden onderverdeeld in 4 categorie¨en, 1. Vertraging <= 5 minuten 2. 5 minuten < vertraging <= 10 minuten 3. Vertraging > 10 minuten 4. Afgeschafte treinen waarbij telkens het percentage van het totaal aantal ingevoerde treinen per categorie vermeld wordt. Die percentages worden vervolgens grafisch weergegeven in een taartdiagram. Zo heeft de gebruiker een handig, visueel overzicht van zijn jaarlijks opgelopen vertragingen en afschaffingen.
Figuur 3.13: Schermafbeelding van het tabblad “Jaarstatistieken”. Merk op dat het beschouwde jaar kan gewijzigd worden.
Zoals blijkt uit bovenstaande bespreking, bieden we de geregistreerde gebruiker een aanzienlijk aantal mogelijkheden aan om zijn persoonlijke ingaven te bekijken. We willen dat de pendelaar die de moeite neemt om dagelijks zijn traject in te voeren, snel en overzichtelijk een beeld kan krijgen van zijn opgelopen vertragingen.
Hoofdstuk 3. Applicatiebespreking
3.4
34
Beheer van de website
Het beheer van de module werd opgesplitst in een aantal aspecten: 1. De invoer van stationsnamen 2. Het bekijken van afwijkingen binnen de vertragingsinvoer en het eventueel verwijderen van ongeldige invoer 3. het opvragen van gegevensinvoer voor een specifieke gebruiker
3.4.1
NMBS Stationsbeheer
Het menu stationsbeheer bestaat uit vier opties die weergegeven worden op verschillende tabbladen. De eerste optie “Stations importeren” laat toe om een CSV-bestand met stationsnamen te importeren in Drupal. Hiervoor hebben we het standaard uploadformulier aangepast. Voorts werd er gebruik gemaakt van een functie die reeds aanwezig was in een andere Drupalmodule (Taxonomy CSV import) en die we naar onze behoeften aangepast hebben. De tweede optie “Stations handmatig ingeven” werd toegevoegd opdat het mogelijk zou zijn voor de beheerder om ook handmatig stations in te geven. Zo blijft de bestaande stationslijst up to date; de beheerder kan nieuwe stations toevoegen en voormalige stations verwijderen. Er werd hierbij gebruik gemaakt van een tekstgebied. Dit laat toe om meerdere stationsnamen tegelijk in te geven, die dienen gesplitst dienen te worden door middel van een scheidingsteken naar keuze. De scheidingstekens worden uiteraard niet opgeslagen in de databank. In de submitfunctie maakten we dan uitgebreid gebruik van enkele stringfuncties van PHP (preg replace, str replace, split) om tot de specifieke stationnamen te komen. De optie “Stations verwijderen” laat de beheerder toe stationsnamen te verwijderen uit de databank. Dit kan nodig zijn indien bepaalde stations geschrapt worden of indien men merkt dat er verkeerde stations zijn ingegeven in de databank. We maakten gebruik van een keuzeveld omdat dit de mogelijkheid toelaat om meerdere stationsnamen te selecteren en te verwijderen. Het laatste onderdeel van dit menu is de optie “Stationsnaam wijzigen”. Deze optie werd toegevoegd om indien nodig de naam van een station te wijzigen. De onderliggende operatie is een SQL UPDATE commando. Aangezien een dergelijke operatie vrij ingrijpend is, gaan we er hierbij wel van uit dat de eventuele beheerders bij het gebruik van deze functie wel enige verantwoordelijkheid aan de dag zullen leggen.
35
Hoofdstuk 3. Applicatiebespreking
3.4.2
NMBS Vertragingsbeheer
Het menu vertragingsbeheer werd toegevoegd aan de beheersectie om de ingevoerde vertragingen te kunnen controleren. Afwijkingen
S u b m itfu n c tie
B e k ijk a fw ijk in g e n W e e rg e v e n v a n e v e n tu e le v e rtra g in g e n . A c tie s : - G e se le cte e rd e v e rtra g in g v e rw ijd e re n - A fw ijk in g g o e d k e u re n - A lle in g e v o e rd e v e rtra g in g e n w e e rg e ve n v o o r g e se le c te e rd e tra je c t
B e v e stig e n In v o e r
IF ve rw ijd e re n --> ve rw ijd e re n va n se le ctie E L S E IF g o e d ke u re n --> g e se le c te e rd e a fw ijk in g g o e d ke u re n ELSE IF g e s e le cte e rd e a fw ijk in g e n > 1 fo u tm e ld in g ELSE re d ire c t s p e c ifie k v e rtra g in g o v e rz ic h t
Figuur 3.14: Schematisch overzicht van de afwijkingen.
Omdat we toch een zekere controle wensen wat betreft de vertragingen die een gebruiker invoert maken we gebruik van een standaardafwijking. Deze zet een vlag op “true” indien de ingevoerde vertraging een grotere afwijking ten opzichte van het gemiddelde vertoont dan de standaardafwijking van de eerder ingevoerde vertragingen op dit traject. De beheerder kan de afwijkende vertragingen bekijken. We zorgen voor de mogelijkheid om een aantal acties te ondernemen voor elke afwijking. Zo kan de beheerder bepaalde afwijkingen verwijderen of goedkeuren. Om de afwijkingen te selecteren opteren we voor een lijst van checkboxes in de plaats van radiobuttons. Door gebruik te maken van checkboxes kunnen we e´ e´ n actie direct toepassen op meerdere afwijkingen. Als we radiobuttons zouden gebruiken, moeten we elke afwijking afzonderlijk behandelen. Bovendien bevat Drupal een interessante Javascript-functie die toelaat alle keuzevelden met e´ e´ n actie aan te vinken.12 Opmerking 3.4. Een probleem dat optreedt bij het bepalen van de afwijkende vertragingen is het feit dat we reeds moeten beschikken over twee vroeger ingevoerde vertragingen alvorens een standaardafwijking wordt berekend. Dit zorgt dan wel voor het probleem dat indien de eerste twee ingevoerde vertragingen niet overeenstemmen met de werkelijkheid dat later ingevoerde vertragingen als afwijkend zullen geregistreerd worden. Dit is een probleem dat moeilijk te ontlopen viel. Daarom hebben we toch enkele maatregelen genomen om de correcte invoer te garanderen. Zo kan de beheerder van elke afwijking de overige vertragingsinvoer opvragen. Hierbij wordt de beheerder doorverwezen naar het “Specifieke vertragingsoverzicht”. 12 De
Javascript-functie is te vinden in de standaardinstallatie van Drupal onder de naam tableselect.js
36
Hoofdstuk 3. Applicatiebespreking Specifiek vertragingsoverzicht
6193'$01(+$'" -%.'/%$'"01(+$'"
Specifiek !"#$#%&'(&)!"#*'+,$ !"#$%%"&%" '"()(*+$,+", -.'(*+", '--( "", )(*/"0)
7,'-"( '*&$%"(",
12$)03 4*5" 67,'-"(",6 8*+**, -9 5)*)$-,5,*#", '"(503$&&",% :$/,; 8*+**, -9 5)*)$-,5,*#", $, %*)*<*,= **,2":$+ :$/,; 8*+**, -9 '"()("=%*)># ,$") &*)"( '*&) %*, **,=-#5)%*)># 8*+**, -9 '"()("=%*)># -9 **,=-#5)%*)># ,$") &*)"( '*&) %*, 3>$%$+" %*)># <("*=?
@*&$%*)$" +"5&*
*+%
@*&$ %*)$" ,$") +"5 &**+ %
12$)03 4*5" 67,'-"(",6 @*($*<"&", $,'>&&", %$" "('--( :-(+", %*) +"#$%%"&%" '"()(*+$,+", =>,,", 2""(+"+"'", 2-(%", <("*=? 4*5" 6A"'"5)$+",6 5"/'#"+$ 67"+'0'"8 !"#$#%&'(&)!"#*'+,$ <("*=?
2)1$3"./'(&4
Figuur 3.15: Schematisch overzicht van de ingevoerde vertragingen voor een specifiek traject.
Op de pagina “Specifiek vertragingsoverzicht” krijgt de gebruiker een overzicht van alle ingevoerde vertragingen voor een bepaald traject. Bij deze vertragingen staat telkens of de ingevoerde vertraging teveel afwijkend is van de gemiddelde vertraging. De vertragingen worden weergegeven van klein naar groot. Als er meer dan vier vertragingen zijn,worden de twee kleinste vertragingen en de twee grootste vertragingen in het rood weergegeven. Dit verduidelijkt wat de uitersten van de ingevoerde vertragingen zijn. Op basis hiervan kan de beheerder dan beslissen om de afwijkingen binnen een bepaald traject goed te keuren of om de te afwijkende vertragingen te verwijderen uit de databank. Algemeen vertragingsoverzicht
738%+)23&.)+$ 0*"+1*)+$23&.)+$
!"#$%$$& '$()(*#+,'$(-+./) !"#$%%"&%" '"()(*+$,+", -.'(*+", '--( "", )(*/"0)
7,'-"( '*&$%"(",
12$)03 4*5" 67,'-"(",6 8*+**, -9 5)*)$-,5,*#", '"(503$&&",% :$/,; 8*+**, -9 5)*)$-,5,*#", $, %*)*<*,= **,2":$+ :$/,; 8*+**, -9 '"()("=%*)># ,$") &*)"( '*&) %*, **,=-#5)%*)># 8*+**, -9 '"()("=%*)># -9 **,=-#5)%*)># ,$") &*)"( '*&) %*, 3>$%$+" %*)># <("*=?
@*&$%*)$" +"5&*
*+%
@*&$ %*)$" ,$") +"5 &**+ %
12$)03 4*5" 67,'-"(",6 @*($*<"&", $,'>&&", %$" "('--( :-(+", %*) +"#$%%"&%" '"()(*+$,+", =>,,", 2""(+"+"'", 2-(%", <("*=? 4*5" 6A"'"5)$+",6 6$1+($.) Algemeen '$()(*#+,'$(-+./) <("*=?
4,3)%$"1+
Figuur 3.16: Schematisch overzicht van de algemene vertragingsoverzichtpagina.
37
Hoofdstuk 3. Applicatiebespreking
Binnen het menu vertragingsbeheer hebben we tot slot ook nog een optie “Algemeen vertragingsoverzicht” toegevoegd. Dit maakt het mogelijk om alle gemiddelde vertragingen voor een bepaald traject te raadplegen. Dit kan interessant zijn om een overzicht te krijgen van alle gemiddelde ingevoerde vertragingen. Zeker ook omdat de optie bestaat om elk traject ook gedetailleerd te bekijken binnen het “Specifieke vertragingsoverzicht”. Het menu vertragingsbeheer laat dus toe misbruiken na te gaan wat betreft de ingevoerde vertragingen. Bij het overzicht van de afwijkingen of bij het specifieke vertragingsoverzicht worden immers telkens ook de gebruikers weergegeven. Op die manier kan de beheerder eenvoudig zien welke gebruikers regelmatig afwijkende vertragingen ingeven. Momenteel wordt nog niet specifiek bijgehouden in de databank hoeveel keer een bepaalde gebruiker een afwijkende vertraging ingaf. Naar de toekomst toe is dit echter zeker een functie die te overwegen valt aangezien dit nog meer duidelijkheid zal verschaffen over de gegevensinvoer per gebruiker.
3.4.3
NMBS Gebruikersbeheer
Momenteel valt de specifieke gegevensinvoer van de gebruikers wel al te raadplegen in het menu “NMBS Gebruikersbeheer”. Invoer van een gebruiker
6*)4+01*"20+%
!"#$%& #'" %%" (%)&*+,%& ! !"#$%&$'($ %$')'*#+"#$" ,$$'#$%$" %&&' $$" -$.**/($ #$-'0+1$'2 3.)+$4 5 6//$ %$')'*#+"#$" 5 7$')'*#+"#$" %&&' $$" -$.**/( )'*8$9) ,$$'#$%$" 5 7$')'*#+"#$" %&&' $$" -$.**/( )'*8$9) &. $$" 4.$9+:+$1$ (*)0; ,$$'#$%$"
-'.+/'0+%1*"20+%
!"%&$' %*/+($'$"
<,+)9= >*4$ ?!"%&$'$"? @*#**" &: #$-'0+1$'4"**; **",$A+# +4 +" ($ (*)*-*"1 @*#**" &: %$')'$1(*)0; $" $+"((*)0; '$$(4 %&&'-+8 A+8"2 "*#**" &: %$')'$1(*)0; %*/) %&&' **"1&;4)(*)0; -'$*1B
7*/+(*)+$ #$4/*
7*
/+ (
*)+
$"
+$)
#$
*#(
4/* *
<,+)9= >*4$ ?!"%&$'$"? 7*'+*-$/$" +"%0//$" (+$ $'%&&' A&'#$" (*) +"#$%&$'($ %$')'*#+"#$" 10""$" ,$$'#$#$%$" ,&'($" -'$*1B >*4$ ?C$%$4)+#$"? C$.*/$" =&$ ($ +"#$%&$'($ %$')'*#+"#$" ,$$'#$#$%$" (+$"$" )$ ,&'($"2 -'$*1B
#(
3$*04%./+"(5 Figuur 3.17: Schematisch overzicht van de afschaffingsbeheerpagina.
Op de pagina “Invoer van een gebruiker” kan de beheerder de ingevoerde vertragingen en afschaffingen van een specifieke gebruiker binnen een bepaalde periode raadplegen. Bij deze weergave wordt dan telkens ook aangeduid of de invoer afwijkend is of niet. Hierbij bestaat de mogelijkheid om enkel de vertragingen weer te geven voor een bepaald traject of de vertragingen voor een bepaald traject op een specifieke datum. Op die manier kan dus bepaald worden welke gebruikers al te vaak verkeerde informatie hebben ingevoerd. Vervolgens kan de beheerder beslissen om alle invoer van een bepaalde gebruiker te verwijderen. Het tabblad “Verwijder gebruikersinvoer” laat dit toe.
38
Hoofdstuk 3. Applicatiebespreking Verwijder gebruikersinvoer
Op de pagina “Gebruikersinvoer” kan de naam van een gebruiker ingegeven worden, waarna alle records van die gebruiker uit de databank verwijderd worden. Bovendien kan men aanduiden of de gebruiker ook geblokkeerd dient te worden. Indien men de gebruiker blokkeert zal er een waarschuwingsbericht worden weergegeven waarbij men de gebruiker kan inlichten over de blokkering. Voor dit waarschuwingsbericht maakten we gebruik van de standaard drupal set message() functie.
3.4.4
NMBS Afschaffingsbeheer
Tot slot hebben we nog een afschaffingsbeheermenu toegevoegd aan onze module. Dit menu werd toegevoegd om na te gaan of een bepaalde trein werd aangeduid als afgeschaft, terwijl andere gebruikers een vertraging invulden voor die specifieke trein. Indien dit het geval is, kan de beheerder deze conflicterende invoer opvragen voor een bepaalde tijdsperiode. Hierbij kan dan voor elk traject een gedetailleerde weergave opgevraagd worden. Gedetailleerd overzicht van geselecteerde traject
G e d e ta ille e rd o v e rz ic h t W e e rg e v e n va n a lle in g e v o e rd e ve rtra g in g e n v o o r s p e c ifie k tra je ct. W e e rg e v e n va n g e b ru ike rs d ie s p e cifie ke tre in a a n d u id e n a ls a fg e sc h a ft A ctie s : - A lle in g e v o e rd e ve rtra g in g e n v e rw ijd e re n , tre in w o rd t a a n g e d u id a ls a fg e sc h a ft - A lle a fsc h a ffin g e n v e rw ijd e re n , v e rtra g in g e n b e h o u d e n
S u b m itfu n c tie B e v e stig e n In vo e r
A fh a n ke lijk v a n ke u z e v e rtra g in g e n ve rw ijd e re n o f a fs ch a ffin g e n ve rw ijd e re n .
Figuur 3.18: Schematisch overzicht van de gedetailleerde overzichtspagina.
In deze gedetailleerde weergave worden dan alle ingevoerde vertragingen voor die specifieke trein opgevraagd uit de databank, waarbij ook telkens de gebruikers weergegeven worden. Daarnaast is er ook een overzicht van gebruikers die deze specifieke trein hebben aangeduid als afgeschaft. Op basis hiervan kan de beheerder opteren voor e´ e´ n van de twee opties die onderaan de pagina aangegeven worden. De eerste optie zorgt ervoor dat alle ingevoerde vertragingen voor die specifieke trein worden verwijderd en de trein dus aangeduid wordt als afgeschaft. De tweede optie verwijdert de trein uit de tabel met afgeschafte treinen en bewaart de ingevoerde vertraging. De beheerder zal naar zijn gevoel moeten bepalen welke optie gekozen moet worden. Eventueel kan deze ook besluiten een mail te sturen naar de gebruikers om meer uitleg te vragen over de betreffende invoer. Afschaffingen bekijken Op de tweede pagina van “NMBS Afschaffingsbeheer” kan de beheerder al de ingegeven afschaffingen voor een arbitraire periode bekijken. Naast traject, aankomst, vertrek, duur en treinsoort wordt als detail ook de gebruiker weergegeven. Om het overzicht te behouden, kan ook hier de weergave aangepast worden.
Besluit en uitbreidingsmogelijkheden Besluit We hebben een Drupalmodule ge¨ımplementeerd die inspeelt op het actuele thema “treinvertragingen”. Treingebruikers kunnen aan de hand van deze applicatie: • Vertragingen/afschaffingen registreren: Een aangemelde gebruiker kan zijn opgelopen vertragingen of afschaffingen op de website registreren. Tijdens dit registratieproces worden de details van het beschouwde traject geparset van de NMBS-website, zodat de gebruiker steeds over de huidige dienstregeling kan beschikken. Het is tevens mogelijk om een traject met overstappen te registreren, waarbij de vertragingen per tussentraject worden opgeslagen. De beheerder kan gebruik maken van een aantal functies om de gebruiksinvoer in goede banen te begeleiden. Zo kan hij afwijkende vertragingen, conflicterende vertragingen en afschaffingen en de invoer van een bepaalde gebruiker opvragen. Aangezien de trajectinformatie gebaseerd is op de gebruikersregistraties, is de beheerssectie een belangrijk onderdeel van onze applicatie. • Trajectinformatie opvragen: Een al dan niet aangemelde gebruiker heeft de mogelijkheid om de reeds ingegeven vertragingen en afschaffingen van een bepaald rechtstreeks traject te bekijken. Hij kan dit doen aan de hand van drie grafiek-klassen, elk met hun specifieke grafieken en tabellen. Op die manier krijgt de gebruiker een duidelijk beeld van de gemiddelde vertragingen op een bepaald traject. • Persoonlijke statistieken: Een geregistreerde gebruiker kan zijn persoonlijke registraties opvragen, eventueel met het oog op compensaties van de NMBS. Hierbij kan hij onder andere de weergave en de beschouwde periode wijzigen om een zo accuraat mogelijk beeld te verkrijgen van zijn reisgedrag. De functionaliteit die we momenteel aanbieden kan nog uitgebreid worden. We bespreken de toekomstperspectieven van de applicatie in de volgende sectie.
39
Hoofdstuk 3. Applicatiebespreking
40
Uitbreidingsmogelijkheden Tot slot overlopen we enkele interessante uitbreidingspistes van de module. • Dienstregelingen vergelijken: Zoals besproken in Sectie 3.1 bevat het veld versie van de databanktabel nmbs overzicht het versienummer van de huidige dienstregeling13 . Het kan nuttig zijn om verschillende dienstregelingen te vergelijken; zo kan nagegaan worden of de invoering van een nieuwe dienstregeling een al dan niet gunstig effect heeft op de stiptheid van het treinverkeer. • Oorzaak van vertraging/afschaffing: De tabel nmbs vertragingen kan uitgebreid worden met een veld dat de oorzaak van vertraging opslaat. De gebruiker zou bij de vertragings- of afschaffingsregistratie dan kunnen kiezen uit een aantal standaard oorzaken14 . Bij de vertragingsgrafieken kunnen deze oorzaken vervolgens in een taartdiagram uitgezet worden. Een tekstveld, waarin additionele trajectinformatie kan ingevoerd worden, behoort in deze optiek ook tot de mogelijkheden. • Onrechtstreekse trajecten: Trajecten met overstappen (zie Opmerking 3.1) vormen een grote uitdaging; aangezien we niet met lijnen werken, is het moeilijk om een onrechtstreeks geregistreerd traject te visualiseren. We slaan evenwel in de tabel nmbs traject het traject met bijhorende tussenstations op (zie Sectie 3.1). Aan de hand daarvan zou het traject met overstappen gereconstrueerd kunnen worden uit de rechtstreekse tussentrajecten. Bij een onrechtstreeks traject kunnen voor de tussentrajecten momenteel enkel vertragingen geregistreerd worden. In de toekomst zou het ook mogelijk moeten zijn om een bepaald tussentraject als afgeschaft te kunnen registreren. • Ten slotte zou een geregistreerde gebruiker zijn persoonlijke statistieken in pdf-formaat moeten kunnen omzetten. We hebben dit geprobeerd aan de hand van een drupalmodule, maar het resultaat was niet bevredigend.
13 Momenteel
wordt dit opgeslagen als bvb. “v1”, maar het is beter om in het vervolg ook de ingangsdatum van de beschouwde dienstregeling bij te houden. 14 We denken hierbij aan technische problemen, staking, andere, enz...
Bibliografie [1] Handelingen (n◦ 4-13) van de Belgische Senaat, donderdag 17 januari 2008 - Namiddagvergadering. http://www.senate.be/www/?MIval=/publications/viewSTBlok\&COLL=H\&DATUM=01/ 17/2008\&DOSID=67109130\&MINID=4333\&LEG=4\&NR=13\&VTYPE=vouid\&LANG=nl [2] http://www.bttb.be/pers/pers071130.htm [3] Plenaire vergadering van de Belgische Senaat, Donderdag 29 oktober 1998. http://www.senate.be/www/?MIval=/publications/viewTBlok\&DATUM=’10/29/ 1998’\&TYP=crabv\&VOLGNR=1\&LANG=nl [4] https://www.infrabel.be/portal/page/portal/pgr_infr_e_internet/pag_society/ Ponctualite2007/Ponctualite-infos/ [5] Douglas T., Little M., Smith J.W., Building online Communities with Drupal, PhpBB and Wordpress, Apress, 2005, xxvii [6] http://www.gnu.org/licenses/gpl.html [7] http://www.joomla.org/ [8] http://www.cakephp.org/ [9] http://www.vandale.nl/vandale/opzoeken/woordenboek/?zoekwoord=open+source [10] http://nl.wikipedia.org/wiki/Model-View-Controller-model [11] We baseren ons grotendeels op: J.K. Van Dyck,M.Westgate, Pro Drupal Development, Apress, Berkeley, 2007,428 p. [12] http://en.wikipedia.org/wiki/LAMP_(software_bundle) [13] http://www.devatwork.nl/index.php/2007/03/26/inversion-of-control/ [14] http://api.drupal.org/api/group/hooks [15] http://api.drupal.org/api/group/form_api/6 [16] http://mollom.com/ [17] http://www.netwatmeer.nl/blog/user-comment-modules [18] http://www.php.net/quickref.php
41
Bibliografie [19] http://nl.wikipedia.org/wiki/Lijst_van_spoorlijnen_in_Belgi%C3%AB [20] http://nl.wikipedia.org/wiki/Treincategorie%C3%ABn_Belgi%C3%AB [21] http://drupal.org/node/146843 [22] http://plannerint.b-rail.be/bin//query.exe/nn?L=b-rail&nl=Nederlands [23] http://www.nmbs.be [24] http://code.google.com/apis/chart/ [25] http://drupal.org/project/charts
42
A
Appendix A.1
Broncode: interactie NMBS-website ",$temp[$i]); $temp3=explode("
",$temp2[1]); $_SESSION['vertrekstation'][$i-2]=str_replace(" ","", trim(Strip_tags($temp3[0]))); $_SESSION['eindstations'][$i-2]=str_replace(" ","", trim(Strip_tags($temp3[1]))); $temp3=explode("
",$temp2[2]); $temp3a= explode("
", $temp3[0]); $temp3b= explode("
", $temp3[1]); $_SESSION['vertrekdatum'][$i-2]=trim(Strip_tags($temp3a[0])); $_SESSION['aankomstdatum'][$i-2]= trim(Strip_tags($temp3b[0])); if ($_SESSION['aankomstdatum'][$i-2] == ""){ $_SESSION['aankomstdatum'][$i-2]= $_SESSION['vertrekdatum'][$i-2]; } $temp3=explode("
",$temp2[4]); $_SESSION['vertrekuur'][$i-2]=str_replace(" ","", trim(Strip_tags(trim($temp3[0])))); $_SESSION['aankomstuur'][$i-2]=str_replace(" ","", strip_tags(trim($temp3[1]))); $_SESSION['reisduur'][$i-2]=str_replace("\n","",(str_replace(" ","",strip_tags(trim($temp2[6]))))); $_SESSION['overstappen'][$i-2]= trim(Strip_tags($temp2[7])); $temp4=explode("
","",trim($temp5[1])); $temp7= explode(" ",$temp6); $opgelet=false; if ($temp7[0]=="Opgelet!") {} else{ if ($_SESSION['treinsoort'][$i-2]==""){ $_SESSION['extendedtreinsoort'][$i-2]=$temp6; $_SESSION['treinsoort'][$i-2]=$temp7[0]; } else{ $_SESSION['extendedtreinsoort'][$i-2].=", ".$temp6; $_SESSION['treinsoort'][$i-2].=", ".$temp7[0]; } } } } ?>
43
Bijlage A. Appendix
A.2
44
Gebruikersmogelijkheden
In dit hoofdstuk wensen we, aan de hand van schermafbeeldingen, de mogelijkheden voor geregistreerde gebruikers van onze website toe te lichten.
A.2.1
Ingeven van treinvertragingen
Wanneer een geregistreerde gebruiker een vertraging wenst in te geven, dient deze in het menu (op de website links) te klikken op “Vertraging ingeven”. Vervolgens komt de gebruiker op onderstaande pagina terecht.
De gebruiker kan op twee mogelijke manieren een traject te selecteren. Ofwel wordt er een traject geselecteerd dat reeds aanwezig is in de voorkeurtrajecten van de gebruiker, zoals op onderstaande afbeelding.
Bijlage A. Appendix
45
Ofwel opteert de gebruiker ervoor om een nieuw traject in te geven. Hierbij kan de gebruiker aanvinken of dit traject dient opgeslagen te worden bij de voorkeurtrajecten.
Eens het traject en de datum geselecteerd is, dient de gebruiker aan te geven of er een afgeschafte trein of een trein met vertraging zal geregistreerd worden. In dit voorbeeld zullen we de vertraging registreren voor de trein van Brugge naar Hasselt op 15 mei 2008 omstreeks 16:12u. Eens de gebruiker op bevestigen klikt, wordt de informatie verwerkt en komt de gebruiker op de pagina “Treinenoverzicht” terecht. Op deze pagina bestaat de mogelijkheid om de datum te wijzigen indien dit vereist is.
Bijlage A. Appendix
46
Wij selecteren de trein van Brugge naar Hasselt omstreeks 16:20u. Aangezien dit een traject met 1 overstap is worden we doorverwezen naar de pagina “Overstappen”.
Aangezien we een traject selecteerden met slechts e´ e´ n overstap, verschijnt er op de pagina ook maar e´ e´ n tekstveld om een overstapplaats in te vullen. In het voorbeeld vullen we als overstapplaats het station “Antwerpen - Berchem” in. Vervolgens worden we terug doorverwezen naar de pagina “Treinenoverzicht” waar automatisch het traject Brugge - Antwerpen-Berchem staat aangegeven.
Bijlage A. Appendix
47
Vanaf nu kunnen er geen trajecten meer met overstappen geselecteerd worden. Indien dit toch gebeurt, verschijnt onderstaande foutmelding.
Bijgevolg selecteren we dan ook het traject zonder overstappen en komen we op de pagina “Vertraging ingeven” terecht.
Bijlage A. Appendix
48
Na invullen van een vertraging van twee minuten worden we terug doorverwezen naar de pagina “Treinenoverzicht”. Daar staat het tweede deel van ons traject reeds aangegeven.
Vervolgens wijzigen we het uur als test naar 15:12u.
Bijlage A. Appendix
49
Vervolgens komen we op de pagina “Vertraging ingeven” waar er geconstateerd wordt dat de trein vroeger vertrekt dan dat de vorige trein is aangekomen.
Bijgevolg keren we terug naar de voorgaande pagina. Waarna we de trein selecteren van 17:38u.
Bijlage A. Appendix Vervolgens vullen we 3 minuten vertraging in.
En ons traject is geregistreerd.
Ter illustratie registreren we ook een afgeschafte trein.
50
Bijlage A. Appendix De trein van Brugge naar Oostende op 15 mei omstreeks 16:42u. wordt geselecteerd.
De afschaffing wordt bevestigd.
51
Bijlage A. Appendix
52
Voorkeurstrajcten De gebruiker kan zijn voorkeurtrajecten zelf beheren. Als voorbeeld wordt het traject Drongen Aalter toegevoegd.
De gebruiker kan tevens e´ e´ n of meerdere voorkeurtrajecten met een muisklik verwijderen.
Bijlage A. Appendix
En de selecteerde trajecten werden uit de lijst verwijderd.
53
Bijlage A. Appendix
A.2.2
54
Bekijken van de persoonlijke statistieken
Naast het ingeven van vertragingen of afschaffingen kunnen geregistreerde gebruikers ook hun gegevensinvoer bekijken die verzameld worden onder de noemer “Persoonlijke statistieken”. Op de pagina “Recente lijnen” worden de laatste 20 ingevulde lijnen weergegeven van zowel de ingevoerde vertragingen als de ingevoerde afschaffingen. Aangezien er in ons voorbeeld nog niet zoveel vertragingen of afschaffingen zijn ingegeven is het aantal lijnen op onderstaande afbeelding wat beperkter. Naast deze weergave is het voor de gebruikers ook mogelijk om specifieke grafieken op te vragen voor de weergegeven lijnen.
Op de pagina “Ingevoerde vertragingen/afschaffingen” kan de gebruiker dan meer specifiek per maand de ingevoerde gegevens bekijken.
Bijlage A. Appendix
55
Bijlage A. Appendix
56
Als voorbeeld geven we alle vertragingen en afschaffingen weer voor het traject “Brugge - Oostende”.
Ook is het mogelijk alle vertragingen en afschaffingen weer te geven voor een bepaald traject op een specifiek uur. In dit geval is dat het traject Brugge - Antwerpen-Berchem met vertrekuur om 16:20u. en aankomstuur om 17:33u.
Bijlage A. Appendix
57
Het tabblad “Extra” biedt ongeveer dezelfde mogelijkheden als het tabblad “Ingevoerde vertragingen/afschaffingen”. Op deze pagina worden echter niet alle vertragingen weergegeven voor een specifieke maand maar alle vertragingen voor een bepaald traject binnen een bepaalde periode. Ook hier is het mogelijk de weergave aan te passen.
Bijlage A. Appendix
58
Tot slot zijn er ook nog de “Jaarstatistieken”. Op deze pagina krijgt de gebruiker een mooie algemene grafiek te zien, op basis van de ingevoerde gegevens. Procentueel wordt ook aangeduid hoeveel vertraging de ingevoerde treinen hadden.
A.2.3
Opvragen van grafieken
Grafieken 1 De gebruiker krijgt een gedetailleerd overzicht van de trein, die bovenaan de pagina in het rood vermeld staat. De eerste grafiek toont de gemiddelde dagelijkse vertraging van de gespecificeerde maand.
Bijlage A. Appendix
59
Vervolgens worden de vooropgestelde reisduur en de gemiddelde maandelijkse vertraging weergegeven in een taartdiagram.
De volgende twee grafieken, de gemiddelde vertraging per weekdag de gemiddelde vertraging per uur van de dag worden enkel getoond als ze van toepassing zijn. Indien de beschouwde trein enkel de zaterdagavond om 22.15u. spoort, zullen deze grafieken dus niet weergegeven worden.
Bijlage A. Appendix
60
Grafieken 2 De grafiek van deze pagina toont de gemiddelde dagelijkse vertraging per treinsoort voor de beschouwde maand. Het traject en de maand worden wederom in het rood bovenaan de pagina weergegeven.
De gemiddelde maandelijkse reisduur van elke treinsoort waarvoor er in de beschouwde maand reeds vertragingen werden geregistreerd, wordt getoond in een taartdiagram.
Bijlage A. Appendix
61
Ten slotte worden eventuele afgeschafte treinen getabelleerd en kan de gebruiker de grafieken van het omgekeerde traject bekijken.
Grafieken 3 De gemiddelde maandelijkse vertraging per treinsoort en per jaar worden getoond in onderstaande grafiek. Merk op dat de kleurcodes van de treinsoorten consequent gehanteerd worden doorheen de verschillende grafiek-klassen.
De tabel van “Grafieken 3” toont de ingaven per maand en per treinsoort van het beschouwde traject. Ten slotte kan de gebruiker ook hier naar de grafieken van het omgekeerde traject navigeren.
Bijlage A. Appendix
A.3
62
Beheersmogelijkheden
Ook voor de beheerde van de website werden een aantal functies ontwikkeld. Deze vallen te raadplegen in de beheerssectie van de website.
Bijlage A. Appendix
A.3.1
63
Nmbs Vertraginsgbeheer
Allereerst bekijken we in het menu “Nmbs Vertragingsbeheer” de pagina “Bekijk afwijkingen”. Hier wordt aangeduid wie er afwijkende vertragingen heeft ingevoerd voor welk traject.
In dit voorbeeld merken we dat er e´ e´ n afwijkende vertraging is ingegeven. Bijgevolg selecteren we deze om een gedetailleerd overzicht te kunnen krijgen over de ingevoerde vertragingen van dat specifieke traject.
Bijlage A. Appendix
64
We merken dat er reeds vijf vertragingen zijn ingevoerd. Deze zijn gerangschikt van klein naar groot, waarbij de twee grootste en de twee kleinste vertragingen in het rood aangegeven staan.
Bijlage A. Appendix
65
We besluiten de afwijkende vertraging te verwijderen.
Aangezien er nu maar vier vertragingen overblijven heeft het weinig zin om deze allemaal in het rood weer te geven.
Bijlage A. Appendix
66
Het is overigens ook mogelijk om een specifiek traject te bekijken door gewoon dat traject in te voeren op deze pagina zelf.
Tot slot is er binnen het menu “Vertragingsbeheer” ook nog de mogelijkheid om de gemiddelde vertragingen voor een bepaald traject binnen een bepaalde op te vragen. Dit kan op de pagina “Algemeen vertragingoverzicht”. In onderstaande werd het traject Bellem - Brugge opgevraagd in de periode van 1/5/2008 tot 18/5/2008.
Bijlage A. Appendix
A.3.2
67
Nmbs Stationsbeheer
Het menu stationsbeheer werd toegevoegd om het aan de beheerder toe te laten de benodigde stations te importeren in de databank. Op de pagina “Stations importeren” kan dit gebeuren aan de hand van een CSV-bestand.
We gebruiken een CSV-bestand waarin alle stations opgesomd staan, zoals in onderstaand voorbeeld.
Vervolgens worden de stations met behulp van een batch ge¨ımporteerd.
Bijlage A. Appendix De stationsnamen kunnen ook handmatig ingegeven worden.
Ook bestaat de mogelijkheid om stations te verwijderen.
68
Bijlage A. Appendix
Tot slot kan de beheerder ook nog de naam van een station wijzigen
69
Bijlage A. Appendix
A.3.3
70
Nmbs Gebruikersbeheer
In het menu gebruikersbeheer kunnen de vertragingen en afschaffingen ingevoerd door een bepaalde gebruiker opgevraagd worden.
Dit laat het toe om na te gaan of een gebruiker niet al teveel afwijkende vertragingen heeft ingegeven. Ook hier weer bestaat de mogelijkheid om de gebruikersinvoer weer te geven volgens traject, volgens traject en tijd...
Bijlage A. Appendix
71
Indien een gebruiker teveel afwijkende vertragingen invoert, kan de beheerder besluiten de gegevensinvoer van die gebruiker te verwijderen. Hierbij bestaat de mogelijkheid om de gebruiker ook te blokkeren.
A.3.4
Nmbs Afschaffingsbeheer
Het menu afschaffingsbeheer werd toegevoegd opdat de beheerder zou kunnen nagaan of er geen conflicterende gegevensinvoer is. Hiermee doelen we op het feit dat een gebruiker voor een bepaalde trein kan ingeven dat deze vertraging had maar daarnaast voor diezelfde trein ook kan aanduiden dat deze trein afgeschaft werd. Op de pagina “Bekijk conflicten” wordt deze conflicterende gegevensinvoer weergegeven.
Bijlage A. Appendix
72
Wanneer we op bevestigen klikken, wordt er een gedetailleerd overzicht gegeven van de ingevoerde vertragingen/afschaffingen.
We opteren ervoor om de vertragingen te behouden, waarna we automatisch teruggestuurd worden naar de “Bekijk conflicten” pagina. Daar staat dan ook maar e´ e´ n traject meer aangegeven.
Bijlage A. Appendix
73
Tot slot werd in dit menu ook nog de optie toegevoegd om alle afschaffingen te bekijken binnen een bepaalde periode.