<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FinalFrag.be &#187; PHP</title>
	<atom:link href="http://finalfrag.be/blog/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://finalfrag.be/blog</link>
	<description>De persoonlijke website van Massimo 'FinalFrag' Mertens</description>
	<lastBuildDate>Tue, 04 Aug 2009 07:08:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Data Type Usage Profiler&#160;(DTUP)</title>
		<link>http://finalfrag.be/blog/2009/06/data-type-usage-profiler-dtup/</link>
		<comments>http://finalfrag.be/blog/2009/06/data-type-usage-profiler-dtup/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 11:00:14 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[datamodel]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[statistieken]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=479</guid>
		<description><![CDATA[Als eerste artikel als gastschrijver op deze blog, wil ik graag een onderwerp aanhalen dat toch wel belangrijk is bij het beheren van een uitgebreide database, zoals bijvoorbeeld die van Spacetarion, namelijk het in de gaten houden van de bevolking van je database.
Het probleem
Bij het creeëren van je datamodel heb je wellicht rekening gehouden met [...]]]></description>
			<content:encoded><![CDATA[<p>Als eerste artikel als gastschrijver op deze blog, wil ik graag een onderwerp aanhalen dat toch wel belangrijk is bij het beheren van een uitgebreide database, zoals bijvoorbeeld die van <a target="_blank" href="http://www.spacetarion.com" title="Spacetarion" >Spacetarion</a>, namelijk het in de gaten houden van de bevolking van je database.</p>
<h3>Het probleem</h3>
<p>Bij het creeëren van je datamodel heb je wellicht rekening gehouden met het optimaal gebruiken van de datatypes die MySQL aanreikt. Een voorbeeld is het verschil tussen de tinyint en de smallint, een tinyint kan maximum waarde 255 bevatten en een smallint maximum 65 535 (wanneer ze worden ingesteld als unsigned). In een optimale database is er goed afgewogen welke datatypes er gebruikt worden voor welk veld. De unieke sleutel van je gebruikerstabel zal waarschijnlijk geen tinyint zijn, tenzij je maar 255 leden verwacht. Maar hoeveel leden verwachten je dan wel?<span id="more-479"></span> Omdat dit moeilijk in te schatten is, hebben <a target="_blank" href="http://www.twitter.com/MassimoMertens" title="Massimo" >Massimo</a> en <a target="_blank" href="http://www.twitter.com/geertsmichael" title="Michaël" >ikzelf</a> een tool geschreven die ons toont hoe ver de tabelvelden &#8216;bevolkt&#8217; zijn. Met de <strong>Data Type Usage Profiler (DTUP)</strong> kan een volledige database beheerd worden en kunnen de volgende datatypes gecontroleerd worden op hun bevolkingsgraad:</p>
<ul>
<li>alle integers (tinyint, smallint, mediumint, int en bigint)</li>
<li>alle teksten (tinytext, text, mediumtext en longtext)</li>
<li>varchar (met eigen ingestelde lengte)</li>
</ul>
<p>In de DTUP zijn er 4 niveaus of zones waarin een datatype zich kan bevinden. Elke zone heeft een kleuraanduiding die terugkomen in de tabelweergave van de databasetabel en in de grafische weergave. De mogelijke zones zijn:</p>
<ol>
<li>&gt; 90% &#8211; Rood</li>
<li>&gt; 75% &#8211; Licht rood</li>
<li>&gt; 50% &#8211; Oranje</li>
<li>&lt; 50% &#8211; Groen</li>
</ol>
<p>Als een datatype zich in de groene of oranje zone bevindt, is er nog geen reden tot het doorvoeren van database aanpassingen. Als echter de het bezettingspercentage &gt; 75% is, dan kan misschien geopteerd worden om een datatype hoger te nemen of de lengte aan te passen. De test op de datatypes uit de reeks van integer gaat kijken naar de hoogste waarde in de tabel. De varchar en text reeks gaat rekening houden met de lengte die het aantal karakters in beslag neemt.</p>
<p>DTUP is gemaakt met het vertrouwde <a target="_blank" href="http://www.codeigniter.com" title="CodeIgniter" >CodeIgniter</a> en <a target="_blank" href="http://www.smarty.net" title="Smarty" >Smarty</a>. De pagina die getoond wordt door de controller te bezoeken, bestaat uit 3 delen.</p>
<ol>
<li>Overzicht: geeft het aantal gevallen weer die voorkomen in elke zone op een pie chart;</li>
<li>Tabellenlijst: alle tabellen die voorkomen in de gebruikte database;</li>
<li>Databasetabellen: bevat een tabel die weergeeft hoeveel waarden er in gebruik zijn en hoeveel er maximum gebruikt mogen worden met als laatste kolom in de tabel de procentuele verhouding tussen aantal gebruikte en maximum te gebruiken. Een bar chart vervolledigt de tabel door op een grafische manier de verhouding nogmaals weer te geven. Zowel de tabel als de grafiek maken gebruik van de kleuren die bij de zones horen.</li>
</ol>
<h3>Waar jullie allemaal op wachten, screenshots</h3>
<p><img class="alignnone wp-smiley wp-image-513 left" src="http://finalfrag.be/blog/wp-content/uploads/2009/06/dtup_screen0.png" alt="dtup_screen0" width="300" height="200" /></p>
<p>Deze pie chart toont de beknopt overzicht van alle velden uit de database. Het grootste deel in de voorbeeld database is gezond (groen) en enkele velden bevinden zich in de kritische zone. De velden die vooral in die rode zone liggen zijn velden waarvan we op voorhand de maximale lengte kennen, bijvoorbeeld omdat we een MD5 hash gebruiken.</p>
<p><img class="alignnone wp-smiley wp-image-515" src="http://finalfrag.be/blog/wp-content/uploads/2009/06/dtup_screen2.png" alt="dtup" width="526" height="268" /></p>
<p>Bovenstaande schermafbeelding geeft duidelijk weer waar dit artikel en DTUP eigenlijk om draait. Alle velden van een bepaalde tabel worden getoond met informatie zoals aantal gebruikt, maximum te gebruiken en de procentuele verhouding. Ook het datatype is weergegeven zodat er van hieruit beslist kan worden welk datatype misschien de opvolger kan worden van het huidige, te kleine, datatype.</p>
<p>Bovenstaand voorbeeld kan een deel zijn van een gebruikerstabel. Zoals al gezegd, wisten we op voorhand dat het wachtwoord 32 tekens lang ging zijn, dus dat rode veld is geen verrassing. Het veld waarin de gebruikersnaam wordt bijgehouden is ook volledig gebruikt. Er heeft zich namelijk een gebruiker geregistreerd met een gebruikersnaam die net 32 karakters is. Nu is de vraag, houden we de beperking op die 32 tekens, of breiden we het veld uit? Dat hangt natuurlijk af van het doel. In ons voorbeeld stellen we dat er van hogerhand beslist is dat een gebruikersnaam nooit langer mag zijn dan 32 tekens.</p>
<p>Dit voorbeeldje ging over een varchar veld. Het is een heel ander verhaal wanneer het gaat om een unieke sleutel die automatisch verhoogd wordt met AUTO_INCREMENT.</p>
<p><img class="alignnone wp-smiley wp-image-515" src="http://finalfrag.be/blog/wp-content/uploads/2009/06/dtup1.png" alt="dtup" width="526" /></p>
<p>In onze instellingen tabel is er gekozen om met een tinyint te werken als unieke sleutel die maximum 255 records toelaat. Zoals te zien is in bovenstaande figuur is ondertussen waarde 240 bereikt. Als er nog meer instellingen bijkomen, is het misschien niet onbelangrijk om op dit moment het datatype tinyint op te krikken naar een smallint die tot waarde 65 535 aankan. Voor deze tabel is het natuurlijk geen probleem als de unieke sleutels op zijn. Voor een gebruikerstabel, waarvan de ID zichzelf verhoogt, kan dit veel kritischer zijn omdat, eenmaal de grens bereikt is, er geen leden meer kunnen registreren en dat wil je natuurlijk niet.</p>
<h3>Voila</h3>
<p>Ik hoop dat ik jullie een nieuwe kijk heb kunnen geven op de manier waarop Massimo en ikzelf <a target="_blank" href="http://www.twitter.com/Spacetarion" title="Spacetarion" >Spacetarion</a> onderhouden.</p>
<p>Dit zelfgeschreven profiler tooltje met behulp van CodeIgniter, Smarty en een MySQL database laat ons toe nauwgezet de bevolking van onze datatypes te monitoren. Deze pagina is toegankelijk vanuit het beheerpaneel van Spacetarion dat opgebouwd is met <a target="_blank" href="http://www.extjs.com" title="ExtJS" >ExtJS</a>. Binnenkort zullen onze trouwe volgers ook een blik kunnen werpen op de adminkant van Spacetarion. Zo weten jullie des te meer waar wij mee bezig zijn. Met dat paneel en deze DTUP kunnen wij ons uitgebreid systeem opvolgen om het zo stabiel mogelijk te presenteren aan de spelers, hopelijk aan jou dus.</p>
<h3>Verbeteringen? Altijd mogelijk&#8230;</h3>
<p>Mogelijke verbeteringen zijn er altijd, zo zou ik nog kunnen voorzien dat het datatype vanuit de DTUP gewijzigd kan worden. Een tweede verbetering die ik nog zou kunnen doorvoeren, is alle autonummeringvelden als speciaal veld behandelen waarbij een verhouding van &gt; 75% echt kritiek is. In het geval van kritieke autonumeringvelden kan ik via een cronjob mezelf via mail op de hoogte houden en direct ingrijpen. Een stap verder is dat het systeem zichzelf kan verbeteren door automatisch zijn datatype te verhogen en me via mail op de hoogte stellen dat deze actie ondernomen werd.</p>
<p>De DTUP staat nog maar in z&#8217;n kinderschoenen en kan dus nog verder uitgebreid worden. Misschien heb jij wel een suggestie die DTUP kan omvormen tot een mooi product dat voor iedereen te downloaden zal zijn in de toekomst? Laat het ons zeker weten!</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/06/data-type-usage-profiler-dtup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Smarty integreren in&#160;CodeIgniter</title>
		<link>http://finalfrag.be/blog/2009/06/smarty-integreren-in-codeigniter/</link>
		<comments>http://finalfrag.be/blog/2009/06/smarty-integreren-in-codeigniter/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:00:51 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=381</guid>
		<description><![CDATA[ Iedereen die iets of wat op een professionele manier bezig is met het maken van websites, heeft al wel van Smarty gehoord. Smarty is een tool die je toelaat om PHP code volledig te scheiden van de manier waarop de site wordt getoond. Deze blogpost dient echter niet om Smarty toe te lichten, want [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://finalfrag.be/blog/wp-content/uploads/2009/06/smarty-logo-orange.gif" alt="Smarty logo" style="margin-left: 10px !important" class="alignright wp-smiley wp-image-417" /> Iedereen die iets of wat op een professionele manier bezig is met het maken van websites, heeft al wel van <a target="_blank" href="http://www.smarty.net"  title="Smarty">Smarty</a> gehoord. Smarty is een tool die je toelaat om PHP code volledig te scheiden van de manier waarop de site wordt getoond. Deze blogpost dient echter niet om Smarty toe te lichten, want daar vind je genoeg informatie over op het internet. Wat deze blogpost wel zal doen, is uitleggen hoe je Smarty kan integreren in <a target="_blank" href="http://www.codeigniter.com"  title="CodeIgniter">CodeIgniter</a>, want daarover is bijzonder weinig (goede) informatie te vinden.<span id="more-381"></span></p>
<h3>Waarom zit het niet standaard in CodeIgniter?</h3>
<p>Daar zijn 2 goede redenen voor. De eerste is de meest voor de hand liggende. CodeIgniter heeft namelijk zijn eigen manier om om te gaan met templates. In CodeIgniter termen noemen deze &#8216;view files&#8217;. Telkens wanneer je het volgende doet, roep je dus eigenlijk een template aan.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'home'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Een andere mogelijke reden waarom Smarty niet standaard bij CodeIgniter wordt geleverd is omdat er meerdere mogelijkheden zijn. Smarty is wel de bekendste, maar zeker niet de enige template engine. Een template engine biedt natuurlijk vele voordelen waaronder caching, afscherming van de PHP code voor designers, handige tags, etc.</p>
<h3>Waar zetten we Smarty?</h3>
<p><img src="http://finalfrag.be/blog/wp-content/uploads/2009/06/smarty_ci_folders.png" alt="Smarty locatie" class="wp-smiley alignleft size-full wp-image-427" style="margin-right: 5px" /> De eerste stap is natuurlijk het uploaden van de Smarty bestanden naar je webhost. De beste locatie om deze te plaatsen vind ik persoonlijk de libraries map onder system/application/. Dit enerzijds omdat Smarty een library is die je zal gebruiken en anderszijds omdat ik al mijn eigen uitbreidingen in die map plaats. Zo blijven alle zelfgemaakte bestanden mooi bij elkaar en kan ik beter het overzicht behouden. Mijn system/application/libraries map zie je links op de afbeelding.</p>
<p>Zoals je ziet heb ik de originele naam van de Smarty map behouden. Hierdoor kan ik makkelijk zien welke versie ik heb wanneer er updates uitkomen. Deze naam mag je uiteraard zelf kiezen, maar ik zou de bestanden wel in een map houden, ook weer om het overzicht te behouden.</p>
<p>Noot: wanneer je werkt met meerdere applicaties op één CodeIgniter installatie, kan het handig zijn om deze map in system/libraries te plaatsen. Op die manier hoef je maar één keer Smarty te uploaden in plaats van één keer voor elke applicatie.</p>
<h3>De Smarty klasse</h3>
<p>Het is uiteraard niet voldoende om gewoon de map te uploaden naar je server. Het Smarty object moet bereikbaar zijn vanuit de CodeIgniter klassen (meestal vanuit een controller). Een klasse toevoegen aan het CodeIgniter framework is helemaal niet moeilijk, eerst moet je de klasse uiteraard schrijven en deze daarna gewoon automatisch inladen met behulp van autoload.php.</p>
<p>Zoals je uit de onderstaande code kan afleiden, heb ik deze klasse de naam &#8216;S&#8217; gegeven. Ik heb gekozen om &#8216;S&#8217; als naam te nemen in plaats van &#8216;MY_Smarty&#8217; om de simpele reden dat &#8216;S&#8217; korter is dan &#8216;MY_Smarty&#8217; (en omdat &#8216;Smarty&#8217; al gereseveerd is door &#8230; jawel &#8230; Smarty zelf). Wanneer ik nu een template aanroep hoef ik dus niet altijd</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">my_smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'home'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>te gebruiken, maar simpelweg</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'home'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>wat in de grotere applicaties toch al snel heel wat typwerk minder is. De hardcore Smarty fans zien ook meteen dat ik de extensie .tpl kan weglaten bij het aanroepen van een template. Deze &#8216;functionaliteit&#8217; is ook voorzien in de S klasse.</p>
<p>Zoals je op de afbeelding van mijn bestandsstructuur al kon zien, heb ik gewoon een bestandje S.php aangemaakt in de system/application/libraries/ map. De inhoud van dit bestand is als volgt:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">&quot;Smarty-2.6.22/Smarty.class.php&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> S <span style="color: #000000; font-weight: bold;">extends</span> Smarty <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> S<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Smarty</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Het config object van CodeIgniter ophalen</span>
        <span style="color: #000088;">$config</span> <span style="color: #339933;">=&amp;</span> get_config<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Aan de hand van de config de mappen die Smarty zal gebruiken instellen</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template_dir</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'smarty_template_dir'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'smarty_template_dir'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> BASEPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'application/views/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">compile_dir</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'smarty_compile_dir'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'compile_dir'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> BASEPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'cache/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// base_url is een handige functie, die willen we altijd bij ons hebben</span>
        <span style="color: #666666; font-style: italic;">// In een Smarty template kunnen we dan gewoon {$base_url} gebruiken</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'base_url'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'base_url'</span><span style="color: #339933;">,</span> base_url<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clear_all_cache</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> display<span style="color: #009900;">&#40;</span><span style="color: #000088;">$resource_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// .tpl toevoegen indien dit niet in het gevraagde bestand staat</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resource_name</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.tpl'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$resource_name</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'.tpl'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Hier kan je allerlei code toevoegen die moet gebeuren vlak voor het tonen van de pagina</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// De pagina tonen</span>
        <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resource_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Let op: de compile map die je aangeeft moet schrijfbaar zijn door de webserver. Ik gebruik altijd 777, maar misschien is minder ook al goed. Kan iemand dat duidelijk maken?</p>
<p>De S klasse moet natuurlijk in het CodeIgniter framework worden ingeladen voordat je deze kan gebruiken in een controller. Hiervoor open je gewoon system/application/config/autoload.php en voeg je bij het &#8216;libraries&#8217; onderdeel de &#8216;S&#8217; klasse toe als volgt:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'libraries'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'s'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Wat met $smarty.session?</h3>
<p>CodeIgniter maakt, zoals je misschien weet, geen gebruik van de globale $_SESSION variabele van PHP. Om gegevens bij te houden, maakt CI gebruik van cookies en/of een database (kan je instellen in het config bestand). Dit brengt echter wel een minpunt met zich mee in dit geval. Smarty kan namelijk de $_SESSION variabele aanspreken met behulp van $smarty.session. Maar aangezien CI hier geen gebruik van maakt, is dit niet mogelijk <img src='http://finalfrag.be/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Maar voor elk probleem is natuurlijk een oplossing. Ik heb in de display functie van de S klasse een stukje code geschreven dat alle gegevens uit $this->session (de plaats waar CI alle sessiegegevens opslaat) haalt en ze doorgeeft aan Smarty. Dit is makkelijk te doen met een foreach, maar dat laat ik als uitstekende oefening voor thuis.</p>
<h3>Een klein voorbeeldje</h3>
<p>system/application/controllers/Voorbeeld.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Voorbeeld <span style="color: #000000; font-weight: bold;">extends</span> Controller <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$tekst</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'hello world...'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tekst'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tekst</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">s</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'voorbeeld'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>system/application/views/voorbeeld.tpl</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;">Dit is de doorgegeven tekst:<span style="color: #009000;">&lt;br /&gt;</span>
<span style="color: #009000;">&lt;br /&gt;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$tekst</span><span style="color: #D36900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/06/smarty-integreren-in-codeigniter/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Automatisch elke dag een&#160;backup</title>
		<link>http://finalfrag.be/blog/2009/06/automatisch-elke-dag-een-backup/</link>
		<comments>http://finalfrag.be/blog/2009/06/automatisch-elke-dag-een-backup/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:25:54 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=232</guid>
		<description><![CDATA[Backups zijn vandaag belangrijker dan ooit. Je bestanden staan waarschijnlijk wel ergens op een server die dagelijks backups neemt in jouw plaats. Je denkt dan nogal snel: &#8216;als er iets fout gaat, hebben ze toch een backup&#8217;. Toch blijft het altijd een heel gedoe wanneer je wil beroep doen op deze backups.
Wanneer je aan een [...]]]></description>
			<content:encoded><![CDATA[<p>Backups zijn vandaag belangrijker dan ooit. Je bestanden staan waarschijnlijk wel ergens op een server die dagelijks backups neemt in jouw plaats. Je denkt dan nogal snel: &#8216;als er iets fout gaat, hebben ze toch een backup&#8217;. Toch blijft het altijd een heel gedoe wanneer je wil beroep doen op deze backups.</p>
<p>Wanneer je aan een klein projectje werkt, is het makkelijk om zelf even elke dag na het programmeren snel even alle bestanden af te halen. Wanneer je echter aan grote projecten werkt, zoals ik nu aan <a target="_blank" href="http://www.spacetarion.com"  title="Spacetarion">Spacetarion</a>, kan het afhalen van alle bestanden al snel 5 tot 10 minuten duren. Daarom had ik nood aan een automatische oplossing.<span id="more-232"></span> Omdat ik deze best wel handig in gebruik vind, deel ik mijn opgedane kennis graag met jullie. Als fervente <a target="_blank" href="http://www.codeigniter.com"  title="CodeIgniter">CodeIgniter</a> fan, heb ik dit natuurlijk met behulp van dit framework gedaan.</p>
<h3>Wat heb ik allemaal nodig?</h3>
<p>Er zijn 2 dingen die nodig zijn om dit werkend te krijgen. Eerst en vooral moet je toegang hebben tot cronjobs. Dit hangt af van je webhost. De meeste fatsoenlijke hosts, zoals <a target="_blank" href="http://www.futureweb.be"  title="Futureweb">Futureweb</a> en <a target="_blank" href="http://www.combell.com"  title="Combell">Combell</a>, ondersteunen cronjobs. De cronjob zorgt ervoor dat het script automatisch elke 24 uur wordt uitgevoerd. Eigenlijk zal het script dus ook werken zonder cronjobs, maar dan moet je er zelf aan denken elke dag de controller een bezoekje te brengen.</p>
<p>Een andere voorwaarde is dat je je CodeIgniter system map niet buiten de web root hebt staan. <a href="http://finalfrag.be/blog/2009/06/ci-installeren-buiten-de-www-map/"  title="CI installeren buiten de www map">CI buiten de web root installeren</a> is veiliger omdat mensen geen toegang kunnen krijgen tot de bestanden in de installatie. Het nadeel is echter dat ook de &#8216;gebruiker&#8217; die PHP uitvoert (Apache) ook geen rechten heeft om bestanden buiten de root te lezen. Aangezien het script dat we gaan gebruiken van elk bestand de inhoud moet kunnen lezen, zal dit enkel werken indien CI volledig in de web root staat. Meestal is deze root de map &#8216;www&#8217; of &#8216;public_html&#8217;. Het kan zijn dat je bij jouw host enkel toegang hebt tot de web root. Indien je nergens een map &#8216;www&#8217; of &#8216;public_html&#8217; terugvind, is dit het geval en kan je het script gebruiken.</p>
<p>Noot: wanneer je je system map wel in de www map hebt staan, kan je deze nog altijd afschermen van het publiek door een klein .htaccess bestand in de system map te zetten. De inhoud van dit .htaccess bestand moet dan het volgende zijn:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">order allow,deny
deny from any</pre></div></div>

<p>Op die manier zal iedereen (behalve de Apache gebruiker) een 403 Forbidden error krijgen. Zo zijn je bestanden toch beschermd (wel minder goed dan gewoon alles buiten de www map te zetten natuurlijk) en kan je toch dit backup script gebruiken.</p>
<h3>De controller</h3>
<p>We maken in de map system/application/controllers een nieuw bestand aan met als naam backup.php. We voorzien in dit bestand 2 functies: 1 functie die elke dag een backup zal nemen en 1 functie die elke maandag (dit wordt bepaald in de cronjob) de laatste backup per e-mail zal versturen. De inhoud van Backup.php is als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Backup <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'PASSWORD'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'your_password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'MAX_BACKUPS'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BACKUP_DIR'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/welke/map/je/wil/backuppen/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span> <span style="color: #339933;">!==</span> PASSWORD<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Get out'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'zip'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Bestanden backuppen</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">zip</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read_dir</span><span style="color: #009900;">&#40;</span>BACKUP_DIR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Database backuppen</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dbutil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$backup</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dbutil</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">backup</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'format'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'txt'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">zip</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_data</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'database.txt'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$backup</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Het zip bestand opslaan</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">zip</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">archive</span><span style="color: #009900;">&#40;</span>BACKUP_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'backups/'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'YmdHis'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' - '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">zip</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_file_num</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' files.zip'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Overbodige backups verwijderen</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$files</span> <span style="color: #339933;">=</span> get_filenames<span style="color: #009900;">&#40;</span>BACKUP_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'backups/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Controleren of er al backups zijn</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$files</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$files</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000088;">$delete</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$files</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> MAX_BACKUPS<span style="color: #339933;">;</span>
			<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$delete</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span>BACKUP_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'backups/'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$files</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> mail_backup<span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span> <span style="color: #339933;">!==</span> PASSWORD<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Get out'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$files</span> <span style="color: #339933;">=</span> get_filenames<span style="color: #009900;">&#40;</span>BACKUP_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'backups/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Controleren of er al backups zijn</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$files</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">rsort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$files</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// De laatste backup mailen</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">library</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'no-reply@example.com'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Backup system'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">to</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'you@example.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">subject</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Your backup'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">message</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Your backup'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">attach</span><span style="color: #009900;">&#40;</span>BACKUP_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'backups/'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$files</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>De cronjob</h3>
<p>De cronjob zal ervoor zorgen dat de Backup controller elke 24 uur opgeroepen wordt. Deze controller zal dan een backup nemen en het bestand opslaan op de server. De manier om cronjobs in te stellen is bij elke host meestal anders. Ik kan dus niet stap voor stap uitleggen hoe je dit moet doen. Het commando dat moet worden uitgevoerd is echter altijd hetzelfde, en ziet er als volgt uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="plain" style="font-family:monospace;">0 0 * * * wget http://www.jouwsite.be/backup/index/your_password/ -O /dev/null</pre></td></tr></table></div>

<p>Deze cronjob zal elke dag om 0:00 worden uitgevoerd. Dit tijdstip kan je zelf aanpassen. De structuur van de argumenten is &#8216;minuut&#8217;, &#8216;uur&#8217;, &#8216;dag van de maand&#8217;, &#8216;maand&#8217;, &#8216;dag van de week&#8217;. Indien je 12 0 * * 1 gebruikt, zal er elke maandag om 12 uur &#8217;s middags een backup worden genomen.</p>
<p>Je moet natuurlijk ook de &#8216;jouwsite.be&#8217; vervangen door het domein waarop jouw site staat. De &#8216;your_password&#8217; op het einde is het wachtwoord dat je hebt gedefiniëerd in de controller. De &#8216;-O /dev/null&#8217; zorgt ervoor dat de cronjob geen logfile zal schrijven naar de website. Indien je dit weglaat zal er elke keer de cronjob wordt uitgevoerd een bestand in de root van je website bijkomen. Na verloop van tijd kan dit aantal flink oplopen. Het is dus een goed idee om deze logfiles weg te laten.</p>
<p>Je kan ook een aparte cronjob aanmaken om de laatste backup per e-mail te ontvangen. Persoonlijk neem ik elke dag een backup, en krijg ik elke maandag om 6 uur &#8217;s morgens graag de laatste backup in mijn inbox. Deze cronjob ziet er als volgt uit:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">0 6 * * 1 wget http://www.jouwsite.be/backup/mail_backup/your_password -O /dev/null</pre></div></div>

<h3>Het resultaat</h3>
<p>Het resultaat is best wel duidelijk. Je webserver zal nu elke dag een backup nemen van alle bestanden EN de volledige database. Ook zal je elke maandag een e-mail krijgen waarin de laatst genomen backup zal zitten. Ook zullen op de server maximaal 14 backups worden bijhouden, zo heb je iets of wat controle over hoeveel plaats de verschillende backups innemen.</p>
<p>Zoals je misschien al gemerkt hebt, zijn alle werken op deze website gelicenseerd onder een Creative Commons licentie. Wanneer je mijn werk wil gebruiken kan je dat vrij doen, zolang je mijn naam bij het werk zet en het niet dient voor commerciële doeleinden. Wanneer je mijn naam liever niet bij het werk wil zetten of de scripts toch wil gebruiken voor commerciële doeleinden, dien je eerst een schriftelijke toestemming aan mij te vragen.</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/06/automatisch-elke-dag-een-backup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CI installeren buiten de www&#160;map</title>
		<link>http://finalfrag.be/blog/2009/06/ci-installeren-buiten-de-www-map/</link>
		<comments>http://finalfrag.be/blog/2009/06/ci-installeren-buiten-de-www-map/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 09:46:59 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=227</guid>
		<description><![CDATA[Wanneer je een website bouwt, wil je dat deze 100% veilig is, zeker wanneer het gaat om een webapplicatie. Je wil bezoekers zo veel mogelijk mogelijkheden bieden, maar toch de gevoelige bestanden goed afschermen. Eén van de stappen die je kan ondernemen om bestanden af te schermen van kwaadaardige bezoekers, is door ze buiten de [...]]]></description>
			<content:encoded><![CDATA[<p>Wanneer je een website bouwt, wil je dat deze 100% veilig is, zeker wanneer het gaat om een webapplicatie. Je wil bezoekers zo veel mogelijk mogelijkheden bieden, maar toch de gevoelige bestanden goed afschermen. Eén van de stappen die je kan ondernemen om bestanden af te schermen van kwaadaardige bezoekers, is door ze buiten de www map te plaatsen op de server. Hierdoor kunnen bezoekers deze niet rechtstreeks aanspreken, maar kan je applicatie er wel aan. Ik heb enkele applicaties online staan waarvan slechts enkele bestanden in de www map staan.<span id="more-227"></span></p>
<h3>Is het mogelijk voor mij?</h3>
<p>Er is één grote voorwaarde opdat je CodeIgniter kan installeren buiten deze map. De host die je je webruimte aanbied, moet jouw de juiste rechten geven zodat je bestanden kan uploaden boven de www map. Bij mijn vorige host, <a target="_blank" href="http://www.one.com"  title="One.com">One.com</a>, kon dit niet. Daarom ben ik ongeveer een jaar geleden verhuist naar een host die dat wel ondersteunt, <a target="_blank" href="http://www.futureweb.be"  title="Futureweb.be">Futureweb.be</a>. De www map waarover ik steeds spreek, kan ook onder een andere naam voorkomen, bijvoorbeeld public_html of wwwroot.</p>
<h3>CodeIgniter installeren</h3>
<p>Het installeren van CodeIgniter is super makkelijk. Het enige dat je moet doen is de laatste versie van het framework downloaden van <a target="_blank" href="http://www.codeigniter.com"  title="codeigniter.com">codeigniter.com</a> en het pakket uitpakken. Wanneer dat gebeurd is kan je gewoon de system map en het index.php bestand uploaden naar je webhost.</p>
<p>Normaal gezien upload je deze bestanden naar één en dezelfde map op de server, maar indien je CodeIgniter buiten de www map wil installeren, is dit lichtjes anders. Het index.php moet je uploaden naar de www map, of een submap hiervan. Het komt er op neer dat het index.php bestand bereikbaar moet zijn voor bezoekers. Dit is het punt vanwaar de bezoekers de applicatie gebruiken, de voordeur zeg maar.</p>
<p>De system map moet je buiten de www map plaatsen. Bezoekers krijgen toegang tot deze bestanden via het index.php bestand, maar kunnen niet rechtstreeks bestanden in de system map aanroepen. Om even terug te komen op het huis waarvan ik de voordeur al vernoemde, mensen kunnen via de voordeur naar de keuken, maar kunnen niet meteen de koelkast komen plunderen.</p>
<p>Je kan best ook de naam van de system map wijzigen. Dit maakt de applicatie niet veiliger (want bezoekers kunnen er toch niet aan), maar zorgt er wel voor dat je zelf de structuur beter kan zien. Ik geef de system map altijd de naam van de applicatie die ik zal maken, maar je verzint wel iets creatief. Zo heb ik de system map van <a target="_blank" href="http://www.degrillmobiel.be"  title="De Grill-Mobiel">degrillmobiel.be</a> simpelweg &#8216;grill&#8217; genoemd.</p>
<h3>Het index.php bestand aanpassen</h3>
<p>Wanneer je nu echter een bezoekje brengt aan het index.php bestand met je favoriete browser, zal het geheel niet werken. Dit komt omdat de verwijzingen in het bestand nog niet juist zijn. In het index.php bestand staat de volgende lijn code (regel 26):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$system_folder</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;system&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dit is de locatie waar CodeIgniter gaat zoeken naar alle bestanden. Wanneer index.php bestand staat op www.host.com/submap/index.php zal CodeIgniter zoeken naar www.host.com/submap/system/ en deze niet vinden. Wanneer je het index.php bestand los in de www map hebt staan, moet je de regel als volgt aanpassen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$system_folder</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;../system&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Per submap moet je vooraan nog een extra &#8216;../&#8217; toevoegen. Indien je index.php bestand dus te bereiken is op www.host.com/submap/index.php moet de $system_folder variabele &#8216;../../system&#8217; zijn. Indien je de naam van de system map hebt gewijzigd, moet je hier natuurlijk ook rekening mee houden.</p>
<p>Enkele regels lager in het bestand staat nog een andere variabele, namelijk $application_folder. Je kan, net als de system map, ook de application map van naam veranderen. Dit is handig wanneer je meerdere applicaties op één CodeIgniter installatie wil draaien, maar daar kom ik in een latere blogpost nog uitgebreid op terug.</p>
<h3>De gebruikelijke instellingen</h3>
<p>Na het uploaden van CodeIgniter moet je natuurlijk nog wel de nodige instellingen aanpassen alvorens je een werkende website hebt. Het bestand dat je zeker moet aanpassen is config.php, te vinden in de map system/application/config/. In dit bestand moet je de volgende regel aanpassen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'base_url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://example.com/&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In het voorbeeld waarbij onze site op www.host.com/submap/index.php staat, moet de regel als volgt veranderd worden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'base_url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://www.host.com/submap/&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Werkt het?</h3>
<p>Wanneer je nu een bezoekje brengt aan www.host.com/submap/ zou je de standaard pagina van CodeIgniter moeten te zien krijgen.</p>
<p>Voila, je hebt met succes CodeIgniter buiten de www map geïnstalleerd en afgeschermd van al die kwaadaardige gebruikers.</p>
<p>Er zijn nog enkele punten die beter kunnen. Zo kan je bijvoorbeeld met behulp van een .htaccess bestand makkelijk de /index.php/ uit de url halen. Dit ziet er niet alleen mooier uit, maar is ook beter vanuit een SEO (Search Engine Optimalisation) standpunt. In een latere blogpost kom ik hier zeker nog op terug.</p>
<p>Indien je na deze (heel uitgebreide) blogpost nog met vragen of problemen zit hoor ik het graag.</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/06/ci-installeren-buiten-de-www-map/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Een e-mail adres beter&#160;controleren</title>
		<link>http://finalfrag.be/blog/2009/05/een-e-mail-adres-beter-controleren/</link>
		<comments>http://finalfrag.be/blog/2009/05/een-e-mail-adres-beter-controleren/#comments</comments>
		<pubDate>Mon, 25 May 2009 14:01:02 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=225</guid>
		<description><![CDATA[Voor sommige projecten is het nodig dat je over een geldig e-mail adres van een gebruiker beschikt. CodeIgniter, ondertussen ieders favoriete framework, biedt echter alleen een controle aan op het formaat van het e-mail adres. Deze controle beperkt zich tot &#8216;zit er een @-teken in?&#8217; en &#8216;zit er een punt in na het @-teken?&#8217;. Voor [...]]]></description>
			<content:encoded><![CDATA[<p>Voor sommige projecten is het nodig dat je over een geldig e-mail adres van een gebruiker beschikt. CodeIgniter, ondertussen ieders favoriete framework, biedt echter alleen een controle aan op het formaat van het e-mail adres. Deze controle beperkt zich tot &#8216;zit er een @-teken in?&#8217; en &#8216;zit er een punt in na het @-teken?&#8217;. Voor de meeste websites is dit natuurlijk meer dan goed genoeg, maar soms moet je toch iets meer zekerheid hebben.<span id="more-225"></span></p>
<h3>Wegwerp-e-mail adressen</h3>
<p>Er zijn op het internet heel wat websites te vinden die e-mail adressen aanbieden die maar een tijdje blijven bestaan. Sommige onder jullie zullen misschien <a target="_blank" href="http://www.mailinator.com"  title="mailinator.com">mailinator.com</a> wel kennen. Op die website kan je elke mailbox raadplegen die onder dat domein valt. Wanneer je bijvoorbeeld op een website een registratieformulier moet invullen, kan je simpelweg piet@mailinator.com gebruiken. Achteraf ga je dan naar mailinator.com en raadpleeg je de mailbox van piet en klaar is kees&#8230; of piet in dit geval.</p>
<h3>De uitbreiding</h3>
<p>De oplossing is uiteraard een uitbreiding op de Email helper van CodeIgniter. We voegen een extra functie toe (is_valid_email) die controleert of het ingevoerde e-mail adres niet voorkomt in een lijst van geblokkeerde hosts. Uiteraard gebruiken we ook nog de standaard functie van CodeIgniter om het formaat te controleren.</p>
<p>Het enige dat je moet doen is in de system/application/helpers map een nieuw bestandje aan te maken met als naam MY_email_helper.php en de volgende code er in plaatsen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> is_valid_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$address</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Blocked hosts</span>
    <span style="color: #000088;">$illegalHosts</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'10x9.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'blockfilter.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'dandikmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'deadaddress.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'deadfake.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'despam.it'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'disposeamail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'dodgit.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'dodgeit.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'emailias.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'gishpuppy.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'greensloth.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'guerrillamail.org'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'haltospam.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'hidzz.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'incognitomail.net'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'jetable.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'kasmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'litedrop.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mailcatch.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'maileater.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mailexpire.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mailinator.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mailnull.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mailzilla.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'makemoneytradingstocks.org'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mint.us.to'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mt2009.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mytempemail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'mytrashmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'nospam4.us'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'nospamfor.us'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'pookmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'pourri.fr'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'shieldemail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'shortmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'signed-first-edition.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'skeefmail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'slopsbox.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'sneakemail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spam.su'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spambox.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spambox.us'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamcero.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamcorptastic.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamex.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamfree24.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamfree24.eu'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamfree24.de'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamfree24.info'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spemfree24.net'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamfree24.org'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamgourmet.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamhole.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spamla.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spammotel.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'spam.la'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'tempemail.net'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'tempinbox.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'trashymail.com'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'wh4f.org'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'yopmail.com'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Check the format with the CodeIgniter function</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>valid_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$address</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Check the illegal hosts</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$illegalHosts</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$illegalHost</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">stripos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$address</span><span style="color: #339933;">,</span> <span style="color: #000088;">$illegalHost</span><span style="color: #339933;">,</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$address</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'@'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// The address is valid</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wanneer je nu op je website een e-mail adres wil controleren, kan je gewoon deze functie gebruiken als volgt:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">is_valid_email<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'massimo@finalfrag.be'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Zal true teruggeven</span>
is_valid_email<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'piet@mailinator.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Zal false teruggeven</span></pre></div></div>

<p>Aangezien we ons bestand MY_email_helper.php hebben genoemd, wordt dit bestand automatisch geladen door CodeIgniter wanneer je de Email helper inlaad. Om deze functie te kunnen gebruiken hoef je dus enkel het volgende te doen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Nog meer hosts</h3>
<p>Indien je zelf nog meer hosts weet die wegwerp-e-mail adressen aanbieden, mag je mij gerust een lijstje bezorgen per e-mail, dan pas ik de functie aan. Ik hoop dat jullie er iets aan hebben.</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/een-e-mail-adres-beter-controleren/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fouten ontvangen per&#160;e-mail</title>
		<link>http://finalfrag.be/blog/2009/05/fouten-ontvangen-per-e-mail/</link>
		<comments>http://finalfrag.be/blog/2009/05/fouten-ontvangen-per-e-mail/#comments</comments>
		<pubDate>Tue, 12 May 2009 12:27:08 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=240</guid>
		<description><![CDATA[Iedereen die al wel eens een website maakt, maakt het mee. Al is het maar een kleine website voor de lokale voetbalploeg, of een website voor het bedrijf van je pa (De Grill-Mobiel   ). Op een dag loopt er iets fout op de website en moeten de mensen jouw komen opzoeken om het [...]]]></description>
			<content:encoded><![CDATA[<p>Iedereen die al wel eens een website maakt, maakt het mee. Al is het maar een kleine website voor de lokale voetbalploeg, of een website voor het bedrijf van je pa (<a target="_blank" href="http://www.degrillmobiel.be"  title="De Grill-Mobiel">De Grill-Mobiel</a> <img src='http://finalfrag.be/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). Op een dag loopt er iets fout op de website en moeten de mensen jouw komen opzoeken om het allemaal uit te leggen wat er juist fout ging. Meestal is de uitleg dan &#8216;ik klikte daar, of was het nu daar, of nee nee, daar klikte ik&#8217; en ben je nog geen stap korter bij het oplossen van het probleem, dat misschien toch bij die eerste klik al voorkwam.<span id="more-240"></span></p>
<p>Zou het niet veel leuker zijn als je automatisch een e-mail kon ontvangen wanneer er iets fout gaat op een van je projecten. Wanneer dan de mensen naar je toe komen met hun probleem kan je trots zeggen: &#8216;ja, dat heb ik gisteren al opgelost, dat werkt terug zoals het hoort&#8217;. Mits een kleine extensie te schrijven voor het <a target="_blank" href="http://www.codeigniter.com"  title="CodeIgniter framework">CodeIgniter framework</a> is dit zo simpel als 1, 2, 3. Of zelfs nog makkelijker, want je moet helemaal niet kunnen tellen.</p>
<h3>My_Log</h3>
<p>Om deze extensie te kunnen schrijven, moeten we eerst op zoek naar de library die instaat voor het opvangen van alle foutmeldingen. In het CodeIgniter framework is dit de Log klasse. We maken een nieuw bestand aan in de map system/application/libraries/ en noemen dit MY_Log.php. In dit bestand zetten we het volgende:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> MY_Log <span style="color: #000000; font-weight: bold;">extends</span> CI_Log
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$levels</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ERROR'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'DEBUG'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'2'</span><span style="color: #339933;">,</span>  <span style="color: #0000ff;">'INFO'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ALL'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> write_log<span style="color: #009900;">&#40;</span><span style="color: #000088;">$level</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'error'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$msg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$php_error</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$config</span> <span style="color: #339933;">=&amp;</span> get_config<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'write_log'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            parent<span style="color: #339933;">::</span><span style="color: #004000;">write_log</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$level</span><span style="color: #339933;">,</span> <span style="color: #000088;">$msg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$php_error</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$level</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$level</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email_log'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">levels</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$level</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">levels</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$level</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_threshold'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$report</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;strong&gt;Requested URI:&lt;/strong&gt;&lt;br /&gt;http://&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_HOST'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Referer:&lt;/strong&gt;&lt;br /&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;strong&gt;User host:&lt;/strong&gt;&lt;br /&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">gethostbyaddr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;strong&gt;Date:&lt;/strong&gt;&lt;br /&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'d-m-Y H:i:s'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;strong&gt;Error:&lt;/strong&gt;&lt;br /&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$msg</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$report</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;/body&gt;&lt;/html&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000088;">$headers</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'MIME-Version: 1.0'</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$headers</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'Content-type: text/html; charset=iso-8859-1'</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$headers</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'From: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_from'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #990000;">mail</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_address'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$report</span><span style="color: #339933;">,</span> <span style="color: #000088;">$headers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Als je de broncode goed naleest zie je dat we enkele variabelen uit het config bestand van CodeIgniter uitlezen. We kunnen uiteraard niets uitlezen dat niet bestaat. Het is dan ook nodig de variabelen in kwestie aan te maken in het config bestand.</p>
<p>De fervente CodeIgniter gebruikers, waaronder ikzelf, willen uiteraard de Email klasse van CI gebruiken om de e-mail te versturen. Ik heb dit proberen te implementeren, maar dat is me niet gelukt. Om in een library aan het CI object te komen, moet je de get_instance() functie gebruiken. Deze functie wordt gedeclareerd <strong>nadat</strong> de Log klasse wordt geladen. Daardoor is het dus niet mogelijk op het CI object te verkrijgen in MY_Log, en is het dus ook niet mogelijk om de Email klasse te laden. Jammer, maar gelukkig doet de <a target="_blank" href="http://be.php.net/manual/en/function.mail.php"  title="PHP mail()">mail() functie</a> van PHP het ook helemaal goed.</p>
<h3>Het config bestand</h3>
<p>In config.php (te vinden in system/application/config/) moeten de volgende items worden toegevoegd:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Vanaf welk niveau moeten er fouten gerapporteerd worden (deze variabele staat al in het config bestand)</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_threshold'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// True als je wil dat er effectief naar het logbestand geschreven wordt</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'write_log'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// True als je een e-mail wil ontvangen wanneer er een fout optreedt</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email_log'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Het e-mail adres naar welk de e-mail wordt verstuurd</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_address'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'massimo@finalfrag.be'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Het onderwerp van het e-mail bericht</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Project x foutmelding'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// De afzender van de e-mail</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'log_email_from'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Project x'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>Het resultaat</h3>
<p>Elke keer wanneer er nu een foutmelding op de website komt, bijvoorbeeld wanneer een PHP variabele niet kan worden gevonden of wanneer er een pagina niet werd gevonden, krijgen we een e-mail waarin meer info staat over de foutmelding. Een foutmelding ziet er als volgt uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="plain" style="font-family:monospace;">REQUESTED URI:
http://www.finalfrag.be/blog/
&nbsp;
USER HOST:
213.219.133.127.adsl.dyn.edpnet.net
&nbsp;
DATE:
06-05-2009 19:37:29
&nbsp;
ERROR:
Severity: Warning --&gt; Cannot modify header information - headers already sent by (output started at /home/finalfrag.be/public_html/libraries/Exceptions.php:164)
/home/finalfrag.be/public_html/libraries/Smarty.php 99</pre></td></tr></table></div>

<p>Uit deze voorbeeldfoutmelding kunnen we afleiden dat er op http://www.finalfrag.be/blog/ al iets op het scherm getoond wordt voordat de sessie geladen wordt door CodeIgniter. Ook krijgen we meer informatie over de gebruiker die de foutmelding heeft veroorzaakt en wanneer.</p>
<p>Ik hoop dat deze blogpost je weer wat verder helpt in de mooie wereld van webontwikkeling. Vragen of opmerkingen passen zoals gewoonlijk mooi in het vakje hieronder.</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/fouten-ontvangen-per-e-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De PHP sluittag&#160;weglaten</title>
		<link>http://finalfrag.be/blog/2009/05/de-php-sluittag-weglaten/</link>
		<comments>http://finalfrag.be/blog/2009/05/de-php-sluittag-weglaten/#comments</comments>
		<pubDate>Sun, 10 May 2009 12:23:52 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=292</guid>
		<description><![CDATA[Met deze blogpost wil even een misverstand de wereld uithelpen. Bijna elke website waar PHP tutorials voor beginners opstaan, leggen dit verkeerd uit. Het gaat om de PHP sluittag, beter bekend als &#8216;?>&#8217;.
Deze tag is optioneel voor de parser die PHP verwerkt. Dit wil zeggen dat de volgende 2 scripts exact hetzelfde doen:

1
2
3
4
&#60;?php
$tekst = 'Ik [...]]]></description>
			<content:encoded><![CDATA[<p>Met deze blogpost wil even een misverstand de wereld uithelpen. Bijna elke website waar PHP tutorials voor beginners opstaan, leggen dit verkeerd uit. Het gaat om de PHP sluittag, beter bekend als &#8216;?>&#8217;.</p>
<p>Deze tag is optioneel voor de parser die PHP verwerkt. Dit wil zeggen dat de volgende 2 scripts exact hetzelfde doen:<span id="more-292"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tekst</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ik ben een voorbeeldtekst.'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$tekst</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tekst</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ik ben een voorbeeldtekst.'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$tekst</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>En dan?</h3>
<p>Op zich is dit geen geweldig nieuws, maar als je even verder nadenkt kan de sluittag weglaten je wel veel frustratie helpen voorkomen. Wanneer je bijvoorbeeld de sluittag wel typt en er per ongeluk nog een spatie achter zet, zal deze niet verwerkt worden door de PHP parser, maar gewoon als HTML aanzien worden. Dat zal op zijn beurt resulteren in een extra spatie op de genereerde pagina, wat in sommige gevallen kan leiden tot onverwachte fouten in de layout van je pagina&#8217;s.</p>
<p>Een spatie of een witregel op het einde van een bestand kan ook gegeneerd worden door de FTP applicatie die je gebruikt. Wanneer de <a target="_blank" href="http://be.php.net/manual/en/function.error-reporting.php"  title="error_reporting">error_reporting</a> functie van PHP wordt gebruikt om fouten niet te tonen aan de eindgebruiker, kan deze spatie het tonen van een lege pagina tot gevolg hebben.</p>
<p>Het is zo dat de PHP parser sowieso stopt met het verwerken van een bepaald script wanneer het einde van dat bestand bereikt is. De parser doet dit helemaal op het einde van het bestand. Zo ben je er zeker van dat er niets meer na deze &#8217;sluittag&#8217; komt te staan.</p>
<h3>Een mogelijk probleem</h3>
<p>Soms kan het gebeuren dat er door een fout in je IDE of een verbinding die plots wegvalt maar een deel van je bestand wordt ingeladen. Door de sluittag weg te laten, kan je niet meer zien of het einde van het geopende bestand effectief het einde is van het bestand in kwestie. Om dit te voorkomen kan je altijd een regel commentaar op het einde van elk bestand zetten, bijvoorbeeld:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$tekst</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ik ben een voorbeeldtekst.'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$tekst</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* EOF: voorbeeld.php */</span></pre></td></tr></table></div>

<p>Voila, zo heb je weer iets bijgeleerd over PHP. Laat gerust een reactie achter als je een vraag of een opmerking hebt.</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/de-php-sluittag-weglaten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Arrays in language files (deel&#160;2)</title>
		<link>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/</link>
		<comments>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/#comments</comments>
		<pubDate>Sat, 09 May 2009 12:49:10 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[meertaligheid]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=305</guid>
		<description><![CDATA[Deze post is een vervolg op de post &#8216;Arrays in language files&#8216; die ik enkele dagen geleden publiceerde. Op het einde gaf ik enkele suggesties voor uitbreidingen op de code in die post.
Als fervente PHPer kon ik me natuurlijk niet inhouden om die uitbreidingen zelf ook eens te maken, al was het maar om de [...]]]></description>
			<content:encoded><![CDATA[<p>Deze post is een vervolg op de post &#8216;<a href="http://finalfrag.be/blog/2009/05/arrays-in-language-files/"  title="Arrays in language files">Arrays in language files</a>&#8216; die ik enkele dagen geleden publiceerde. Op het einde gaf ik enkele suggesties voor uitbreidingen op de code in die post.</p>
<p>Als fervente PHPer kon ik me natuurlijk niet inhouden om die uitbreidingen zelf ook eens te maken, al was het maar om de uitdaging aan te gaan. Bovendien heb ik van elke mensen al vragen gehad over hoe ze eraan moeten beginnen. Daarom heb ik besloten om dit vervolg te schrijven en een woordje uitleg te geven bij deze uitbreidingen.<span id="more-305"></span></p>
<h3>Meerdimensionale arrays</h3>
<p>De uitbreiding die ik heb geschreven ziet er als volgt uit:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> line <span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vals</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$return</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Er zijn geen waardes opgegeven</span>
        <span style="color: #666666; font-style: italic;">// We gebruiken dan een echo</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'return $this-&gt;language'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Er zijn wel waardes opgegeven</span>
        <span style="color: #666666; font-style: italic;">// We gebruiken dan een sprintf</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'return sprintf($this-&gt;language'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// De volledige key samenstellen aan de hand van de array</span>
    <span style="color: #666666; font-style: italic;">// Dit wordt iets als ['error']['username']['minLength']</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Als $keys een array is halen we alle delen op</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$keys</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'[\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\']'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Anders is er maar één key meegegeven aan de functie</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'[\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$keys</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\']'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Daarna doen we ongeveer hetzelfde voor de waardes</span>
    <span style="color: #666666; font-style: italic;">// Als die er zijn, maken we gebruik van een sprintf (zie bovenaan)</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Als er een array werd meegegeven, doorlopen we deze</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">', \''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$val</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\''</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Anders is er maar één waarde</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">', \''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$vals</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\''</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Op het einde nog even de functie (echo of sprint) juist afsluiten</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vals</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">';'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$return</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// En het geheel teruggeven</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$return</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Deze functie staat uiteraard in het MY_Language.php bestand. Aangezien de naam van de functie die hierboven staat &#8216;line&#8217; is, zal de functie van CI_Language overschreven worden. Dit is echter geen probleem, omdat onze eigen functie dezelfde en meer functionaliteiten biedt dan de originele. Om dit even te demonstreren, maak ik gebruik van dutch_lang.php in de map language/dutch/:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'een'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is een voorbeeld'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'twee'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld %s'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'drie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld a'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'drie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Dit is voorbeeld b met als gegevens: %s en %s'</span><span style="color: #339933;">;</span></pre></div></div>

<p>De code om dit te testen is redelijk makkelijk te schrijven. Dit zijn enkele van de tests, maar er zijn er natuurlijk nog meer mogelijk. Zo is er bijvoorbeeld geen test voorzien voor een array van keys met één waarde.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Home <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'een'</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'twee'</span><span style="color: #339933;">,</span>
            <span style="color: #cc66cc;">2</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'drie'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'drie'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'b'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bovenstaande code geeft als resultaat:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">Dit is een voorbeeld
Dit is voorbeeld 2
Dit is voorbeeld a
Dit is voorbeeld b met als gegevens: 1 en 2</pre></div></div>

<p>Dat werkt allemaal heel mooi, maar er is nog een tweede uitdaging.</p>
<h3>Alle language file rechtstreeks in de language/ map</h3>
<p>Nu staat alle taalbestanden nog in mappen. Zo staat dutch_lang.php in language/dutch/ en english_lang.php in language/english/. Dit heeft als gevolg dat we steeds deze map moeten meegeven met de $this->lang->load functie.</p>
<p>De enige manier om dit op te lossen is om de load functie van CI_Language te overschrijven. Dit kan door de load functie te kopiëren vanuit Language.php (te vinden in system/libraries/) en te plakken in MY_Language.php. Het enige dat je nu nog moet doen is een stuk code in commentaar zetten, of volledig te verwijderen als je dat liever doet. Het gaat om de if structuur die begint op regel 8 van de functie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$idiom</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$deft_lang</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">item</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'language'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$idiom</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$deft_lang</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'english'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$deft_lang</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wanneer je bovenstaande code in commentaar zet kan je in je controllers</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>vervangen door</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Je moet natuurlijk ook dutch_lang.php verplaatsen van language/dutch/ naar language/.</p>
<h3>En klaar is kees</h3>
<p>Voila, beide ideeën die ik en de vorige post voorstelde zijn bij deze gemaakt. Als er nog vrage zijn, je weet ondertussen wel waar je ze kan zetten&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/arrays-in-language-files-deel-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arrays in language&#160;files</title>
		<link>http://finalfrag.be/blog/2009/05/arrays-in-language-files/</link>
		<comments>http://finalfrag.be/blog/2009/05/arrays-in-language-files/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:44:25 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[meertaligheid]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=199</guid>
		<description><![CDATA[Eén van de weinige tekortkomingen in het CodeIgniter framework zijn de language files. Deze bestanden bevatten arrays die vertalingen aanbieden voor een bepaalde tekst. Standaard biedt CodeIgniter slechts de mogelijkheid aan om 1-dimensionale arrays te gebruiken, en dit leid al snel tot beperkingen. In deze blogpost zal ik toelichten hoe je de language klasse van [...]]]></description>
			<content:encoded><![CDATA[<p>Eén van de weinige tekortkomingen in het <a target="_blank" href="http://www.codeigniter.com"  title="CodeIgniter framework">CodeIgniter framework</a> zijn de language files. Deze bestanden bevatten arrays die vertalingen aanbieden voor een bepaalde tekst. Standaard biedt CodeIgniter slechts de mogelijkheid aan om 1-dimensionale arrays te gebruiken, en dit leid al snel tot beperkingen. In deze blogpost zal ik toelichten hoe je de language klasse van CodeIgniter kan uitbreiden zodat deze ook meerdimensionale arrays ondersteunt. Op die manier moet je slechts één bestand per taal aanmaken.<span id="more-199"></span></p>
<h3>De situatie nu</h3>
<p>Wanneer je CodeIgniter download van de website en upload naar je eigen webspace, ben je gebonden aan de 1-dimensionale arrays in language files. Concreet houdt dit in dat je je vertalingen niet kan bundelen. Een kleine language file ziet er bijvoorbeeld zo uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMaxLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameInvalid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam bevat ongeldige tekens.'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Voor simpele applicaties is dit goed genoeg, maar wanneer je veel teksten hebt die moeten vertaald worden is dit onbegonnen werk. Denk maar eens aan het feit dat je teksten in categorieën wil indelen. Zo wil ik bijvoorbeeld alle foutmeldingen, alle waarschuwingen en alle informatieteksten bij elkaar groeperen. De handleiding van CodeIgniter raad in dat geval het volgende aan:</p>
<p><em>It&#8217;s a good practice to use a common prefix for all messages in a given file to avoid collisions with similarly named items in other files. For example, if you are creating error messages you might prefix them with error_</em></p>
<p>Dit is weer een leuke oplossing, maar ook niet goed genoeg voor hele grote websites. Een andere oplossing zou zijn om meerdere language files te maken per taal. Zo kan je bijvoorbeeld voor nederlands 3 bestanden aanmaken: nl_foutmeldingen_lang.php, nl_waarschuwingen_lang.php en nl_informatie_lang.php. Ook weer een tof alternatief, maar een oplossing die bijna niet onderhouden is.</p>
<p>Het mag dus wel duidelijk zijn dat er nood is aan een beter oplossing, en die gaan we nu maken.</p>
<h3>Hoe het zou moeten</h3>
<p>De ideale oplossing zou één bestand per taal zijn, waarin een meerdimensionale array staat die de teksten in categorieën onderverdeeld. Een klein voorbeeldje, in nl_lang.php staat het volgende:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameMaxLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'usernameInvalid'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam bevat ongeldige tekens.'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'warning'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwordMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je wachtwoord is niet lang genoeg.'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'warning'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwordMinLength'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Je gebruikersnaam is te lang.'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'info'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'welcome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Welkom op mijn blog'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Het spreekt voor zich dat in en_lang.php exact hetzelfde staat, maar dan in het engels. Voor de_lang.php, fr_lang.php, etc. is dit uiteraard ook zo. Zoals je kan zien in bovenstaande code, zijn de teksten gegroepeerd. Een array voor alle foutmeldingen, een voor alle waarschuwingen en een voor alle informatieteksten.</p>
<p>Er rest nu nog één probleem. CodeIgniter kan standaard niet om met meerdimensionale arrays in de language files. We moeten dus de language class uitbreiden met een functie die de array wel kan uitlezen.</p>
<h3>De oplossing</h3>
<p>Wie al een beetje ervaring heeft met CodeIgniter, weet meteen dat voor problemen als deze de ideale oplossing al aanwezig is. Je kan in CI namelijk heel makkelijk bestaande klassen (of libraries in dit geval) overschrijven. Eerst maken we een nieuw bestand aan in /system/application/libraries en we noemen dit MY_Language.php. De inhoud van dit bestand is als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> MY_Language <span style="color: #000000; font-weight: bold;">extends</span> CI_Language
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> line2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$line</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$line</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$line</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">''</span> OR <span style="color: #000088;">$array</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">''</span> OR <span style="color: #339933;">!</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">language</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$line</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">language</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$line</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$line</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Aangezien de naam van het bestand MY_ + een_bestaande_klasse is, zal deze automatisch worden geladen door CodeIgniter en moeten we ons hier verder geen zorgen meer om maken. We hebben nu een functie toegevoegd aan de Language klasse van CI, namelijk line2. We geven 2 parameters mee aan deze functie, de array waarin we willen zoeken en de regel die we willen ophalen. Ik heb voor dit voorbeeld deze functie line2 genoemd. In een realistische omgeving zou ik deze functie een kortere naam geven, bijvoorbeeld l2. Zo besparen we onszelf elke keer we deze functie aanroepen weer een beetje werk.</p>
<p>De functie gebruiken kan nu als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Home <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Eerst laden we het bestand in ('mapnaam', 'bestandsnaam zonder _lang')</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dutch'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dutch'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Daarna printen we de regel 'usernameMinLength' uit de array 'error'</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lang</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">line2</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usernameMinLength'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Wanneer we dan een bezoekje brengen aan home/index krijgen we het volgende resultaat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="plain" style="font-family:monospace;">Je gebruikersnaam is niet lang genoeg.</pre></td></tr></table></div>

<p>Exact wat we wilden bereiken. Missie geslaagd.</p>
<h3>Noot</h3>
<p>De code hierboven is bedoeld als voorbeeld en kan nog heel wat beter geschreven worden. Nu moeten we bijvoorbeeld nog steeds als onze language files in een aparte map plaatsen. dutch_lang.php in language/dutch/, english_lang.php in language/english/. Volgens de zelfde manier als hierboven kan de load functie van de Language klasse overschreven worden zodat we de language files rechtstreeks in language/ mogen plaatsen.</p>
<p>Ook kan de code hierboven worden uitgebreid om ondersteuning te bieden voor meerdimensionale array zodat je nog meer vrijheid krijgt. Beide ideeën laat ik als oefening voor de lezer <img src='http://finalfrag.be/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/05/arrays-in-language-files/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Een tagcloud&#160;maken</title>
		<link>http://finalfrag.be/blog/2009/04/een-tagcloud-maken/</link>
		<comments>http://finalfrag.be/blog/2009/04/een-tagcloud-maken/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 10:04:10 +0000</pubDate>
		<dc:creator>FinalFrag</dc:creator>
				<category><![CDATA[Programmeren]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[tags]]></category>

		<guid isPermaLink="false">http://finalfrag.be/blog/?p=110</guid>
		<description><![CDATA[Tijdens mijn stage ben ik deze week gestoten op iets dat ik nooit eerder heb gemaakt, een tagcloud. Dit klinkt heel simpel om te maken, maar uiteindelijk was het toch moeilijker om te maken dan verwacht. Door deze blogpost zal ik het maken van een tagcloud wat toelichten.
Wat is een tagcloud?
Een tagcloud is een verzameling [...]]]></description>
			<content:encoded><![CDATA[<p>Tijdens mijn stage ben ik deze week gestoten op iets dat ik nooit eerder heb gemaakt, een tagcloud. Dit klinkt heel simpel om te maken, maar uiteindelijk was het toch moeilijker om te maken dan verwacht. Door deze blogpost zal ik het maken van een tagcloud wat toelichten.</p>
<h3>Wat is een tagcloud?</h3>
<p>Een tagcloud is een verzameling van kernwoorden op een blog. Door het grote succes van tagclouds, worden ze ondertussen ook voor andere doeleinden gebruikt.<span id="more-110"></span>In mijn stageproject gebruik ik een &#8216;product-cloud&#8217;, een tagcloud die de producten bevat waarover de meeste reviews werden geschreven.</p>
<p>Een tagcloud kan je makkelijk herkennen doordat er grote en kleine woorden instaan. De grote woorden zijn belangrijker en worden dus groter getoond zodat ze beter opvallen. Een voorbeeld van een tagcloud kan je op deze blog in het rechter menu zien. Kernwoorden waarover ik het dikwijls heb in mijn posts worden groter getoond, terwijl minder vaak voorkomende tags kleiner worden afgebeeld.</p>
<h3>Een tagcloud maken</h3>
<p>Het makkelijkste deel van een tagcloud is de CSS. In dit voorbeeld zullen we gebruik maken van vier verschillende groottes. De CSS bevat dus vier klassen, één voor elke grootte.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.size1</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">12px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.size2</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">24px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.size3</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">36px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.size4</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">48px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Om dit voorbeeld zo simpel mogelijk te houden, zal ik de tags niet ophalen uit een database, maar zelf een array declareren. In een realistische situatie moet dit uiteraard wel gebeuren. Om een tagcloud samen te stellen hebben we nood aan twee gegevens. In mijn stageproject waren dit de naam van een product en het aantal reviews dat erover zijn geschreven. De naamgeving hangt af van het doel van de cloud. Om dit voorbeeld zo duidelijk mogelijk te maken, zullen we gegevens ‘naam’ en ‘aantal’ noemen. De gebruikte array ziet er dus als volgt uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Massimo'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Mertens'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">9</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'FinalFrag'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Website'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">7</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Blog'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'naam'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Tagcloud'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'aantal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">8</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Uit deze array kunnen we al afleiden dat &#8216;Tagcloud&#8217; en &#8216;Mertens&#8217; het grootst gaan getoond worden met respectievelijk 8 en 9 als aantal. &#8216;Blog&#8217; en &#8216;FinalFrag&#8217; zullen klein worden getoond omdat ze maar 1 en 2 als aantal hebben.</p>
<p>De verwerking van deze array gaat in mensentaal als volgt. Eerst bepalen we het grootste en het kleinste aantal. Zo komen we te weten welke klein moeten getoond worden en welke groot. Uiteraard moeten ook de tussenliggende tags onderverdeeld worden in de vier CSS klassen die we eerder al hebben aangemaakt. In PHP ziet dit er als volgt uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Eerst initialiseren we de variabelen</span>
<span style="color: #666666; font-style: italic;">// die het kleinste en grootste aantal bevatten</span>
<span style="color: #000088;">$min</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Daarna overlopen we de array (by reference)</span>
<span style="color: #666666; font-style: italic;">// om het kleinste en grootste aantal op te slaan</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Indien er nog geen kleinste waarde is opgeslagen,</span>
    <span style="color: #666666; font-style: italic;">// is de eerste de kleinste</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$min</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$min</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Hetzelfde voor de maximumwaarde</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$max</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Als het huidige aantal kleiner is dan de opgeslagen</span>
    <span style="color: #666666; font-style: italic;">// minimumwaarde is dit de nieuwe minimumwaarde</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$min</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$min</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// En weer hetzelfde voor de maximumwaarde</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$max</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// De volgende stap is om de tags te verdelen over de vier klassen</span>
<span style="color: #666666; font-style: italic;">// Eerst moeten we de range bepalen waarin de tags zich bevinden</span>
<span style="color: #000088;">$range</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$max</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$min</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Daarna bepalen we de grootte van elk van de vier delen</span>
<span style="color: #000088;">$partSize</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$range</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Aan de hand van de grootte van elk deel,</span>
<span style="color: #666666; font-style: italic;">// kunnen we de maximumwaarde van elk deel bepalen</span>
<span style="color: #000088;">$part1Max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$min</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$partSize</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$part2Max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$min</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$partSize</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$part3Max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$min</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">*</span> <span style="color: #000088;">$partSize</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$part4Max</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$max</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Wanneer we bovenstaande code uitvoeren op de array die we hoger hebben aangemaakt, krijgen we volgend resultaat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">$min = 1
$max = 9
&nbsp;
$range = 8 (9 – 1)
$partSize = 2 (8 / 4)
&nbsp;
$part1Max = 3 (1 + 2)
$part2Max = 5 (1 + 2 * 2)
$part3Max = 7 (1 + 3 * 2)
$part4Max = 9 ($max)</pre></td></tr></table></div>

<p>Het enige dat ons nu nog rest is om de array opnieuw te overlopen en de tags te verdelen over de aangemaakt klassen. Dit is makkelijk te realiseren als volgt:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span> <span style="color: #b1b100;">as</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$part1Max</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Het aantal ligt tussen 1 en 3</span>
        <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'klasse'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$part2Max</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Het aantal ligt tussen 3 en 5</span>
        <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'klasse'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'aantal'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$part3Max</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Het aantal ligt tussen 5 en 7</span>
        <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'klasse'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Het aantal ligt tussen 7 en 9</span>
        <span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'klasse'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Nu is de array die we in het begin aangemaakt hebben uitgebreid met een extra veld, namelijk &#8216;klasse&#8217;. In deze variabele staat de CSS klasse waartoe die bepaalde tag hoort. Met behulp van Smarty (onze favoriete template engine) kunnen we deze array makkelijk omzetten in HTML zodat deze op de website kan getoond worden. Allereerst moeten we de array doorgeven aan Smarty en de juiste template aanroepen:</p>
</pre>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Eerst geven we de tags array door aan Smarty</span>
<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tags'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tags</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// En daarna tonen we de tagcloud template</span>
<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tagcloud.tpl'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Deze template ziet er als volgt uit:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="smarty" style="font-family:monospace;"><span style="color: #009000;">&lt;div id=&quot;tagcloud&quot;&gt;</span>
    <span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">foreach</span> <span style="color: #6A0A0A;">from</span><span style="color: #D36900;">=</span><span style="color: #00aaff;">$tags</span> <span style="color: #6A0A0A;">item</span><span style="color: #D36900;">=</span>tag<span style="color: #D36900;">&#125;</span>
        <span style="color: #009000;">&lt;span class=&quot;size{$tag.klasse}&quot;&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$tag</span>.<span style="color: #006600;">naam</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/span&gt;</span>
    <span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span><span style="color: #0600FF;">foreach</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/div&gt;</span></pre></td></tr></table></div>

<h3>Het resultaat</h3>
<p><a href="http://finalfrag.be/blog/wp-content/uploads/2009/04/tag_cloud_resultaat.png"  rel="shadowbox[post-110];player=img;"><img src="http://finalfrag.be/blog/wp-content/uploads/2009/04/tag_cloud_resultaat.png" alt="Het resultaat" title="Het resultaat" width="170" height="60" class="alignright size-thumbnail wp-image-181" /></a>Als je alle code die hierboven staat zou samenvoegen en uitvoeren, krijg je een 'mooie' tagcloud. Uiteraard kan dit met behulp van de juiste CSS regels veel beter gemaakt worden, maar daar gaat deze post niet over. Bepaalde stukken PHP code kunnen op een betere manier geschreven worden, bijvoorbeeld het deel dat beslist in welk deel een bepaalde tag hoort. In een productieomgeving moet dit gedaan worden met een switch. Het is dan ook niet aangeraden de code gewoon over te nemen wanneer je zelf een tagcloud wil maken. Er zijn op het internet heel wat voorbeelden te vinden van tagclouds met een mooie stijling.</p>
<p><a target="_blank" href="http://www.inventis.be/blog"  title="Inventis blog"><img src="http://finalfrag.be/blog/wp-content/uploads/2009/04/tag_cloud_voorbeeld1.png" alt="Inventis tagcloud" title="Inventis tagcloud" class="alignnone size-thumbnail wp-image-184" /></a></p>
<p><a target="_blank" href="http://chir.ag/projects/preztags/"  title="US presidential speeches tagcloud"><img src="http://finalfrag.be/blog/wp-content/uploads/2009/04/tag_cloud_voorbeeld2.png" alt="US presidential speeches tagcloud" title="US presidential speeches tagcloud" width="385" height="123" class="alignnone size-thumbnail wp-image-186" /></a></p>
<p><a target="_blank" href="http://www.webdesignerwall.com"  title="Webdesignerwall"><img src="http://finalfrag.be/blog/wp-content/uploads/2009/04/tag_cloud_voorbeeld3.png" alt="Webdesignerwall tagcloud" title="Webdesignerwall tagcloud" class="alignnone size-thumbnail wp-image-184" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://finalfrag.be/blog/2009/04/een-tagcloud-maken/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
