Shimju asks:
This is rather simple, and I think you already have most of the answer written out already. Typically folks do layouts in Model-Glue like so:In a model-glue app, suppose I have 3 templates files - templateA, templateB and templateC. All are set as private events in model-glue.xml. Now my requirement is I want to select a particular template dynamically based on Arguments.event.AddResult("templateA") which we set on contoller method for the event. Based on this, I want corresponding template should appear for that event. Can you please advice how we can accomplish this.
<event-handler name="page.index">
<broadcasts />
<results>
<result do="view.template" />
</results>
<views>
<include name="body" template="dspIndex.cfm" />
</views>
</event-handler>
<event-handler name="view.template">
<broadcasts />
<results />
<views>
<include name="template" template="dspTemplate.cfm" />
</views>
</event-handler>
The event, page.index, has one result. Because it is unnamed, and the only result, it will always run. So all calls to page.index always run view.template. As you have already suggested, you can simply add other results. So let's say you want to have a default template, and two alternates, slim and print. Your controller could decide to add those results based on some logic, like the existence of a print attribute:
<cfif arguments.event.valueExists("print")>
<cfset arguments.event.addResult("print")>
</cfif>
The modified XML could then look like so:
<event-handler name="page.index">
<broadcasts />
<results>
<result name="print" do="view.printtemplate" />
<result do="view.template" />
</results>
<views>
<include name="body" template="dspIndex.cfm" />
</views>
</event-handler>
<event-handler name="view.template">
<broadcasts />
<results />
<views>
<include name="template" template="dspTemplate.cfm" />
</views>
</event-handler>
<event-handler name="view.printtemplate">
<broadcasts />
<results />
<views>
<include name="template" template="dspPrintTemplate.cfm" />
</views>
</event-handler>
This simply reads as - if no result was fired, use the view.template template, but if the print result was used, fire off view.printtemplate.
Pretty simple, but I wonder if this could be done easier? (And yes, I'm being sly. Look later today for another example using Model-Glue 3, or as I call it, the Super-Fantastic Uber Framework.)