Aliaspooryorik
ColdFusion ORM Book

Really simple CMS with FW/1 and ColdFusion ORM

I recently wanted to create a simple, lightweight Content Managed site and decided to use FW/1 and of course ColdFusion's excellent ORM capabilities.

FW/1 is incredibly easy to get started with, you just need to download a single cfc and get Application.cfc to extend it.

As my site will have dynamic pages which can be added or deleted at any time, then I don't want to have to create specific views and controllers (as I don't know what the pages are yet!), luckily F/W1 has a onMissingView method which is called when a view is not found.

In the onMissingView I'm going use EntityLoad to get the page content from the database. To do that I'll need the define my Content object.


/**
* I am the Content object which maps to the contents database table
*/

component persistent="true" table="contents"
{
property name="id" column="content_id" generator="native";
property name="guid" column="content_guid"; // used for pretty urls
property name="title" column="content_title";
property name="content" column="content_content";
}

I'll need a view page to show the page content stored in the database.


<!---
views/content.cfm
I'm a simple view to display CMS content
--->

<cfoutput>
<h1>#rc.Content.getTitle()#</h1>

#rc.Content.getContent()#
</cfoutput>

It's a good idea to trap any requests to pages that no longer exist, so we need a 404 page.


<!---
views/notfound.cfm
I'm a simple 404 view
--->

<cfoutput>
<h1>Page Not found</h1>
<p>Sorry, the page you requested (#getFullyQualifiedAction()#) has not been found.</p>
<cfoutput>

A layout would be kinda useful!


<!---
layouts/default.cfm
I am the default layout
--->

<cfoutput>
<html>
<head>
<title>#rc.Content.getTitle()#</title>
</head>
<body>
<ul id="nav">
<cfloop array="#rc.menu#" index="local.thispage">
<li><a href="#buildURL( local.thispage.getGuid() )#">#local.thispage.getTitle()#</a>
</cfloop>
</ul>

<div id="content">#body#</div>

</body>
</html>
</cfoutput>

Now we need to set up the Application.cfc


component extends="org.corfield.framework"
{

APPLICATION_ROOT = GetDirectoryFromPath( GetCurrentTemplatePath() );

this.name = ReReplace( UCase( APPLICATION_ROOT ), "[^A-Z]", "", "all" );
this.mappings["/model"] = APPLICATION_ROOT & "model";

// ORM Setttings
this.datasource = "simplecms";
this.ormenabled = true;
this.ormSettings.flushAtRequestEnd = false;
this.ormSettings.cfclocation = this.mappings["/model"];

// FW/1 Setttings
variables.framework = {
generateSES = true
};

// executes when a view is not found
any function onMissingView( required rc )
{
var filter = {
guid = getFullyQualifiedAction()
};

rc.Content = EntityLoad( "Content", filter, true );
if ( !IsNull( rc.Content ) )
{
// use the content view to display content
return view( 'content' );
}
else
{
// create a 404 response header
var pc = getpagecontext().getresponse();
pc.getresponse().setstatus( 404 );
// set the page title
rc.Content = EntityNew( "Content" );
rc.Content.setTitle( "Page Not Found" );
// display the 404 page
return view( 'notfound' );
}
}

// executes per request
void function setupRequest()
{

// get all pages for the navigation
rc.menu = EntityLoad( "Content" );
}

}

Finally, we need to create a blank index.cfm file in the application root. Now when you hit a URL such as; http://localhost/simplecms/index.cfm/my-new-page. You'll get the 404 page. If you add a page to your database with the content_guid field set to "my-new-page.default", it will magically appear.

Obviously my application is more complex than this, but I thought it would be a good example of how simple it is to build a fairly powerful system quickly in ColdFusion and I haven't mentioned a beanFactory once!


2 comments

  1. John, great example of how frameworks can handle complexity for you. Amazing how much ground you can cover in just a few dozen lines.

    What I find interesting is the fact that FW/1 accomplishes what it does while remaining just a single file. A sleek nutcracker to Hibernate's sledgehammer. But as your code shows, CF can do most of the heavy lifting and wielding of that sledgehammer for you.

    Comment by Julian Halliwell – May 23, 2011
  2. Hi Julian. What FW/1 does really well is build on-top of Coldfusion's in-built Application lifecycle.

    I could have made use of Service layers etc, but I really don't see the point for a simple app like this and the API for cf-orm is so nice :)

    Comment by John Whish – May 24, 2011

Leave a comment

If you found this post useful, interesting or just plain wrong, let me know - I like feedback :)

Please note: If you haven't commented before, then your comments will be moderated before they are displayed.

Please subscribe me to any further comments
 

Search

Wish List

Found something helpful & want to say ’thanks‘? Then visit my Amazon Wish List :)

Categories

Recent Posts