Script-based controllers and models, tag-based views
October 22, 2009 · Chris Peters
One of the areas of ColdFusion 9 that interests me in particular is the ability to write full CFCs in CFScript syntax.
I’m looking forward to playing around with ColdFusion 9 when I get some more time here in a month or so. One of the areas that interests me in particular is the ability to write full CFCs in CFScript syntax.
Think about this scenario in CFWheels:
- Controllers in script syntax
- Models in script syntax
- Views in tag syntax
I like the idea of this, though I’ll admit that I haven’t tried it yet. The more data- and logic-heavy parts of the app can be script-driven, while the tag-based syntax can be used with HTML.
Imagine this scenario for a CFWheels model class:
| component extends="Model" { | |
| /** | |
| @hint Initializes associations and validations | |
| */ | |
| public function init() { | |
| // Associations | |
| hasMany("chirps"); | |
| // Validations | |
| validatesPresenceOf("firstName,lastName,email,gender,urlId"); | |
| validatesUniquenessOf("email,urlId"); | |
| validatesLengthOf(properties="firstName,lastName", maximum=50); | |
| } | |
| } |
And this for a Wheels controller:
| component extends="Controller" { | |
| /** | |
| @hint Shows form for registering for social network. | |
| */ | |
| public function register() { | |
| user = model("user").new(); | |
| } | |
| /** | |
| @hint Saves registration submission. | |
| */ | |
| public function create() { | |
| user = model("user").new(params.user); | |
| user.save(); | |
| if(user.hasErrors()) { | |
| renderPage(action="register"); | |
| } | |
| else { | |
| flashInsert(success="Thank you for registering for Social Network."); | |
| redirectTo(controller="home"); | |
| } | |
| } | |
| } |
And then any view logic can be mixed in via tags with all the other HTML tags (right where it belongs).
| <cfparam name="user"> | |
| <cfoutput> | |
| <h1>Register for Social Network</h1> | |
| #startFormTag(action="create")# | |
| #textField(label="First Name", objectName="user", property="firstName")# | |
| #textField(label="Last Name", objectName="user", property="lastName")# | |
| #textField(label="Email", objectName="user", property="email")# | |
| <fieldset> | |
| <legend>Gender</legend> | |
| #radioButton(label="Male", objectName="user", property="gender", tagValue="M")# | |
| #radioButton(label="Female", objectName="user", property="gender", tagValue="F")# | |
| </fieldset> | |
| <fieldset> | |
| <legend>Profile Address</legend> | |
| #textField(label="http://#cgi.script_name#/profile/", objectName="user", property="urlId")# | |
| </fieldset> | |
| <div> | |
| #submitTag(value="Register Now")# | |
| </div> | |
| #endFormTag()# | |
| </cfoutput> |
This makes me excited for Railo adoption of script-based CFCs and for time to warp 5 years into the future when script-based CFCs are more widely used in general.