Over a million developers have joined DZone.

Really simple CMS with FW/1 and ColdFusion ORM

DZone's Guide to

Really simple CMS with FW/1 and ColdFusion ORM

· Web Dev Zone
Free Resource

Learn how to build modern digital experience apps with Crafter CMS. Download this eBook now. Brought to you in partnership with Crafter Software

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!

Crafter is a modern CMS platform for building modern websites and content-rich digital experiences. Download this eBook now. Brought to you in partnership with Crafter Software.


Published at DZone with permission of John Whish, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}