繁体   English   中英

jQuery + PHP 使用列过滤的数据表服务器端处理

[英]jQuery + PHP Datatables Server Side Processing with Column Filtering

我已经使用 jQuery 数据表和全局过滤器实现了 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>

在尝试了许多实现之后,这是让我最接近我想做的一个。 最初它给了我一个未定义表的错误,所以我将表的初始化放入 function 并返回它的值。 在加载数据表时按预期呈现,但是当我搜索时它给了我这个错误:

无法设置 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 
            }

我删除了一些列和部分查询,以便某人更容易和更实用地查看。

不知道我在这里做错了什么,我可以看到我正在过滤的数据正在添加到column[x][search][value] = 'search value'下的请求中,我可以假设我做错了什么在 PHP 一侧?

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

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

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

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

像这样更改 function initAdultTable() ...

function initAdultTable() {
  return $('#members').DataTable({
     //......
  });
}

您需要将数据表分配给全局变量tablessp ,以便可以在需要时在其他函数中访问它。

这是可能对您有帮助的代码!

<script type="text/javascript">
// define variable for table globally
var tablessp;
$(document).ready(function() {
   initAdultTable();
});

function initAdultTable () {
    // do not return anything here
    tablessp = $('#members').DataTable({
        // Your code
    });
}

function searchAdultData() {
    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() {
    $('#membersForm')[0].reset();

    tablessp.search('');
    tablessp.draw();    
}
</script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM