extending reactor record objects
Reactor provides a simple mechinism to easily add new functionality to your record objects. The advantage of this is that you dont have to create a seperate CFC, invoke it, pass it the parameters and interprit the results. The reactor record object already has access to its own instance data,and (if you are using reactor) you have already created it and are already calling functions on it.
The base record objects are located in the project/projectname/record/ folder under the reactor folder.
reactor provides you with two CFC's that extend this base record object. these are created in the folder you have set up in the mapping section in the reactor.xml file (or in coldspring.xml if using modelglue 2 unity).
If you are not doing anything that is database specific, use the tablenameRecord.cfc. If you are doing something that is specific to your database convention, use the tablenameRecord?????.cfc.
In my example, we will be performing simple math calculations on several values from our record object, returning a sum total.
Assume I have a table/record called 'Rate' that has the following fields:
RateID (pk)
EmployeeCost
EmployerCost
ThirdPartyCost
In my reactor.xml file I have defined the rate table as an object
<object name="Rate">
</object>Now in a cfm page, I create a reactor rate record
<cfset reator = CreateObject("Component", "reactor.reactorFactory").init(expandPath(".") & "/reactor.xml") />
<CFSET raterecord =reactor.createRecord("Rate")>
<CFSET raterecord.SetRateID(url.RateID)>
<CFSET raterecord.load()>
<CFDUMP var="raterecord#">Afterloading this page, reactor creates my Raterecord CFC's. We can now add our custom function. Open mappingvalue/record/RateRecord.cfc and look for the comment <!--- Place custom code here, it will not be overwritten --->
between this and the closing CFCOMPONENT tag is where I will add my function:
<CFFUNCTION name="CalculateTotalCost" access="public" hint="I am a custom method created to demonstrate how to extend and customize record objects" output="false" returntype="string">
<CFSET var result = "" />
<cfset result = val(getEmployeeCost()) + val(getEmployerCost() + val(getThirdPartyCost() )>
<CFRETURN result />
</CFFUNCTION>Now, going back to my Raterecord, I see I have a new method "CalculateTotalCost". After populating my rateRecord with data, I can access the computed total cost value with this:
<CFSET cost = raterecord.CalculateTotalCost()>Yes I do know I could have calculated this in the view with one line of code, but by placing the logic in the Model, it is in a consistant place to be access by other pages as well as webservices, etc.
delicious |
digg |
reddit |
technorati
