我已经用jQuery Datatables和全局过滤器实现了SSP,但经过审查,我想实现特定的列过滤,但是遇到了问题。这是我到目前为止的代码:
Javascript:
$(document).ready(function() {
initAdultTable();
});
function initAdultTable () {
return tablessp = $('#members').DataTable({
url: '<?php echo site_url("members"); ?>',
processing: true,
serverSide: true,
paging: true,
searching: true,
pageLength: 25,
lengthMenu: [[10, 25, 50, 100, 500, 1000,5000], [10, 25, 50, 100, 500, 1000, "All"]],
deferRender: true,
dom: 'flBrtip',
retrieve: true,
ordering: true,
order: [[0, "desc"]],
language: {
"lengthMenu": "Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing _MAX_ entries",
"infoEmpty": "No records available",
"infoFiltered": "( from _TOTAL_ total records)"
},
scrollx: true,
sScrollX: "100%",
columns: [{data: "id"}, {data: "first_name"}, {data: "middle_name"},{data: "last_name"} , {data: "phone_number"} , {data: "company_location"} ,{data: "parent"} ,{data: "agency_location"} , {data: "Age"} , {data: "gender"} , {data: "education_level"} , {data: "marital_status"} , {data: "office_pos"} , {data: "email"}, {data: "membership_status"}, {data: "active_status"}, {data: "street_address"}, {data: "postcode"}, {data: "action"} ]
});
}
function searchAdultData(){
var tablessp = initAdultTable();
office_position_id = $('#office_position_id').val();
membership_status_id = $('#membership_status_id').val();
agency_id = $('#agency_id').val();
company_id = $('#company_id').val();
tablessp
.columns(14).search(office_position_id)
.columns(16).search(membership_status_id)
.columns(7).search(agency_id)
.columns(5).search(company_id)
.draw();
}
function resetAdultData(){
var tablessp = initAdultTable();
$('#membersForm')[0].reset();
tablessp.search('');
tablessp.draw();
}
HTML:
<div class="col-sm-12">
<div class="row">
<div class="col-lg-12">
<button type="button" class="btn btn-primary btn-brand--icon" id="kt_search" onClick="searchAdultData();" style="width:100%;">
<span>
<i class="la la-search"></i>
<span>Search</span>
</span>
</button>
<button type="button" class="btn btn-warning btn-warning--icon" id="kt_reset" onClick="resetAdultData();" style="width:100%;">
<span>
<i class="la la-close"></i>
<span>Reset</span>
</span>
</button>
</div>
</div>
</div>
在尝试了许多实现之后,这是使我最接近我想要做的事情的实现。最初,它给我一个错误,即未定义tablesp,因此我将表的初始化放入函数中并返回其值。加载时,数据表按预期方式呈现,但是当我搜索它时,出现此错误:“无法将属性'data'设置为null”
PHP:
<?php
if ($this->input->is_ajax_request()) {
/** this will handle datatable js ajax call * */
/** get all datatable parameters * */
$search = $this->input->get('search') ;/** search value for datatable * */
$offset = $this->input->get('start') ;/** offset value * */
$limit = $this->input->get('length') ;/** limits for datatable (show entries) * */
$order = $this->input->get('order') ;/** order by (column sorted ) * */
$column = array('members.id', 'first_name', 'middle_name','last_name','phone_number','company_location','parent','agency_location','Age','gender','education_level','marital_status','office_pos','email', 'membership_status','active_status','street_address','postcode', 'action');/** set your data base column name here for sorting* */
//$column = array('id');/** set your data base column name here for sorting* */
$type = '';
$orderColumn = isset($order[0]['column']) ? $column[$order[0]['column']] : 'members.id';
$orderDirection = isset($order[0]['dir']) ? $order[0]['dir'] : 'desc';
$ordrBy = $orderColumn . " " . $orderDirection;
if (!empty($search['value'])) {
$type="search";
// RESULT SET WHEN QUERYING
$sql = "SELECT members.`id`,`first_name`, `middle_name`,`last_name`, picture `Photo`, TIMESTAMPDIFF(YEAR, date_birth, CURDATE()) as `Age`, gender, marital_status, members.phone_number, members.email, setting_company.name as `company_name`, setting_office_position.title `office_pos`, setting_company_group._description `company_location`, setting_agency_parent.description `parent`, setting_agency_group.description `agency_location`, street_address , postcode, setting_occupation.title `job`, setting_membership_status.title `membership_status` , active_status, education_level FROM members
** VARIOUS_JOINS_GOES HERE **
WHERE members.company_id = '$company_id' AND (members.membership_status != 10) AND members.age_group = 'Adults'
AND (CONCAT(members.first_name, ' ' , members.middle_name, ' ', members.last_name ) LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_company_group.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_office_position.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_membership_status.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_agency_group.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
order by " . $ordrBy . " limit $offset,$limit";
// QUERY FOR COUNT OF ROWS
$sql2 = "SELECT count(*) as `filtered` FROM members
** VARIOUS_JOINS_GOES HERE **
WHERE members.company_id = '$company_id' AND (members.membership_status != 10) AND members.age_group = 'Adults'
AND (CONCAT(members.first_name, ' ' , members.middle_name, ' ', members.last_name ) LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_company_group.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_office_position.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_membership_status.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
OR (setting_agency_group.id LIKE '%" . $search['value'] . "%' AND members.company_id = '$company_id')
order by " . $ordrBy;
$result = $this->db->query($sql);
$result2 = $this->db->query($sql2)->row();
$count = $result2->filtered;
} else {
DEFAULT DATA WITHOUT FILTER HERE
}
我删除了部分查询列和部分内容,以使他人更轻松,更实用地进行查看。
[不确定我在这里做错了什么,我可以看到我正在过滤的数据正在添加到列[x] [search] [value] ='search value'下的请求中,我可以假设我正在做PHP方面有问题吗?
附带说明:在任何人指出之前,我知道这里需要完成一些安全工作。
在您的函数中:initAdultTable()
您没有返回Datatable API,而是始终返回true。 return a = whatever;
将不会返回a
的值,而是会返回boolean: true
,因为它已成功将值分配给a
。
第一次使用是因为您在准备好文档时调用了initAdultTable()。它获取数据并填写表格。
第二次,您期望它返回您希望排序/过滤的数据集,但它就像第一次填充所有数据一样,并返回true
。您正在尝试对boolean
进行排序,因此会出现错误。
像这样更改功能initAdultTable()
...
function initAdultTable() {
return $('#members').DataTable({
//......
});
}