Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Chunky WebSlices voor Firefox

Een van de nieuwe features in Internet Explorer 8 is het zogenaamde WebSlices. Een feature waarmee je een gedeelte van een website kunt 'bookmarken'. Dit deel wordt iedere zoveel minuten geupdate. Dit lijkt sterk op de WebClips uit Apple's Safari, maar verschilt op het feit dat je voor WebSlices speciale HTML (een zgn. microformat) moet gebruiken, terwijl WebClips in Safari je simpelweg een block-level element laat selecteren en dit vervolgens toont.

Firefox plugin voor WebSlices: Webchunks

De grote achterblijver hiermee is Firefox, maar niet getreurd. Firefox is zeer uitbreidbaar en dus is iemand, namelijk Daniel Glazman, bekend van NVU maar ook het CSS variables voorstel, al sinds 1 dag na de release van Internet Explorer 8 beta 1 bezig met een implementatie voor Firefox 3 onder de niet zo flatteuze naam Webchunks.

(more...)

HTTP response headers & PHP stream wrappers

Van het weekend was ik aan het spelen met de Twitter API en liep, ondanks een caching constructie, op een gegeven moment toch tegen het rate limit aan; je mag vanwege de performance problemen eerder dit jaar momenteel max. 20 requests per uur naar de Twitter API doen.

De Twitter API geeft dit aan met een HTTP 400 response code. Ik kon dit alleen niet goed detecteren want fopen() retourneert alleen maar FALSE en ik wilde graag de daadwerkelijke HTTP response code hebben.

Het feit dat je PHP dan toch al behoorlijk wat jaartjes gebruikt houdt niet in dat PHP dan ook geen verrassingen meer voor je heeft. Sowieso aangezien er behoorlijk wat toegevoegd wordt aan PHP, maar ook omdat er soms gewoon rare, verstopte, dingen in PHP zitten. Het detecteren van de HTTP response headers bij een mislukt HTTP request is daar wat mij betreft een van.

(more...)

Lazy Initialization voor Zend_Registry

In de reacties op mijn review van PHP|Architect's guide to Programming with Zend Framework werd gereageerd door de schrijver van het boek, Cal Evans. Een van mijn punten van kritiek was dat de schrijver een heel hoofdstuk gebruikt om een eigen Globals class te introduceren terwijl hier naar mijn mening in Zend Framework al een klasse voor beschikbaar was, namelijk het Zend_Registry.

Uit zijn reactie blijkt dat zijn voornaamste reden voor zijn Globals klasse een principe genaamd Lazy Initialization te zijn. In dit artikel introduceer ik je aan het Zend_Registry en laat ik zien hoe je Lazy Initialization kunt toepassen met Zend_Registry.

(more...)

PHP5: Debuggen met Magic Methods

Iemand kwam van de week naar me toe met een probleempje. Deze persoon had een object waarop een eigenschap gewijzigd werd, maar hij kon - omdat het niet zijn eigen code was - niet zo 1-2-3 vinden waar dat gebeurde. Scriptorama to the rescue :-) !

Ik raadde hem aan om een nieuwe lege klasse aan te maken met een paar zogenaamde magic methods om zo de toegang tot de eigenschappen te kunnen uitlezen. Dat was -al zeg ik het zelf - een aardig idee, maar zou stranden op het moment dat het object eerst de nodige logica dient uit te voeren voordat de eigenschap in kwestie veranderd werd.

Dit artikel legt uit wat magic methods zijn en laat zien hoe we ze kunnen gebruiken om het probleem op te lossen.

(more...)

4 tips om PHP6 compatible code te schrijven

Iedereen die een beetje met PHP werkt weet hopelijk nu wel dat PHP4 vanaf het eind van dit jaar niet meer ondersteund zal worden door de ontwikkelaars. Dat is natuurlijk vervelend voor de mensen die nu nog gebruik maken van PHP4 maar het wordt nu dus toch echt tijd om te gaan upgraden.

Vervolgens staat PHP6 ook al in de planning, dus als je inderdaad vanaf PHP4 af komt is het verstandig om nu alvast rekening te gaan houden met PHP6. In dit artikel leer je hoe nu voor PHP 5.2 al code kunt schrijven die compatibel blijft met PHP6.

(more...)

Hoe implementeer ik een simpel tagging systeem?

Tagging is simpelweg het toekennen van labels aan een item. Eigenlijk is dit een verkapte vorm van aan een item categorieën toekennen. Het grote verschil tussen categorieën en tags is dat tags veel vrijer zijn. Categorieën worden meestal vooraf gedefinieerd en later wordt hier een artikel aan gehangen. Bij tagging is het precies andersom. Je creëert een artikel, en hangt daar tags aan.

