2017-12-19 12 views
5

200 개 이상의 행을 포함하는 DataTables를 사용하는 사용자 테이블이 있습니다. DataTables를 기본값 인 "pageLength": 10으로 사용할 때보기에는 좋았습니다.이 예제는 테이블입니다.Ajax가있는 DataTable이 사용 후 제대로 작동하지 않습니다. serverSide : true

Username  | Type | Request | 
user01    1   request01 
user02    1   request02 
user03    2   request03 
user04    1   request04 
user05    1   request05 
user06    1   request06 
user07    1   request07 
user08    1   request08 
user09    1   request09 
user10    1   request10 

Showing 1 to 10 of 200 entries그래서 우선 이전1 2 3 ... (20) 다음 마지막

로딩 t 저감 예, 나는 "processing": true"serverSide": true을 사용하기로 결정했습니다. 그런 다음이 "serverSide" : true과 관련된 문제가 발생했습니다. 테이블에 200 행의 데이터를 인쇄합니다.

Showing 0 to 0 of 0 entries (filtered from NaN total entries). 그러면 페이지 매김이 계속 인쇄되고 페이지 을 클릭하면 아무 효과가 없습니다.

DataTables가 첫 번째 데이터를 얻지 못해 을 클릭하면 10 개가 더 늘어납니다. 내 조회수 +에 JS

:

<select name="task" id="task"> 
    <option value="1">Task 1</option> 
    <option value="2">Task 2</option> 
</select> 
<table id="user-request" class="table"> 
<thead> 
    <tr> 
     <th>Username</th> 
     <th>Type</th> 
     <th>Request</th> 
    </tr> 
</thead> 
</table> 
<script> 
... on task change ... 
... var task = $("#task").val(); ... 
    $('#user-request').DataTable({ 
     'processing': true, 
     'serverSide': true, 
     'ajax': { 
      'type': 'POST', 
      'url': base_url+'user/get_user_request', 
      'data': {"task":task,"csrf_token":$("input[name=csrf_token]").val()} 
     } 
    }) 
</script> 

: 나는 CodeIgniter를 사용하고

가 여기 내 코드입니다 작업은 클래스 1 또는 클래스와 같은 다른 그룹, 예입니다 2, 오차드 대학 또는 하버드 대학교

컨트롤러 :

모델에 91,363,210
$task = $this->input->post('task', TRUE); 
$user_request = $this->model->all_user_request(task); 
foreach ($user_request as $ur) 
{ 
    $arr = array(); 
    $arr[] = $ur->username; 
    $arr[] = $ur->type; 
    $arr[] = $ur->request; 
    $data[] = $arr; 
} 
$output = array(
    "data" => $data 
); 
if (COUNT($output) > 0) 
{ 
    echo json_encode($output); 
} 

:

public function all_user_request($task_id) { 
    $query = "SELECT * FROM user_request WHERE task_id = ?"; 
    return $this->db->query($query, $task_id)->result(); 
} 

: 모델에서 실제로 2 INNER JOIN을 사용하고, 난 그냥 여기 만 요청의 선택을 단순화하고 있습니다. (여기서만 역 정규화 테이블로 변환).

숫자 데이터를 사용하여 draw, recordsTotal, recordsFiltered ~ $output을 (를) 내 컨트롤러에 추가하려고했습니다. 예

$output = array(
    "draw" => 5, 
    "recordsTotal" => 5, 
    "recordsFiltered" => 5, 
    "data" => $data 
); 
if (COUNT($output) > 0) 
{ 
    echo json_encode($output); 
} 

나는 대답을 검색했지만, 나는 문제가 여기에있다 생각하지만 난 아직도 내가 draw 받아야 아무 생각이 없다 - recordsTotal - recordsFiltered 데이터를. 나는 다른 사람들로부터 또 다른 대답을보고, 그들은 "draw" => $_POST['draw']을 사용하고, 나는 그것을 시도했고, 그것은 아무것도하지 않는다.

그래서 숫자 데이터를 사용하려고 노력하고 있습니다. 결과는 여전히 동일합니다. 이걸 좀 도와 줘. 그것은 여전히 ​​테이블에 200 행의 데이터를 인쇄합니다.

Showing 0 to 0 of 0 entries (filtered from NaN total entries). 그러면 페이지 매김이 계속 인쇄되고 페이지 을 클릭하면 아무 효과가 없습니다.

+0

가 구체적으로 어떤 오류 여기에서 발생되고있다? 질문에 추가하십시오. – Akintunde007

+0

안녕하세요 @Akintunde, 상단에 오류를 추가했지만 내 질문을 편집하여 하단에 다시 추가했습니다. – Zinc

답변

3

Datatables는 당신이 필요로하는 모든 것을 보낼 모델 기능 - 사용자가 네트워크에서 콘솔에서 살펴 경우 당신

01을 다음과 같이 '가 서버에

GET 매개 변수를 그 요청을 보낼 아약스-얻을 방법을 사용하는 것을 볼 것이다 2,

당신은 의미 전체 목록 here

찾을 수 있습니다 -

가 같은

뭔가

