Over a million developers have joined DZone.
Platinum Partner

Really simple CMS with FW/1 and ColdFusion ORM

· Web Dev Zone

The Web Dev Zone is brought to you in partnership with Mendix.  Discover how IT departments looking for ways to keep up with demand for business apps has caused a new breed of developers to surface - the Rapid Application Developer.

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.

I'm a simple view to display CMS content 


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

I'm a simple 404 view
<h1>Page Not found</h1>
<p>Sorry, the page you requested (#getFullyQualifiedAction()#) has not been found.</p>

A layout would be kinda useful!

I am the default layout
<ul id="nav">
<cfloop array="#rc.menu#" index="local.thispage">
  <li><a href="#buildURL( local.thispage.getGuid() )#">#local.thispage.getTitle()#</a>

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


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' );
      // 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!

The Web Dev Zone is brought to you in partnership with Mendix.  Learn more about The Essentials of Digital Innovation and how it needs to be at the heart of every organization.


Published at DZone with permission of John Whish , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}