[jQuery + PHP Datatables服务器端处理,带有列过滤

问题描述 投票:0回答:1

我已经用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方面有问题吗?

附带说明:在任何人指出之前,我知道这里需要完成一些安全工作。

php jquery datatables
1个回答
0
投票

在您的函数中:initAdultTable()您没有返回Datatable API,而是始终返回true。 return a = whatever;将不会返回a的值,而是会返回boolean: true,因为它已成功将值分配给a

第一次使用是因为您在准备好文档时调用了initAdultTable()。它获取数据并填写表格。

第二次,您期望它返回您希望排序/过滤的数据集,但它就像第一次填充所有数据一样,并返回true。您正在尝试对boolean进行排序,因此会出现错误。

像这样更改功能initAdultTable() ...

function initAdultTable() {
  return $('#members').DataTable({
     //......
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.