Can you show the code you're using to get the cart from the event into the 
page's variables scope? It's possible that there's a structCopy() involved 
rather than a simple assignment.

The difference is that doing a structCopy() would cause a separate instance of 
session.cart to be set to the event object and/or the variables scope of your 
template. If that's the case then the behavior you're seeing makes perfect 
sense. If this is the case, the byRef nature of structs that you're depending 
on isn't going to work because you have a discrete COPY of the objects in the 
event object and variables scope. For some reason this is ringing a bell in the 
back of my mind as far as MG's functionality and unexpected behaviors.

You may be right, I may be crazy. But I just might be the lunatic you're 
looking for. Give it a try, see what happens. :)

Just for shits and giggles, you could also try replacing your function calls 
with direct references to the relevant variable. I know it breaks 
encapsulation, but I'm not suggesting you do it for your production code, just 
remark out your calls to UserSession and CurrentCart and replace them with 
direct references to the variables. That will eliminate your machinery from the 
equation and tell you if you have a bug in your code or if there's something 
deeper going on.

You could also try setting session.cart to "" rather than using structDelete(). 
Replace structKeyExists() with isStruct() and just have session.cart always 
exist...

Man it's been a long time since I've responded to a community support request 
like this... feels good!

Let us know what you find out!

J

PS - If you really want help with this you might be best off to post the code 
to the template in question, both controllers, your UserSession and your Cart 
to something like pastebin.com or nomorepasting.com and send us links to them 
all so we can see the whole codebase in a format that's familiar and easily 
readable. Both of those resources provide ColdFusion code support so they will 
color code highlight things correctly.

http://pastebin.com
http://www.nomorepasting.com/paste.php


On Oct 29, 2012, at 12:26 PM, Jeff P <[email protected]> wrote:

