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.
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.
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