Codeigniter – Как получить данные данных из ajax?

Я работаю над приложением на основе CodeIgniter. Здесь код:

Контроллер :

public function index(){ $data = array( 'record' => $this->Parameter_model->get_parameter('tbl_parameter') ); $this->site->view('parameter', $data); } 

Модель :

 public function get_parameter($table){ $query = $this->db->query("select * from $table order by 'parameter_ID' ASC"); if($query->num_rows() > 0){ foreach($query->result_array() as $row){ $data[] = $row; } $query->free_result(); } else{ $data = NULL; } return $data; } 

Вид :

 <table id="parameter" class="listdata table table-bordered table-striped table-hover"> <thead> <tr> <th class="text-nowrap">Parameter</th> <th class="text-nowrap">Method</th> <th class="text-nowrap">Type</th> <th class="text-nowrap">Action</th> </tr> </thead> <tbody> <?php if(!empty($record)):?> <?php foreach($record as $row):?> <tr align="center"> <td class="text-nowrap"><a href="<?=set_url('parameter/parameter_view/'.$row['parameter_ID']);?>"><strong><?php echo $row['parameter_name'];?></strong></a></td> <td class="text-nowrap"><?php echo $row['parameter_method'];?></td> <td class="text-nowrap"> <?php if($row['parameter_type'] == "1"){ echo "General"; } else{ echo "COA Only"; } ?> </td> <td class="text-nowrap"> <div> <a href="<?=set_url('parameter#edit?parameter_ID='.$row['parameter_ID']);?>" class="btn btn-warning btn-xs">Edit</a> <a href="<?=set_url('parameter/parameter_view/'.$row['parameter_ID']);?>" class="btn btn-success btn-xs">Lihat</a> <a href="<?=set_url('parameter#hapus?parameter_ID='.$row['parameter_ID']);?>" class="btn btn-danger btn-xs">Hapus</a> </div> </td> </tr> <?php endforeach;?> <?php endif;?> </tbody> <tfoot> <tr> <th class="text-nowrap">Parameter</th> <th class="text-nowrap">Method</th> <th class="text-nowrap">Type</th> <th class="text-nowrap">Action</th> </tr> </tfoot> </table> 

Javascript :

 // parameter // Setup - add a text input to each footer cell $('#parameter tfoot th').each( function () { var title = $(this).text(); $(this).html( '<input type="text" style="width:100%;" title="Search '+title+'" placeholder="Search '+title+'" />' ); } ); // DataTable var table = $('#parameter').DataTable({ paging: true, searching: true, ordering: true, "order": [[ 0, "asc" ]], scrollX: true, scroller: true, }); // Apply the search table.columns().every( function () { var that = this; $( 'input', this.footer() ).on( 'keyup change', function () { if ( that.search() !== this.value ) { that .search( this.value ) .draw(); } } ); } ); 

Над кодом работает хорошо.

Теперь я хочу получить данные в table id="parameter" помощью ajax-запроса. Я создаю запрос ajax из url, скажем отсюда http://'+host+path+'/action/ambil , где var path = window.location.pathname; и var host = window.location.hostname; ,