public function all_user_request($task_id) 
{ 
    $intStart = intval($this->input->get("start")); 
    $intLength = intval($this->input->get("length")); 
    $strSearch = (strlen($this->input->get("search")["value"]) >= 2) ? $this->input->get("search",true)["value"] : false; 
    $order = $this->input->get("order",true); 


    $this->setQuery($task_id,$strSearch); 

    $query = $this->db->get(); 
    $this->recordsTotal = $query->num_rows(); 

    $this->setQuery($task_id, $strSearch); 

    if ($intStart >= 0 && $intLength > 0) 
    { 
     $this->db->limit($intLength,$intStart); 
    } 

    $strOrderField = 'username'; 
    $strDirection = "ASC"; 
    if (is_array($order)) 
    { 
     switch($order[0]['column']) 
     { 
      case 1: 
       $strOrderField = 'type'; 
       break; 
      case 2: 
       $strOrderField = 'request'; 
       break; 

     } 
     if (!empty($order[0]['dir'])) $strDirection = $order[0]['dir']; 
    } 
    $this->db->order_by($strOrderField,$strDirection); 


    $query = $this->db->get(); 

    $arrData = $query->result(); 

    return $arrData; 

} 

public function getRecordsTotal() 
{ 
    return $this->recordsTotal; 
} 

private function setQuery($task_id, $strSearch="") 
{ 
    $this->db 
     ->select('*') 
     ->from('user_request') 
     ->where('task_id', $task_id); 

    if (!empty($strSearch)) 
    { 
     $this->db->like('task_id', $strSearch); 
    } 

} 

를 작동해야 제대로 모델을 적응했습니다를 ... 그리고 귀하의 컨트롤러

//controller 
$task = $this->input->post('task', TRUE); 
$user_request = $this->model->all_user_request($task); 

$data = []; 
foreach ($user_request as $ur) 
{ 
    $data[] = [ 
     $ur->username, 
     $ur->type, 
     $ur->request 
    ]; 
} 

$arrCompiledData = [ 
    'data' => $data, 
    'draw' => $this->input->get('draw'), 
    'recordsTotal' => $this->model->getRecordsTotal(), 
    'recordsFiltered' => $this->model->getRecordsTotal(), 
]; 

$this->output 
    ->set_content_type('application/json') 
    ->set_output(json_encode($arrCompiledData)); 

나는 단지 이것을 썼다는 것을 명심해라. 오타가있을 수도 있지만, datatables 요청의 서버 측 처리가 어떻게 작동해야하는지 이해할 수 있어야한다.

+0

감사합니다. 코드를 확인해주십시오. – Zinc

+0

안녕하세요, @ sintakonte, 귀하의 코드를 사용하려고했습니다. 페이지 번호 변경 후 레코드의 결과가 이미 변경되어 행 항목이 변경됩니다. 하지만 여전히 문제가 있습니다. 여전히 테이블에 200 행의 데이터를 인쇄합니다. 쿼리에'-> limit (10)'을 추가하려고하는데, 단지 10을 인쇄하고 더 이상 데이터를 출력하지 않습니다. – Zinc

+0

또한 검색 기능이 제대로 작동하지 않습니다. – Zinc

0

서버 모드를 선택하면 요청을 통해 모든 것을 관리해야합니다. 그래서, 당신은 동적으로 출력 배열의 값을 만들어야합니다 :

$output = array(
    "draw" => $_POST['draw'], 
    "recordsTotal" => $this->my_model->get_total_records(), 
    "recordsFiltered" => $this->my_model->get_total_filtered(), 
    "data" => $this->my_model->all_user_request($id) 
); 

public function all_user_request($task_id) { 
    $query = "SELECT * FROM user_request WHERE task_id = ?"; // add limit $_POST['length'], $_POST['start'] to your request 

    return $this->db->query($query, $task_id)->result(); 
} 
+0

Arthur Lekane, 감사합니다. 코드를 확인해주세요. – Zinc

+0

'get_total_filtered' 및'get_total_records()'에 대한 예제를 줄 수 있습니까? @ArthurLekane – Zinc

0

serverSide = true을 사용하는 경우 필터 수와 총 개수를 입력해야합니다. 또한 자신의 검색 기능, 주문 등을 제공하십시오. 참조 용으로 컨트롤러 & 모델을 사용하십시오.

컨트롤러

$task = $this->input->post('task', TRUE); 
$user_request = $this->model->all_user_request($task); 

$output = array(
    'draw' => $this->input->post('draw', TRUE), 
    'recordsTotal' => $user_request['recordsTotal'], 
    'recordsFiltered => $user_request['recordsFiltered'], 
    'data'   => empty($user_request['data'])? array() : $user_request['data'] 
); 

echo json_encode($output); 

모델

public function all_user_request($task_id) { 

    $params = $this->input->post(null, TRUE); 

    $search_fields = array('username','type','request'); //change this into your table fields 

    $data = array(); 
    $this->db->start_cache(); 
    $this->db->select("username, type, request"); 
    $this->db->from("user_request"); 
    $this->db->where("task_id", $task_id); 

    if(!empty($params['search']['value'])){ 
     $str = $params['search']['value']; 
     $this->db->group_start(); 
     foreach($search_fields as $row){ 
      $this->db->or_like($row, $str, 'BOTH'); 
     } 
     $this->db->group_end(); 
    } 

    $data['recordsTotal'] = $this->db->count_all_results(); 

    $this->db->stop_cache(); 
    $this->db->limit($params['length'], $params['start']); 
    $data['recordsFiltered'] = $this->db->count_all_results(); 
    $query = $this->db->get(); 
    $this->db->flush_cache(); 
    foreach($query->result_array() as $row){ 
     $data['data'][] = array_values($row); 
    } 
    return $data; 
}