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



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

Reply via email to