- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-22-2015 01:24 PM
I'm building a New Hire Order Guide. We're collecting all the information we need to generate the requests on the first screen. Right now, users have to click 'Choose Options', and click on each tab (there are 9 of them), even though they don't need to choose any options, then click Checkout. I'd like them to be able to just answer the questions on the first screen, then click 'Checkout' and get to the order confirmation screen. I'm using Cascading variables from my Order Guide, but 5 of the catalog items have the same variables, so I've created catalog scripts that move the information from the cascaded-to variables that match the Order Guide variables. These don't run unless the tab is clicked on. I've also set 'Ignore Mandatory Evaluation' to True for all of the items, but that doesn't help if the variables aren't getting set correctly without clicking on the tabs.
My users would really like to not see the tabs at all, just click 'Checkout' from the first screen, and go right to the checkout screen.
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-23-2015 08:40 AM
I would agree with Abhiram and you can use a catalog item and then you can automatically add other items into the user's cart via client script on the submit of the cart via an AJAX call. Below is some sample code:
On Submit Client Script:
var ajax = new GlideAjax('AJAXAddCatItems');
ajax.addParam('sysparm_name', 'addCatItems');
ajax.addParam('sysparm_variable1', g_form.getValue('variable1'));
ajax.addParam('sysparm_variable2', g_form.getValue('variable2'));
ajax.getXMLWait();
Then create an AJAX script include to add the catalog items. You will notice that I did not use the script in the Wiki article that Abhiram included and that is because calling new Cart() clears the user's existing cart which is not what I wanted. So I took code from the out of the box Script Included named Cart, which is the code that it was calling. Below is example code for your new AJAX Script Include based on the above example
var AJAXAddCatItems = Class.create();
AJAXValidateInstance.prototype = Object.extendsObject(AbstractAjaxProcessor, {
addCatItems: function() {
var scCart = new GlideRecord("sc_cart");
scCart.addQuery("user", gs.getUserID());
scCart.query();
if (scCart.next()) {
var scCartID = scCart.sys_id;
var catItemSysID = 'SYS_ID_OF_CAT_ITEM';
var scCartItem = new GlideRecord("sc_cart_item");
scCartItem.addQuery("cart", scCartID);
scCartItem.addQuery("cat_item", catItemSysID);
scCartItem.query();
if (!scCartItem.next()) {
var variable1 = this.getParameter('sysparm_variable1');
var variable2 = this.getParameter('sysparm_variable2');
var itemID = catItemSysID;
scCartItem.initialize();
scCartItem.cart = scCartID;
scCartItem.cat_item = itemID;
scCartItem.quantity = 1;
var rc = scCartItem.insert();
var ci = GlideappCatalogItem.get(itemID);
var gr = ci.getStandaloneVariables();
var seq = ci.getKeySequence();
while (gr.next()) {
var question = new GlideappQuestion(gr.sys_id);
var variable = new GlideRecord('sc_item_option');
variable.initialize();
variable.item_option_new = gr.sys_id;
var variableValue = "";
var variableName = variable.item_option_new.name.toString();
switch (variableName) {
case 'variable1':
variableValue = variable1;
break;
case 'variable2':
variableValue = variable2;
break;
default:
variableValue = question.getValue();
break;
}
variable.value.setValue(variableValue);
variable.cart_item = rc;
for (var i = 0; i < seq.size(); i++) {
if (seq.get(i) + "" == gr.sys_id + "")
variable.order = i + "";
}
variable.insert();
}
}
}
return 'proceed';
},
type: 'AJAXAddCatItems'
});
You can repeat lines 11-53 to add other items into the cart or better yet create a function that is called so you don't repeat the code. But hopefully this gets you started.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-22-2015 03:29 PM
I will write a detailed writeup. Also you will have to use this on Before / After insert Business Rule when the one Catalog Item is submitted.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-22-2015 03:38 PM
Ah. I tried that, too, but I couldn't figure out what table the Business Rule is running on.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-23-2015 08:40 AM
I would agree with Abhiram and you can use a catalog item and then you can automatically add other items into the user's cart via client script on the submit of the cart via an AJAX call. Below is some sample code:
On Submit Client Script:
var ajax = new GlideAjax('AJAXAddCatItems');
ajax.addParam('sysparm_name', 'addCatItems');
ajax.addParam('sysparm_variable1', g_form.getValue('variable1'));
ajax.addParam('sysparm_variable2', g_form.getValue('variable2'));
ajax.getXMLWait();
Then create an AJAX script include to add the catalog items. You will notice that I did not use the script in the Wiki article that Abhiram included and that is because calling new Cart() clears the user's existing cart which is not what I wanted. So I took code from the out of the box Script Included named Cart, which is the code that it was calling. Below is example code for your new AJAX Script Include based on the above example
var AJAXAddCatItems = Class.create();
AJAXValidateInstance.prototype = Object.extendsObject(AbstractAjaxProcessor, {
addCatItems: function() {
var scCart = new GlideRecord("sc_cart");
scCart.addQuery("user", gs.getUserID());
scCart.query();
if (scCart.next()) {
var scCartID = scCart.sys_id;
var catItemSysID = 'SYS_ID_OF_CAT_ITEM';
var scCartItem = new GlideRecord("sc_cart_item");
scCartItem.addQuery("cart", scCartID);
scCartItem.addQuery("cat_item", catItemSysID);
scCartItem.query();
if (!scCartItem.next()) {
var variable1 = this.getParameter('sysparm_variable1');
var variable2 = this.getParameter('sysparm_variable2');
var itemID = catItemSysID;
scCartItem.initialize();
scCartItem.cart = scCartID;
scCartItem.cat_item = itemID;
scCartItem.quantity = 1;
var rc = scCartItem.insert();
var ci = GlideappCatalogItem.get(itemID);
var gr = ci.getStandaloneVariables();
var seq = ci.getKeySequence();
while (gr.next()) {
var question = new GlideappQuestion(gr.sys_id);
var variable = new GlideRecord('sc_item_option');
variable.initialize();
variable.item_option_new = gr.sys_id;
var variableValue = "";
var variableName = variable.item_option_new.name.toString();
switch (variableName) {
case 'variable1':
variableValue = variable1;
break;
case 'variable2':
variableValue = variable2;
break;
default:
variableValue = question.getValue();
break;
}
variable.value.setValue(variableValue);
variable.cart_item = rc;
for (var i = 0; i < seq.size(); i++) {
if (seq.get(i) + "" == gr.sys_id + "")
variable.order = i + "";
}
variable.insert();
}
}
}
return 'proceed';
},
type: 'AJAXAddCatItems'
});
You can repeat lines 11-53 to add other items into the cart or better yet create a function that is called so you don't repeat the code. But hopefully this gets you started.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-23-2015 09:05 AM
Thank you for this. I was kind of heading this way late yesterday, but I haven't worked much with GlideAjax, so I wasn't sure how to proceed. This gives me a good framework to work from.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-26-2015 05:00 PM
OK. I got this working to submit 8 items on a single request. I'm very happy. Now there's one more requirement: display the catalog checkout page, so the user can add other items if they want before checkout. The UI page is com.glideapp.servicecatalog_cart_view. I've added this to my AJAX script include:
var dialog=new GlideDialogWindow('com.glideapp.servicecatalog_cart_view');
dialog.setSize(800,1200);
dialog.render();
which I'm clear display a dialog, which is not exactly what I want, but it does display, but only for a few seconds, then it closes and we see the confirmation screen. I'm not finding examples of how to call this UI Page except through the GlideDialogWindow.