Firstly I'd like to say how awesome Tea Commerce is!
We’ve now almost done everything we wanted in terms of
functionality with Tea Commerce, but I’m running into a small issue which I wondered if you might
be able to help me with..
I have modified the javascript api method to change the
shipping method when it is selected in the UI, and I can fire off events
successfully, but we would like to also be able to fire off some javascript code when the shipping method is changed based on some calculations in the code behind – at the
moment I’m just testing with an alert and response.write, however this causes a
cart error that shows the alert code, plus what appears to be the order details, any ideas what might be causing this?
I will probably need to see some of your code to be able to help you. But what you might be able to do is to check the shipping method on every general event that is fired.
On every page load, write the shipping method in the head of the page like the _pageId and _languageId. That will be your currently selected shipping method and you will know that if it is different to the one you get in the general Tea Commerce event, it will have changed, and then you can do whatever to the UI.
That's an idea. Don't know if it fits your scenario. If not, I need to know more.
That sounds like a valid solution, thanks, and I have also come up with a workaround for our situation (which may or may not be used), but knowing more may help us or someone else? :)
The jquery I have added to change the shipping method on selection is:
$("input[name=paymentMethod]").live("click", function () { var paymentMethod = jQuery('input[name="paymentMethod"]:checked').val(); TeaCommerce.setPaymentMethod(paymentMethod, { async: false }); });
The events code in the dll (stripped down to barebones to test).
public void Initialize() { WebshopEvents.PaymentMethodChanged += WebshopEvents_PaymentMethodChanged; }
I think you are complicating things a bit. You don't need any .NET code at all. Try something like this:
1. In your Main Master you add, which will be the variable you use to keep track of the current shipping method chosen: var_shippingId=<umbraco:Itemfield="pageID"runat="server"xslt="teacommerce:GetOrderXml()/shipping/@id"/>;
2. In the teaCommerce_Advanced.js event "TeaCommerce.subscribeToOnCartUpdated" you write a bit of code to check the order everytime it have changed. If you have changed the shipping id on the server, we will know like this: if(data.Order.Shipping.Id!=_shippingId){ //do some stuff }
I agree that for that example, it appears overly complex.. however, the reason I was using .Net was to query a database based on which payment method was selected, and run some javascript/jquery functions based on the result of the query.. a little unconventional..but that's what our requirements are.
That you might still be able to do in the javascript. You have access to both the selected shipping method and payment method. Just make the different scenarios in the javascript. If you need some extra information you can let the .net code add it to the order with an order property and use that in the javascript as well.
Agreed that is also another way of doing it, though I have for now, implemented the solution I came up with, which is based on razor and javascript, but would have liked to be able to do it all from the .Net code if possible.
Any ideas on why it would throw the error in the first place?
When the cart error comes up the server have somehow thrown an error. You can use firebugs console to see what request are made to the server and what response you recieve. In the response you will be able to see what kind of server error is thrown. OR you can see if no errors are thrown.
I get a 200 OK status from the server, and the response contains the script code that I posted earlier, plus the order details (as I pointed out before).
Yes, and now that I look more closely at your code I realize that you are writing to the response in one of our events. That would destroy any response that Tea Commerce returns. In the Tea Commerce events all you can do is manipulate the order. Therefore you must put your javascript in an order property as a string. It's really bad practice though. The server should not write javascript code. It should provide the data for the javascript and let the client side take care of the javascript.
Bottom line is, you cannot do this:
$("input[name=paymentMethod]").live("click", function () { var paymentMethod = jQuery('input[name="paymentMethod"]:checked').val(); TeaCommerce.setPaymentMethod(paymentMethod, { async: false }); });
Cart Error - Javascript fired from .net events
Firstly I'd like to say how awesome Tea Commerce is!
We’ve now almost done everything we wanted in terms of functionality with Tea Commerce, but I’m running into a small issue which I wondered if you might be able to help me with..
I have modified the javascript api method to change the shipping method when it is selected in the UI, and I can fire off events successfully, but we would like to also be able to fire off some javascript code when the shipping method is changed based on some calculations in the code behind – at the moment I’m just testing with an alert and response.write, however this causes a cart error that shows the alert code, plus what appears to be the order details, any ideas what might be causing this?
Thanks
Tom
Hi Tom,
Thanks for the kind words.
I will probably need to see some of your code to be able to help you. But what you might be able to do is to check the shipping method on every general event that is fired.
On every page load, write the shipping method in the head of the page like the _pageId and _languageId. That will be your currently selected shipping method and you will know that if it is different to the one you get in the general Tea Commerce event, it will have changed, and then you can do whatever to the UI.
That's an idea. Don't know if it fits your scenario. If not, I need to know more.
/Rune
Hi Rune,
That sounds like a valid solution, thanks, and I have also come up with a workaround for our situation (which may or may not be used), but knowing more may help us or someone else? :)
The jquery I have added to change the shipping method on selection is:
$("input[name=paymentMethod]").live("click", function () { var paymentMethod = jQuery('input[name="paymentMethod"]:checked').val(); TeaCommerce.setPaymentMethod(paymentMethod, { async: false }); });
The events code in the dll (stripped down to barebones to test).
public void Initialize() { WebshopEvents.PaymentMethodChanged += WebshopEvents_PaymentMethodChanged; }
void WebshopEvents_PaymentMethodChanged(Order order, PaymentMethod paymentMethod) { HttpContext.Current.Response.Write("<script type=\"text/javascript\">alert(\"hello\");</script>"); }
Any insight on this would be very much appreciated :)
Tom
Hi Tom,
I think you are complicating things a bit. You don't need any .NET code at all. Try something like this:
1. In your Main Master you add, which will be the variable you use to keep track of the current shipping method chosen:
var _shippingId = <umbraco:Item field="pageID" runat="server" xslt="teacommerce:GetOrderXml()/shipping/@id" />;
2. In the teaCommerce_Advanced.js event "TeaCommerce.subscribeToOnCartUpdated" you write a bit of code to check the order everytime it have changed. If you have changed the shipping id on the server, we will know like this:
if(data.Order.Shipping.Id != _shippingId){
//do some stuff
}
That should do the trick.
/Rune
Thanks Rune,
I agree that for that example, it appears overly complex..
however, the reason I was using .Net was to query a database based on which payment method was selected, and run some javascript/jquery functions based on the result of the query.. a little unconventional..but that's what our requirements are.
Tom
That you might still be able to do in the javascript. You have access to both the selected shipping method and payment method. Just make the different scenarios in the javascript. If you need some extra information you can let the .net code add it to the order with an order property and use that in the javascript as well.
/Rune
Agreed that is also another way of doing it, though I have for now, implemented the solution I came up with, which is based on razor and javascript, but would have liked to be able to do it all from the .Net code if possible.
Any ideas on why it would throw the error in the first place?
Thanks again for your time!
Tom
When the cart error comes up the server have somehow thrown an error. You can use firebugs console to see what request are made to the server and what response you recieve. In the response you will be able to see what kind of server error is thrown. OR you can see if no errors are thrown.
Try that.
/Rune
I get a 200 OK status from the server, and the response contains the script code that I posted earlier, plus the order details (as I pointed out before).
Any help?
Thanks,
Tom
Then it might be because jQuery tries to parse your script as json. That would make it fail as well
/Rune
Ah ok, any way I can avoid that happening?
Tom
Yes, and now that I look more closely at your code I realize that you are writing to the response in one of our events. That would destroy any response that Tea Commerce returns. In the Tea Commerce events all you can do is manipulate the order. Therefore you must put your javascript in an order property as a string. It's really bad practice though. The server should not write javascript code. It should provide the data for the javascript and let the client side take care of the javascript.
Bottom line is, you cannot do this:
$("input[name=paymentMethod]").live("click", function () { var paymentMethod = jQuery('input[name="paymentMethod"]:checked').val(); TeaCommerce.setPaymentMethod(paymentMethod, { async: false }); });
/Rune
Thanks Rune.
I appreciate that it is bad practice, but it was a slightly unusual situation, which needed an unusual answer :)
For now I will be sticking with the razor alternative.
Thanks for your help!
Tom
Hi Tom,
That's cool. I hope you'll get it working.
Please mark your own answer as the answer, or which one is most correct, for others to see when they come past this question.
/Rune
is working on a reply...