<?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"
	>

<channel>
	<title>Stephen Beattie</title>
	<atom:link href="http://www.stephenbeattie.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stephenbeattie.com</link>
	<description>Flash, PHP, Flex and other Rich Internet Application technologies.</description>
	<pubDate>Tue, 17 Jun 2008 01:04:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Indiana Jones and the Kingdom of the Crystal Skull: Mini Review</title>
		<link>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/</link>
		<comments>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 01:04:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[film reviews]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=17</guid>
		<description><![CDATA[A nostalgic, tongue-in-cheek, roller coaster of a film that captures the spirit of the original trilogy.  Plenty of over the top action sequences, comic book villainy and rich special effects that enhance the much-loved Indy aesthetic.
However, the film feels like a cast and crew reunion with Indy as the guest of honour, swept along [...]]]></description>
			<content:encoded><![CDATA[<p>A nostalgic, tongue-in-cheek, roller coaster of a film that captures the spirit of the original trilogy.  Plenty of over the top action sequences, comic book villainy and rich special effects that enhance the much-loved Indy aesthetic.</p>
<p>However, the film feels like a cast and crew reunion with Indy as the guest of honour, swept along in the action rather than being the dynamic pivotal character.  After the &#8216;fridge&#8217; scene, Indy was never in any believable danger and the minimal romance aspects of the plot didn&#8217;t allow Harrison Ford a chance to fully deliver his famous wise-guy charm.</p>
<p>Overall though definitely worth a watch.  Real value for money in terms of sheer entertainment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/06/16/indiana-jones-and-the-kingdom-of-the-crystal-skull-mini-review/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Content Modeling with XML</title>
		<link>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/</link>
		<comments>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/#comments</comments>
		<pubDate>Tue, 20 May 2008 08:33:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Content Management]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/?p=14</guid>
		<description><![CDATA[The Content Management System I'm currently working on has some known and reasoned limitations.  It was designed a couple of years back for immediate ease-of-use by clients with simple needs and so i more an Adobe Contribute replacement rather than a full blown enterprise-ready überapp.  There are some dynamic/shared elements such as 'Common [...]]]></description>
			<content:encoded><![CDATA[<p>The Content Management System I'm currently working on has some known and reasoned limitations.  It was designed a couple of years back for immediate ease-of-use by clients with simple needs and so i more an <a title="Adobe Contribute" href="http://www.adobe.com/products/contribute/">Adobe Contribute</a> replacement rather than a full blown enterprise-ready überapp.  There are some dynamic/shared elements such as 'Common  Content' (think footer/sidebar content) and Collections (think <acronym title="Frequently Asked Questions">FAQs</acronym> and lists of things that need to be managed separately but appear on multiple pages).  The navigation also builds itself from the site structure.  It works well and I get good feedback from the clients and developers using it.</p>
<p>However, there normally comes a point when the client wants to do something a bit different.  Lets say that  rather than maintaining a simple list of <acronym title="Frequently Asked Questions">FAQs</acronym> with Collections, they want to create a knowledge base of articles.  Up to this point clients have had to re-purpose a set list of properties for each 'Collection Item'.  The fields were: <strong>publish date</strong>, <strong>title</strong>, <strong>summary</strong>, <strong>thumbnail</strong> and <strong>link</strong>. Thanks to a bit of ingenuity on the part of our developers, these properties were sufficiently generic to be useful in a range of scenarios from making a randomly rotating banner to an events list to a simple photo gallery with albums.  I was surprised how flexible something so statically defined could be.   That said, the fields weren't all used all the time and since the labels were generic, sometimes it has hard for the client to relate which form fields affected the final output on the website.  In short we needed something more scalable and user-friendly.  We needed 'custom' Collections where the form fields could be configured for each type of content the client required.  We needed a way to model content.</p>
<p>It so happened that the way in which I'd designed the database earlier abstracted the notion of a schema for Collection Items away in favour of storing name/value pairs to facilitate versioning.   In fact the static properties discussed above (title, summary etc.) were only enforced as hard-coded items in PHP.  Good so far but I needed a way of mapping some sort of structure to the data on its way into the database as well as on its way out.</p>
<p>XML was the answer.  For each 'Collection' of content added to the site, a collection type is used to provide a 'content schema' for the data.  The basic idea is to have a single XML file that carries just enough information to build a form, validate the user input (and filter it if necessary) and then store the data entered.</p>
<p>A sample collection type is shown below:</p>
<div class="igBar"><span id="lxml-2"><a href="#" onclick="javascript:showPlainTxt('xml-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-2">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">"1.0"</span>?<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;collection</span>-types<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- DEFAULT --&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;collection</span>-type <span style="color: #000066;">guid</span>=<span style="color: #ff0000;">"00000000-0000-0000-0000-000000000000"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;name<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[Default Collection Type]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/name<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;description<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[GCMS v1.0 Collection Type]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/description<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;settings</span> <span style="color: #000066;">items-sortable</span>=<span style="color: #ff0000;">"true"</span> <span style="color: #000066;">grid-columns</span>=<span style="color: #ff0000;">"link"</span> <span style="color: #000066;">grid-search</span>=<span style="color: #ff0000;">"title|summary"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;properties<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"title"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"TextField"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Image"</span> <span style="color: #000066;">required</span>=<span style="color: #ff0000;">"true"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"summary"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"RichTextArea"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Summary"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;default</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span><span style="color: #339933;">&lt;![CDATA[blah blah]]&gt;</span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/default</span>-value<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"thumbnail"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"AssetChooser"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Image"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"link"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"LinkChooser"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Link"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/properties<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/collection</span>-type<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/collection</span>-types<span style="font-weight: bold; color: black;">&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>As you can see the XML schema is fairly simple.  Each collection type gets a node with a unique identifier by way of the 'guid' attribute.  This <acronym title="Globally Unique Identifier">GUID</acronym> gets stored in the database along with the name and description node values for each Collection and the <acronym title="Globally Unique Identifier">GUID</acronym> is used in an XPath query to retrieve the schema from this document at runtime.</p>
<p>The property nodes define the actual form fields that appear when the user adds/edits Collection Items.  There are various property types which relate to the interface elements used when the form is rendered.  Other attributes on each property node relate to how the data should be validated and filtered (such as have the entered text made uppercase or hyperlinks made clickable).  Some more attributes specify default values that should be used, whether values should match another field, be unique etc.</p>
<p><em>The settings node in the XML document is used when the Collection records are viewed in the Content Management System.  The attribute values are used to determine which properties are displayed in a datagrid and which can be searched.</em></p>
<p>And so, the XML simply defines a form to be rendered but also, the fact that we have a record of the structure of the stored content means that we can use this to publish content from the database into HTML (by means of templating), XML (by using the 'id' attribute of each property node as the tag names) and even to an SQLite database.  Since SQLite supports only a few simple data types I was able to simply map the property types (taking into account their validation rules) and create an SQLite database for each Collection on the fly.  This proved to be an ideal solution for <a title="Hybrid Static/Dynamic Content With SQLite" href="http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite">reasons I've mentioned before</a>.</p>
<p>So modeling simple content with XML is a very useful way to make your Content Management System flexible and because the content model is not stored recursively in your database, getting at the schema is simple and quick.  If you're planning a <acronym title="Content Management System">CMS</acronym> then I'd strongly recommend this approach</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/20/xml-content-modeling/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Essential Programming Tools</title>
		<link>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/</link>
		<comments>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/#comments</comments>
		<pubDate>Sat, 17 May 2008 15:20:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General Programming]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/</guid>
		<description><![CDATA[Here is a list of programming tools I find essential in my development work.  I'm omitting the obvious PHP, Apache, MySQL, Flash, Flex etc. in the hope of highlighting the smaller utilities.  These are the ones off the top of my head but I hope to add to it later.
General Programming

Aptana - PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a list of programming tools I find essential in my development work.  I'm omitting the obvious <a title="PHP" href="http://www.php.net">PHP</a>, <a title="Apache Web Server" href="http://httpd.apache.org/">Apache</a>, <a title="MySQL" href="http://www.mysql.com/">MySQL</a>, <a title="Flash" href="http://www.adobe.com/products/flash/">Flash</a>, <a title="Flex Builder" href="http://www.adobe.com/products/flex/">Flex</a> etc. in the hope of highlighting the smaller utilities.  These are the ones off the top of my head but I hope to add to it later.</p>
<h4>General Programming</h4>
<ul>
<li><a title="Aptana Studio - Community Edition" href="http://www.aptana.com/products/studio/community">Aptana</a> - PHP and Subversion integration, Dreamweaver "Ctrl+U" upload goodness.</li>
<li><a title="Beyond Compare" href="http://www.scootersoftware.com/moreinfo.php">Beyond Compare</a> - Compare folders, zip files, FTP sites.  Integrates well with <a title="Tortoise SVN" href="http://tortoisesvn.tigris.org/">Tortoise SVN</a> and <a title="Tortoise CVS" href="http://www.tortoisecvs.org/">Tortoise CVS</a>.</li>
<li><a title="Notepad++" href="http://notepad-plus.sourceforge.net/uk/site.htm">Notepad++</a> - Excellent file support, the right balance of being lightweight and feature rich for a text editor.</li>
<li><a title="Tortoise SVN" href="http://tortoisesvn.tigris.org/">Tortoise SVN</a> - Windows Explorer integration, very easy to use and unobtrusive Subversion client.</li>
<li><a title="Console (An improvement on cmd.exe)" href="http://sourceforge.net/projects/console">Enhanced Windows Console</a> - A recent find but looks very useful.</li>
</ul>
<h4>Design Tools</h4>
<ul>
<li><a title="Color Cop" href="http://colorcop.net/">Color Cop</a> - Simple, no-nonsense colour picking.</li>
<li><a title="@icon sushi" href="http://www.towofu.net/soft/e-aicon.php">@icon sushi</a> - A really good little .ICO file editor</li>
</ul>
<h4>Flash Development</h4>
<ul>
<li><a title="FlashDevelop" href="http://www.flashdevelop.org/">FlashDevelop</a> - Nice integration with open-source Flash compilers etc.  Better than the ActionScript editor in Flash IDE anyday.</li>
<li><a title="ServiceCapture by Kevin Langdon" href="http://kevinlangdon.com/serviceCapture/">ServiceCapture</a> - Nice tool for debugging AMF, JSON and SOAP.  Acts as a proxy for your browser and so can also be used to throttle bandwidth for testing.</li>
<li><a title=".sol Editor" href="http://sourceforge.net/projects/soleditor/">.sol Editor</a> - A Flash Shared Object file parser and editor.  Very handy indeed.</li>
</ul>
<h4>Network Tools</h4>
<ul>
<li><a title="WinSCP" href="http://winscp.net/eng/index.php">WinSCP</a> - Good SCP Client for remote file administration.</li>
<li><a title="FileZilla" href="http://filezilla-project.org/">FileZilla</a> - Simple, lightweight and efficient FTP Client.  A handy connection manager interface.  Regularly updated.</li>
<li><a title="PuTTY" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> - Command line console for remote server administration.</li>
</ul>
<h4>Database Design &amp; Management</h4>
<ul>
<li><a title="fabFORCE DBDesigner" href="http://www.fabforce.net/dbdesigner4/">fabFORCE DBDesigner</a> - Great (but slightly buggy) tool for sketching out DB schemas visually. Will create/update/reverse-engineer databases.</li>
<li><a title="SQLite2008 Pro Enterprise Manager" href="http://www.osenxpsuite.net/?xp=3">SQLite2008 Pro Enterprise Manager</a> - Powerful tool for managing SQLite databases.  I've found myself using this a lot lately.</li>
</ul>
<h4>.NET Programming</h4>
<ul>
<li><a title="SharpDevelop" href="http://sharpdevelop.net/OpenSource/SD/Default.aspx">SharpDevelop</a> - Very lightweight compared to VS.NET.  Perfect for the odd bit of ASP.NET 2.0 development.</li>
<li><a title="UtliDev Cassini Web Server" href="http://www.ultidev.com/products/Cassini/">UltiDev Cassini Web Server</a> - A No-frills (embeddable) web server for .NET written in .NET. A great development alternative to IIS.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/17/my-essential-programming-tools/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hybrid Static/Dynamic content with SQLite</title>
		<link>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/</link>
		<comments>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/#comments</comments>
		<pubDate>Mon, 12 May 2008 09:38:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Content Management]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/</guid>
		<description><![CDATA[I've been reading Deane's posts on Gadgetopia a lot recently and one of them refers to the notions of ' Data Push' and 'Template Pull' in terms of how content gets to the page driven by a CMS.  This was an interesting post for me as I've recently found that a combination of these [...]]]></description>
			<content:encoded><![CDATA[<p>I've been reading <a href="http://www.gadgetopia.com/category/12" title="Gadgetopia - Content Management Posts">Deane's posts on Gadgetopia</a> a lot recently and <a href="http://gadgetopia.com/post/5385" title="Gadgetopia - Content Publishing Models">one of them</a> refers to the notions of ' Data Push' and 'Template Pull' in terms of how content gets to the page driven by a <acronym title="Content Management System">CMS</acronym>.  This was an interesting post for me as I've recently found that a combination of these models provided a solution to a problem I was having.</p>
<p>As part of my work for <a href="http://www.golleyslaterdigital.co.uk" title="Golley Slater Digital" target="_blank">Golley Slater Digital</a> I've been architecting a PHP5-based <acronym title="Content Management System">CMS</acronym> that uses the 'Push' model where content authored on a private 'admin' server is published to a public 'live' server to be viewed by end-users.  Essentially, the <acronym title="Content Management System">CMS</acronym> stores content in <a href="http://www.mysql.com/" title="MySQL Homepage">MySQL</a>, writing it out as a hierarchy of static HTML (well PHP really) pages when the user elects to publish.  These static pages, along with the other assets are 'pushed' live using <a href="http://samba.anu.edu.au/rsync/" title="RSync Homepage">RSync</a> which copies them from one server to the other.</p>
<p>In addition to regular page content, there are other types of content such as 'Collections' that are used in the <acronym title="Content Management System">CMS</acronym> and that need to be copied to the live server.  A Collection is a list of structured data types, Collection Items, that are managed independently from page content.  Collection Items have their own approval workflow, go-live dates etc. and can be bound to pages through the admin UI.  Typically, Collections are used for News, Events, <acronym title="Frequently Asked Questions">FAQ</acronym>'s etc. but really any content type that can be modeled with a simple structure is a candidate.</p>
<p>Now up to last month I had stored published Collection Items in XML which was parsed at runtime on the live site (The XML would get conveniently pushed live with RSync along with the pages).  With PHP 5's improved XML support this was a reasonably performant solution and provided a basic storage mechanism for the structured data.  But what if I had thousands of items in a Collection and wanted to perform a complex search to display the results over a few pages?  Hmmmm.  It was achievable with XML but was going to get tricky with XPath expressions and server resources would definitely suffer when parsing the XML and sorting arrays of data. I needed another way.</p>
<p>Enter <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a>! This database engine is embedded into PHP5, and was the answer to my woes.  <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> databases require no setup, passwords and are nothing more than regular files so they play very nicely with the <a href="http://samba.anu.edu.au/rsync/" title="RSync Homepage">RSync</a> deployment scheme I use.  On top of that since the vast majority of <acronym title="Structured Query Language">SQL</acronym> can be used to query <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> databases, searching and paging of results was going to be a breeze.  So I made a change to the <acronym title="Content Management System">CMS</acronym> that saw published collection items going into a local database rather than the XML.</p>
<p>Using <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> means that the <acronym title="Content Management System">CMS</acronym> can effectively queue-up content ahead of a display date and expire content at some point in the future. What's even better is that the published sites are still standalone in nature and do not need any knowledge of the <acronym title="Content Management System">CMS</acronym> which created them.</p>
<p>O.k. so using <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> is nothing groundbreaking but the application of it in this context made me stop thinking of a database as something at the bottom of a technology stack and as an portable and intelligent file format that can be shared between applications.  Revelation!</p>
<p>If you're planning a <acronym title="Content Management System">CMS</acronym> then I recommend you look at <a href="http://www.sqlite.org/" title="SQLite Homepage">SQLite</a> for creating hybrid static/dynamic pages.  It certainly opened some doors for me.</p>
<p>Disclaimer: Yes, I used the word 'performant' in this post.  Apparently it's <a href="http://boulter.com/blog/2004/08/19/performant-is-not-a-word/" title="Performant - Not a Word">not a word</a> but I like it. So Sue me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stephenbeattie.com/2008/05/12/hybrid-staticdynamic-content-with-sqlite/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.368 seconds -->
