2013-05-19 64 views
0

我使用Codeigniter和JQuery Datatables通過AJAX/JSON請求實時更新來自MYSQL數據庫的數據。我不是這個代碼的原始開發人員,這就是爲什麼我不能解決這個問題,我想。JQuery Datatables + Codeigniter(Static cols)

我所擁有的是一張有26列的表格,並不是所有的表格都被填充,但它們似乎都直接來自數據庫。這是一塊從json_table函數的代碼的外觀:

$this->load->model('aircraft_model'); 
$this->load->model('nats_model'); 

$aColumns = array('FlightSts', 'TblOrder', 'Callsign', 'Destination', 'NAT', 'SELCAL', 'CldFL', 'CldMach', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'FlightID'); 
$sTable = 'naecs_aircraft'; 

$穩定似乎是MySQL表這是正確的, $ acolumns似乎是從MySQL表naecs_aircraft所有字段。這是完全正確的,它甚至可以工作,但在第二個最後一列中,就在FlightID之前我想填充一個按鈕。所以基本上在倒數第二個柱子我想要一個按鈕。

怎麼辦?

Regards, Maciej。

@ EDIT1

這是控制器ajax.php內整體功能:

public function json_table(){ 
    $this->access->requires(ACCESS_USER); 
    $this->load->model('aircraft_model'); 
    $this->load->model('nats_model'); 

    $aColumns = array('FlightSts', 'TblOrder', 'Callsign', 'Destination', 'NAT', 'SELCAL', 'CldFL', 'CldMach', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'FlightID'); 
    $sTable = 'naecs_aircraft'; 

    $iDisplayStart = $this->input->get_post('iDisplayStart', true); 
    $iDisplayLength = $this->input->get_post('iDisplayLength', true); 
    $iSortCol_0 = $this->input->get_post('iSortCol_0', true); 
    $iSortingCols = $this->input->get_post('iSortingCols', true); 
    $sSearch = $this->input->get_post('sSearch', true); 
    $sEcho = $this->input->get_post('sEcho', true); 

    if(isset($iSortCol_0)) 
    { 
     for($i=0; $i<intval($iSortingCols); $i++) 
     { 
      $iSortCol = $this->input->get_post('iSortCol_'.$i, true); 
      $bSortable = $this->input->get_post('bSortable_'.intval($iSortCol), true); 
      $sSortDir = $this->input->get_post('sSortDir_'.$i, true); 

      if($bSortable == 'true') 
      { 
       if ($aColumns[$iSortCol] != ' '){ 
        $this->aircraft_model->json_table_sort($aColumns, $iSortCol, $sSortDir); 
       } 
      } 
     } 
    } 

    if(isset($sSearch) && !empty($sSearch)) 
    { 
     for($i=0; $i<count($aColumns); $i++) 
     { 
      if ($aColumns[$i] != ' '){ 
       $bSearchable = $this->input->get_post('bSearchable_'.$i, true); 
       if(isset($bSearchable) && $bSearchable == 'true') 
       { 
        $this->aircraft_model->json_table_filter($aColumns, $i, $sSearch); 
       } 
      } 
     } 
    } 

    $rResult = $this->aircraft_model->json_table_select($aColumns, $sTable); 
    $iFilteredTotal = $this->aircraft_model->json_table_found($aColumns); 
    $iTotal = $this->aircraft_model->count_all($sTable); 

    $output = array(
     'sEcho' => intval($sEcho), 
     'iTotalRecords' => $iTotal, 
     'iTotalDisplayRecords' => $iFilteredTotal, 
     'aaData' => array() 
    ); 

    $headers = array('3active' => FALSE, '2cleared' => FALSE, '4closed' => FALSE, '1entered' => FALSE, '5disconnected' => FALSE); 

    foreach($rResult->result_array() as $aRow) 
    { 
     $row = array(); 

     foreach($aColumns as $col) 
     { 
      @$row[] = $aRow[$col]; 
     } 

     $databit = $row; 
     $databit['DT_RowId'] = $aRow['FlightID']; 
     $databit['DT_RowName'] = $aRow['Callsign']; 
     $output['aaData'][] = $databit; 
     $headers[$aRow['FlightSts']] = TRUE; 
    } 

    foreach ($headers as $key => $value){ 
     if ($value == FALSE){ 
      $output['aaData'][] = array($key, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); 
     } 
    } 

    $output['aaData'][] = array('No More Aircraft', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); 

    echo json_encode($output); 
} 

tableinit.js:

function initTable(){ 
    oTable = $('#main-table').dataTable({ 
     "bProcessing": true, 
     "bServerSide": true, 
     "bSort": true, 
     "sServerMethod": "GET", 
     "sAjaxSource": "ajax/json_table", 
     "oLanguage": { "sProcessing": "<i class='icon-refresh icon-spin'></i>" }, 
     "sDom": "<'pull-right'r><'row'<'span8'l>>tS", 
     "sScrollY": "400px", 
     "bPaginate": false, 
     "bScrollCollapse": true, 
     "aoColumnDefs": [ 
     { "bVisible": false, "aTargets": [ 1, 25 ] }, 
     ], 
     "aaSorting": [[ 1, "asc" ]], 
     "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
      $('td:eq(0)', nRow).attr("name", "callsign"); 
      $('td:eq(1)', nRow).attr("name", "destination"); 
      $('td:eq(2)', nRow).attr("name", "nat"); 
      $('td:eq(3)', nRow).attr("name", "selcal"); 
      $('td:eq(4)', nRow).attr("name", "lvl"); 
      $('td:eq(5)', nRow).attr("name", "mach"); 
     }, 
    }).rowGrouping({ iGroupingColumnIndex: 0, sGroupingClass: 'nodrop', bSetGroupingClassOnTR: true }); 
} 

回答

0

我已經研究到處都是,我終於找到了解決辦法,之後

foreach($aColumns as $col) 
{ 
     @$row[] = $aRow[$col]; 
} 

我只是說:

$row[24] = '<a data-toggle="modal" href=#clrAircraft" data target="#clrAircraft">Clearance</a>'; 

很簡單的解決方案,這將需要24關口出aColumns陣列的山坳這樣的表25,並添加任何東西,你將它添加。

0

你需要找到數據所在的位置是爲表建立起來,並在那裏添加html。你還沒有給我們足夠的信息來完全回答,但你可以通過以下兩種方法之一填充數據表:

1)建立正常的PHP輸出表,然後就初始化

2)使用AJAX源加載數據

這兩種方式本質上是你的問題是相同的 - 發現那裏正在創建的錶行數據,並對其進行修改有s表示一個列有該按鈕HTML中你想

+0

我試圖找到它,但它似乎像它的所有由JavaScript的datatables生成。我添加了json_table + init代碼的整個控制器。 –

+0

所以你看到「sAjaxSource」:「ajax/json_table」在那裏 - 這意味着它是我提到的第二種方法。在您的aCols集的foreach中,您需要在將列傳遞到行數組之前以某種方式標記和修改列。有點難以閱讀,但把一些var_dumps,你應該看看發生了什麼 – jmadsen

+0

試圖var_dump,但是當我嘗試這樣做,它給了我一個數據表錯誤,它不能解析JSON,因爲JSON格式是錯誤的。 –