Bekende voorbeelden van tagging zijn te zien op Del.icio.us en Flickr. Het mooie hieraan is dat iedereen zijn/haar bookmarks / foto's een x aantal tags meegeeft, waardoor anderen deze foto's en bookmarks op basis van die tag kan vinden.

Naar mijn mening wordt tagging tegenwoordig te pas en te onpas gebruikt. Op websites als flickr en del.icio.us zijn er meerdere gebruikers die allen meerdere items taggen. Hierdoor krijg je al snel een community gevoel. Voor een één gebruiker website (portfolio, weblog, whatever) kan een tagcloud overbodig zijn, zeker als je toch maar over een x aantal onderwerpen schrijft. In dat geval is het gebruik van categorieën aan te raden. Waarom zou je als één gebruiker website toch kiezen voor een tagging systeem? Dit zou je kunnen doen doordat je visueel kan laten zien waar je interesse/kennis ligt, door middel van de text grootte.

Hoe maak je zo'n tag systeem? Onder de lees meer link een tutorial hoe je een dergelijk systeem bouwt.

(more...)

eKudos Wordpress plugin

eKudos is een social media site en is de Nederlandse variant van Digg. Vanaf nu hebben ze ook een 'live' knop die je kunt plaatsen op je website. Voor meer informatie en de code hiervoor is op deze pagina te lezen.

Alleen de huidige Wordpress plugin van eKudos werkt niet met deze nieuwe feature. Dus ik heb de oude plugin aangepast zodat je vanaf nu wel een live eKudos knop op je website hebt. De code staat hieronder.
(more...)

Naar Voren: aan de slag met .htaccess

In "Aan de slag met .htaccess" leert Lodewijk Schutte ons principes van de meest gebruikte .htaccess-toepassingen met Apache: controle over bezoekers, bestanden en URLs. (Bron: Naar Voren)

Update

WannaBrowser is handig om je .htaccess rules te testen. Deze online tool is vooral nuttig om de User-Agent en Referer request headers snel te wijzigen.
Wil je alle request headers beïnvloeden en ook kunnen knoeien met POST parameters, dan is de Firefox-extensie Tamper Data een uitkomst.
Hiermee kun je overigens een goed beeld krijgen van requests en responses. Erg handig om bottlenecks op te sporen. Een bijzonder aardige feature is een grafiek van laadtijden van requests. Je vindt 'm verstopt in het context-menu: Graph All.
Deze functionaliteit mogen we ook in Firebug 1.0 verwachten.

PHP 5.2: de Date extensie uitbreidingen

Een van de nieuwe dingen in PHP 5.2 is de uitgebreidde Date extensie. Dat is een beetje een understatement want naar verluidt is de extensie grotendeels herschreven. Het was de bedoeling dat de uitbreiding in de Date extensie al eerder beschikbaar werd maar doordat de PEAR Date klasse ook de klassenaam Date gebruikte en de nodige druk van een nieuwe release is toen besloten om deze klassen later toe te voegen.

Zodoende is een deel van de nieuwe functionaliteit al in PHP 5.1 te vinden terwijl de rest pas echt vanaf 5.2 beschikbaar is. Dit artikel introduceert de belangrijkste wijzigingen.

Update: Een comment op Evert's blog beschrijft hoe je een DateTime klasse kunt configureren met een unix timestamp. Ik heb dat ook toegevoegd aan het overzicht.

Update II: In PHP 5.3 is deze functionaliteit nog verder uitgebreidt met o.a. een DateInterval en DatePeriod klasse. Lees verder in PHP 5.3: Date extensie revisited.

(more...)

Re: mixins in PHP

We don't normally post in english, but as I want to reply to a posting by Ivo Jansch (who has been around Scriptorama a few times) which is also in english, I'll make an exception.

In his posting "Mixins in PHP", Ivo describes a way to "copy" methods from certain classes into a specific class of his choosing. This allows him to pick certain methods from a class, and it allows him to specify this during runtime rather than "compile-time". He does this by using the new __call() magic method in PHP5 which allows him to intercept any calls to methods that do not exist in the current class.

He runs into a few problems though, one not being able to call the object without using eval() and another rather important problem is that he has no access to the scope of the object from the "mixed in methods" what, I feel, is sort of defeating the whole purpose of the mixin.

There is a different way though, and we've visited it on Scriptorama before.
(more...)