使用Code Igniter进行数据表服务器端处理

时间:2017-09-12 15:48:15

标签: php jquery ajax codeigniter datatables

我正在使用Code Igniter框架构建一个论坛。我正在尝试实现Datatables服务器端处理。我知道如何使用数据表和JQuery进行排序和搜索等操作,但我的数据库表有可能增长到数千并且一次拉动所有行不会让用户非常高兴,所以我试图将两个服务器结合起来侧(代码点火器)和客户端(AJAX)处理,以便使用限制和偏移。所以我深入网络,发现了一个很棒的教程。这就是我所拥有的:

型号:Posts_model.php

<?php
    var $table = 'general_posts';
    var $column_order = array(null, 'title','body','username','time','category'); //set column field database for datatable orderable
    var $column_search = array('title','body','username','time','category'); //set column field database for datatable searchable 
    var $order = array('id' => 'desc'); // default descending order 

    private function get_posts_query() {        
        $this->db->from($this->table);
        $i = 0; 
        foreach ($this->column_search as $item) 
        {
            if($_POST['search']['value']) 
            {               
                if($i===0) // first loop
                {
                    $this->db->group_start(); 
                    $this->db->like($item, $_POST['search']['value']);
                } else {
                    $this->db->or_like($item, $_POST['search']['value']);
                }
                if(count($this->column_search) - 1 == $i) //last loop
                    $this->db->group_end(); 
            }
            $i++;
        }       
        if(isset($_POST['order'])) { 
            $this->db->order_by($this->column_order[$_POST['order']['0']['column']], $_POST['order']['0']['dir']);
        } else if(isset($this->order)) {
            $order = $this->order;
            $this->db->order_by(key($order), $order[key($order)]);
        }
    }

    function get_gen_posts($category) {
        $this->get_posts_query();
        if($_POST['length'] != -1)
        $this->db->limit($_POST['length'], $_POST['start']);
        $this->db->where(array('category' => $category, 'display' => 'true'));
        $query = $this->db->get();
        return $query->result();
    }

    function count_filtered_gen_posts($category) {
        $this->get_posts_query();
        $this->db->where(array('category' => $category, 'display' => 'true'));
        $query = $this->db->get();
        return $query->num_rows();
    }

    public function count_all($category) {
        $this->db->where(array('category' => $category, 'display' => 'true'));
        $this->db->from($this->table);
        return $this->db->count_all_results();
    }

 } ?>

控制器:Posts.php

<?php
    public function __construct() {
        parent::__construct();
        $this->load->model('posts_model','general_posts');
    }

    public function posts($category) {
        $data['category'] = $category;      
        $this->load->view('posts', $data);
    }

    public function posts_ajax($category)
    {
        $list = $this->general_posts->get_gen_posts($category);
        $data = array();
        foreach ($list as $post) {
            $row = array();
            $row[] = $post->title;
            $row[] = $post->body;
            $row[] = $post->category;
            $row[] = $post->poster;
            $row[] = $post->time;
            $data[] = $row; 
        }           
        $output = array(
            "draw" => $_POST['draw'],
            "recordsTotal" => $this->general_posts->count_all($category),
            "recordsFiltered" => $this->general_posts->count_filtered_gen_posts($category),
            "data" => $data,
        );
        //output to json format
        echo json_encode($output);
    }

} ?>

查看:posts.php

    <table id="table" class="table table-no-border" cellspacing="0" width="100%" style="text-align: left">
            <thead>
                <tr>
                    <th></th>
                </tr>
            </thead>
            <tbody>
            </tbody>
        </table>

<script type="text/javascript">
var table;
$(document).ready(function() {
    //datatables
    table = $('#table').DataTable({ 
        "paging": true,
        "pageLength" : 10,
        "lengthChange": true, 
        "searching": true,
        "info": false,
        "autoWidth": true,
        "ordering": false,
        "stateSave": true,
        "processing": true, 
        "serverSide": true, 
        "order": [], //Initial no order.
        // Load data for the table's content from an Ajax source
        "ajax": {
            "url": "<?php echo base_url('posts/posts_ajax/'.$category)?>",
            "dataType": "json",
            "type": "POST",
            "data":{  '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>' }
        },
        //Set column definition initialisation properties.
        "columnDefs": [
        { 
            "targets": [ 0 ], //first column / numbering column
            "orderable": false, //set not orderable
        },
        ],
    });
});
</script>

到目前为止,一切都按预期工作,但它并不完全符合我的需要。看看这些行:

foreach ($list as $post) {
        $row = array();
        $row[] = $post->title;
        $row[] = $post->body;
        $row[] = $post->category;
        $row[] = $post->poster;
        $row[] = $post->time;
        $data[] = $row; 
}   

我希望每行的结果显示在一列中,而不是五列中。这是因为我打算使用Bootstrap面板显示每行的结果,并根据我的需要对其进行自定义。 我希望每个结果都有这样的东西:

帖子标题:bla bla bla
身体到这里了 发表于:类别名称
发布者:海报名称
时间:2017年9月9日晚上10:30:

我想控制每个字段的显示方式,包括样式和格式,例如将时间字段转换为更易于阅读的内容(例如,2017年9月9日晚上10:30)。问题是,因为循环是在控制器内部创建的(而不是在视图中,我已经习惯了),所以我不知道如何去做。我知道如果我可以得到表体标签之间的循环(这里),我可以做我想要的,但我不认为AJAX会欣赏它,如果我做的(我试过,'他'没有)。这是我第一次涉足AJAX。

编辑:我想知道是否有办法在视图中使用post_ajax函数的内容,以便我可以将foreach循环放在表的body标记内。 所以我需要帮助。请帮忙!对不起,这么久......

1 个答案:

答案 0 :(得分:0)

跟随镫骨得到结果

第 1 步:- 在视图侧粘贴下面的代码

       <table id="table_lists" class="table table-bordered table-hover table-striped datatable ">
        <thead>
          <tr>
             <th>No</th>
             <th>Date</th>
             <th>Day</th>
             <th>Holiday</th>
             <th>Action</th>
          </tr>
         </thead>
         <tbody>
         </tbody>
      </table> 

      <script type="javascript">
       var t = $('#table_lists').DataTable({

        "processing": true,

        "serverSide": true,

        "ordering": false,

        "ajax": {

            "url": "<?php echo admin_url('employee/lists'); ?>",

            "type": "POST",

        },

        "columns": [

            { "data": "no" },

            { "data": "date" },

            { "data": "day" },

            { "data": "holiday" },

            { "data": "action"},

        ],

    });

      </script>

第 2 步:- 在控制器中创建这样的函数

    public function lists(){
        $json_data = $this->holiday->get_list_table();
        echo json_encode($json_data);
    }

第 3 步:- 在模型中粘贴以下代码 公共函数 get_list_table()

    {

    $params = $columns = $totalRecords = $data = array();
    $params = $_REQUEST;
    $start = $params['start'];
    $where = $sqlTot = $sqlRec = "";

    if( !empty($params['search']['value']) ) {

        $where .=" AND ";

        $where .=" ( ";

        $where .=" name LIKE '%".$params['search']['value']."%' ";

        $where .=" OR DATE_FORMAT(date, \"%d-%m-%Y\") LIKE '%".$params['search']['value']."%' ";

        $where .=" OR DAYNAME(date) LIKE '%".$params['search']['value']."%' ";

        $where .=" )";
    }



    $sql = "SELECT * 

            FROM {$this->tbl_holiday}

            WHERE 1 = 1 {$where}

            ORDER BY date ASC";

    $sqlTot .= $sql;

    $sqlRec .= $sql;

    $sqlRec .=  " LIMIT ".$params['start']." ,".$params['length']." ";

    $queryTot = $this->db->query($sqlTot);

    $totalRecords = $queryTot->num_rows();

    $queryRecords = $this->db->query($sqlRec);

    $results = $queryRecords->result();

    $i = ($start + 1);

    if(!empty($results)) {

        foreach ($results as $result) {

            $actions = '<a href="javascript:void(0);" onclick="javascript: editHoliday('.$result->id.');" class="btn btn-info btn-sm">

                            <i class="fa fa-edit"></i>

                        </a>&nbsp;&nbsp;

                        <a href="javascript:void(0);" title="Delete" data-toggle="modal" data-target="#confirm-delete" class="btn btn-danger btn-sm" data-href="'.admin_url('holiday/delete/'.$result->id).'">

                            <i class="fa fa-trash"></i>

                        </a>';

            $data[] = array(

                'no'    => $i,

                'date'    => date('d-m-Y', strtotime($result->date)),

                'day'    => date('l', strtotime($result->date)),

                'holiday' => $result->name,

                'action'  => $actions,

            );

            $i++;

        }

    }

    $json_data = array(

        "draw"            => intval( $params['draw'] ),

        "recordsTotal"    => intval( $totalRecords ),

        "recordsFiltered" => intval($totalRecords),

        "data"            => $data   // total data array

    );

    return $json_data;

}