Ответ ajax дает:

 {"record":[{"parameter_ID":"1","parameter_name":"pH","parameter_method":"(pH meter)","parameter_type":"1",{"parameter_ID":"2","parameter_name":"Viscosity","parameter_method":"(Brookfield-Viscometer)","parameter_type":"1"}]} 

Вопрос
Как настроить datatable с источником данных Ajax и как отображать данные в таблице, поэтому я могу использовать данные, например, для создания ссылки, такой как код
<a href="<?=set_url('parameter/parameter_view/'.$row['parameter_ID']);?>">

Вы можете сделать dataTable по сценарию на стороне сервера, как показано ниже.

  1. Измените свой контроллер так, чтобы он обрабатывал вызов на стороне сервера из datatable, и вы можете создавать динамические ссылки только в контроллере. Я добавил комментарий в контроллер для получения дополнительной информации.
  2. Измените свой скрипт, чтобы вызвать его с помощью ajax.
  3. Не загружайте какую-либо вещь во время загрузки страницы.
  4. Примечание. Я пропустил часть модели, в которой я использовал прямой запрос. Надеюсь, вы сможете его изменить.

Contorller

 public function index() { $data = array(); 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('parameter', 'method', 'type');/** set your data base column name here for sorting* */ $orderColumn = isset($order[0]['column']) ? $column[$order[0]['column']] : 'parameter'; $orderDirection = isset($order[0]['dir']) ? $order[0]['dir'] : 'asc'; $ordrBy = $orderColumn . " " . $orderDirection; if (isset($search['value']) && !empty($search['value'])) { /** creat sql or call Model * */ /** $this->load->model('Parameter_model'); $this->Parameter_model->get_parameter('tbl_parameter'); * */ /** I am calling sql directly in controller for your answer * Please change your sql according to your table name * */ $sql = "SELECT * FROM TABLE_NAME WHERE column_name '%like%'" . $search['value'] . " order by " . $ordrBy . " limit $offset,$limit"; $sql = "SELECT count(*) FROM TABLE_NAME WHERE column_name '%like%'" . $search['value'] . " order by " . $ordrBy; $result = $this->db->query($sql); $result2 = $this->db->query($sql2); $count = $result2->num_rows(); } else { /** * If no seach value avaible in datatable */ $sql = "SELECT * FROM TABLE_NAME order by " . $ordrBy . " limit $offset,$limit"; $sql2 = "SELECT * FROM TABLE_NAME order by " . $ordrBy; $result = $this->db->query($sql); $result2 = $this->db->query($sql2); $count = $result2->num_rows(); } /** create data to display in dataTable as you want **/ $data = array(); if (!empty($result->result())) { foreach ($result->result() as $k => $v) { $data[] = array( /** you can add what ever anchor link or dynamic data here **/ 'parameter' => "<a href=".set_url('parameter/parameter_view/'.$v['parameter_ID'])."><strong>".$v['parameter_name']."</strong></a>", 'method' => "<a href=".set_url('parameter/parameter_view/'.$v['parameter_ID'])."><strong>".$v['parameter_name']."</strong></a>", 'parameter_type' => "<a href=".set_url('parameter/parameter_view/'.$v['parameter_ID'])."><strong>".$v['parameter_name']."</strong></a>", 'actions' => "<a href=".set_url('parameter/parameter_view/'.$v['parameter_ID'])."><strong>".$v['parameter_name']."</strong></a>" ); } } /** * draw,recordTotal,recordsFiltered is required for pagination and info. */ $results = array( "draw" => $this->input->get('draw'), "recordsTotal" => count($data), "recordsFiltered" => $count, "data" => $data ); echo json_encode($results); } else { /** this will load by default with no data for datatable * we will load data in table through datatable ajax call */ $this->site->view('parameter', $data); } } 

Посмотреть

  <table id="parameter" class="listdata table table-bordered table-striped table-hover"> <thead> <tr> <th class="text-nowrap">Parameter</th> <th class="text-nowrap">Method</th> <th class="text-nowrap">Type</th> <th class="text-nowrap">Action</th> </tr> </thead> <tbody> /** tbody will be empty by default. **/ </tbody> <tfoot> <tr> <th class="text-nowrap">Parameter</th> <th class="text-nowrap">Method</th> <th class="text-nowrap">Type</th> <th class="text-nowrap">Action</th> </tr> </tfoot> </table> 

скрипт

  <script> $(document).ready(function() { $('#example').DataTable({ url: '<?php base_url(); ?>controllerName/index', processing: true, serverSide: true, paging: true, searching: true, ordering: true, order: [[0, "asc"]], scrollX: true, scroller: true, columns: [{data: "parameter"}, {data: "method"}, {data: "parameter_type"}, {data: "action"}] /** this will create datatable with above column data **/ }); }); </script> 

Если вы хотите использовать некоторую стороннюю библиотеку, проверьте это . Для вашего запроса модели вы можете настроить его как упоминание в этом сообщении .

Вы можете проверить эту статью . Хотя я написал это с использованием raw php, вы можете легко реализовать его, создав отдельную библиотеку с использованием этого класса ssp и создав этот тип ссылок.