Module Specific Plugins with Zend Framework

I have been looking over Zend Framework modules for some time now. Although I have some experience with the Zend Framework, my experience with modules is quite limited.

Setting up modules is not that difficult. Tutorials like the one of Jeroen will guide you flawlessly through this process. Jeroen uses another approach to layout switching though. I prefer to put all layouts in the layouts folder and give them the same name as their module. Like this, switching can be done easily with the following plugin.

<?php
class Mist_Controller_Plugin_ModularLayout extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $layout = Zend_Layout::getMvcInstance();
        $layout->setLayout($request->getModuleName());
    }
}

Now, let’s get back to the problem.

The big misconception

The big problem with Zend_Application, for me, was that it did not do what I supposed it would do.

In a non-modular application I would use the Bootstrap to set up the View and other things (like illustrated in the tutorial of Rob Allen).

protected function _initView()
{
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $view->doctype(Zend_View_Helper_Doctype::HTML5);
    $view->headTitle('Some Application');
    $view->headTitle()->setSeparator(' - ');
}

One might think you could extend this behaviour to modules (by adding Zend_Application_Module_Bootstrap classes) and set up a different title for each module. Think again! Zend_Application bootstraps the entire application. So, if you were to make separate Bootstrap classes with _initView() methods, you would end up with a title ‘*title set in Bootstrap* – *title set in Module1_Bootstrap* – *title set in Module2_Bootstrap* – …’ on each page.

The answer to this behaviour is simple, but it hard to find (I did not find it in the manual anyway). There are three basic steps from request to response when working with Zend Framework.

  • Bootstrapping
  • Routing
  • Dispatching

Zend_Application only takes care of the bootstrapping. So, at that point, it is not aware of the routing. That is why your application gets fully bootstrapped all the time. As this happens for each request, it is a good practise to make the bootstrap as light as possible.

How does this resolve my problem? It does not. All module specific loading should happen using Plugins or Helpers. But how do you implement module specific Plugins? Adding this line to the application.ini file does not do the trick.

admin.resources.frontController.plugins.view = Admin_Plugin_View

The plugin will be used in every module. That is not what I (and probably you) want.

The solution

Because Zend_Application registered my plugins with all modules, I decided to register only two plugins: my layout switcher and a plugin to manage module specific plugins. It looks like this.

<?php
class Mist_Controller_Plugin_ModuleSpecificPluginLoader extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        if($request->getModuleName() != 'default')
        {
            $plugins = $this->getModuleSpecificPlugins($request->getModuleName());
            foreach($plugins as $plugin)
            {
                $instance = new $plugin();
                $instance->preDispatch($request);
            }
        }
    }
 
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        if($request->getModuleName() != 'default')
        {
            $plugins = $this->getModuleSpecificPlugins($request->getModuleName());
            foreach($plugins as $plugin)
            {
                $instance = new $plugin();
                $instance->routeShutdown($request);
            }
        }
    }
 
    protected function getModuleSpecificPlugins($module)
    {
        $result = array();
        $fc = Zend_Controller_Front::getInstance();
        $pluginsPath = realpath($fc->getModuleDirectory() . "/plugins");
 
        $files = scandir($pluginsPath);
 
        foreach($files as $file)
        {
            if($file != '.' && $file != '..')
            {
                if(!in_array(realpath($pluginsPath . '/' . $file), get_included_files()))
                {
                    require($pluginsPath . '/' . $file);
                }
 
                $reflectionFile = new Zend_Reflection_File($pluginsPath . '/' . $file);
                $classes = $reflectionFile->getClasses();
                foreach($classes as $class)
                {
                    /* @var $class Zend_Reflection_Class */
                    if($class->isSubclassOf('Zend_Controller_Plugin_Abstract'))
                    {
                        $result[] = $class->getName();
                    }
                }
            }
        }
        return $result;
    }
}

It just looks for classes in the module plugin directory, checks whether they are plugins, and uses them if they are called for.

Conclusion

You might have noticed that this is not an elegant solution. There is definitely another way to register specific plugins for a module. However, with my limited knowledge of the Zend MVC, it is nearly the best/only solution I can think of.

To summarize: this is a quick and dirty fix. It does the job, but it is not quite elegant.

To be completely honest, I do not even use this myself. I did use it, but it did not last long.

Wat is een browser?

Op een van mijn talloze dooltochten op internet kwam ik dit tegen. Ik wil het jullie niet onthouden.

Ik was op zijn minst geschrokken. Weten zo weinig mensen wat een browser is? Serieus, ze gebruiken het dagelijks en ze weten niet hoe zo’n ding heet? :o

Een mens gaat zich vragen stellen. Zijn de mensen dom? Worden mensen onverschillig? Moet je tegenwoordig niet meer weten waar je mee werkt? Blijkbaar niet, enkele Nederlanders hebben hetzelfde experiment gedaan in Rotterdam. Opnieuw, teleurstellend resultaat…

Wat is er toch aan de hand? Ik vraag me af wat de resultaten zouden zijn in België. Iemand met een camera zin om wat mensen te gaan bevragen in Antwerpen na de tweede zit? :)

Oh, en indien je ‘t antwoord niet kent en toch je leven wil beteren. Hier is enkele mogelijke definities.

(web) browser
Een webbrowser is een stuk software, een programma dat je op je computer, smartphone hebt geïnstalleerd en waarmee je op het web kan surfen.

Google
Google is een zoekmachine. Zoekmachines zijn websites die je de mogelijkheid geven om het web te doorzoeken.

Een browser is dus niet Google en evenmin is Google een browser. Google heeft wel een (overigens zeer goede) browser, genaamd Chrome.

Huishoudkunde voor meisjes anno 1960

Ik heb het niet zo voor doorgestuurde e-mail. Soms echter, zit er wel eens iets lachwekkends bij, zoals volgende tekst. Mijn moeder duwde me deze gisteren deze in de handen. Het zou afkomstig zijn uit een katholiek handboek van de jaren ’60, getiteld “huishoudkunde voor meisjes”.

Maak dat het eten klaar is
Maak de zaken op voorhand klaar, de avond voordien als het moet, zodat een heerlijke maaltijd hem opwacht als hij terug keert van zijn werk. Het is een vorm van duidelijk maken dat je aan hem hebt gedacht en je bezorgd bent over zijn noden. De meeste mannen hebben honger als ze thuis komen en het vooruitzicht op een stevige maaltijd (vooral als het hun lievelingskostje is) maakt deel uit van de noodzakelijke warme verwelkoming.

Wees op tijd klaar
Neem voor jezelf een kwartier rust voor hij thuis komt om te ontspannen.
Werk uw opmaak een beetje bij, doe een band in je haren en wees fris en bevallig.
Hij heeft een zware dag achter de rug samen met mensen die hem overladen met werk en zorgen.
Wees dus opgewekt en een beetje interessanter dan laatstgenoemden. Zijn zware dagtaak moet opgevrolijkt worden en daar ligt ergens jouw taak dat het zo wordt.

Breng orde op zaken
Maak nog een laatste ronde door de voornaamste kamers van het huis juist voor je man thuis komt.
Verzamel de schoolboeken, speelgoed, papieren enz. en neem nog vlug het stof af op de tafels.

Gedurende de koudste maanden van het jaar
Je moet een gezellig vuurtje aanmaken waarnaast hij zich kan koesteren en ontspannen. Uw man zal het gevoel krijgen van in een ordelijke en rustige haven te zijn aangekomen en dat maakt jou ook gelukkig.
Voor zijn comfort zorgen bezorgt jou een enorme persoonlijke voldoening.

Breng het geluid op een minimaal niveau
Bij zijn aankomst zet je best al het geluid af van wasmachine, droogkast of stofzuiger.
Probeer de kinderen kalm te krijgen. Wees blij hem te zien. Verwelkom hem met een warme glimlach en toon de oprechtheid van uw wil om hem te bevallen.

Luister naar hem
Het zou kunnen dat je een dozijn belangrijke zaakjes aan hem wilt vertellen, maar daarvoor is zijn thuiskomst niet het geschikte moment. Laat hem eerst spreken, herinner je dat zijn onderwerpen belangrijker zijn dan de uwe. Maak ongeveer dat het zijn avond wordt.

Maak nooit je beklag als hij laat thuis komt
Klaag nooit als hij laat thuis komt voor de maaltijd of zelfs als hij de hele nacht wegblijft. Bekijk het als kleinschalig in vergelijking met wat hij heeft moeten doorstaan gedurende de dag. Instaleer hem comfortabel. Vraag hem zich te ontspannen in de zetel of te gaan rusten in bed. Maak een warme of frisdrank klaar.
Schud de kussens op en stel voor zijn schoenen uit te trekken. Spreek hem aan met een zachte, vredelievende en plezante stem. Stel hem geen vragen wat hij heeft gedaan en twijfel nooit aan zijn oordeel of zijn rechtschapenheid. Denk er aan dat hij de meester is in huis en uit deze functie zal hij steeds zijn wil uitoefenen met eerlijkheid en waarheid.

