• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جستجو در jqgrid
#1
آقا من با این آپشن جستجو تو jqgrid مشکل دارم
البته میتونم یه چند تا تکست باکس درست کنم و خودم پارامتر به کوئری پاس کنم، اما اگه جستجوی خودش رو بتونم فعال کنم بهتره

این بخش جاوا اسکریپتش هست:

کد:
jQuery().ready(function (){
jQuery("#list1").jqGrid({
       url:'Task/server.php?q=1'+GetQuery,
    datatype: "xml",
    height: 300,
       colNames:['شماره','نام کاربری','نام مشترک','تلفن ADSL','مسئول', 'شروع وظیفه','آخرین فعالیت','وضعیت','شعبه'],
       colModel:[
           {name:'id',index:'ID', width:60},
           {name:'UserName',index:'UserName', width:100},
           {name:'Name',index:'Name', width:100},
           {name:'ADSLTEL',index:'ADSLTEL', width:70, align:"right"},
           {name:'Admin',index:'Admin', width:70, align:"right"},
           {name:'SDate',index:'SDate', width:120, align:"right"},
           {name:'LDate',index:'LDate', width:120, align:"right"},
           {name:'Status',index:'Status', width:50, align:"right"},
        {name:'Branch',index:'Branch', width:50, align:"right"}        
       ],
       rowNum:10,
    width: 830,
       autowidth: false,
       rowList:[10,20,30,50,100],
       pager: jQuery('#pager1'),
       sortname: 'id',
    viewrecords: true,
    height: "250px",
    sortorder: "desc",
    caption: "لیست وظیفه ها",
    direction: "rtl",
    shrinkToFit: false
}).navGrid('#pager1',{edit:true,add:false,del:false});
});

اینم بخش php:

کد پی‌اچ‌پی:
$page $_GET['page']; // get the requested page
$limit $_GET['rows']; // get how many rows we want to have into the grid
$sidx $_GET['sidx']; // get index row - i.e. user click to sort
$sord $_GET['sord']; // get the direction
if(!$sidx$sidx =1;
// connect to the database
$db mysql_connect("localhost""hamid""hamid")
or die(
"Connection Error: " mysql_error());

mysql_select_db('taaknet') or die("Error conecting to db.");
$result mysql_query("SET NAMES 'utf8'");
$result mysql_query("SELECT COUNT(*) AS count FROM `task` a INNER JOIN `admin` c ON a.`TaskUser`= c.`ID`   Where $Where $Where2 $Where3");
$row mysql_fetch_array($result,MYSQL_ASSOC);
$count $row['count'];

if( 
$count >) {
    
$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)
$SQL="
        SELECT a.`ID` AS ID , a.`UserID` AS UserID , a.`Step` AS Level , a.`TaskUser` AS Worker , a.`StartDate` AS SDate ,
               a.`LastWorkDate` AS LDate , a.`Branch` AS Branch ,b.`UserName` AS UserName , b.`Name` AS NameUser ,
               b.`ADSLTEL` AS ADSLTEL , c.`Name` AS AdminName
        FROM  `task` a
        INNER JOIN  `users` b
        INNER JOIN  `admin` c
        ON a.`UserID`=b.`ID` AND a.`TaskUser`=c.`ID`
        WHERE 
$Where $Where2 $Where3
        ORDER BY 
$sidx $sord LIMIT $start , $limit
     ;"
;
//$SQL = "SELECT UserID,UserName,Name,ADSLTEL,Email from user ORDER BY $sidx $sord LIMIT $start , $limit";
$result mysql_query$SQL ) or die("Couldn’t execute query.".mysql_error());

if ( 
stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) {
header("Content-type: application/xhtml+xml;charset=utf-8"); } else {
header("Content-type: text/xml;charset=utf-8");
}
$et ">";

echo 
"<?xml version='1.0' encoding='utf-8'?$et\n";
echo 
"<rows>";
echo 
"<page>".$page."</page>";
echo 
"<total>".$total_pages."</total>";
echo 
"<records>".$count."</records>";
// be sure to put text data in CDATA

include_once(_PATH_ 'class' .DS'task.class.php');
$urlpath=URL_PATH;
$Task1=new Task;
while(
$row mysql_fetch_array($result,MYSQL_ASSOC)) {
    echo 
"<row id='"$row['ID']."'>";    
    echo 
"<cell>"$row['ID']."</cell>";        
    echo 
"<cell>"$row['UserName']."</cell>";        
    echo 
"<cell><![CDATA["."<a href=\"$urlpath/content/user/ShowFull.php?UserID=".$row['UserID']."\" target=\"_blank\"
                             class=\"LinkInGrid\" >"
.$row['NameUser']."</a>"."]]></cell>";        
    echo 
"<cell>"$row['ADSLTEL']."</cell>";        
    echo 
"<cell>"$row['AdminName']."</cell>";        
    echo 
"<cell>"$row['SDate']."</cell>";                                    
    echo 
"<cell>"$row['LDate']."</cell>";
    echo 
"<cell>".$Task1->getStepStr($row['Level'])."</cell>";
    echo 
"<cell>".$Task1->getBranchStr($row['Branch'])."</cell>";    
    echo 
"</row>";
}
echo 
"</rows>"


جایی از کار مشکل داره؟
کسی تا حالا با جستجوی این گرید کار کرده؟ Huh
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#2
کسی نمیدونست؟ Confused
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#3
خب خدا رو شکر حل شد:

ببینید jqgrid وقتی simple search یعنی همون سرچی که تو navigator استفاده میکنه و در حالتی که فقط یک پارامتر جهت جستجو میگیره، سه تا پارامتر رو با متد Get به صفحه Server.php که عملیات واکشی توش انجام میشه میفرسته، این سه تا پارامتر اینا هستن:
کد پی‌اچ‌پی:
$_GET['searchField']
$_GET['searchOper']
$_GET['searchString'
searchField اسم فیلدی در بانک اطلاعاتی هست که باید بر اساس اون جستجو انجام شه
searchString هم مقدار مورد جستجو هست
searchOper اپراتور جستجو هست
در مورد دو متغیر اولی که حرفی نیست، اما متغیر searchOper کمی فرق داره، این متغیر حاوی عباراتی مثل = و یا LIKE نیست، مثلاً بجای مساوی عبارت 'eq' پاس میشه، اینه که باید تو صفحه server.php تغییراتی روی این اپراتور صورت بگیره...
تو صفحه سرور استفاده از این آرایه به کار میاد:
کد پی‌اچ‌پی:
$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
); 

اما در نهایت با پاس شدن این سه تا متغیر باید جستجو انجام بدیم، یعنی Where! خب باید با این سه تا متغیر یه شرط واسه جستجو بسازیم، من تو یه وبسایت این تابع رو دیدم و از همون هم استفاده کردم:
کد پی‌اچ‌پی:
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);

اینجا با ['GET['_search_$ هم بررسی شده که آیا اصلاً جستجو صورت گرفته یا نه...
در آخر هم باید این متغیر where$ رو به کوئری تون اضافه کنید:
کد پی‌اچ‌پی:
$SQL "SELECT field1, field2, field3, field4, field5 FROM $tablename "
.$where." ORDER BY $sidx $sord LIMIT $start , $limit"
که البته برای داشتن count صحیح در navigator باید این متغیر رو به کوئری count که چند خط بالاتر هست هم اضافه کنید؛

فقط دو تا نکته اینه که حتماً در فایل جاوا اسکریپت گریدتون colName ها رو درست وارد کنید، و اگه تو کوئری تون Join زدید اسم ها جدول رو یا Alias Name جدول رو ذکر کنید:
کد:
...
       colModel:[
           {name:'ID',index:'a.`ID`', width:60, search:true},
           {name:'UserName',index:'b.`UserName`', width:100},
           {name:'Name',index:'b.`Name`', width:100},
...

و بعدم اینکه هواستون باشه در صورت نیاز تبدیلات لازم رو در فایل server.php انجام بدید، مثلاً من تو DB یه فیلد دارم به اسم Branch که مقدار 1 یا 2 یا 3 میگیره و در موقع نمایش تو گرید اگه مقدار فیلد 1 باشه "شعبه غرب"، برای 2 "شعبه شرق" و برای 3 "شعبه مشترک" نمایش داده میشه، خب طبیعتاً کاربر هم همینطوری تو جستجو وارد میکنه، یعنی مثلاً موقع جستجو میزنه:
کد:
شرق Branch equal
خب شما باید تو صفحه server.php بررسی کنید که اگه مقدار متغیر ['GET['searchString_$ برابر با شرق بود، ['GET['searchString_$ برابر با 2 بشه...
----------------------
همچنین شما میتونید دسترسی جستجو برای فیلدی خاص رو با عبارت search:false تو تنظیمات column تو فایل JavaScript مسدود کنید:
کد:
...
       colModel:[
           {name:'ID',index:'a.`ID`', width:60, search:true},
           {name:'UserName',index:'b.`UserName`', width:100},
           {name:'Name',index:'b.`Name`', width:100},
           {name:'b.`ADSLTEL`',index:'b.`ADSLTEL`', width:70, align:"right", search:false},
...

اطلاعات بیشتر:
http://www.trirand.com/jqgridwiki/doku.p...earching&s[]
شاد باشید Smile
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#4
با تشکر
من کار کرده بودم اینو ولی الان پست شما رو دیدمBig Grin
ولی من روی سرچ لوکال مشکل دارم باهاش، وقتی مقادیر عددی باشه و بخاد لوکال سرچ انجام بده به صورت رشته باهاشون برخورد میکنهTongue
  پاسخ
تشکر شده توسط : hamid_80386
#5
نقل قول: به صورت رشته باهاشون برخورد میکنه

یعنی از نظر سرعت پردازش مشکل پیدا میکنید یا پیام خطا دریافت میکنید؟
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :
#6
نه توی جستجو مشکل داره مثلا وقتی بزرگتر از ۴۰ سرچ میکنی ۴ و ۱۴ و ۴۰ و ... رو نشون میده
  پاسخ
تشکر شده توسط :
#7
آها از اون لحاظ
خب مجتبی تو که خودت میدونی کدوم فیلد هات عددی هستن، تو server.php اگه بیای بررسی کنی که اگه searchField مثلاً برابر با Money بود بجای اینکه

کد پی‌اچ‌پی:
return " WHERE $col {$ops[$oper]} '$val' " 

بزاری
کد پی‌اچ‌پی:
return " WHERE $col {$ops[$oper]} $val "
بزاری، یعنی کوتیشن رو از value حذف کنی درست نمیشه؟
هر که با مرغ هوا دوست شود - خوابش آرامترین خواب جهان خواهد بود.
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان