Week 7 - Eindelijk resultaat

Deze week ben ik begonnen aan het uitwerken van de front-end. Dit ging verbazingwekkend goed vooruit, hoewel er hier en daar wel wat kleinere problemen naar boven kwamen. Op het moment van schrijven is alles van de front-end afgewerkt op de widgets en enkele details na.  De meeste pagina’s bestaan echter uit widgets dus op zich is er nog wel een hoop werk, maar het gaat tenminste wel vooruit. Het werken aan de front-end is bovendien een hoop grafischer, hiermee bedoel ik: je ziet ook vrij snel welk effect je code op de site heeft, terwijl dit bij de webadmin iets minder was.

Dit maakt mijn blogpost voor mij ook een stukje interessanter aangezien ik nu effectief iets kan tonen. Daarom hieronder al enkele screenshots.

homepage world explorer

homepage world explorer

landen pagina

landen pagina

Url-structuur

Ik heb deze week een groot deel van mijn tijd besteed aan het uitwerken van de url-structuur voor World Explorer. Ik stuitte hierbij op het probleem dat de oorspronkelijke url-structuur, namelijk http://sitedomein/FrontControllerNaam/functie/parameter1/parameter2/param../ niet voldeed voor wat ik probeerde te doen.

Zo wilde ik een url in de stijl van http://www.worldexplorer.be/bestemmingscategorieNaam/landnaam/bestemmingsnaam/ hebben, maar zoals je ziet wordt dit moeilijk omdat dit waarden zijn die uit de database moeten worden opgehaald en ze bovendien afhankelijk zijn van elkaar. Bovendien is de FrontController die opgeroepen moet worden afhankelijk van het niveau binnen deze url-structuur. Nog moeilijker wordt het als er behalve deze structuur ook nog vaste pagina’s mogelijk moeten zijn.

Inventis heeft daarom een Routing-library voor het framework uitgewerkt om het mogelijk te maken om een eigen url-structuur op te stellen. Onmisbaar bij een url-structuur zoals deze.

Omdat er echter over deze library nog geen documentatie is geschreven en het op het eerste zicht toch een vrij complex iets is, heb ik besloten om de rest van mijn blogpost hieraan te wijden.

Routing Library

Zoals al eerder vermeld moeten er voor iedere categorie van pagina’s van een website controllers geschreven worden. Deze controllers bevatten dan functies die de gegevens ophalen en weergeven. Standaard worden de url’s op de volgende manier samengesteld: http://example.com/controllerNaam/functieNaam/parameter1/parameter2

De routing-library maakt het bijvoorbeeld mogelijk om de volgende situatie uit te werken: als een routing-segment overeenkomt met ‘test’, gebruik dan controller ‘test’ en functie ‘testAction’. Als het overeenkomt met iets anders, gebruik dan controller ‘error’ en functie ’show404′.

Hieronder een voorbeeld:

//verwijs  http://example.com/test/ door naar controller Test en functie home

$this->newSegment(’test’)->useController(’Test’)->useFunction(’home’);

//verkorte versie:

rs(’test’)->useController(’Test’)->useFunction(’homeAction’);

//met childpagina http://example.com/hello/:

$this->newSegment(’hello’)->useController(’Hello’)->useFunction(’helloAction’)->addChildren(

rs(’world’)->useFunction(’worldAction’), //http://example.com/hello/world/

rs(’test’)->useController(’Test’)->useFunction(’homeAction’)  // http://example.com/hello/test/

);

Belangrijk om op te merken is dat de functies gechained worden. Iedere functie in routing geeft het huidige routing-object terug, dus kun je blijvend functies op hetzelfde routingsegment blijven uitvoeren.

Het declareren van childs wordt gedaan door middel van de addChildren-functie.

In bovenstaande voorbeelden hebben we echter alleen maar met vaste waarden gewerkt, interessanter wordt het als we op bepaalde types gegevens gaan zoeken. Hiervoor bestaan er een aantal functies. Hieronder een overzicht.

Functie

Beschrijving

match($waarde) Kijkt of het huidige routing-segment overeenkomt met de opgegeven waarde.
matchNumber Kijkt of het huidige routing-segment numeriek is.
matchAlphanum Kijkt of het huidige routing-segment alfanumeriek is.
matchRegexp($regexp) Kijkt of het huidige routing-segment overeenkomt met de opgegeven reguliere expressie.
matchTranslation($translationKey) Kijkt of een bepaalde vertaling van de opgegeven translationKey overeenkomt met dit huidige routing-segment.
matchModel($modelName) Roept de match($quicklink) methode op van het opgegeven model, waarbij $quicklink het huidige routing-segment is. Hiermee is het mogelijk om via de database te controleren of de opgegeven waarde doorverwezen moet worden.
matchAll() Deze functie geeft altijd true op, zodat hiermee een standaard-route kan opgegeven worden die gebruikt wordt als de routes erboven niet overeenkomen.

In bovenstaand overzicht is het belangrijk om te weten dat met huidig routing-segment het url-segment waarop deze functie wordt uitgevoerd bedoeld wordt.

Even een tweede voorbeeld ter verduidelijking:

//http://example.com/1/

$this->newSegment()->matchNumber()->useController(’Test’)->useFunction(’homeAction’)->asParam()

Als het 1ste routing-segment numeriek is, wordt de Test-controller gebruikt in combinatie met de homeAction-functie. In het voorbeeld is ook te zien dat ik de functie asParam() gebruik. Dit brengt mij tot mijn volgende punt: een parameter meegeven met een functie bij het doorverwijzen.

Als de functie asParam() wordt gebruikt, wordt het huidige routing-segment meegegeven als parameter van de gekozen functie. Een controller zou bijvoorbeeld op de volgende manier gedeclareerd kunnen worden:

<?php

class TestFront extends FrontController{

public function homeAction($param1){

echo $param1;

}//end homeAction

}//end class

?>

Als we dan de url http://example.com/1/ ingeven, zal er “1″ op het scherm verschijnen.

Hieronder nog een overzicht van de verschillende functies die we kunnen toepassen op een url-segment:

Functie

Beschrijving

useController($controllerName) Gebruikt de controller met de opgegeven naam voor het huidige routing-segment
useFunction($functionName) Gebruikt de functie met de opgegeven naam voor het huidige routing-segment
asParam() Geeft het huidige routing-segment mee als parameter van de opgegeven functie.
redirect($url, $http_status_code, $get_params) Redirect naar de opgegeven url met mogelijk een custom http status en de opgegeven get-parameters. Deze functie staat los van de standaard routing en wordt verder niet besproken in deze blogpost.

Coming up

Volgende week ga ik waarschijnlijk besteden aan het uitschrijven van de dossiers- en promotiemodule in de webadmin, om vervolgens deze in de Front-end uit te werken.

Een reactie op “Week 7 - Eindelijk resultaat”

  1. Dirk Bonhomme zei op 26/04/2010 om 21:25,

    Fijn dat je de routing op een duidelijke manier probeert voor te stellen. Het blijft een complexe (maar krachtige) feature van het framework en is niet op 5 seconden uitgelegd. Hopelijk wordt de werking en het idee erachter iets duidelijker met deze blogpost!


Reageren