2012-03-04 60 views
1

我想獲得集成的搜索工具欄在我的頁面上工作,但是我沒有任何運氣。常規搜索功能正在爲我工​​作,但每當我在集成工具欄中輸入任何內容時,它都會返回0個結果。jqGrid集成的工具欄搜索不起作用

這裏是我的jQuery:

$("#parts_table").jqGrid({ 
      url:'testparts2.php', 
      datatype: "json", 
      colNames:['Part ID','Name', 'Description', 'Weight'], 
      colModel:[ 
       {name:'part_ID',index:'part_ID', search: true, stype:'text', width:55}, 
       {name:'part_name',index:'part_name', width:90}, 
       {name:'part_desc',index:'part_desc', width:100}, 
       {name:'part_weight',index:'part_weight', width:80, align:"right"},  
      ], 
      rowNum:30, 
      rowList:[10,20,30], 
      pager: '#pager2', 
      sortname: 'part_ID', 
      viewrecords: true, 
      sortorder: "asc", 
      caption:"Parts in Database", 
      width: '800', 
      height: '300', 
     }); 
     $("#parts_table").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false}); 
     $("#parts_table").jqGrid('filterToolbar',{stringResult: false,searchOnEnter : false, defaultSearch: 'cn', ignoreCase: true}); 

這裏是我的PHP代碼:

<?php 
    include "begin.php"; 
    $page = $_REQUEST['page']; // get the requested page 
    $limit = $_REQUEST['rows']; // get how many rows we want to have into the grid 
    $sidx = $_REQUEST['sidx']; // get index row - i.e. user click to sort 
    $sord = $_REQUEST['sord']; // get the direction 
    if(!$sidx) $sidx =1; 

    //array to translate the search type 
    $ops = array(
     'eq'=>'=', //equal 
     'ne'=>'<>',//not equal 
     'lt'=>'<', //less than 
     'le'=>'<=',//less than or equal 
     'gt'=>'>', //greater than 
     'ge'=>'>=',//greater than or equal 
     'bw'=>'LIKE', //begins with 
     'bn'=>'NOT LIKE', //doesn't begin with 
     'in'=>'LIKE', //is in 
     'ni'=>'NOT LIKE', //is not in 
     'ew'=>'LIKE', //ends with 
     'en'=>'NOT LIKE', //doesn't end with 
     'cn'=>'LIKE', // contains 
     'nc'=>'NOT LIKE' //doesn't contain 
    ); 
    function getWhereClause($col, $oper, $val){ 
     global $ops; 
     if($oper == 'bw' || $oper == 'bn') $val .= '%'; 
     if($oper == 'ew' || $oper == 'en') $val = '%'.$val; 
     if($oper == 'cn' || $oper == 'nc' || $oper == 'in' || $oper == 'ni') $val = '%'.$val.'%'; 
     return " WHERE $col {$ops[$oper]} '$val' "; 
    } 
    $where = ""; //if there is no search request sent by jqgrid, $where should be empty 
    $searchField = isset($_GET['searchField']) ? $_GET['searchField'] : false; 
    $searchOper = isset($_GET['searchOper']) ? $_GET['searchOper']: false; 
    $searchString = isset($_GET['searchString']) ? $_GET['searchString'] : false; 
    if ($_GET['_search'] == 'true') { 
     $where = getWhereClause($searchField,$searchOper,$searchString); 
    } 

    $totalrows = isset($_REQUEST['totalrows']) ? $_REQUEST['totalrows']: false; 
    if($totalrows) { 
     $limit = $totalrows; 
    } 

    $result = mysql_query("SELECT COUNT(*) AS count FROM parts"); 
    $row = mysql_fetch_array($result,MYSQL_ASSOC); 
    $count = $row['count']; 

    if($count >0) { 
     $total_pages = ceil($count/$limit); 
    } else { 
     $total_pages = 0; 
    } 
    if ($page > $total_pages) $page=$total_pages; 
    if ($limit<0) $limit = 0; 
    $start = $limit*$page - $limit; // do not put $limit*($page - 1) 
    if ($start<0) $start = 0; 
    $SQL = "SELECT * FROM parts ".$where." ORDER BY $sidx $sord LIMIT $start , $limit"; 
    $result = mysql_query($SQL) or die("Couldn't execute query.".mysql_error()); 
    $response->page = $page; 
    $response->total = $total_pages; 
    $response->records = $count; 
    $i=0; 
    while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { 
     $response->rows[$i]['part_ID']=$row[part_ID]; 
     $response->rows[$i]['cell']=array($row[part_ID],$row[part_name],$row[part_desc],$row[part_weight]); 
     $i++; 
    } 
    echo json_encode($response); 

