2012-03-04 1 views
1

を働いていない統合jqGrid。通常の検索機能は私のために働いていますが、統合されたツールバーに何かを入力すると、0の結果が返されます。ここでは、ツールバーの検索がしかし、私はすべての運を持っていないです、私は私のページに取り組んで統合検索ツールバーを取得しようとしています

は私の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なので、文字列はうまく動作します)。私は値変換のためにスイッチ/ケース部分を取り除くことができると思います。 $_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リクエストをリバースエンジニアリングすることをお勧めします。送信されたparamsを見てから、一致するかどうかPHP CRUDをチェックし、必要に応じて適応することができます。 – charlietfl

+0

私の例は、単一の検索フィールドでしか機能しないようですが、統合ツールバー検索で "multisearch" $ _REQUEST ['filters']を使ってそれらのすべてを取得してください。ただし、それらの読み込み/デコード方法はわかりません。デモの例には、タイプミスや不完全なものがたくさんあり、実際に書かれていてテストされたことのないように見えます。私はまだPHPに新しいので、私はこれを処理することは非常に混乱しています。 – Sandoichi

+0

私はデモページのコードをオリジナルの投稿に追加しました – Sandoichi

答えて

3

私は実際にちょうど昨日、この同じ問題を自分で持っていました。あなたは正しいです、あなたは$ _REQUEST ['filters']を使ってフィルターを持ってきて、それを分割して各部分を使うことができるようにする必要があります。

まず、あなたがFilterToolbarを初期化し、あなたのjQueryのファイルにstringResult: trueを設定する必要があるとしています。

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

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

今、あなたはfiltersオブジェクトの内容を含む$filterArrayを持っていることを、あなたは今rulesを破ることができます。ここでは

は、PHPがで持って使用し、filtersオブジェクトを分割するコードです内部に含まれるオブジェクト。基本的に、$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

関連する問題