<?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</title>
	<atom:link href="http://www.touchdownconsulting.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.touchdownconsulting.nl</link>
	<description>application, e-commerce and website development</description>
	<lastBuildDate>Thu, 25 Mar 2010 12:14:50 +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>(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[PHP]]></category>
		<category><![CDATA[Phing]]></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 environments, [...]]]></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" 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>0</slash:comments>
		</item>
		<item>
		<title>dotCMS first WCMS to embrace CMIS Specification</title>
		<link>http://www.touchdownconsulting.nl/2009/12/dotcms-first-wcms-to-embrace-cmis-specification/</link>
		<comments>http://www.touchdownconsulting.nl/2009/12/dotcms-first-wcms-to-embrace-cmis-specification/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 21:52:19 +0000</pubDate>
		<dc:creator>Michiel Rook</dc:creator>
				<category><![CDATA[dotCMS]]></category>

		<guid isPermaLink="false">http://www.touchdownconsulting.nl/?p=17</guid>
		<description><![CDATA[
			
				
			
		
&#8220;Boston, MA – dotCMS, a leading Java-based, open source WCMS software company, announced today at the 6th Annual Gilbane Conference in Boston that the upcoming release of dotCMS will implement the CMIS 1.0 draft specification. dotCMS is the first Web Content Management System (WCMS) to integrate the newly released specification into a web management product.&#8221;
READ [...]]]></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%2F12%2Fdotcms-first-wcms-to-embrace-cmis-specification%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.touchdownconsulting.nl%2F2009%2F12%2Fdotcms-first-wcms-to-embrace-cmis-specification%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>&#8220;<strong>Boston, MA</strong> – dotCMS, a leading Java-based, open source WCMS software company, announced today at the 6th Annual Gilbane Conference in Boston that the upcoming release of dotCMS will implement the CMIS 1.0 draft specification. dotCMS is the first Web Content Management System (WCMS) to integrate the newly released specification into a web management product.&#8221;</p>
<p><a href="http://www.dotcms.org/company/press-releases.dot?id=805685" target="_blank">READ MORE</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.touchdownconsulting.nl/2009/12/dotcms-first-wcms-to-embrace-cmis-specification/feed/</wfw:commentRss>
		<slash:comments>0</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" 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" 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>