Wanneer hij klaar is met eten, ruim de tafel af en doe vlug de afwas
Als je man vraagt om te helpen wijs zijn voorstel af want hij zou zich kunnen verplicht voelen om het steeds weer te doen en na een zware dagtaak heeft hij geen nood aan extra werk.
Zet hem aan om zich aan zijn favoriete bezigheden te wijden. Toon je interesse hiervoor zonder hem het gevoel te geven dat je op gelijke voet komt op zijn gebied. Als je zelf kleine bezigheden hebt, doe ze zonder praten en storen, want zijn interesse punten zijn meestal belangrijker dan die van de vrouw.

Uiteindelijk de avond
Breng het huis in orde zodat het klaar is voor de volgende morgen. Denk er aan eventueel een ontbijt op voorhand klaar te maken. Het ontbijt van je man is uiterst belangrijk als hij op een positieve manier zijn zware dagtaak moet aanvatten.
Eenmaal dat jullie in de slaapkamer zijn aangekomen maak je je klaar om zo vlug mogelijk in bed te komen.

Niettegenstaande de vrouwelijke hygiëne
Een grote rol speelt, mag het niet de bedoeling zijn dat uw man de rij moet doen om in de badkamer te komen, zoals hij moet doen om zijn trein te halen. Zorg er echter wel voor dat je het beste voorkomen hebt als je gaat slapen. Tracht een voorkomen te hebben dat innemend is zonder uitdagend te zijn. Als je een nachtcrème moet aanbrengen of krulspelden, wacht tot hij slaapt want het zou hem kunnen ergeren bij het zien van een dergelijk schouwspel net voor hij slaap.

Wat de intieme relaties betreft met je man
Het is heel belangrijk je te herinneren wat jullie elkaar beloofden bij het huwelijk en voornamelijk de belofte van gehoorzaamheid. Als hij van oordeel is onmiddellijk te willen slapen dan zal het zo zijn. Te allen tijde word je geleid door de wil van je man en oefen je op geen enkel moment druk op hem uit om hem tot een intieme relatie te stimuleren.

Als je man voorstelt te paren
Aanvaardt met nederigheid maar houdt steeds in het achterhoofd dat het plezier aan de man is besteed  en veel belangrijker is dan dat van een vrouw. Als hij zijn orgasme bereikt is een beetje gekreun van jou kant niet misplaatst, integendeel het zal hem overtuigen dat jij er ook plezier aan hebt beleefd.

Als je man minder normale handelingen voorstelt
Gedraag je gehoorzamend en lijdzaam maar geef je eventueel ongenoegen aan door een stilzwijgen. Het is waarschijnlijk dat je man onmiddellijk zal inslapen. Breng je kledij weer in orde, breng je schoonheidsproducten aan alsook je haarverzorging.

Nu mag je de wekker zetten
Om zeker even voor je man op te zijn in de morgen. Zo kan je hem een kop thee maken tegen dat hij wakker wordt.

Straffe taal. Mijn eerste gedachte was: ‘Dit kan toch niet echt zijn?!’. Het lijkt me dan ook sterk uitgesloten dat deze tekst ooit effectief in een handboek heeft gestaan.

Moesten meisjes/vrouwen van deze tijd dit boek in handen krijgen, zouden ze het prompt uit het raam katapulteren en daarbij liefst nog de auteur (waarschijnlijk een man) goed verwonden met deze… euh, rotzooi.

Eerlijk gezegd zou ik niet eens zo willen/kunnen leven, denk ik. Het is leuk om verwend te worden, maar heel de dag, dag na dag, week na week, maand na maand, jaar na jaar (als je vriendin je al niet verlaten heeft omdat ze dit allemaal beu is)…?

Bij wijze van antwoord, heeft mijn moeder de tekst herwerkt tot een meer hedendaagse versie, getiteld “Toestanden in het ‘hedendaagse huwelijk’ (2008), aanzienlijk incompatibel met de richtlijnen van “Huishoudkunde” in 1960″. Best wel grappig om te lezen.

