2012-03-01 116 views
4

我使用DataTables以成功显示100k +记录,但现在我无法添加自定义链接到表,因为使用JavaScript生成的地方有点丢失。 我想实现的是显示类似于此的链接的最后一列:a href="index.php?edit=ID"其中id是来自db的idDataTables服务器端链接处理

你可以看到在这个下面使用的PHP和HTML:

<?php 
    /* 
    * Script: DataTables server-side script for PHP and MySQL 
    * Copyright: 2010 - Allan Jardine 
    * License: GPL v2 or BSD (3-point) 
    */ 

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    * Easy set variables 
    */ 

    /* Array of database columns which should be read and sent back to DataTables. Use a space where 
    * you want to insert a non-database field (for example a counter or static image) 
    */ 
    $aColumns = array('first_name', 'last_name', 'afiliere', 'user', 'parola', 'activ', 'id'); 

    /* Indexed column (used for fast and accurate table cardinality) */ 
    $sIndexColumn = "id"; 

    /* DB table to use */ 
    $sTable = "useri"; 

    /* Database connection information */ 
    $gaSql['user']  = ""; 
    $gaSql['password'] = ""; 
    $gaSql['db']   = "_summon"; 
    $gaSql['server']  = ""; 


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    * If you just want to use the basic configuration for DataTables with PHP server-side, there is 
    * no need to edit below this line 
    */ 

    /* 
    * MySQL connection 
    */ 
    $gaSql['link'] = mysql_pconnect($gaSql['server'], $gaSql['user'], $gaSql['password'] ) or 
     die('Could not open connection to server'); 

    mysql_select_db($gaSql['db'], $gaSql['link']) or 
     die('Could not select database '. $gaSql['db']); 


    /* 
    * Paging 
    */ 
    $sLimit = ""; 
    if (isset($_GET['iDisplayStart']) && $_GET['iDisplayLength'] != '-1') 
    { 
     $sLimit = "LIMIT ".mysql_real_escape_string($_GET['iDisplayStart']).", ". 
      mysql_real_escape_string($_GET['iDisplayLength']); 
    } 


    /* 
    * Ordering 
    */ 
    $sOrder = ""; 
    if (isset($_GET['iSortCol_0'])) 
    { 
     $sOrder = "ORDER BY "; 
     for ($i=0 ; $i<intval($_GET['iSortingCols']) ; $i++) 
     { 
      if ($_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true") 
      { 
       $sOrder .= $aColumns[ intval($_GET['iSortCol_'.$i]) ]." 
        ".mysql_real_escape_string($_GET['sSortDir_'.$i]) .", "; 
      } 
     } 

     $sOrder = substr_replace($sOrder, "", -2); 
     if ($sOrder == "ORDER BY") 
     { 
      $sOrder = ""; 
     } 
    } 


    /* 
    * Filtering 
    * NOTE this does not match the built-in DataTables filtering which does it 
    * word by word on any field. It's possible to do here, but concerned about efficiency 
    * on very large tables, and MySQL's regex functionality is very limited 
    */ 
    $sWhere = ""; 
    if (isset($_GET['sSearch']) && $_GET['sSearch'] != "") 
    { 
     $sWhere = "WHERE ("; 
     for ($i=0 ; $i<count($aColumns) ; $i++) 
     { 
      $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch'])."%' OR "; 
     } 
     $sWhere = substr_replace($sWhere, "", -3); 
     $sWhere .= ')'; 
    } 

    /* Individual column filtering */ 
    for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 
     if (isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '') 
     { 
      if ($sWhere == "") 
      { 
       $sWhere = "WHERE "; 
      } 
      else 
      { 
       $sWhere .= " AND "; 
      } 
      $sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' "; 
     } 
    } 


    /* 
    * SQL queries 
    * Get data to display 
    */ 
    $sQuery = " 
     SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 
     FROM $sTable 
     $sWhere 
     $sOrder 
     $sLimit 
    "; 
    $rResult = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 

    /* Data set length after filtering */ 
    $sQuery = " 
     SELECT FOUND_ROWS() 
    "; 
    $rResultFilterTotal = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 
    $aResultFilterTotal = mysql_fetch_array($rResultFilterTotal); 
    $iFilteredTotal = $aResultFilterTotal[0]; 

    /* Total data set length */ 
    $sQuery = " 
     SELECT COUNT(".$sIndexColumn.") 
     FROM $sTable 
    "; 
    $rResultTotal = mysql_query($sQuery, $gaSql['link']) or die(mysql_error()); 
    $aResultTotal = mysql_fetch_array($rResultTotal); 
    $iTotal = $aResultTotal[0]; 


    /* 
    * Output 
    */ 
    $output = array(
     "sEcho" => intval($_GET['sEcho']), 
     "iTotalRecords" => $iTotal, 
     "iTotalDisplayRecords" => $iFilteredTotal, 
     "aaData" => array() 
    ); 

    while ($aRow = mysql_fetch_array($rResult)) 
    { 
     $row = array(); 
     for ($i=0 ; $i<count($aColumns) ; $i++) 
     { 
      if ($aColumns[$i] == "version") 
      { 
       /* Special output formatting for 'version' column */ 
       $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ]; 
      } 
      else if ($aColumns[$i] != ' ') 
      { 
       /* General output */ 
       $row[] = $aRow[ $aColumns[$i] ]; 
      } 
     } 
     $output['aaData'][] = $row; 
    } 

    echo json_encode($output); 
