At the top of the function that processes the order and clears the cart I have: <cfset var cart = beans.UserSession.getCurrentCart()> <cfset var theSession = beans.UserSession.getSession()>
Right after the <cfset beans.UserSession.clearCartSession()> if I put in a <cfthrow message="#StructKeyExists(beans.UserSession.cart)#"> returns a "No" but <cfthrow message="#isStruct(cart)#"> returns a "Yes" and the item in the cart is still there, it's not a freshly initialized cart. Thanks, Jeff On Tuesday, October 30, 2012 10:02:23 AM UTC-4, Dan Wilson - [email protected] wrote: > > What happens when you put a cfdump right after the cart clearing operation? > > DW > > On Tue, Oct 30, 2012 at 9:56 AM, Jeff P <[email protected] > <javascript:>>wrote: > >> The sessionid remains correct and separate between the two browsers. The >> product in the cart is also correct for the user's session. This has also >> helped verify that the cart that shows up after the order is complete is >> not a freshly initialized cart but the same cart from the order (or a copy >> as you stated earlier) >> >> Jeff >> >> >> On Monday, October 29, 2012 7:48:15 PM UTC-4, Jared Rypka-Hauer wrote: >> >>> Try something once. >>> >>> Use two different browsers and create 2 different sessions with >>> different products in the cart so you can differentiate them. >>> >>> The process one cart and see if the symptom still exists and if it does, >>> check to see which product is in the cart, the one that should be there or >>> the one from the other session... >>> >>> Just a thought... >>> >>> J >>> >>> Then run your test and make sure that the cart you see in the dump is >>> the cart that actually belongs to the user in question. >>> On Oct 29, 2012, at 1:24 PM, Jeff P <[email protected]> wrote: >>> >>> Here are the parts in pastebin >>> >>> Controller http://pastebin.**com/q9sg4u3a <http://pastebin.com/q9sg4u3a> >>> >>> UserSession http://pastebin.**com/5mDTu7dS<http://pastebin.com/5mDTu7dS> >>> >>> OrderController http://**pastebin.com/GdDejK0E<http://pastebin.com/GdDejK0E> >>> >>> Template http://pastebin.com/**0MDbxPJg <http://pastebin.com/0MDbxPJg> >>> >>> On Monday, October 29, 2012 1:59:47 PM UTC-4, Jeff P wrote: >>>> >>>> <cfset event.copyToScope( variables, "currentUser, currentCart, >>>> userSession")> >>>> <cfset me = variables.currentUser> >>>> <cfset cart = variables.currentCart> >>>> >>>> <cfdump var="#userSession#"> shows the cart isn't in the session >>>> >>>> <cfdump var="#currentCart#" label="currentCart"> which comes from the >>>> session as well, returns the object. >>>> >>>> I will give the direct calls a try. I had thought about always having >>>> the cart exist but hadn't worked towards it yet. >>>> >>>> Thanks also for reminding me about pastebin. >>>> >>>> Jeff >>>> >>>> On Monday, October 29, 2012 1:45:00 PM UTC-4, Jared Rypka-Hauer wrote: >>>>> >>>>> 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<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 >>>>>>> model-glue+...@googlegroups.**com >>>>>>> For more options, visit this group at >>>>>>> http://groups.google.com/**group/model-glue?hl=en<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 >>>>> model-glue+...@googlegroups.**com >>>>> For more options, visit this group at >>>>> http://groups.google.com/**group/model-glue?hl=en<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 >>> model-glue+...@**googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/**group/model-glue?hl=en<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]<javascript:> >> To unsubscribe from this group, send email to >> [email protected] <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/model-glue?hl=en >> > > > > -- > Plutarch - "The mind is not a vessel to be filled but a fire to be > kindled." > -- 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
