<?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>Touchdown Consulting Services &#187; PHP</title>
	<atom:link href="http://www.touchdownconsulting.nl/category/main/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touchdownconsulting.nl</link>
	<description>application, e-commerce and website development</description>
	<lastBuildDate>Wed, 17 Aug 2011 10:39:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Zend Certified Engineer!</title>
		<link>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/</link>
		<comments>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 08:27:43 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[exam]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zce]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=159</guid>
		<description><![CDATA[Finally got around to doing the ZCE (http://www.zend.com/services/certification/) exam yesterday, and I passed! Click the logo below to see my certification details.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fzend-certified-engineer%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fzend-certified-engineer%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Finally got around to doing the ZCE (http://www.zend.com/services/certification/) exam yesterday, and I passed! Click the logo below to see my certification details.</p>
<p><a href="http://www.zend.com/en/store/education/certification/yellow-pages.php#show-ClientCandidateID=ZEND017376"><img src="http://www.zend.com/topics/zce-php5-3-logo.gif" alt="Zend Certified Engineer (ZCE) - PHP 5.3"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/08/zend-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Phing &#8211; a PHP Build Tool (presentation)</title>
		<link>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/</link>
		<comments>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 06:48:37 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dpc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[slideshare]]></category>
		<category><![CDATA[uncon]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=152</guid>
		<description><![CDATA[Below are the slides of a presentation on Phing I gave at this year&#8217;s Dutch PHP Conference.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fphing-a-php-build-tool-presentation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2011%2F08%2Fphing-a-php-build-tool-presentation%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Below are the slides of a presentation on Phing I gave at this year&#8217;s <a href="http://www.phpconference.nl/" target="_blank">Dutch PHP Conference</a>.</p>
<div style='width:670px;text-align:left'><object style='margin:0px' width='425' height='355'><param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=phingdpcunconslideshare-110522045919-phpapp01&#038;stripped_title=phing-dpc-uncon-slideshare' /><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always'/><embed src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=phingdpcunconslideshare-110522045919-phpapp01&#038;stripped_title=phing-dpc-uncon-slideshare' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='670' height='355'></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2011/08/phing-a-php-build-tool-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(Semi-)automatic MODx migrations using Phing</title>
		<link>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/</link>
		<comments>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 20:07:11 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[modx migration phing]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=53</guid>
		<description><![CDATA[MODx is a very popular PHP/MySQL content management system &#8211; no surprise when you look at its flexibility, light weight and ease of use. However, as any MODx developer will attest, it is not without its quirks. One of those problems is the lack of (automated) support for maintaining separate development and staging or production [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2010%2F03%2Fsemi-automatic-modx-migrations-using-phing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2010%2F03%2Fsemi-automatic-modx-migrations-using-phing%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>MODx is a very popular PHP/MySQL content management system &#8211; no surprise when you look at its flexibility, light weight and ease of use. However, as any MODx developer will attest, it is not without its quirks.</p>
<p>One of those problems is the lack of (automated) support for maintaining separate development and staging or production environments, and migrations between those environments. MODx saves content, templates and code snippets in its database, without versioning. Even though the Revolution branch (MODx <a href="http://modxcms.com/about/blog/jgilmore/modx-revolution-rc1-out.html" target="_blank">has recently launched</a> the first release candidate) aims to solve this by introducing the <a href="http://svn.modxcms.com/docs/display/revolution/Transport+Packages" target="_blank">Transport Package concept</a>, many developers will still need to support installations that run on MODx Evolution.</p>
<p>The code featured in this blog post is a mix of a <a href="http://www.phing.info" target="_blank">Phing</a> task that is executed on the development machine, and a small script that is uploaded to the staging or production machine. The task uses the MODx manager log to detect the changes made since a particular date. It then tries to match those changes to the database on the staging/production machines, and collates the changes to a SQL file.</p>
<p>In my case, I usually can&#8217;t access a production database from my development machine &#8211; this is where the <em>updserver</em> script comes in. It returns mysqldump-style output to the Phing task, and should be uploaded to your staging / production machine and installed in the same directory MODx resides in.</p>
<p>The syntax of the task call in the build file is as follows:</p>
<blockquote>
<pre>&lt;?xml version="1.0"?&gt;
&lt;project name="MODx update" default="update"&gt;
        &lt;target name="update"&gt;
            &lt;taskdef name="modxchanged" classname="ModxChangedTask"/&gt;
            &lt;modxchanged
                hostname="localhost" username="root"
                password="test123" database="modx123"
                remoteurl="http://localhost/modx/" remotekey="test123"
                prefix="" timestamp="${timestamp}"/&gt;
        &lt;/target&gt;
&lt;/project&gt;</pre>
</blockquote>
<p>In this example, MODx is installed on localhost/modx/. The remote key is the same as the remote database password.</p>
<p>Running the task should result in an SQL file that can be executed on the staging/production machine, and output similar to the following:</p>
<blockquote>
<pre>MODx update &gt; update:</pre>
<pre>Searching changes from 1970-01-01:</pre>
<pre>===== Templates =======================================</pre>
<pre>NONE</pre>
<pre>===== Documents =======================================</pre>
<pre>[ 10] Test                          2010-03-24 19:58:41 [NEW]</pre>
<pre>===== Chunks ==========================================</pre>
<pre>NONE</pre>
<pre>===== Snippets ========================================</pre>
<pre>NONE</pre>
<pre>BUILD FINISHED</pre>
</blockquote>
<p>The code in this post is very much a work-in-progress, so there are a few caveats / unimplemented features:</p>
<ul>
<li>Does not correctly handle conflicting/shared id&#8217;s</li>
<li>Does not process deleted items</li>
<li>Checking (and manually adjusting) the generated SQL file is always a good idea</li>
</ul>
<p>Any comments or questions are highly appreciated! You can also e-mail me directly at info AT touchdownconsulting.nl!</p>
<p><a href="/files/modx-migration-286.tgz">DOWNLOAD</a> (modx-migration-286.tgz)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2010/03/semi-automatic-modx-migrations-using-phing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setting up continuous integration for PHP using Hudson and Phing</title>
		<link>http://www.touchdownconsulting.nl/2009/11/setting-up-continuous-integration-for-php-using-hudson-and-phing-davegardner/</link>
		<comments>http://www.touchdownconsulting.nl/2009/11/setting-up-continuous-integration-for-php-using-hudson-and-phing-davegardner/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 20:32:17 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Phing]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[dave gardner]]></category>
		<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=11</guid>
		<description><![CDATA[&#8220;CI gets the most out of Unit Tests by forcing them to be run after every change. Not only that, but with a good CI setup, developers instantly know if they haven’t written enough tests. If avoids the situtation where Joe Bloggs has added in a huge chunk of code with zero tests.&#8221; READ MORE]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2009%2F11%2Fsetting-up-continuous-integration-for-php-using-hudson-and-phing-davegardner%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2009%2F11%2Fsetting-up-continuous-integration-for-php-using-hudson-and-phing-davegardner%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>&#8220;CI gets the most out of Unit Tests by <strong>forcing them to be run after every change</strong>. Not only that, but with a good CI setup, developers instantly know if they haven’t written enough tests. If avoids the situtation where Joe Bloggs has added in a huge chunk of code with zero tests.&#8221;</p>
<p><a href="http://www.davegardner.me.uk/blog/2009/11/09/continuous-integration-for-php-using-hudson-and-phing/" target="_blank">READ MORE</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2009/11/setting-up-continuous-integration-for-php-using-hudson-and-phing-davegardner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Different Loggers In Phing</title>
		<link>http://www.touchdownconsulting.nl/2009/11/using-different-loggers-in-phing/</link>
		<comments>http://www.touchdownconsulting.nl/2009/11/using-different-loggers-in-phing/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 20:25:38 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[Phing]]></category>
		<category><![CDATA[hashbangcode]]></category>
		<category><![CDATA[logger]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=6</guid>
		<description><![CDATA[&#8220;When you run a phing script it will print things out to the console. These messages are either system messages (eg. BUILD STARTED) or echo messages that you have put into your build.xml file. All of this output is controlled and created by a logger file. The default logger is called (unsuprsingly) DefaultLogger and will [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2009%2F11%2Fusing-different-loggers-in-phing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2009%2F11%2Fusing-different-loggers-in-phing%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>&#8220;When you run a phing script it will print things out to the console. These messages are either system messages (eg. BUILD STARTED) or echo messages that you have put into your build.xml file. All of this output is controlled and created by a logger file. The default logger is called (unsuprsingly) DefaultLogger and will be used as a default. There are a few different types of logger available, all of which can be found in the listener folder in your PEAR\phing directory.&#8221;</p>
<p><a href="http://www.hashbangcode.com/blog/using-different-loggers-in-phing-2231.html" target="_blank">READ MORE</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2009/11/using-different-loggers-in-phing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