?> 

我花時間尋找,尋找最適合普通搜索工作PHP的例子(見上文) ,但它似乎不適用於工具欄搜索。誰能幫忙?謝謝

編輯:這裏是代碼從jqGrid的演示文件夾使用此搜索,但它似乎是充滿了錯誤,我不知道如何使用它爲我的情況。我不需要爲搜索指定數據類型(它們都是varchars,所以字符串可以正常工作)..所以我認爲我可以去掉switch/case部分以進行值轉換。我想我只需要更改我的原始代碼以使用$_REQUEST['filters']和一個foreach循環來構建查詢,但我對PHP並不擅長,所以我們不勝感激任何幫助。

演示代碼:

$wh = ""; 
$searchOn = Strip($_REQUEST['_search']); 
if($searchOn=='true') { 
    $searchstr = Strip($_REQUEST['filters']); 
    $wh= constructWhere($searchstr); 
    //echo $wh; 
} 
function constructWhere($s){ 
    $qwery = ""; 
    //['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'] 
    $qopers = array(
        'eq'=>" = ", 
        'ne'=>" <> ", 
        'lt'=>" < ", 
        'le'=>" <= ", 
        'gt'=>" > ", 
        'ge'=>" >= ", 
        'bw'=>" LIKE ", 
        'bn'=>" NOT LIKE ", 
        'in'=>" IN ", 
        'ni'=>" NOT IN ", 
        'ew'=>" LIKE ", 
        'en'=>" NOT LIKE ", 
        'cn'=>" LIKE " , 
        'nc'=>" NOT LIKE "); 
    if ($s) { 
     $jsona = json_decode($s,true); 
     if(is_array($jsona)){ 
      $gopr = $jsona['groupOp']; 
      $rules = $jsona['rules']; 
      $i =0; 
      foreach($rules as $key=>$val) { 
       $field = $val['field']; 
       $op = $val['op']; 
       $v = $val['data']; 
       if($v && $op) { 
        $i++; 
        // ToSql in this case is absolutley needed 
        $v = ToSql($field,$op,$v); 
        if ($i == 1) $qwery = " AND "; 
        else $qwery .= " " .$gopr." "; 
        switch ($op) { 
         // in need other thing 
         case 'in' : 
         case 'ni' : 
          $qwery .= $field.$qopers[$op]." (".$v.")"; 
          break; 
         default: 
          $qwery .= $field.$qopers[$op].$v; 
        } 
       } 
      } 
     } 
    } 
    return $qwery; 
} 
function ToSql ($field, $oper, $val) { 
    // we need here more advanced checking using the type of the field - i.e. integer, string, float 
    switch ($field) { 
     case 'id': 
      return intval($val); 
      break; 
     case 'amount': 
     case 'tax': 
     case 'total': 
      return floatval($val); 
      break; 
     default : 
      //mysql_real_escape_string is better 
      if($oper=='bw' || $oper=='bn') return "'" . addslashes($val) . "%'"; 
      else if ($oper=='ew' || $oper=='en') return "'%" . addcslashes($val) . "'"; 
      else if ($oper=='cn' || $oper=='nc') return "'%" . addslashes($val) . "%'"; 
      else return "'" . addslashes($val) . "'"; 
    } 
} 

