Ajax and JSON to fill fields

KB15
Giga Guru

My requirement is to return multiple fields from a user's manager's fields (the manager's email and username) based on field. I'm a little lost with JSON with Ajax. I can mostly understand Ajax.

I'm getting confused on the server side section based. I mostly based this on this post: GlideAjax Example Cheat Sheet

I'm not sure how it's getting its query results and how to pull those to the client side to fill in the fields.

This is my client script

function onChange(control, oldValue, newValue, isLoading) {

    if (isLoading || newValue == '') {

          return;

    }

var employee = g_form.getValue('u_employee');

var ga = new GlideAjax('getEmployeeFields');

ga.addParam('sysparm_name', 'getEmployeeData');

ga.addParam('syparm_emp', employee);

ga.getXML(stateCallback);

}

function stateCallback(response) {

var answer = response.responseXML.documentElement.getAttribute('answer');

if (answer) {

var returneddata = answer.evalJSON(true);

//g_form.setValue('y_employee_username', sepEmp.user_name);

//g_form.setValue('y_employee_dn', sepEmp.u_display_name);

//g_form.setValue('y_employee_email', sepEmp.email);

g_form.setValue('y_manager_username', returneddata.manager_username);

//g_form.setValue('y_manager_email', returneddata.manager_email);

}

}

This is my script include

var asu_GetLocationData = Class.create();

asu_GetLocationData.prototype = Object.extendsObject(AbstractAjaxProcessor, {

      getEmployeeData: function () {

              var employee = this.getParameter('sysparm_emp');

              var userTable = new GlideRecord('sys_user');

              if (userTable.get(employee)) {

              var json = new JSON();

              var results = {

              "manage_username": userTable.getValue('manager.user_name'),

              "manager_email": userTable.getValue('manager.email')

            };

            return json.encode(results);

          }          

    }

});

1 ACCEPTED SOLUTION

KB15
Giga Guru

I was able to play around with some of the script and found a few typos. Other than the typos, I was running into an [object Object] error with my results. I used a combination of suggestions this what worked for me. I found that using getDisplayValue() fixed the [object Object] error but I'm not sure if that would be right fix. I'm curious why I couldn't go down another level if I used



userTable.getValue('manager.user_name');



If there are best practices I should be using, please feel free to correct. I'd rather learn the right way.



Server Side


var getEmployeeFields = Class.create();


getEmployeeFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {



getEmployeeData: function () {


var employee = this.getParameter('sysparm_emp');


var userTable = new GlideRecord('sys_user');


if (userTable.get(employee)) {



var results = {


'musername': userTable.getDisplayValue('manager.user_name'),


'memail': userTable.getDisplayValue('manager.email'),


'username': userTable.getValue('user_name'),


'displayname': userTable.getValue('u_display_name'),


'email': userTable.getValue('email')


};



return JSON.stringify(results);


}        


},



type: 'getEmployeeFields'


});



Client Side


function onChange(control, oldValue, newValue, isLoading) {


    if (isLoading || newValue == '') {


          return;


    }



var employee = g_form.getValue('u_employee');



var ga = new GlideAjax('getEmployeeFields');


ga.addParam('sysparm_name', 'getEmployeeData');


ga.addParam('sysparm_emp', employee);


ga.getXML(stateCallback);


}



function stateCallback(response) {


var answer = response.responseXML.documentElement.getAttribute('answer');


if (answer) {


var returneddata = JSON.parse(answer);


g_form.setValue('y_employee_username', returneddata.username);


g_form.setValue('y_employee_dn', returneddata.displayname);


g_form.setValue('y_employee_email', returneddata.email);


g_form.setValue('y_manager_username', returneddata.musername);


g_form.setValue('y_manager_email', returneddata.memail);


}



}


View solution in original post

6 REPLIES 6

dhasselquist
Mega Guru

kkim,



The sysparm_name section of your client script (line 😎 should have it's second argument match the name of the class in line 1 of your server script (in this case, it looks like you copied the name from the example, 'asu_GetLocationData').



The best practices for returning JSON objects has since changed (at least as far as I know).



Here is a pretty simple example, give that a try and let us know.



Script Include:


var UserUtils = Class.create();


UserUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {


getValue: function(){


var userInfo = {};


userInfo.name = 'John';


return JSON.stringify(userInfo);


},


type: 'UserUtils'


});