Maak dat het eten klaar is
Je man mag al enorm blij zijn als er überhaupt eten ís. Vaak heb je je  zo afgejaagd om met je werk klaar te zijn, dat er geen tijd rest voor een uitgebreide maaltijd. Je gaat er dan van uit dat hij inzicht vertoont in zijn eigen noden en daar preventief kan op inspelen. Een pizza in de oven zetten is heus niet zo moeilijk.

Wees op tijd klaar
Neem inderdaad een kwartier voor jezelf om alle ballast van de dag af te werpen vóór je man thuiskomt. Zorg er vooral voor, dat je er op je werk fris en bevallig bijloopt, thuis hoeft dat niet meer. Hij zal je echt wel nemen zoals je bent.

Breng orde op zaken
Het voelt altijd fijn om je eigen bureau opgeruimd te zien. Dan valt ook meteen het contrast met ZIJN bureau op.

Gedurende de koudste maanden van het jaar
Als je voldoende zeurt mag de thermostaat van hem misschien wel één graadje hoger, maar dan moet je eerst met staalharde wetenschappelijke bewijzen komen, anders geeft hij niet toe.

Breng het geluid op een minimaal niveau
Het geluid van wasmachine en droogkast is verwaarloosbaar in vergelijking met het gebrom van de maairobot die je man toch met veel enthousiasme in gebruik heeft genomen, om uiteindelijk zelf het gras niet te hoeven afdoen.

Luister naar hem
Jammer genoeg heeft je man tijdens zijn werkdag al zoveel oninteressante verhalen moeten aanhoren, dat hij niet echt geneigd is om die ’s avonds ook nog eens aan jou door te vertellen.  Je kan hem dan beter even achter zijn pc laten wegzakken.

Maak nooit je beklag als hij laat thuis komt
Het zou enigszins absurd zijn om je beklag te doen over laattijdig thuiskomen als je zelf nóg later thuiskomt.

Wanneer hij klaar is met eten, ruim de tafel af en doe vlug de afwas
De tafel ruimt zichzelf af (wij hebben drie kinderen) en de vaatwasmachine zorgt voor de rest.
Wat de kleine bezigheden betreft: ik kan me niet concentreren met muziek op de achtergrond, hij niet zonder.  Om dit soort problemen op te lossen bestaan er deuren.

Uiteindelijk de avond
Het ontbijt klaar zetten voor de volgende dag is niet nodig. De ochtend is het enige moment van de dag dat je man helemaal voor zichzelf heeft, ongestoord en rustig van zijn boterhammetje en koffie kan genieten en het nieuws luisteren, zonder door jou onderbroken te worden.

Niettegenstaande de vrouwelijke hygiëne een grote rol speelt…
Als je over twee badkamers beschikt, is er geen gevaar voor filevorming vóór het slapen gaan.
Wanneer je man de slaap niet meteen kan vatten, zal dit eerder te wijten zijn aan bloederige en gewelddadige scènes die hij net voordien nog te zien heeft gekregen op televisie, dan aan de aanblik van je gezicht vol nachtcrème.

Wat de intieme relaties betreft met je man
De huwelijksbeloften vermelden iets in de zin van ‘trouw blijven’ en ‘liefhebben’ en zijn voor de rest bijzonder vaag. Houden zo.

Als je man voorstelt te paren
Alle wetenschappelijk onderzoek ten spijt, is het paargedrag van koppels nog steeds vrij natuurlijk en dus niet te vatten in enig administratief voorstel of technisch ontwerp.

Als je man minder normale handelingen voorstelt…
… dan had je dit wel op voorhand al kunnen weten.

Oplichterij bij The Phone House

Zoals vele anderen (waaronder veel lezersbrief-schrijvers van Humo de laatste tijd) ben ik het slachtoffer geworden van de oplichterij bij ‘The Phone House’, de bekende GSM winkel. Dit bericht is bedoeld om mensen, die zich ook een lifeline verzekering hebben laten aansmeren, op de hoogte te brengen van wat komen gaat.

Stel, je beslist dat het wel eens tijd is voor een nieuwe GSM. Je gaat naar de winkel, koopt je toestel en denkt: ‘Hoera, ik heb een nieuwe GSM’. Op deze manier zal je niet bij The Phone House buitenwandelen.