$result = mysql_query("SELECT COUNT(*) AS count FROM invheader a, clients b WHERE a.client_id=b.client_id".$wh); 
     $row = mysql_fetch_array($result,MYSQL_ASSOC); 
     $count = $row['count']; 

     if($count >0) { 
      $total_pages = ceil($count/$limit); 
     } else { 
      $total_pages = 0; 
     } 
     if ($page > $total_pages) $page=$total_pages; 
     $start = $limit*$page - $limit; // do not put $limit*($page - 1) 
     if ($start<0) $start = 0; 
     $SQL = "SELECT a.id, a.invdate, b.name, a.amount,a.tax,a.total,a.note FROM invheader a, clients b WHERE a.client_id=b.client_id".$wh." ORDER BY ".$sidx." ".$sord. " LIMIT ".$start." , ".$limit; 
     $result = mysql_query($SQL) or die("Could not execute query.".mysql_error()); 
     $responce->page = $page; 
     $responce->total = $total_pages; 
     $responce->records = $count; 
     $i=0; 
     while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { 
      $responce->rows[$i]['id']=$row[id]; 
      $responce->rows[$i]['cell']=array($row[id],$row[invdate],$row[name],$row[amount],$row[tax],$row[total],$row[note]); 
      $i++; 
     } 
     //echo $json->encode($responce); // coment if php 5 
     echo json_encode($responce); 
+0

最好的建議是反向工程ajax請求。看看發送的參數,然後您可以檢查匹配的PHP CRUD並根據需要進行修改 – charlietfl 2012-03-04 02:45:33

+0

以及我注意到我的示例似乎只適用於單個搜索字段,因爲集成的工具欄搜索使用「multisearch」,而我需要使用$ _REQUEST ['filters']來獲取它們,但是我不確定如何讀取/解碼它們。演示示例充滿了拼寫錯誤/不完整,看起來好像它們只是寫得很快而且從未測試過。我還是PHP的新手,所以我在處理這個問題時感到很困惑。 – Sandoichi 2012-03-04 03:43:22

+0

我將演示頁面的代碼添加到了原始文章 – Sandoichi 2012-03-04 03:49:11

回答

3

其實我只是有這個同樣的問題,我昨天。你是對的,你需要使用$ _REQUEST ['filters']來引入過濾器,然後分解它,這樣你就可以使用每一塊。

首先,你需要在你初始化FilterToolbar的jQuery文件中設置stringResult: true

這裏是一個PHP將用來引進,並打破了filters對象的代碼:

// Gets the 'filters' object from JSON 
$filterResultsJSON = json_decode($_REQUEST['filters']); 

// Converts the 'filters' object into a workable Array 
$filterArray = get_object_vars($filterResultsJSON); 

現在你已經包含$filterArrayfilters對象的內容,你現在可以打破了rules包含在裏面的物體。基本上,$filterArray中有另一個數組,其中包含搜索詳細信息,如果用戶嘗試在表中的多列中執行此搜索 - 它被稱爲rules

這裏是我打破了rules對象並基於用戶的輸入SELECT查詢:

// Begin the select statement by selecting cols from tbl 
$sql = 'select '.implode(',',$crudColumns).' from '.$crudTableName; 
// Init counter to 0 
$counter = 0; 
// Loop through the $filterArray until we process each 'rule' array inside 
while($counter < count($filterArray['rules'])) 
{ 
// Convert the each 'rules' object into a workable Array 
$filterRules = get_object_vars($filterArray['rules'][$counter]); 

// If this is the first pass, start with the WHERE clause 
if($counter == 0){ 
$sql .= ' WHERE ' . $filterRules['field'] . ' LIKE "%' . $filterRules['data'] . '%"'; 
} 
// If this is the second or > pass, use AND 
else { 
$sql .= ' AND ' . $filterRules['field'] . ' LIKE "%' . $filterRules['data'] . '%"'; 
} 
$counter++; 
} 

// Finish off the select statement 
$sql .= ' ORDER BY ' . $postConfig['sortColumn'] . ' ' . $postConfig['sortOrder']; 
$sql .= ' LIMIT '.$intStart.','.$intLimit; 

/* run the query */ 
$result = mysql_query($sql) 

我敢肯定,你有問題,所以覺得免費的,如果你要問!

+0

謝謝你爲我分解!這很有意義,我一定會嘗試一下,如果我有任何問題,請告訴我們。謝謝! – Sandoichi 2012-03-08 00:37:29