> This is in a controller called OrderController Here is the code: 
> 
> <cffunction name="processOrder" access="public" returntype="void" 
> output="false">
>       <cfargument name="event" type="any">
> 
>         <!--- get the cart data --->
>       <cfset var cart = beans.UserSession.getCurrentCart()>
>         
>        <cfif returnCode eq "Y">
>            <!--- if payment is successful, --->
>                       
>            <!--- clear database tables for the cart --->
>            <cfset beans.cartService.removeCartFromDatabase(cart)>
>                       
>            <!--- clear the cart session --->
>            <cfset beans.UserSession.clearCartSession()>
>            <cfset beans.UserSession.clearCheckout()>
>                       
>            <!--- delete the credit card temp stuff --->
>            <cfset beans.OrderService.deleteCreditCardData(myOrder)>
>                       
>            <cfset arguments.event.setValue("publicOrderNumber", 
> myOrder.getPublicOrderNumber())>
>            <cfset arguments.event.addResult("paymentAccepted")>
>                       
>       <cfelse>
>             .....
>          </cfif>
> 
> The code to clear the cart session and checkout in the UserSession cfc are:
> 
> <cffunction name="clearCartSession" access="public" output="false">
>       <cflock timeout="3" type="exclusive" scope="session">
>               <cfset structDelete( session, "cart" )>
>       </cflock>
> </cffunction> 
>       
> <cffunction name="clearCheckout" access="public" output="false">
>       <cflock timeout="3" type="exclusive" scope="session">
>               <cfset structDelete( session, "checkout" )>
>       </cflock>
> </cffunction>
> 
> Thank you Dan.
> 
> On Monday, October 29, 2012 11:02:52 AM UTC-4, Dan Wilson - 
> [email protected] wrote:
> Show the portion of code where you delete the cart after a successful 
> transaction.
> 
> DW
> 
> On Oct 29, 2012 10:41 AM, "Jeff P" <[email protected]> wrote:
> Hey everybody, 
> 
> I'm experiencing so strangeness with sessions and am hoping you folks could 
> shed some light on on what's happening. I have a cart app in MG 3.1.299. When 
> I complete an order and delete the cart from the session and show the order 
> complete page a dump of the session shows the cart is no longer in the 
> session scope. However, another call to the session on the same page shows 
> the cart as a valid struct within the session.
> 
> In my Controller.cfc I have an onRequestStart function that copies the cart 
> and the user (if they exist) to the event scope. I also have it copying the 
> entire session through the UserSession.cfc to try to figure this out. Here 
> are the pertinent parts of my controller.cfc and userSession.cfc:
> 
> Controller.cfc
> 
>          <cffunction name="onRequestStart" access="public" output="false">
>               <cfargument name="event" type="any">
>               
>               <!--- copy the cart to the event scope if it exists. --->
>               <cfif beans.UserSession.cartExists()>
>                       <cfset arguments.event.setValue("currentCart", 
> beans.UserSession.getCurrentCart())>
>               </cfif>
>               
>               <!--- and for the user if they're logged in. --->
>               <cfif beans.UserSession.loggedIn()>
>                       <cfset arguments.event.setValue("currentUser", 
> beans.UserSession.getCurrentUser())>
>               </cfif>
>               
>               <!--- return the whole session for some testing --->
>               <cfset arguments.event.setValue("userSession", 
> beans.UserSession.getSession())>
>       </cffunction>
> 
> UserSession.cfc
> 
>         <cffunction name="cartExists" access="public" output="false">
>               <cflock timeout="3" type="readonly" scope="session"> 
>                       <cfreturn structKeyExists( session, "cart" )>
>               </cflock>
>       </cffunction>
> 
>         <cffunction name="getCurrentCart" access="public" output="false">
>               <cflock timeout="3" type="readonly" scope="session">
>                       <cfreturn session.cart>
>               </cflock>
>       </cffunction>
>       
>       <cffunction name="getCurrentUser" access="public" output="false">
>               <cflock timeout="3" type="readonly" scope="session">
>                       <cfreturn session.user>
>               </cflock>
>       </cffunction>
>       
>       <cffunction name="getSession" access="public" output="false">
>               <cflock timeout="3" type="readonly" scope="session">
>                       <cfreturn session>
>               </cflock>
>       </cffunction>
> 
>         <cffunction name="loggedIn" access="public" output="false">
>               <cflock timeout="3" type="readonly" scope="session">
>                       <cfreturn structKeyExists( session, "user" )>
>               </cflock>
>       </cffunction>
> 
> In my template I have a chink of code that displays a link to the cart if it 
> exists and has at least one item in it:
> 
> If I use the currentCart variable set in Controller.cfc, it returns the cart 
> from the session after the order is processed even though a cfdump of the 
> session shows it isn't there.
> 
> <cfif isStruct(variables.currentCart) and 
> variables.currentCart.getItemCount() gte 1>
>       <div class="row-fluid">
>               <div id="viewCart" class="span12">
>                       <a href="#click_ViewCart#">Your cart: <span 
> class="bold">#variables.currentCart.getItemCount()#</span> item<cfif 
> variables.currentCart.getItemCount() neq 1>s</cfif></a> <a 
> href="#click_ViewCart#"><img src="images/shoppingCart.png" alt="view 
> cart"></a>
>               </div>
>       </div>  
> </cfif>       
> 
> The display section still shows up after the order is complete.
> 
> But, If I use the entire getSession function from the Controller.cfc it acts 
> as it's supposed to:
> 
> <cfif structKeyExists(variables.userSession, "cart") and 
> variables.userSession.cart.getItemCount() gte 1>
>       <div class="row-fluid">
>               <div id="viewCart" class="span12">
>                       <a href="#click_ViewCart#">Your cart: <span 
> class="bold">#variables.userSession.cart.getItemCount()#</span> item<cfif 
> variables.userSession.cart.getItemCount() neq 1>s</cfif></a> <a 
> href="#click_ViewCart#"><img src="images/shoppingCart.png" alt="view 
> cart"></a>
>               </div>
>       </div>  
> </cfif>       
> 
> The display section doesn't show up after the order is complete.
> 
> How can one call to the session return that the cart doesn't exist and then a 
> second, later call to the session on the same page return that it does?
> 
> Thank you for looking at this,
> 
> Jeff P.
> 
> -- 
> Model-Glue Sites:
> Home Page: http://www.model-glue.com
> Documentation: http://docs.model-glue.com
> Bug Tracker: http://bugs.model-glue.com
> Blog: http://www.model-glue.com/blog
>  
> You received this message because you are subscribed to the Google
> Groups "model-glue" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/model-glue?hl=en
> 
> -- 
> Model-Glue Sites:
> Home Page: http://www.model-glue.com
> Documentation: http://docs.model-glue.com
> Bug Tracker: http://bugs.model-glue.com
> Blog: http://www.model-glue.com/blog
>  
> You received this message because you are subscribed to the Google
> Groups "model-glue" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/model-glue?hl=en

-- 
Model-Glue Sites:
Home Page: http://www.model-glue.com
Documentation: http://docs.model-glue.com
Bug Tracker: http://bugs.model-glue.com
Blog: http://www.model-glue.com/blog

You received this message because you are subscribed to the Google
Groups "model-glue" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/model-glue?hl=en

Reply via email to