So, I'm working a new project, and using Mura CMS. We decided to write our modules as plugins, and are using the MuraFW/1 plugin template to do so. Thing is, each plugin really needs to share a common model that uses ColdFusion's ORM.

The MuraFW/1 plugin template has facility for defining a cfclocation for ORM configuration, but that location is relative to the plugin itself, so this took a little hunting. Finally, what made the most sense was to define ORM for the Mura site (as a whole), and let that definition propogate down to the plugins.

For those who are unfamiliar with Mura, it's a very nice CMS, and very extensible, but incredibly undocumented. There is some documentation, but it's spotty, and there are articles on their site that are quite dated. (I know this is something they are working on, so I'll leave it at that.) Luckily, I do write code for a living, so I just started pulling on strings until I found the thread I needed.

The MuraFW/1 template's application.cfc includes the core application settings:

view plain print about
1include '../../config/applicationSettings.cfm';

That works to our advantage, as anything defined in the core app then becomes available to the plugin. Looking at that file, I started looking for anything related to ORM. The first bit I came upon showed me this:

view plain print about
1<cfset this.ormenabled = properties.getProperty("ormenabled","true") />

From there, I had to figure out where ormenabled would come from. I discovered that all of those properties are defined in the /config/settings.ini.cfm file. So, if I added the right properties, I should have my orm configuration. Here is a list of the properties supported by the applicationSettings.cfm at this time:

  • ormenabled
  • ormdbcreate
  • ormcfclocation
  • ormflushAtRequestEnd
  • ormeventhandling
  • ormautomanageSession
  • ormsavemapping
  • ormskipCFCwitherror
  • ormuseDBforMapping
  • ormautogenmap
  • ormlogsql

So, knowing this, I started looking at my model. First, I placed the model in my theme:

/mysite/includes/themes/mysite/model

This was a requirement of the client, so that was ok for me. Except now, I needed a reference to that directory. A mapping. Mura allows custom CF mappings, by making changes to the /config/mappings.cfm file:

view plain print about
1<cfset this.mappings["/myModel"] = variables.mapPrefix & variables.BaseDir & "/mysite/includes/themes/mysite/model">

Now that I had my mapping, I needed to setup the ORM settings in that settings.ini.cfm file:

view plain print about
1ormenabled=true
2ormcfclocation=/myModel
3ormflushAtRequestEnd=false
4ormautomanageSession=false
5ormeventhandling=true

The only thing I was missing was my ORM Event Handler. While the settings allowed me to enable ormeventhandling, they did not allow me to define the handler. For that, I added the setting in my plugin Application.cfc files, right after the initial includes:

view plain print about
1this.ormsettings.eventhandler = "myModel.aop.GlobalEventHandler";

I reloaded my application, then updated my plugins (in the Mura Plugin admin) for good measure. Presto! Shared ORM! Hopefully this will help others from spinning their wheels.

Side Note: During this process, I also updated to the Mura v6 Preview. Wow! What an improvement. And the Bootstrap usage should make layout and theming much easier.