<?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>Weblog van Paul de Raaij</title>
	<atom:link href="http://www.paulderaaij.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.paulderaaij.nl</link>
	<description>Algemeen weblog van Paul de Raaij</description>
	<lastBuildDate>Sat, 31 Jul 2010 12:21:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>A way to implement unit testing in Joomla!</title>
		<link>http://www.paulderaaij.nl/2010/07/31/a-way-to-implement-unit-testing-in-joomla/</link>
		<comments>http://www.paulderaaij.nl/2010/07/31/a-way-to-implement-unit-testing-in-joomla/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 12:21:28 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=203</guid>
		<description><![CDATA[Since a couple of months I&#8217;m not anymore self-employed and am I working for a company who develops for ActiveCollab, Magento and Joomla!. While developing I&#8217;m trying to work according the TDD paradigm. So you write your tests first and then you develop the business logic to succeed the failing test. I&#8217;d have to admit that Joomla! [...]]]></description>
			<content:encoded><![CDATA[<p>Since a couple of months I&#8217;m not anymore self-employed and am I working for a company who develops for ActiveCollab, Magento and Joomla!. While developing I&#8217;m trying to work according the TDD paradigm. So you write your tests first and then you develop the business logic to succeed the failing test. I&#8217;d have to admit that Joomla! never will be my first choice to develop on, but it isn&#8217;t as bad some are preaching.</p>
<p>While getting my way around the Joomla! framework I have a big problem getting the checked in unit tests to run. If you do a checkout of the unit tests from the svn you&#8217;ll see there are about 960 tests and about 600 fails straight out of the box. Pretty annoying and unusable to write your own tests against.</p>
<p>So I&#8217;ve been working on a test runner of my own. The test runner tries to use the most of the Joomla! framework, but some things it just have to do itself. It consists of 2 files. One file is the testloader which is setup as an autoloader using the JLoad class. The second class sets some configuration files and kickstarts the Joomla! framework.</p>
<p><strong>Here&#8217;s the code for the testloader</strong></p>
<pre class="brush: php;">

&lt;?php

/**

* Testloader class

*

* This class strips the requested class and passes it thru

* to the Joomla autoload function

*

* @author Paul de Raaij &lt;paul@paulderaaij.nl&gt;

*/

// Preload the model so we can add paths to the inlude path of JLoader

jimport( 'joomla.application.component.model' );

class TestLoader {

/**

* Strip the given class and pass it to the

* Joomla autoloader.

*

* If it's a component add the path to the

* include path of the loader

*

* @param String $classname

* @return bool Has the inclusion succeeded

*/

static public function load( $classname ) {

$explodedPath = self::explodeClassname( $classname );

if( $explodedPath == null ) {

return self::loadJoomlaClass( $classname );

}

// Add the folder to the loader include path

JModel::addIncludePath('../components/com_' . $explodedPath['component'] . '/' . $explodedPath['type'] . 's');

return self::loadJoomlaClass( $classname );

}

/**

* Explode the classname and strip component name,

* type and type name

*

* @param string $classname

* @return mixed Returns null when it's a core file. Returns an array with data if it's a component data

*/

static protected function explodeClassname( $classname ) {

$types = array('model', 'controller', 'helper', 'view');

$classname = strtolower($classname);

if( $classname == 'jmodel' ) {

return null;

}

$fileInfo = array();

foreach( $types as $type ) {

if( false !== strpos($classname, $type) ) {

$fileInfo['type']       = $type;

}

}

if( isset( $fileInfo['type'] ) ) {

$fileInfo['component']  = substr($classname, 0, strpos($classname, $fileInfo['type'] ) );

$fileInfo['name']       = substr($classname, ( strpos($classname, $fileInfo['type'] ) + strlen($fileInfo['type']) ) );

return $fileInfo;

}

return null;

}

/**

* Simple pass thru function to the Joomla autoloader

*

* @param string $class

* @return bool Has inclusion succeeded?

*/

static public function loadJoomlaClass( $class ) {

return JLoader::load( $class );

}

}

?&gt;
</pre>
<p>And this is the TestCase class which is required by each unit test file:</p>
<pre class="brush: php;">

&lt;?php

require_once 'PHPUnit/Framework.php';

// We are a valid Joomla entry point.

define('_JEXEC', 1);

// Setup the path related constants.

define('DS', DIRECTORY_SEPARATOR);

define('JPATH_BASE', dirname( __FILE__ ) . '\..');

define('JPATH_ROOT', JPATH_BASE);

define('JPATH_CONFIGURATION', JPATH_BASE);

define('JPATH_LIBRARIES', JPATH_BASE.DS.'libraries');

define('JPATH_METHODS', JPATH_ROOT.DS.'methods');

// Load the library importer, datbase class and configuration

require_once (JPATH_LIBRARIES.'/joomla/import.php');

require_once (JPATH_LIBRARIES.'/joomla/database/database.php');

// Load the TestLoader

require_once dirname(__FILE__) . '\lib\TestLoader.php';

// register specific test autloader

if( !defined('LOADED_AUTOLOADER') ) {

spl_autoload_register( array('TestLoader', 'load') );

define('LOADED_AUTOLOADER', true);

}

// Define configuration

jimport( 'joomla.registry.registry' );

require_once( JPATH_CONFIGURATION.'/configuration.php' );

// Create the JConfig object

$config = new JConfig();

// Get the global configuration object

$registry =&amp; JFactory::getConfig();

// Load the configuration values into the registry

$registry-&gt;loadObject($config);

$options = array ('driver' =&gt; $config-&gt;driver,

'host' =&gt; $config-&gt;host,

'user' =&gt; $config-&gt;user,

'password' =&gt; $config-&gt;password,

'database' =&gt; $config-&gt;database,

'prefix' =&gt; $config-&gt;prefix );

// Preload database with configuration

$db = JDatabase::getInstance( $options );

?&gt;
</pre>
<p>An example unit test looks like this:</p>
<pre class="brush: php;">

&lt;?php

require_once dirname(__FILE__) . '\..\..\..\TestCase.php';

class Model_Test_Base extends PHPUnit_Framework_TestCase {

protected $model = null;

public function setUp() {

$this-&gt;model = JModel::getInstance('&lt;modelname&gt;', '&lt;componentname&gt;Model');

}

public function testSimpleAssertion() {

$this-&gt;assertTrue( $this-&gt;model-&gt;test() );

}

}

?&gt;
</pre>
<p>Perhaps this isn&#8217;t the best way to use unit testing in Joomla! But at the moment this is the only thing I got working. If you&#8217;ve got some suggestions your glad to leave it behind as a reaction!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/07/31/a-way-to-implement-unit-testing-in-joomla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>het eerste schooljaar zit er op</title>
		<link>http://www.paulderaaij.nl/2010/07/24/het-eerste-schooljaar-zit-er-op/</link>
		<comments>http://www.paulderaaij.nl/2010/07/24/het-eerste-schooljaar-zit-er-op/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 09:17:30 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[LOI/Opleiding]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=199</guid>
		<description><![CDATA[Vorig jaar rond deze tijd besloot ik dat het echt niet verder kon met de LOI. Als ik namelijk door zou gaan met de HBO opleiding informatica bij hun, dan zou ik mijn diploma eens in 2020 op kunnen halen. Iets wat niet mijn bedoeling was. Na een korte oriëntatie besloot ik om mijn gelukt [...]]]></description>
			<content:encoded><![CDATA[<p>Vorig jaar rond deze tijd besloot ik dat het echt niet verder kon met de LOI. Als ik namelijk door zou gaan met de HBO opleiding informatica bij hun, dan zou ik mijn diploma eens in 2020 op kunnen halen. Iets wat niet mijn bedoeling was. Na een korte oriëntatie besloot ik om mijn gelukt te gaan beproeven bij de Haagse Hogeschool.</p>
<p>Het afgelopen jaar heb ik op dit blog al geregeld gepost hoe de opleiding mij verging. Over het algemeen ben ik best tevreden met de HHS, natuurlijk zijn er behoorlijk wat rare situaties, maar inmiddels begrijp ik ook wel dat je die overal wel tegenkomt.</p>
<p>Het laatste blok moesten we van een zeer oud en slecht geschreven programma het beheer op ons nemen en daar nieuwe functionaliteiten inbakken en dat volgens nette beheer methodes. Met weer een deels nieuw project groepje ging het ons aardig af. Voor de praktijk opdracht kregen we een 7 en voor de theoretische toets had ik een 7,3. Prima voor elkaar dus!</p>
<p>Eindresultaat van het eerste jaar is dan ook dat ik met de diverse vrijstellingen in het eerste jaar al 105 studiepunten heb gehaald, de propedeuse binnen is en dat ik lekker op schema lig om over 1,5 jaar het diploma op te halen.</p>
<p>Kortom&#8230; doe mij nog maar zo&#8217;n schooljaar!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/07/24/het-eerste-schooljaar-zit-er-op/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ik stop met ondernemen!</title>
		<link>http://www.paulderaaij.nl/2010/04/24/ik-stop-met-ondernemen/</link>
		<comments>http://www.paulderaaij.nl/2010/04/24/ik-stop-met-ondernemen/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 08:41:48 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=190</guid>
		<description><![CDATA[Deze week kon het dan eindelijk bekend worden. Ik heb besloten om te stoppen als ondernemer. Een beslissing die niet bepaald makkelijk genomen is, maar wel heel goed voelt. Zes jaar lang ben ik aan de gang gegaan met Mediactief en heb ik geprobeerd mijn droom te realiseren. De laatste maanden kwam ik er echter [...]]]></description>
			<content:encoded><![CDATA[<p>Deze week kon het dan eindelijk bekend worden. Ik heb besloten om te stoppen als ondernemer. Een beslissing die niet bepaald makkelijk genomen is, maar wel heel goed voelt.</p>
<p>Zes jaar lang ben ik aan de gang gegaan met Mediactief en heb ik geprobeerd mijn droom te realiseren. De laatste maanden kwam ik er echter steeds meer achter dat ik het niet zo gevormd kreeg zoals ik het graag zou willen hebben. Helaas, had ik ook niet het vertrouwen dat ik dit wel voor elkaar kreeg zoals ik zou willen. Als je daarbij optelt dat ik daardoor ook steeds meer het plezier kwijtraakte, dan is er maar een juiste beslissing.</p>
<p>En om eerlijk te zijn voel ik me er heel goed bij. Het is de juiste beslissing geweest en zeker ook geen schande. Ik voel dan ook geen schaamte en zie het ook niet als falen. Ik heb het geprobeerd en op tijd ingezien dat het mooi is geweest.</p>
<p>Het bedrijf is verkocht aan Eleven in Maasdijk. Zij nemen mijn klanten over en ook ik zal mij bij hun team voegen als webdeveloper. Daar kan ik gaan doen wat ik echt wil doen en dat is het ontwikkelen van (web)applicaties. Lekker in de code duiken zonder te denken aan de BTW aanslag die nog moet gebeuren en dat soort zaken.</p>
<p>Zes jaar lang heb ik me vol overgave gegeven voor mijn bedrijf en mijn klanten. Ik wil hun dan nogmaals ontzettend bedanken voor hun vertrouwen in mij en mijn team. Ik waardeer het zeer en weet zeker dat we samen met Eleven nog betere service en kwaliteit kunnen verlenen.</p>
<p>Ik heb er de volste vertrouwen in!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/04/24/ik-stop-met-ondernemen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Custom symfony filters to filter model relations</title>
		<link>http://www.paulderaaij.nl/2010/04/21/custom-symfony-filters-to-filter-model-relations/</link>
		<comments>http://www.paulderaaij.nl/2010/04/21/custom-symfony-filters-to-filter-model-relations/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 10:17:21 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=186</guid>
		<description><![CDATA[For an application I was looking for a way to add filters in the generated admin application. We&#8217;de like to filter clients based on the articles or orders they have.  Lets take a look at the (simplified) schema: Account: columns: id:             { type: integer, primary: true, autoincrement: true, notnull: [...]]]></description>
			<content:encoded><![CDATA[<p>For an application I was looking for a way to add filters in the generated admin application. We&#8217;de like to filter clients based on the articles or orders they have.  Lets take a look at the (simplified) schema:</p>
<pre class="brush: php;">

Account:
columns:
id:             { type: integer, primary: true, autoincrement: true, notnull: true }
accountNumber:  { type: integer, notnull: true }
accountName:    { type: string(255), notnull: true }

Order:
columns:
id:             { type: integer, primary: true, autoincrement: true, notnull: true }
internID:       { type: string(20) }
accountID:      { type: integer, notnull: true }
locationID:    { type: integer }
orderDate:      { type: timestamp }
orderedBy:      { type: integer, notnull: true }
remarks:        { type: string(3000) }
orderDelivered: { type: boolean }
placedOrder:    { type: boolean }
relations:
Account:        { onDelete: CASCADE, local: accountID, foreign: id, foreignAlias: accountOrders }

Article:

columns:

id:            { type: integer, primary: true, autoincrement: true, notnull: true }
accountID:     { type: integer, notnull: true }

articleNumber: { type: string(15) }

description:   { type: string(255) }

currentStock:  { type: integer }

minimumStock:  { type: integer }

packageAmount: { type: integer }

previewFile:   { type: string( 255 ) }

remarks:       { type: string( 3000 ) }

internRemarks: { type: string( 5000 ) }

image:         { type: string( 255 ) }

relations:

Account:       { onDelete: CASCADE, local: accountID, foreign: id, foreignAlias: articleAccount }
</pre>
<p>In short. We have an account and each account has it own articles. The can order these articles and this is stored in the Order model ( and a bunch of others, which aren&#8217;t relevant for this post).</p>
<p>What we want to achieve is that we can filter the client list based on a article number or order id.</p>
<p>To do this I extended the generator.yml to add the two new fields.</p>
<pre class="brush: php;">
config:

fields:
articleNumber:     {label: Artikel nummer, type: string }
orderNumber:     {label: Order nummer, type: string }
</pre>
<p>Next thing to do is to modify the filter form of the account model. Here we&#8217;re going to add the two new fields to the filter form and give them a simple validator.</p>
<pre class="brush: php;">

public function configure()

{

parent::configure();

$this-&gt;widgetSchema['articleNumber'] = new sfWidgetFormInputText();

$this-&gt;validatorSchema['articleNumber'] = new sfValidatorPass(array('required'=&gt;'false'));

$this-&gt;widgetSchema['orderNumber'] = new sfWidgetFormInputText();

$this-&gt;validatorSchema['orderNumber'] = new sfValidatorPass(array('required'=&gt;'false'));

}
</pre>
<p>Now we want to add the filter values to the query so that the list actually gets filtered by the given values. Therefore were going to add a function for each of the filter fields. The function has one purpose and that is to add a where to the doctrine query.</p>
<pre class="brush: php;">

protected function addArticleNumberColumnQuery( Doctrine_Query $query, $field, $values) {

$rootAlias = $query-&gt;getRootAlias();

$fieldName = 'articleNumber';

$query-&gt;addWhere( sprintf('%s.articleAccount.%s = ?', $rootAlias, $fieldName), $values );

}

protected function addOrderNumberColumnQuery( Doctrine_Query $query, $field, $values) {

$rootAlias = $query-&gt;getRootAlias();

$fieldName = 'id';

$query-&gt;addWhere( sprintf('%s.accountOrders.%s = ?', $rootAlias, $fieldName), $values );

}
</pre>
<p>The name of the function is specific and has to match the format add%fieldname%ColumnQuery. The code in the functions are pretty self-explanatory. Somethings are hard coded and could be a  nicer. For example you could name the field accountOrders instead of orderNumber so that you can use the value of $field.</p>
<p>This is the simplest solution I could find for filtering a model based on its relations. If someone knows a better way I&#8217;d love to hear about it.</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/04/21/custom-symfony-filters-to-filter-model-relations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opdracht I2: Happer spel</title>
		<link>http://www.paulderaaij.nl/2010/04/19/opdracht-i2-happer-spel/</link>
		<comments>http://www.paulderaaij.nl/2010/04/19/opdracht-i2-happer-spel/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 17:36:24 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[LOI/Opleiding]]></category>
		<category><![CDATA[happer]]></category>
		<category><![CDATA[HHS]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=179</guid>
		<description><![CDATA[Dit blok moesten we een Happer spel maken als opdracht. Doel was om het zo Object Oriënted mogelijk te maken. In groepen van twee moesten we dit spel vanaf nul opbouwen. Natuurlijk gaat het niet alleen om de Java code, maar ook om de UML modellen die gemaakt moesten worden en dat allemaal via de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.paulderaaij.nl/wp-content/uploads/2010/04/happer.png" rel="lightbox[179]" rel="lightbox[179]" title="Happer screenshot"><img class="size-thumbnail wp-image-181 alignleft" style="margin: 5px;" title="Happer screenshot" src="http://www.paulderaaij.nl/wp-content/uploads/2010/04/happer-150x150.png" alt="Happer spel, I-2 HHS" width="193" height="193" /></a>Dit blok moesten we een Happer spel maken als opdracht. Doel was om het zo Object Oriënted mogelijk te maken. In groepen van twee moesten we dit spel vanaf nul opbouwen. Natuurlijk gaat het niet alleen om de Java code, maar ook om de UML modellen die gemaakt moesten worden en dat allemaal via de RUP methode.</p>
<p>Bekijk de <a href="http://www.paulderaaij.nl/wp-content/uploads/2010/04/happer.zip">Happer source code</a>. Door de docenten is het project beoordeeld met een 8. Daarmee heb ik de propedeuse behaald en is de eerste horde genomen.</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/04/19/opdracht-i2-happer-spel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony: Multiple embedded forms in a specific layout</title>
		<link>http://www.paulderaaij.nl/2010/02/27/symfony-multiple-embedded-forms-layout/</link>
		<comments>http://www.paulderaaij.nl/2010/02/27/symfony-multiple-embedded-forms-layout/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 11:42:01 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[ontwikkeling]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=162</guid>
		<description><![CDATA[First of all I want to state that I&#8217;m quite new to the Symfony Framework and that my English does not compare with a native, but hey, I&#8217;ll do my best. At the moment I&#8217;m working on my first Symfony application what will be a toto for the upcoming World Championship soccer. A quite challenging [...]]]></description>
			<content:encoded><![CDATA[<p>First of all I want to state that I&#8217;m quite new to the Symfony Framework and that my English does not compare with a native, but hey, I&#8217;ll do my best.</p>
<p>At the moment I&#8217;m working on my first Symfony application what will be a toto for the upcoming World Championship soccer. A quite challenging application but fun and instructive.</p>
<p><a href="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-design.jpg" rel="lightbox[162]" rel="lightbox[162]" title="toto-design"><img title="toto-design" src="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-design.jpg" alt="" width="854" height="229" /></a></p>
<p>The design presented me with a great challenge. As you can see in the picture above (which is in Dutch, sorry), we want multiple rows containing the matches of that group per row,  where you can fill in your prediction of the result of that match.</p>
<p>The schema I&#8217;ve figured out is this one (just the relevant part) :</p>
<pre class="brush: php;">

Groups:

columns:

id: { type: integer, primary: true, autoincrement: true }

name: { type: string(100) }

Team:

columns:

id: { type: integer, primary: true, autoincrement: true }

group_id: { type: integer, notnull: true }

name: { type: string(255) }

flag: { type: string(255) }

desription: { type: string(4000) }

biography: { type: string(4000) }

points: { type: integer(2) }

relations:

Groups: { local: group_id, foreign: id }

Games:

columns:

id: { type: integer, primary: true, autoincrement: true }

home_team_id: { type: integer, notnull: true }

away_team_id: { type: integer, notnull: true }

stadium_id: { type: integer }

playing_time: { type: timestamp }

desription: { type: string(3000) }

relations:

Stadium: { local: stadium_id, foreign: id, foreignAlias: Stadium }

HomeTeam: { class: Team, local: home_team_id, foreign: id, foreignAlias: homeTeam }

AwayTeam: { class: Team, local: away_team_id, foreign: id, foreignAlias: awayTeam }

Predictions:

actAs: [Timestampable]

columns:

id: { type: integer, primary: true, autoincrement: true }

user_id: { type: integer(4) }

game_id: { type: integer }

home_score: { type: integer(2) }

away_score: { type: integer(2) }

real_home_score: { type: integer(2) }

real_away_score: { type: integer(2) }

relations:

Profile: { local: user_id, foreign: user_id, foreignAlias: User }

Games: { local: game_id, foreign: id, foreignAlias: Game }
</pre>
<p>Okay, now I&#8217;ve shown you the design we wanted and the schema I&#8217;ve used. Let me show the implementation I&#8217;ve used and the steps how I got to the result.</p>
<p>We want the user to predict the matches that are in the system so I want to show all the games with an embedded form of Prediction. But the problem here is that the 1:n relation is sorted out via the Predictions model, which to me is logical as you have one match with multiple predictions. Here the difficulty came. How do you couple a game to a prediction when there isn&#8217;t a relation yet, which is the case in a first prediction.</p>
<p>This is my solution:</p>
<p>I&#8217;ve created a new action in the Games controller called executePredict:</p>
<pre class="brush: php;">

public function executePredict( sfWebRequest $request ) {
$this-&gt;form = new GamesCollectionForm( );
}</pre>
<p>Here we call GamesCollectionForm which collects all games in the system and creates a form for them.</p>
<pre class="brush: php;">

class GamesCollectionForm extends BaseGamesForm

{

public function configure()

{

$this-&gt;useFields(array());

$q = Doctrine_Query::create()-&gt;from('Games');

$aGames = $q-&gt;execute();

$wrapperForm = new sfForm();

foreach( $aGames as $index =&gt; $game ) {

$gameForm = new GamesPredictionForm( $game );

$gameForm-&gt;widgetSchema-&gt;setNameFormat('games[predictions][game_' . $index . '][%s]');

$wrapperForm-&gt;embedForm('game_' . $index, $gameForm);

}

$this-&gt;embedForm('predictions', $wrapperForm);

}

}
</pre>
<p>Okay, here I ran into multiple problems. The first one being that the collection form is an child of BaseGamesForm and therefore contains form widgets for adding a game, something I don&#8217;t want. So clean them all out by stating that we aren&#8217;t going to use any fields.</p>
<p>Next we collect all the games in the system and create an empty sfForm as wrapperform. In this wrapperform we&#8217;re going to embed instances of the GamePredictionForm. So for every game we create a GamesPredictionForm and set the right name format. This name format we need for the rendering and saving the forms.</p>
<p>Each form is embedded to the wrapper by setting its index prefixed with &#8220;game_&#8221;. Eventually the wrapperform gets embedded to the collection form.</p>
<p>The GamesPredictionForm looks like this:</p>
<pre class="brush: php;">

class GamesPredictionForm extends BaseGamesForm

{

public function configure( )

{

$q = Doctrine_Query::create()-&gt;from('Predictions')-&gt;where('user_id = ? ', sfContext::getInstance()-&gt;getUser()-&gt;getProfile()-&gt;getUserID())-&gt;andWhere('game_id = ?', $this-&gt;getObject()-&gt;getID());

$oPred = $q-&gt;fetchOne();

if(! $oPred instanceof Predictions ) {

$oPred = new Predictions();

$this-&gt;getObject()-&gt;Game[] = $oPred;

}

$this-&gt;embedRelation('Game', 'PredictionsForm', array('user_id' =&gt; sfContext::getInstance()-&gt;getUser()-&gt;getProfile()-&gt;getUserID()));

$this-&gt;widgetSchema['home_team_id'] = new sfWidgetFormInputHidden();

$this-&gt;widgetSchema['away_team_id'] = new sfWidgetFormInputHidden();

}

}
</pre>
<p>What this class does is checking if there is a prediction of the user for this game. If this isn&#8217;t the case we create an empty Predictions object so the form renders a Prediction form. The Predictions model gets embedded with the game form and the id widgets are set hidden. This configuration of hidden inputs is needed for the customized rendering as I going to show later.</p>
<p>If we now render our form we got the result like below.</p>
<p><a href="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-default-rendering.jpg" rel="lightbox[162]" rel="lightbox[162]" title="toto-default-rendering"><img class="aligncenter size-full wp-image-168" title="toto-default-rendering" src="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-default-rendering.jpg" alt="" width="565" height="648" /></a></p>
<p>Nice, but not quite what we wanted. Besides that, any user now can edit the stadium, playing time or description. That&#8217;s not want we&#8217;d like to see, so lets start change the rendering of this form.</p>
<p>Before we change the rendering of the form I&#8217;d like to mention that at this moment it isn&#8217;t possible to save the form. If you&#8217;ll try to save now a database error is thrown stating that you try to enter null values in the games table. Which is correct, we&#8217;ve said that we don&#8217;t want to use any fields in the GamesCollectionForm. That works for the widgets, not for the save function. We need to modify that. My solution to this problem took me ages to find and I doubt that this is the best way to handle this.</p>
<p>What I&#8217;ve done is to override the doSave function of the GamesCollectionForm and checked if there&#8217;s any home_team_id been set. If not, the form is used for prediction by a user and we only want to save the embedded forms. In code it looks like this:</p>
<pre class="brush: php;">

public function doSave( $con = null ) {

if( $this-&gt;getObject()-&gt;getHomeTeamId() != null ) {

} else {

$this-&gt;updateObjectEmbeddedForms($this-&gt;taintedValues);

$this-&gt;saveEmbeddedForms($con);

return;

}

}
</pre>
<p>What took me so long to figure out is the updateObjectEmbeddedForms. It seems this just don&#8217;t happens with the bind function of the form which is called in the action. By that it mean, if the parent values are all null, the embedded forms doesn&#8217;t get bound to the form values. I did not tested this so it&#8217;s an assumption and not a fact.</p>
<pre class="brush: php;">

public function executePredict( sfWebRequest $request ) {

if($request-&gt;isMethod(sfRequest::POST) || $request-&gt;isMethod(sfRequest::PUT)) {

$games = Doctrine::getTable('Games')-&gt;find(array($request-&gt;getParameter('id')));

$this-&gt;form = new GamesCollectionForm($games);

$this-&gt;processForm($request, $this-&gt;form);

} else {

$this-&gt;form = new GamesCollectionForm( );

}

}

protected function processForm(sfWebRequest $request, sfForm $form)

{

$form-&gt;bind($request-&gt;getParameter($form-&gt;getName()), $request-&gt;getFiles($form-&gt;getName()));

if ($form-&gt;isValid())

{

$form-&gt;save();

$this-&gt;redirect('games/predict');

}

}
</pre>
<p>Well, now we can save our form whether its new or just an update, it works and that&#8217;s a victory on its own.</p>
<p>Now the rendering of the form. Our goal is to get the rendering as suggested by the designers. Well I can tell a lot about this, but lets just start by showing the code and the end result of that code. This is the code of the template rendering:</p>
<pre class="brush: php;">

&lt;?php use_helper('Date'); ?&gt;

&lt;h1&gt;Voorspel de wedstrijden&lt;/h1&gt;

&lt;form action=&quot;&lt;?php echo url_for('games/predict') ?&gt;&quot; method=&quot;POST&quot;&gt;

&lt;table width=&quot;100%&quot;&gt;

&lt;?php echo $form['id'];?&gt;

&lt;?php echo $form[$form-&gt;getCSRFFieldName() ]-&gt;render(); ?&gt;

&lt;?php foreach( $form-&gt;getEmbeddedForm('predictions')-&gt;getEmbeddedForms() as $pred): ?&gt;

&lt;tr&gt;

&lt;td&gt;&lt;?php echo format_datetime($pred-&gt;getObject()-&gt;getPlayingTime(), 'dd-MM-yyyy HH:mm'); ?&gt;&lt;/td&gt;

&lt;td&gt;&lt;?php echo &quot;&lt;img src='/uploads/flags/&quot; . $pred-&gt;getObject()-&gt;getHomeTeam()-&gt;getFlag() . &quot;' width=15 height=10/&gt;&quot;;

echo $pred-&gt;getObject()-&gt;getHomeTeam(); ?&gt;&lt;/td&gt;

&lt;td&gt; - &lt;/td&gt;

&lt;td&gt;&lt;?php echo &quot;&lt;img src='/uploads/flags/&quot; . $pred-&gt;getObject()-&gt;getAwayTeam()-&gt;getFlag() . &quot;' width=15 height=10/&gt;&quot;;

echo $pred-&gt;getObject()-&gt;getAwayTeam(); ?&gt;&lt;/td&gt;

&lt;td&gt;&lt;?php echo $pred-&gt;getObject()-&gt;getStadium()-&gt;getName(); ?&gt;&lt;/td&gt;

&lt;td&gt;&lt;?php echo $pred-&gt;getObject()-&gt;getStadium()-&gt;getCity(); ?&gt;&lt;/td&gt;

&lt;td&gt;&lt;?php echo $pred['Game'][0]['home_score']; ?&gt;&lt;/td&gt;

&lt;td&gt; - &lt;/td&gt;

&lt;td&gt;&lt;?php echo $pred['Game'][0]['away_score']; ?&gt;&lt;/td&gt;

&lt;?php echo $pred['Game'][0]['id']; ?&gt;

&lt;?php echo $pred['Game'][0]['user_id']; ?&gt;

&lt;?php echo $pred['Game'][0]['game_id']; ?&gt;

&lt;?php echo $pred['home_team_id']; ?&gt;

&lt;?php echo $pred['away_team_id']; ?&gt;

&lt;/tr&gt;

&lt;?php endforeach; ?&gt;

&lt;tr&gt;

&lt;td colspan=&quot;2&quot;&gt;

&lt;input type=&quot;submit&quot; /&gt;

&lt;/td&gt;

&lt;/tr&gt;

&lt;/table&gt;

&lt;/form&gt;
</pre>
<p>Which leads us to&#8230;</p>
<p><a href="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-rendering-result.jpg" rel="lightbox[162]" rel="lightbox[162]" title="toto-rendering-result"><img class="aligncenter size-full wp-image-173" title="toto-rendering-result" src="http://www.paulderaaij.nl/wp-content/uploads/2010/02/toto-rendering-result.jpg" alt="" width="832" height="147" /></a></p>
<p>Hey! It looks like we&#8217;ve got it right. In essence this is just like the designers wishes. Well, what&#8217;s up with this form rendering&#8230;</p>
<p>First of all I start with rendering the hidden form ID tag and the hidden CSFR field. We need this for the binding and security of the form (I&#8217;m not sure of the binding part).</p>
<p>Then I want the embedded Predictions form which is the wrapperform containing all forms per match as an embedded form. Hence, the double getEmbeddedForms call. The $pred variable now holds an instance of the GamesPredictionForm class.</p>
<p>Per row we first render all the static match information by retrieving the object and outputting them. After that we render the prediction form elements which are stored in the Game property of the GamesPredictionForm. The game[0] holds the Predictions form which needs to be editable for the user.</p>
<p>That are all the visible fields, they are followed by a bunch of hidden fields so that the objects can be stored right. This information is processed by the bind and updateObject function and are mandatory.</p>
<p>This rendering will be done for every Game stored in the system. And the best thing is that it works!</p>
<p>But there&#8217;s a catch. It works and I&#8217;m glad with that, but I&#8217;m not happy with this solution. I can&#8217;t figure out if the model design is incorrect, if I use Symfony wrong or just do something other totally the wrong way around. Therefore I need you! If you got to here you probably have the same problem or a huge interest in Symfony ( or just me, but I&#8217;ll let that idea go by ).</p>
<p>Perhaps you can tell me what I can do better to prevent these kind of &#8216;hacks&#8217; and adjustments. Help me to grow as developer and give your feedback. I appreciate it big time!</p>
<p>Thanks for your time so far!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/02/27/symfony-multiple-embedded-forms-layout/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Als tinyMCE niet in één keer laad</title>
		<link>http://www.paulderaaij.nl/2010/02/26/als-tinymce-niet-in-een-keer-laad/</link>
		<comments>http://www.paulderaaij.nl/2010/02/26/als-tinymce-niet-in-een-keer-laad/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 09:14:05 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Tiny-MCE]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=159</guid>
		<description><![CDATA[Het wil bij tinyMCE in bepaalde browsers nog wel eens gebeuren dat de editor niet gelijk geladen word. Pas bij een refresh verschijnt de editor. Voornamelijk Safari en google Chrome vertonen dit gedrag. De oplossing is echter simpel. Controleer of alle plugins die je in de configuratie opgeeft wel bestaan en geladen kunnen worden. Dus [...]]]></description>
			<content:encoded><![CDATA[<p>Het wil bij tinyMCE in bepaalde browsers nog wel eens gebeuren dat de editor niet gelijk geladen word. Pas bij een refresh verschijnt de editor. Voornamelijk Safari en google Chrome vertonen dit gedrag.</p>
<p>De oplossing is echter simpel. Controleer of alle plugins die je in de configuratie opgeeft wel bestaan en geladen kunnen worden. Dus deze regel:</p>
<p>plugins : &#8216;table,advimage,archvr,paste&#8217;,</p>
<p>Moet wel over plugins beschikken die bestaan en bereikbaar zijn.</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/02/26/als-tinymce-niet-in-een-keer-laad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweede blok succesvol afgerond</title>
		<link>http://www.paulderaaij.nl/2010/01/21/tweede-blok-succesvol-afgerond/</link>
		<comments>http://www.paulderaaij.nl/2010/01/21/tweede-blok-succesvol-afgerond/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 18:38:31 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[LOI/Opleiding]]></category>
		<category><![CDATA[HHS]]></category>
		<category><![CDATA[Opleiding Informatica]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=156</guid>
		<description><![CDATA[Deze week stonden twee toetsen op het programma om het blok TI-3 af te ronden. Het blok over netwerken werd getoetst door middel van theoretische toets en een praktische toets. De theorie heb ik afgesloten met een 7,5 en de praktische toets met een 10! Komende woensdag hoeven we alleen de losse project opdrachten te [...]]]></description>
			<content:encoded><![CDATA[<p>Deze week stonden twee toetsen op het programma om het blok TI-3 af te ronden. Het blok over netwerken werd getoetst door middel van theoretische toets en een praktische toets. De theorie heb ik afgesloten met een 7,5 en de praktische toets met een 10! Komende woensdag hoeven we alleen de losse project opdrachten te verdedigen en dan is dit blok klaar.</p>
<p>Komend blok ga ik weer met de Informatici mee doen en gaan we aan de slag met java en UML. Nu al zin in!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/01/21/tweede-blok-succesvol-afgerond/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dit wil ik in 2010 doen</title>
		<link>http://www.paulderaaij.nl/2010/01/15/dit-wil-ik-in-2010-doen/</link>
		<comments>http://www.paulderaaij.nl/2010/01/15/dit-wil-ik-in-2010-doen/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 13:39:10 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[ontwikkeling]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=143</guid>
		<description><![CDATA[Ok, we zijn al even in 2010 en het is al zeker niet meer de juiste tijd om de &#8220;Beste wensen!&#8221; te roepen. Overigens toch al een rare zijn.. wat wens je iemand die andere 350 dagen toen dan? Toch wil ik in dit blog vertellen wat ik dit jaar wil gaan doen op het [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, we zijn al even in 2010 en het is al zeker niet meer de juiste tijd om de &#8220;Beste wensen!&#8221; te roepen. Overigens toch al een rare zijn.. wat wens je iemand die andere 350 dagen toen dan?</p>
<p>Toch wil ik in dit blog vertellen wat ik dit jaar wil gaan doen op het gebied software engineering, ondernemen en persoonlijk ondernemen. Door het op te schrijven in dit blog kan ik wat feedback van lezers krijgen op de dingen die ik wil gaan doen en ik kan mezelf er ook wat beter aan houden <img src='http://www.paulderaaij.nl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Algemene software ontwikkeling</strong></p>
<p>Dit ga ik voornamelijk behalen via het werk wat ik voor school moet doen. Door nu niet alleen maar te lezen over ontwikkelmethodes en software concepten, maar ook verplicht en gestimuleerd te worden door ze te gebruiken hoop ik dat ik dat vrij goed onder de knie krijg.</p>
<p><strong>PHP<br />
</strong></p>
<p>Aan het eind van vorig jaar al lichtelijk verdiept in het <a href="http://www.symfony-project.org/" target="_blank">Symfony framework</a> en dat wil ik zeker nog verder uitbreiden. Symfony biedt interessante mogelijkheden en zorgt voor een stukje zekerheid tijdens het ontwikkelen. Daarnaast helpt het mijn ontwikkeling als programmeur ontzettend. Voornamelijk omdat je gedwongen word op de ´juiste manier´ te programmeren zodat je van alle voordeeltjes gebruik kan maken.</p>
<p>Overigens wil ik niet alleen met symfony werken. Op den duur wil ik ook kennis hebben van andere frameworks zodat je leert te kiezen welk framework je kan gebruiken voor een probleem.</p>
<p><strong>Project methode</strong></p>
<p>Met <a href="http://www.mediactief.nl" target="_blank">mijn bedrijf</a> werken voornamelijk aan kleine projectjes van 3 weken. Ik wil op zoek naar een project/ontwikkelingsmethode die ons echt kan helpen om gestructureerd te werken zonder te verzanden in bergen extra werk. Als iemand tips heeft dan lees ik ze graag!</p>
<p><strong>Regular expressions &amp; wiskunde</strong></p>
<p>Dit jaar wil ik erg graag mijn kennis van regexs en wiskunde in zijn algemeenheid verbeteren. Ik merk dat mijn kennis over deze onderwerpen niet optimaal is. Vooral door regex beter onder de knie te krijgen hoop ik wat smerige hacks achterwege te kunnen laten in de toekomst.</p>
<p>Wat betreft Wiskunde heb ik al een boek van <a href="http://www.headfirstlabs.com/books/hfalg/" target="_blank">Head First</a> gekocht. Dit is voornamelijk bedoeld om te leren sommen te optimaliseren. Soms denk ik gewoon veels te moeilijk.</p>
<p><strong>En verder&#8230;<br />
</strong></p>
<p>Meer conferenties bezoeken is een belangrijk doel dit jaar en we beginnen goed. Eind januari ga ik naar de <a href="http://conference.phpbenelux.eu/" target="_blank">conference </a>van <a href="http://phpbenelux.eu/" target="_blank">PHP Benelux</a>, in april help ik tijdens het<a href="http://www.pfcongres.nl" target="_blank"> pfcongres</a> en de <a href="http://phpconference.nl/" target="_blank">dutch php conference </a>staat ook op het wensenlijstje.</p>
<p>Alhoewel ik niet veel tijd heb lijkt het me erg leuk en zinvol om dit jaar betrokken te raken bij een open source project wat mij aanspreekt. Door met meerdere developers aan een project te werken kan ik een heleboel leren en terug te geven aan de open source community. Dus als iemand een leuk project voor ogen heeft <img src='http://www.paulderaaij.nl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>In ieder geval wil ik nog een heleboel, pas aan het eind van het jaar gaan we zien of het allemaal gelukt is. Heb je nog tips of tricks? Ik hoor ze graag!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/01/15/dit-wil-ik-in-2010-doen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zip bestanden van een mac</title>
		<link>http://www.paulderaaij.nl/2010/01/06/zip-bestanden-van-een-mac/</link>
		<comments>http://www.paulderaaij.nl/2010/01/06/zip-bestanden-van-een-mac/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 07:00:32 +0000</pubDate>
		<dc:creator>Paul de Raaij</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.paulderaaij.nl/?p=136</guid>
		<description><![CDATA[Ik heb jullie hulp nodig. Van veel ontwerpers krijg ik zip bestanden toegestuurd in een zip file. Wanneer ik ze open in WinRAR gebeurd het nogal regelmatig dat de daadwerkelijke databestanden 0 bytes zijn, maar de bestanden in de __MACOSX map zijn van de correcte grootte. Dit is voornamelijk bij zips die font bestanden bevat. [...]]]></description>
			<content:encoded><![CDATA[<p>Ik heb jullie hulp nodig. Van veel ontwerpers krijg ik zip bestanden toegestuurd in een zip file. Wanneer ik ze open in WinRAR gebeurd het nogal regelmatig dat de daadwerkelijke databestanden 0 bytes zijn, maar de bestanden in de __MACOSX map zijn van de correcte grootte.</p>
<p>Dit is voornamelijk bij zips die font bestanden bevat. Wat kunnen wij hier nu aan doen? Of ligt het probleem bij degene die de zip maakt? Graag jullie advies!</p>
<!-- PHP 5.x --><p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.paulderaaij.nl/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.paulderaaij.nl/2010/01/06/zip-bestanden-van-een-mac/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->