Nog voor je maar 1 eurocent betaald hebt, begint de typische Phone House verkoper je te overhalen om een extra verzekering af te sluiten. ‘Ah, dit en dat, ben je dan niet geïnteresseerd in een lifeline verzekering? Veel schade wordt niet gedekt door de standaard garantie en dus kan de reparatiekost hoog oplopen (wijst naar een blaadje vol met prijzen voor reparaties van de verschillende merken) maar met dit contract moet je maar 20 euro opleggen en je krijgt een nieuw toestel van The Phone House.’

Vele mensen zijn terecht onzeker en zeggen wellicht dat ze niet zeker zijn of ze dat wel willen. De verkoper hen dat hij het zal activeren maar dat de koper nog een maand heeft om zich te bedenken. Allemaal goed en wel, maar je bent zo in de wolken van je recente aankoop (of je hebt gewoon een druk leven) dat die maand sneller om is dan gedacht en dat er ineens een bepaald bedrag van je rekening wordt gehaald voor die verzekering. Je hebt – eigenlijk tegen je zin – een lifeline (in mijn geval Silver) contract afgesloten (medium afzetterij). Dit kostte mij elke 3 maanden 19,99 euro.

Was dit nu echt wel nodig?

Er is een wetgeving in België die verplicht dat op elk toestel 2 jaar garantie is voorzien. Gedurende 2 jaar kan je dus terugvallen op de garantie (behalve voor een schermbreuk). Dus eigenlijk ben je gedurende 2 jaar veilig (tenzij je van plan bent ermee te gooien) en betaal je 160 euro gedurende die 2 jaar (24 maanden / 3 x 20 euro).

Stel dat er na 2 jaar iets kapot gaat. Je hebt al 160 euro betaald aan premies de afgelopen 2 jaar. Om een nieuw toestel te krijgen, moet je nog slechts 20 euro opleggen om een volledig nieuw toestel van The Phone House te ontvangen.

Welnu, een LifeLine Silver contract beschermt toestellen met een aankoopprijs tot 200 euro. Na 2 jaar is een toestel gegarandeerd end-of-life of half zo duur. Het is dus volslagen zinloos om bij die 160 euro nog eens 20 euro op te leggen voor een nieuw toestel van hetzelfde type. Als je GSM het na 2 jaar begeeft, koop je gewoon beter een nieuwe. Je bent dus beter af door de verkoper het zwijgen op te leggen (wellicht geen eenvoudige klus).

Volgens het contract kan je de verzekering enkel opzeggen door aangetekend schrijven (en niet door de betaling botweg stop te zetten zoals ze in de winkel verklaren) en zal dit je ook nog eens 5 euro kosten ook, al is dat misschien wel de best geïnvesteerde 5 euro ooit…

Met andere woorden, laat je niet in de luren leggen door de verkopers van The Phone House, zoals ik heb laten gebeuren…

Verongelukken voor dummies

Bike accidentOp deze wereld gebeuren dagelijks ongelukken. Gisteren was het, jammer genoeg, mijn beurt…

Ik reed rustig (lees: vloog bergaf) door de Schapenstraat en ik dacht: “laat ik maar wat remmen, voor ik beneden alles moet dichtgooien” (wat sowieso al niet lukt, maar dat terzijde). Ik trek dus aan de hendel van mijn rechterrem. Vrij hard, want zoals bij elke Leuvense studentenfiets, zijn ook mijn remmen niet van de beste. Tot opeens… die hendel afbreekt en… — zoals elk ervaren fietser weet — ga je naar rechts als je rechts aan je stuur trekt. Hier even een zeer gedetailleerde reconstructie van de feiten.

  1. Hendel breekt af.
  2. Bij het remmen trek je aan je stuur, dus ik stuur ongewild naar rechts.
  3. Mijn fiets, met mij erop, rijdt nu naar rechts tot…
  4. … ik het trottoir raak en vervolgens…
  5. … tijdelijk in een zwevende fase overga om daarna…
  6. … pijnlijk over de grond verder te schuiven.
  7. Ik sta recht en bemerk
    • veel gaten in mijn broek
    • veel gaten in mijn jas
    • bloed op mijn handen (de afgebroken remhendel was erg scherp en had een diepe snede in mijn duim gemaakt)
    • enkele mensen die behulpzaam komen vragen of het gaat.
  8. Ik ga verder te voet gegaan gezien mijn fiets kapot is.

Op de koop toe ben ik na dit ongeluk nog uitgeweest en daarna redelijk zat terug naar mijn kot gestrompeld. Een betere verdoving kon niet zeker? :)

Op naar het volgende accident!