Yes, create() and createAddress() (as well as update and
updateAddress) are all in the same cfc. It's a bit lengthy, but
breaking it up further wasn't really worth it for this project. Below
is the fuse that calls the store() method, followed by the full
userDAO.cfc - constructive criticism welcome, as always ;)
<!---
<fusedoc fuse="qry_storeUser.cfm">
<responsibilities>
I create or update a user in the system. If the fields pass are
invalid, I return the user
to the edit form and provide information on the error.
</responsibilities>
<properties>
<id value="$Id: qry_storeUser.cfm,v 1.1 2005/03/02 22:35:05 ken
Exp $" />
</properties>
<io>
<in>
<!-- General User Info -->
<number name="id" />
<string name="username" />
<string name="password" />
<string name="firstName" />
<string name="lastName" />
<string name="company" />
<string name="businessType" />
<string name="email" />
<string name="mailPref" />
<string name="roles" />
<!-- Billing Address -->
<number name="bID" />
<string name="bStreet" />
<string name="bStreet2" />
<string name="bCity" />
<string name="bState" />
<string name="bZip" comments="5 or 9 digits" />
<string name="bPhone" comments="Most formats supported,
()'s optional"/>
<string name="bExt" />
<string name="bFax" comments="Same as phone" />
<!-- Shipping Address -->
<number name="sID" />
<string name="sStreet" />
<string name="sStreet2" />
<string name="sCity" />
<string name="sState" />
<string name="sZip" comments="5 or 9 digits" />
<string name="sPhone" comments="Most formats supported,
()'s optional"/>
<string name="sExt" />
<string name="sFax" comments="Same as phone" />
</in>
<out>
<object name="user" scope="request" />
<string name="message" scope="request" />
</out>
</io>
</fusedoc>
--->
<cfsilent>
<cfset userManager = application.appManager.getUserManager() />
<!--- Get container objects --->
<cfset request.user = userManager.getDAO().new() />
<cfset billing = request.user.addressNew() />
<cfset shipping = request.user.addressNew() />
<cfset request.user.init(argumentCollection="#attributes#") />
<!--- Populate billing object --->
<cfset billing.setID(attributes.bID) />
<cfset billing.setStreet(attributes.bStreet) />
<cfset billing.setStreet2(attributes.bStreet2) />
<cfset billing.setCity(attributes.bCity) />
<cfset billing.setState(attributes.bState) />
<cfset billing.setZip(attributes.bZip) />
<cfset billing.setPhone(attributes.bPhone) />
<cfset billing.setExt(attributes.bExt) />
<cfset billing.setFax(attributes.bFax) />
<cfset request.user.setBilling(billing) />
<!--- Populate shipping object --->
<cfset shipping.setID(attributes.sID) />
<cfset shipping.setStreet(attributes.sStreet) />
<cfset shipping.setStreet2(attributes.sStreet2) />
<cfset shipping.setCity(attributes.sCity) />
<cfset shipping.setState(attributes.sState) />
<cfset shipping.setZip(attributes.sZip) />
<cfset shipping.setPhone(attributes.sPhone) />
<cfset shipping.setExt(attributes.sExt) />
<cfset shipping.setFax(attributes.sFax) />
<cfset request.user.setShipping(shipping) />
<!--- Get any error information --->
<cfset request.error = request.user.validate() />
<cfif structIsEmpty(request.error)>
<!--- No errors, go ahead and save --->
<cfset request.user = userManager.getDAO().store(request.user)
/>
<cfset request.message = "User information stored succesfully."
/>
<cfelse>
<!--- Errors, do not save yet --->
<cfset request.message = "There was a problem with the
information
entered.<br>" />
<cfset request.message = request.message &
structKeyList(request.error) />
<cfset request.message = request.message &
structKeyList(request.error.billing) &
structKeyList(request.error.shipping) />
</cfif>
</cfsilent>
---- userDAO.cfc ----
<!--- $Id: userDAO.cfc,v 1.8 2005/03/02 22:35:05 ken Exp $ --->
<cfcomponent name="userDAO" output="false" extends="dao"
displayname="User Data Access Object" hint="I provide data layer
methods for the user class.">
<cffunction name="new" output="false" access="public"
returnType="user" hint="Gets a new, empty user object">
<cfreturn createObject("component","user") />
</cffunction>
<cffunction name="addressNew" returnType="address" output="false"
hint="Get a new, empty address object">
<cfreturn createObject("component","address") />
</cffunction>
<cffunction name="fetch" output="false" returnType="user"
access="public" hint="Get a new or existing user">
<cfargument name="key" type="any" required="true"
hint="Username or
ID to fetch." />
<cfset var user = new() />
<cfif IsNumeric(arguments.key)>
<cfif arguments.key GT 0>
<cfset user = read(arguments.key) />
</cfif>
<cfelse>
<cfset user = readByUsername(arguments.key) />
</cfif>
<cfreturn user />
</cffunction>
<cffunction name="store" output="false" returnType="user"
access="public" hint="Create or Update a user">
<cfargument name="userObj" type="user" required="true"
hint="User to
store." />
<cfset var user = new() />
<cfif arguments.userObj.getID() EQ 0>
<cfset user = create(arguments.userObj) />
<cfelse>
<cfset user = update(arguments.userObj) />
</cfif>
<cfreturn user />
</cffunction>
<cffunction name="create" output="false" access="private"
returnType="user" hint="Insert a new user into the database">
<cfargument name="bean" type="user" required="yes" hint="User
object" />
<cfset var billing = arguments.bean.getBilling() />
<cfset var shipping = arguments.bean.getShipping() />
<cftransaction>
<cfquery name="create" datasource="#getDSN()#">
INSERT INTO users (username, password, roles,
firstName, lastName,
company, businessType,
email, mailPref)
VALUES (
<cfqueryparam
value="#arguments.bean.getUsername()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getPassword()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getRoles()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getFirstname()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getLastname()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getCompany()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getBusinessType()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getEmail()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.bean.getMailPref()#"
CFSQLType="cf_sql_varchar" />
)
</cfquery>
<cfquery name="newID" datasource="#getDSN()#">
SELECT MAX(id) AS id FROM users
</cfquery>
</cftransaction>
<cfset arguments.bean.setID(newID.id) />
<!--- Create Billing Address --->
<cfset billing = createAddress(billing) />
<cfset arguments.bean.setBilling(billing) />
<!--- Create Shipping Address --->
<cfset shipping = createAddress(shipping) />
<cfset arguments.bean.setShipping(shipping) />
<!--- Link the addresses to the user in the lookup table --->
<cfset
createAddressRef(arguments.bean.getID(),arguments.bean.getBilling().getID(),"billing")
/>
<cfset
createAddressRef(arguments.bean.getID(),arguments.bean.getShipping().getID(),"shipping")
/>
<cfreturn arguments.bean />
</cffunction>
<cffunction name="createAddress" output="false" returnType="address"
access="private" hint="Create a new address entry">
<cfargument name="address" type="address" required="true" />
<cftransaction>
<cfquery name="createAddress" datasource="#getDSN()#">
INSERT INTO addresses (street, street2, city,
state, zip, phone, ext, fax)
VALUES (
<cfqueryparam
value="#arguments.address.getStreet()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getStreet2()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getCity()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getState()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getZip()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getPhone()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getExt()#"
CFSQLType="cf_sql_varchar" />,
<cfqueryparam
value="#arguments.address.getFax()#"
CFSQLType="cf_sql_varchar" />
)
</cfquery>
<cfquery name="newAddressID" datasource="#getDSN()#">
SELECT MAX(id) AS id FROM addresses
</cfquery>
</cftransaction>
<cfset arguments.address.setID(newAddressID.id) />
<cfreturn arguments.address />
</cffunction>
<cffunction name="createAddressRef" output="false" returnType="void"
access="private">
<cfargument name="userID" type="numeric" required="true"
hint="User
ID to link against" />
<cfargument name="addressID" type="numeric" required="true"
hint="Address ID to link to" />
<cfargument name="type" type="string" required="false"
default="billing" hint="Specify 'billing' or 'shipping'" />
<cfquery name="createAddressRelQuery" datasource="#getDSN()#">
INSERT INTO userAddresses (userID, addressID, type)
VALUES (
<cfqueryparam value="#arguments.userID#"
CFSQLType="cf_sql_numeric" />,
<cfqueryparam value="#arguments.addressID#"
CFSQLType="cf_sql_numeric" />,
<cfqueryparam value="#arguments.type#"
CFSQLType="cf_sql_varchar" />
)
</cfquery>
</cffunction>
<cffunction name="read" output="false" access="private"
returnType="user" hint="Return a user from the database">
<cfargument name="id" type="numeric" required="yes" hint="ID of
the
user to fetch" />
<cfset var user = new() />
<cfset var args = structNew() />
<cfquery name="read" datasource="#getDSN()#">
SELECT * FROM users
WHERE id = <cfqueryparam value="#arguments.id#"
CFSQLType="cf_sql_numeric" />
</cfquery>
<cfset args = queryToArgumentCollection(read) />
<cfset args.billing = readAddress(arguments.id,'billing') />
<cfset args.shipping = readAddress(arguments.id,'shipping') />
<cfset user.init(argumentCollection=args) />
<cfreturn user />
</cffunction>
<cffunction name="readByUsername" output="false" access="private"
returnType="user" hint="Return a user with a specified username. Used
for login methods.">
<cfargument name="username" type="string" required="yes" />
<cfset var user = new() />
<cfset var args = structNew() />
<cfquery name="readByUsername" datasource="#getDSN()#">
SELECT * FROM users
WHERE username = <cfqueryparam
value="#arguments.username#"
CFSQLType="cf_sql_varchar" />
</cfquery>
<cfset args = queryToArgumentCollection(read) />
<cfset args.billing = readAddress(arguments.id,'billing') />
<cfset args.shipping = readAddress(arguments.id,'shipping') />
<cfset user.init(argumentCollection=args) />
<cfreturn user />
</cffunction>
<cffunction name="readAddress" output="false" returnType="address"
access="private">
<cfargument name="userID" type="numeric" required="true"
hint="User
ID to check against" />
<cfargument name="type" type="string" required="false"
default="billing" hint="Specify 'billing' or 'shipping'" />
<cfset var address = AddressNew() />
<cftransaction>
<cfquery name="readAddressIDQuery"
datasource="#getDSN()#">
SELECT addressID FROM userAddresses
WHERE userID = <cfqueryparam
value="#arguments.userID#"
CFSQLType="cf_sql_numeric" />
AND type = <cfqueryparam
value="#arguments.type#"
CFSQLType="cf_sql_varchar" />
</cfquery>
<cfif readAddressIDQuery.RecordCount GT 0>
<cfset addressID = readAddressIDQuery.addressID
/>
<cfquery name="readAddressQuery"
datasource="#getDSN()#">
SELECT * FROM addresses
WHERE id = <cfqueryparam
value="#addressID#" CFSQLType="cf_sql_numeric" />
</cfquery>
<cfset
address.init(argumentCollection=queryToArgumentCollection(readAddressQuery))
/>
</cfif>
</cftransaction>
<cfreturn address />
</cffunction>
<cffunction name="update" output="false" access="private"
returnType="user" hint="Update an exisitng user in the database">
<cfargument name="bean" type="user" required="yes" />
<cfset var billing = arguments.bean.getBilling() />
<cfset var shipping = arguments.bean.getShipping() />
<cfquery name="update" datasource="#getDSN()#">
UPDATE users SET username=<cfqueryparam
value="#arguments.bean.getUsername()#" CFSQLType="cf_sql_varchar" />,
password=<cfqueryparam
value="#arguments.bean.getPassword()#"
CFSQLType="cf_sql_varchar" />,
roles=<cfqueryparam
value="#arguments.bean.getRoles()#"
CFSQLType="cf_sql_varchar" />,
firstName=<cfqueryparam
value="#arguments.bean.getFirstname()#"
CFSQLType="cf_sql_varchar" />,
lastName=<cfqueryparam
value="#arguments.bean.getLastname()#"
CFSQLType="cf_sql_varchar" />,
company=<cfqueryparam
value="#arguments.bean.getCompany()#"
CFSQLType="cf_sql_varchar" />,
businessType=<cfqueryparam
value="#arguments.bean.getBusinessType()#" CFSQLType="cf_sql_varchar"
/>,
email=<cfqueryparam
value="#arguments.bean.getEmail()#"
CFSQLType="cf_sql_varchar" />,
mailPref=<cfqueryparam
value="#arguments.bean.getMailPref()#"
CFSQLType="cf_sql_varchar" />
WHERE id=<cfqueryparam value="#arguments.bean.getID()#"
CFSQLType="cf_sql_integer" />
</cfquery>
<!--- Update Billing Address --->
<cfset arguments.bean.setBilling(updateAddress(billing)) />
<!--- Update Shipping Address --->
<cfset arguments.bean.setShipping(updateAddress(shipping)) />
</cffunction>
<cffunction name="updateAddress" output="false" returnType="address"
access="private" hint="Update an existing address">
<cfargument name="address" type="address" required="true" />
<cfquery name="updateAddress" datasource="#getDSN()#">
UPDATE addresses
SET street=<cfqueryparam
value="#arguments.address.getStreet()#"
CFSQLType="cf_sql_varchar" />,
street2=<cfqueryparam
value="#arguments.address.getStreet2()#"
CFSQLType="cf_sql_varchar" />,
city=<cfqueryparam
value="#arguments.address.getCity()#"
CFSQLType="cf_sql_varchar" />,
state=<cfqueryparam
value="#arguments.address.getState()#"
CFSQLType="cf_sql_varchar" />,
zip=<cfqueryparam
value="#arguments.address.getZip()#"
CFSQLType="cf_sql_varchar" />,
phone=<cfqueryparam
value="#arguments.address.getPhone()#"
CFSQLType="cf_sql_varchar" />,
ext=<cfqueryparam
value="#arguments.address.getExt()#"
CFSQLType="cf_sql_varchar" />,
fax=<cfqueryparam
value="#arguments.address.getFax()#"
CFSQLType="cf_sql_varchar" />
WHERE id=<cfqueryparam
value="#arguments.address.getID()#"
CFSQLType="cf_sql_numeric" />
</cfquery>
<cfreturn arguments.address />
</cffunction>
<cffunction name="delete" output="false" access="public"
returnType="void">
<cfargument name="id" type="numeric" required="yes" />
<cfset var user = read(arguments.id) />
<cfset var billing = user.getBilling() />
<cfset var shipping = user.getShipping() />
<cfset deleteAddress(billing.getID()) />
<cfset deleteAddress(shipping.getID()) />
<cfquery name="delete" datasource="#getDSN()#">
DELETE FROM users
WHERE id = <cfqueryparam value="#arguments.id#"
CFSQLType="cf_sql_numeric" />
</cfquery>
</cffunction>
<cffunction name="deleteAddress" output="false" returnType="void"
access="private" hint="Delete a given address">
<cfargument name="id" type="numeric" required="true" />
<cfset deleteAddressRef(arguments.id) />
<cfquery name="delAddressQuery" datasource="#getDSN()#">
DELETE FROM addresses
WHERE id = <cfqueryparam value="#arguments.id#"
CFSQLType="cf_sql_numeric" />
</cfquery>
</cffunction>
<cffunction name="deleteAddressRef" output="false" returnType="void"
access="private" hint="Delete an address relational link">
<cfargument name="id" type="numeric" required="true"
hint="Address ID" />
<cfquery name="delAddressRefQuery" datasource="#getDSN()#">
DELETE FROM userAddresses
WHERE addressID = <cfqueryparam value="#arguments.id#"
CFSQLType="cf_sql_numeric" />
</cfquery>
</cffunction>
</cfcomponent>
----------------------------------------------------------
You are subscribed to cfcdev. To unsubscribe, send an email to
[email protected] with the words 'unsubscribe cfcdev' as the subject of the
email.
CFCDev is run by CFCZone (www.cfczone.org) and supported by CFXHosting
(www.cfxhosting.com).
An archive of the CFCDev list is available at
www.mail-archive.com/[email protected]