Client Script:


function onLoad() {


var ga = new GlideAjax('UserUtils');


ga.addParam('sysparm_name','getValue');


ga.getXMLAnswer(emitResponse);


}



function emitResponse(response){


var responseObject = JSON.parse(response);


alert(responseObject);


}


Prateek kumar
Mega Sage

Hello Kim


Can we try something like this


Script Include:


Client callable: checked


Name: GetUserDetails


Script:


var GetUserDetails = Class.create();


GetUserDetails.prototype = Object.extendsObject(AbstractAjaxProcessor, {



getDetails: function(){


var retVal ;


var name= this.getParameter('sysparm_user_id');


var gr = new GlideRecord('sys_user');


gr.addQuery('sys_id', name);


gr.query();


if(gr.next())


{


retVal = gr.manager.email+','+gr.manager.getDisplayValue();


}


return retVal;


},



type: 'GetUserDetails'


});




Client Script: OnChange


function onChange(control, oldValue, newValue, isLoading, isTemplate) {


    if (isLoading || newValue === '') {


          return;


    }


var name = g_form.getValue('u_test_user_select'); //give your variable name on the form


var ga = new GlideAjax('GetUserDetails');


ga.addParam('sysparm_name','getDetails');


ga.addParam('sysparm_user_id',name);


ga.getXML(CallBack);



function CallBack(response){


var answer = response.responseXML.documentElement.getAttribute("answer");


alert(answer);


g_form.setValue('required feild1',answer[0]);


g_form.setValue('required feild2',answers[1]);


}


}



Let me know how it goes



Please mark my response as correct and helpful if it helped solved your question.
-Thanks

Shishir Srivast
Mega Sage

instead of evalJSON in client script, please use JSON.parse, like



in client script:


var returneddata =JSON.parse(answer);


g_form.setValue('u_manager_username', returneddata.manager_username); // I think field name should start with u_ (if it's not a variables)



in script include:


var results = {};


results.manage_username = userTable.manager.user_name;


results.manager_email = userTable.manager.email;



KB15
Giga Guru

I was able to play around with some of the script and found a few typos. Other than the typos, I was running into an [object Object] error with my results. I used a combination of suggestions this what worked for me. I found that using getDisplayValue() fixed the [object Object] error but I'm not sure if that would be right fix. I'm curious why I couldn't go down another level if I used



userTable.getValue('manager.user_name');



If there are best practices I should be using, please feel free to correct. I'd rather learn the right way.



Server Side


var getEmployeeFields = Class.create();


getEmployeeFields.prototype = Object.extendsObject(AbstractAjaxProcessor, {



getEmployeeData: function () {


var employee = this.getParameter('sysparm_emp');


var userTable = new GlideRecord('sys_user');


if (userTable.get(employee)) {



var results = {


'musername': userTable.getDisplayValue('manager.user_name'),


'memail': userTable.getDisplayValue('manager.email'),


'username': userTable.getValue('user_name'),


'displayname': userTable.getValue('u_display_name'),


'email': userTable.getValue('email')


};



return JSON.stringify(results);


}        


},



type: 'getEmployeeFields'


});



Client Side


function onChange(control, oldValue, newValue, isLoading) {


    if (isLoading || newValue == '') {


          return;


    }



var employee = g_form.getValue('u_employee');



var ga = new GlideAjax('getEmployeeFields');


ga.addParam('sysparm_name', 'getEmployeeData');


ga.addParam('sysparm_emp', employee);


ga.getXML(stateCallback);


}



function stateCallback(response) {


var answer = response.responseXML.documentElement.getAttribute('answer');


if (answer) {


var returneddata = JSON.parse(answer);


g_form.setValue('y_employee_username', returneddata.username);


g_form.setValue('y_employee_dn', returneddata.displayname);


g_form.setValue('y_employee_email', returneddata.email);


g_form.setValue('y_manager_username', returneddata.musername);


g_form.setValue('y_manager_email', returneddata.memail);


}



}