Nathan,
 
This is good encapsulation, divide and conquer technique etc..
One quick question..
 
Can you implement the same encapsulation technique for Client Variables?
i.e
"PersistanceScope.cfc"
Instance vars
-id
-firstName
-lastName
 
and store the Instance of PersistanceScope.cfc in a Client Var.. like
client.user = createObject("Component","PersistanceScope").init();
 
Thanks,
Joe Eugene
 
----- Original Message -----
Sent: Friday, October 03, 2003 12:45 PM
Subject: RE: [CFCDev] Just starting CFC's -- Session Question

Yes -- basically, the cart should be self-contained in its logic.  It contains, as instance data, information about what's in the cart.  It has methods for manipulating that information and would expose methods that would probably be something like:
 
addItem(item,quantity);
deleteItem(item);
changeQuantity(item,newQuantity);
getAllItems();
getSubTotal(); [add all prices of the items]
 
getAllItems might return a struct of structs, or it might return an array of other CFC instances (instances of Item, perhaps?) -- that will depend on your implementation, but the point I'm trying to make is that the cart itself should not be "aware" of a session (in fact, your problem of needing a CFAPPLICATION tag is a classic example of why a component should minimize dependencies on the external environment).  Thus, you shouldn't ever need to pass the Session scope "into" the CFC (or out of the CFC).
 
You can just say things like:
 
session.cart.addItem(item,quantity);
 
myCartItems = session.cart.getAllItems();
 
or, maybe something like:
 
for(item in session.cart.getAllItemKeys()){
    thisItem = session.cart.getItem(item);
}
 
etc.
 
 
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Paul Giesenhagen
Sent: Friday, October 03, 2003 9:28 AM
To: [EMAIL PROTECTED]
Subject: Re: [CFCDev] Just starting CFC's -- Session Question

That makes good sense ... so basically build the "cart" in the CFC and return to the the CFM template to update the cartData session.  Keep session information out of the CFC completly? 

I would assume you would also set the session to a local variable before it went into the CFC. 
 
How do you handle multiple structs and arrays being passed to a component ..
 
Ie, I have cartData (individual items in the cart) and then orderData that is all the information about the cart.  They interact together (maybe I need to think more object oriented). 
 
Paul Giesenhagen
QuillDesign
 
----- Original Message -----
Sent: Friday, October 03, 2003 11:21 AM
Subject: RE: [CFCDev] Just starting CFC's -- Session Question

I have to throw in the obligatory and oft repeated advice that you should not be directly manipulating session variables inside your CFCs, generally speaking.  You'd be better off having your cartModule component store things as instance variables, then store an instance of the cartModule in the session.  This way you preserve encapsulation because the cartModule does not need to be aware of its environment (you could, for instance, use it in the Application or Server scope if that were more appropriate in another setting).  You also avoid any risk of overwriting the data inside the cart.  You also don't need to be aware of how the cartModule is implemented to use it -- you can then use CFCs' strength, which is to encapsulate complexity and expose functionality through an API defined by the methods.  Then if you ever need to change how a cartModule works internally your other code doesn't need to change because the API of the cartModule can stay the same.
 
 
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]On Behalf Of Paul Giesenhagen
Sent: Friday, October 03, 2003 8:10 AM
To: [EMAIL PROTECTED]
Subject: [CFCDev] Just starting CFC's -- Session Question

I am just now starting my learning on CFC's and having issues with sessions .. it is quite frustrating.
 
I created a VERY simple little input for building an array populated with a struct and then sticking it into a session.
 
I am not getting any session information from the calling CFM page .. if I set the session inside of the CFC.
 
Can anyone see what I am doing wrong?
 
If I run cart.cfm?mode=addCart  (I see the session set in the CFC -- cfdump)
 
AND then Run cart.cfm?mode=viewCart it says cartData is undefined in SESSION.
 
<!--- Calling CFM page --->
<cfparam name="url.mode" default="">
 
<cfswitch _expression_="#url.mode#">
 <cfcase value="delCart">
  <cfset variables.foo = StructDelete(session, "cartData")>
 </cfcase>
 <cfcase value="addCart">
  <cfparam name="url.qty" default="1">
  <cfparam name="url.id" default="1">
  <!--- <cfobject type="component" name="addCart" component="test.components.cartModule"> --->
  <cfinvoke component="test.components.cartModule" method="addCart"/>
 </cfcase>
 <cfcase value="viewCart">
  <cfdump var="#session.cartData#">
 </cfcase>
</cfswitch>
 
 
<!--- cartModule.cfc --->
<cfcomponent displayname="cartModule" hint="manages  Items to the Cart">
 <cffunction name="addCart" output="true" displayname="Adds Cart Stuff" hint="Adds Cart Stuff">
  <cfif IsDefined("session.cartData")>
   <cfset cartLen = ArrayLen(cart) + 1>
   <cfset cart[cartLen] = structNew()>
   <cfset cart[cartLen].qty = url.qty>
   <cfset cart[cartLen].id = url.id>
  <cfelse>
   <cfset cart = arrayNew(1)>
   <cfset cartLen = ArrayLen(cart) + 1>
   <cfset cart[cartLen] = structNew()>
   <cfset cart[cartLen].qty = url.qty>
   <cfset cart[cartLen].id = url.id>
  </cfif>
  <cfset session.cartData = cart>
  <cfdump var="#session.cartData#">
 </cffunction> 
</cfcomponent>
 
 
Also: If I call this component via CFOBJECT the <CFDUMP in the function doesn't display anything -- If I use <CFINVOKE it displays the dump.
 
Thanks
Paul Giesenhagen
QuillDesign
 

Reply via email to