?> 

和HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 

     <title>DataTables example</title> 
     <style type="text/css" title="currentStyle"> 
      @import "media/css/demo_page.css"; 
      @import "media/css/demo_table.css"; 
     </style> 
     <script type="text/javascript" language="javascript" src="media/js/jquery.js"></script> 
     <script type="text/javascript" language="javascript" src="media/js/jquery.dataTables.js"></script> 
     <script type="text/javascript" charset="utf-8"> 
      $(document).ready(function() { 
       $('#example').dataTable({ 
        "bProcessing": true, 
        "bServerSide": true, 
        "sAjaxSource": "1.php" 
       }); 
      }); 
     </script> 
    </head> 
    <body id="dt_example"> 
     <div id="container"> 
      <div id="demo"> 
<table cellpadding="0" cellspacing="0" border="0" class="display" id="example"> 
    <thead> 
     <tr> 
      <th>hjghkj</th> 
      <th>hgjkghj</th> 
      <th>ghjkghk</th> 
      <th>ghjkghjk</th> 
      <th>ghjkghjk</th> 
      <th>ghjkghjkgh</th> 
      <th>dfgdfgdg</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td>asdasd</td> 
      <td colspan="6" class="dataTables_empty">Loading data from server</td> 
     </tr> 
    </tbody> 
    <tfoot> 
     <tr> 
      <th>sdfgd</th> 
      <th>dsfgsdfgdsg</th> 
      <th>sdfgsdfg</th> 
      <th>sdgsdfgsdfg</th> 
      <th>sdfgsdfgsd</th> 
      <th>sdfgsdfgsd</th> 
      <th>dfgdfgd</th> 
     </tr> 
    </tfoot> 
</table> 
      </div> 
      <div class="spacer"></div> 
     </div> 
    </body> 
</html> 

回答

7

检查fnRowCallback here

$(document).ready(function() { 
    $('#example').dataTable({ 
    "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
     // Bold the grade for all 'A' grade browsers 
     if (aData[4] == "A") 
     { 
     $('td:eq(4)', nRow).html('<b>A</b>'); // You can add your link here!! 
//like $('td:eq(4)', nRow).html('<a href="'+ aData[4] +'">Click Here</b>'); 
     } 
    } 
    }); 
}); 

aData是包含在一个阵列,每行的基础上的对象,这是从你的服务器来您的内容。所以在你的情况下,它可能不一定是aData[4],它可能是1,2,3取决于你的idcolumn

你可以在你的情况下做一个console.log(aData)来分析你的id在哪个列中! (您需要firebug

另外td:eq(4)也是您希望显示链接的列。

+0

它的工作原理,但我不能生成每行的ID。我试过:$('td:eq(6)',nRow).html('Edit'); //你可以在这里添加你的链接!但没有成功 – user1164474 2012-03-01 06:47:39

+0

非常感谢。祝您有个美好的一天 – user1164474 2012-03-01 06:51:32

+0

@ user1164474我更新了我的答案,希望对您有所帮助。 – linuxeasy 2012-03-01 06:54:01

相关问题