You need to sign in to do that
Don't have an account?
Div403
How can i add checkbox to the below code in JSON?
Hi All,
I am able to display set of records in visual force page using JSON.
Please guide me how to add checkboxes to the below code
Apex Class
global class DataTableController {
// Defines shape of JSON response
global class Response {
public Integer sEcho;
public Integer iTotalRecords;
public Integer iTotalDisplayRecords;
public SObject[] aaData;
Response(Integer echo, Integer total, SObject[] sobs) {
this.sEcho = echo;
this.iTotalRecords = total;
this.iTotalDisplayRecords = total;
this.aaData = sobs;
}
}
// DataTable passes JSON definition of what server should do
private class Params {
Map<String, Object> m = new Map<String, Object>();
Integer echo;
Integer start;
Integer length;
String[] columns;
Integer[] sortColumns;
String[] sortDirections;
Params(List<Map<String, Object>> request) {
for (Map<String, Object> r : request) {
m.put((String) r.get('name'), r.get('value'));
}
echo = integer('sEcho');
start = integer('iDisplayStart');
length = integer('iDisplayLength');
columns = stringArray('mDataProp');
sortColumns = integerArray('iSortCol');
sortDirections = stringArray('sSortDir');
}
String[] stringArray(String prefix) {
String[] strings = new String[] {};
for (Object o : array(prefix)) {
strings.add(o != null ? esc(String.valueOf(o)) :null);
}
return strings;
}
Integer[] integerArray(String prefix) {
Integer[] integers = new Integer[] {};
for (Object o : array(prefix)) {
integers.add(o != null ? Integer.valueOf(o) : null);
}
return integers;
}
Object[] array(String prefix) {
Object[] objects = new Object[] {};
for (Integer i = 0; true; i++) {
Object o = m.get(prefix + '_' + i);
if (o != null) {
objects.add(o);
} else {
break;
}
}
return objects;
}
Integer integer(String name) {
Object o = m.get(name);
if (o instanceof Decimal) {
return ((Decimal) o).intValue();
} else if (o instanceof Integer) {
return (Integer) o;
} else {
return null;
}
}
// Guard against SOQL injection
String esc(String s) {
return s != null ? String.escapeSingleQuotes(s) : null;
}
}
@RemoteAction
global static Response contacts(List<Map<String, Object>> request) {
Params p = new Params(request);
String soql = ''
+ ' select ' + String.join(p.columns, ', ')
+ ' from Contact'
+ ' order by ' + String.join(orderBys(p), ', ')
+ ' limit :length'
+ ' offset :start'
;
System.debug('>>> soql=' + soql);
Integer start = p.start;
Integer length = p.length;
return new Response(
p.echo,
[select Count() from Contact limit 40000],
Database.query(soql)
);
}
private static String[] orderBys(Params p) {
Map<String, String> soqlDirections = new Map<String, String>{
'asc' => 'asc nulls last',
'desc' => 'desc nulls first'
};
String[] orderBys = new String[] {};
Integer min = Math.min(p.sortColumns.size(), p.sortDirections.size());
for (Integer i = 0; i < min; i++) {
orderBys.add(''
+ p.columns[p.sortColumns[i]]
+ ' '
+ soqlDirections.get(p.sortDirections[i])
);
}
return orderBys;
}
}
Visula Force Page
<apex:page controller="DataTableController">
<link
rel="stylesheet"
type="text/css"
href="https://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css"
/>
<apex:sectionHeader title="DataTables"/>
<table id="table" cellpadding="0" cellspacing="0" border="0">
<thead>
<th>Name</th>
<th>Birthdate</th>
<th>Phone</th>
<th>Email</th>
</thead>
<tbody>
</tbody>
</table>
<script
type="text/javascript"
charset="utf8"
src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"
>
</script>
<script
type="text/javascript"
charset="utf8"
src="https://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"
>
</script>
<script>
var j$ = jQuery.noConflict();
var fields = ['Name', 'Birthdate', 'Phone', 'Email'];
var aoColumns = [];
for (var i = 0; i < fields.length; i++) {
aoColumns.push({'mData': fields[i]});
}
j$(document).ready(function() {
j$('#table').dataTable({
'aoColumns': aoColumns,
'bProcessing': true,
'bServerSide': true,
'bFilter': false,
'sAjaxSource': 'fakeUrl',
'fnServerData': function(sSource, aoData, fnCallback) {
console.log(JSON.stringify(aoData));
// Call the @RemoteAction JavaScript function
DataTableController.contacts(aoData, function(result, event) {
if (event.type != 'exception') {
console.log(JSON.stringify(result));
for (var i = 0; i < result.aaData.length; i++) {
var r = result.aaData[i];
for (var j = 0; j < fields.length; j++) {
var field = fields[j];
if (r[field] == undefined) {
// DataTables pops a dialog for undefined values
r[field] = null;
} else if (field == 'Birthdate') {
// Dates transmitted as longs
var d = new Date(r[field]);
r[field] = ''
+ (d.getMonth() + 1)
+ '/'
+ d.getDate()
+ '/'
+ d.getFullYear()
;
}
}
}
// Call back into the DataTable function
fnCallback(result);
} else {
alert(event.message);
}
});
}
});
});
</script>
</apex:page>
I am able to display set of records in visual force page using JSON.
Please guide me how to add checkboxes to the below code
Apex Class
global class DataTableController {
// Defines shape of JSON response
global class Response {
public Integer sEcho;
public Integer iTotalRecords;
public Integer iTotalDisplayRecords;
public SObject[] aaData;
Response(Integer echo, Integer total, SObject[] sobs) {
this.sEcho = echo;
this.iTotalRecords = total;
this.iTotalDisplayRecords = total;
this.aaData = sobs;
}
}
// DataTable passes JSON definition of what server should do
private class Params {
Map<String, Object> m = new Map<String, Object>();
Integer echo;
Integer start;
Integer length;
String[] columns;
Integer[] sortColumns;
String[] sortDirections;
Params(List<Map<String, Object>> request) {
for (Map<String, Object> r : request) {
m.put((String) r.get('name'), r.get('value'));
}
echo = integer('sEcho');
start = integer('iDisplayStart');
length = integer('iDisplayLength');
columns = stringArray('mDataProp');
sortColumns = integerArray('iSortCol');
sortDirections = stringArray('sSortDir');
}
String[] stringArray(String prefix) {
String[] strings = new String[] {};
for (Object o : array(prefix)) {
strings.add(o != null ? esc(String.valueOf(o)) :null);
}
return strings;
}
Integer[] integerArray(String prefix) {
Integer[] integers = new Integer[] {};
for (Object o : array(prefix)) {
integers.add(o != null ? Integer.valueOf(o) : null);
}
return integers;
}
Object[] array(String prefix) {
Object[] objects = new Object[] {};
for (Integer i = 0; true; i++) {
Object o = m.get(prefix + '_' + i);
if (o != null) {
objects.add(o);
} else {
break;
}
}
return objects;
}
Integer integer(String name) {
Object o = m.get(name);
if (o instanceof Decimal) {
return ((Decimal) o).intValue();
} else if (o instanceof Integer) {
return (Integer) o;
} else {
return null;
}
}
// Guard against SOQL injection
String esc(String s) {
return s != null ? String.escapeSingleQuotes(s) : null;
}
}
@RemoteAction
global static Response contacts(List<Map<String, Object>> request) {
Params p = new Params(request);
String soql = ''
+ ' select ' + String.join(p.columns, ', ')
+ ' from Contact'
+ ' order by ' + String.join(orderBys(p), ', ')
+ ' limit :length'
+ ' offset :start'
;
System.debug('>>> soql=' + soql);
Integer start = p.start;
Integer length = p.length;
return new Response(
p.echo,
[select Count() from Contact limit 40000],
Database.query(soql)
);
}
private static String[] orderBys(Params p) {
Map<String, String> soqlDirections = new Map<String, String>{
'asc' => 'asc nulls last',
'desc' => 'desc nulls first'
};
String[] orderBys = new String[] {};
Integer min = Math.min(p.sortColumns.size(), p.sortDirections.size());
for (Integer i = 0; i < min; i++) {
orderBys.add(''
+ p.columns[p.sortColumns[i]]
+ ' '
+ soqlDirections.get(p.sortDirections[i])
);
}
return orderBys;
}
}
Visula Force Page
<apex:page controller="DataTableController">
<link
rel="stylesheet"
type="text/css"
href="https://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css"
/>
<apex:sectionHeader title="DataTables"/>
<table id="table" cellpadding="0" cellspacing="0" border="0">
<thead>
<th>Name</th>
<th>Birthdate</th>
<th>Phone</th>
<th>Email</th>
</thead>
<tbody>
</tbody>
</table>
<script
type="text/javascript"
charset="utf8"
src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"
>
</script>
<script
type="text/javascript"
charset="utf8"
src="https://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"
>
</script>
<script>
var j$ = jQuery.noConflict();
var fields = ['Name', 'Birthdate', 'Phone', 'Email'];
var aoColumns = [];
for (var i = 0; i < fields.length; i++) {
aoColumns.push({'mData': fields[i]});
}
j$(document).ready(function() {
j$('#table').dataTable({
'aoColumns': aoColumns,
'bProcessing': true,
'bServerSide': true,
'bFilter': false,
'sAjaxSource': 'fakeUrl',
'fnServerData': function(sSource, aoData, fnCallback) {
console.log(JSON.stringify(aoData));
// Call the @RemoteAction JavaScript function
DataTableController.contacts(aoData, function(result, event) {
if (event.type != 'exception') {
console.log(JSON.stringify(result));
for (var i = 0; i < result.aaData.length; i++) {
var r = result.aaData[i];
for (var j = 0; j < fields.length; j++) {
var field = fields[j];
if (r[field] == undefined) {
// DataTables pops a dialog for undefined values
r[field] = null;
} else if (field == 'Birthdate') {
// Dates transmitted as longs
var d = new Date(r[field]);
r[field] = ''
+ (d.getMonth() + 1)
+ '/'
+ d.getDate()
+ '/'
+ d.getFullYear()
;
}
}
}
// Call back into the DataTable function
fnCallback(result);
} else {
alert(event.message);
}
});
}
});
});
</script>
</apex:page>
Shashank (Salesforce Developers)
You may need a wrapper class: https://developer.salesforce.com/page/Wrapper_Class