星期二, 5月 25, 2010

jqgrid - search

我怎麼照官網做 都沒有search的結果
看官網的php 也不像會有search的結果...

最後還是上網找

server.php (同官網範例,就在下sql那段 加入這個)
$where = "WHERE 1=1 " . constructWhere();
$SQL = "SELECT ... FROM xxx $where ORDER BY $sidx $sord LIMIT $start , $limit";
...

//--------------------------
function constructWhere(){
  $wh = "";
  $searchOn = $_REQUEST['_search'];
  if($searchOn=='true')
  {
   $fld = $_REQUEST['searchField'];

   //過濾欄位,填入會用到search的欄位
   if(!( $fld=='id' || $fld =='name'))
   {
    $fldata = $_REQUEST['searchString'];
    $foper = $_REQUEST['searchOper'];

    //construct where
    $wh .= " AND " . $fld;
    switch ($foper) {
      case "bw":
        $fldata .= "%";
        $wh .= " LIKE '" . $fldata."'";
        break;
      case "eq":
        if(is_numeric($fldata)) {
          $wh .= " = " . $fldata;
        }else{
          $wh .= " = '" . $fldata."'";
        }
        break;
      case "ne":
        if(is_numeric($fldata)) {
          $wh .= " <> " . $fldata;
        }else{
          $wh .= " <> '" . $fldata . "'";
        }
        break;
      case "lt":
        if(is_numeric($fldata)) {
          $wh .= " < " . $fldata;
        } else {
          $wh .= " < '" . $fldata."'";
        }  
        break;
      case "le":
        if(is_numeric($fldata)) {
          $wh .= " <= " . $fldata;
        }else {
          $wh .= " <= '" . $fldata."'"; 
        }
        break;
      case "gt":
        if(is_numeric($fldata)) {
          $wh .= " > ".$fldata;
        } else {
          $wh .= " > '".$fldata."'";
        }
        break;
      case "ge":
        if(is_numeric($fldata)) {
          $wh .= " >= ".$fldata;
        } else {
          $wh .= " >= '".$fldata."'";
        }
        break;
      case "ew":
        $wh .= " LIKE '%".$fldata."'";
        break;
      case "ew":
        $wh .= " LIKE '%".$fldata."%'";
        break;
      default :
        $wh = "";
    }
  }
  return $wh;
}

Reference
忘了哪看的了...

接收完成的callback function
jQuery("#tbSearch").jqGrid({
  datatype:function(postdata) {
  jQuery.ajax({
  url: "server.php", //原本寫在外面的,現在外面那個就參考用
  data:postdata,
  datatype:"json",
  complete:function(xmldata,stat){
   if(stat=="success") {
    //xmldata是XMLHttpRequest, 所以如果是datatype的話,就要 xmldata.responseXML
    alert(xmldata.responseText);
   }
  }
});
},
...

Reference
Data Manipulation
jqGrid 的多字段查詢

星期二, 5月 18, 2010

zend - 關連table

我也不知道怎麼做出來的
一開始明明就照著教學做
可是怎麼做都說有錯
什麼No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname"
不然就什麼 No reference from table $thisClass to table $tableClassname"
說xx table裡找不到reference關係...

最後進到Zend/library/Db/Table/Abstract.php一步步查
先看建構子有存進去了
最後一路看到getReference()
因為會說沒有rule 所以就先把那段解註掉
if ($ruleKey !== null) {
...
}

再看foreach ($refMap as $reference)...這段
明明有哇... 再把註解全拿掉時...
神奇的事發生了...
一切的值都有了 也不會有例外
這... 到底發生什麼事了...= =?

過程中 我是有一直亂改值測試...
可是... 最後成功的值...應該是一樣的
嗯哉~~ 總之先記錄下來.... 免得又遇到了

說明
table "GroupTee"裡有teeid,需要跟table "Tee"的主鍵id做關連
table grouptee
<?php
class Application_Model_DbTable_GroupTee extends Zend_Db_Table_Abstract
{
protected $_name = 'group_tee_rt';
protected $_dependentTables = array('Application_Model_DbTable_Tee'); // 對應到關連的 Table Class
}


table tee
<?php
class Application_Model_DbTable_Tee extends Zend_Db_Table_Abstract
{
protected $_name = 'tee'; //real table name

protected $_referenceMap= array(
'TeeName' => array( //rule名稱
'columns' => array('id'), //tee的pky
'refTableClass' => 'Application_Model_DbTable_GroupTee', //參考GroupTee
'refColumns' => array('teeid') //GroupTee裡的teeid
)
);
}


contoller或應用的地方
$tbGroupTee = new Application_Model_DbTable_GroupTee();
$group = $tbGroupTee ->fetchRow('id=1'); //取得第1個group
$grouptee = $group->findDependentRowset('Application_Model_DbTable_Tee','TeeName');
Zend_Debug::dump($grouptee, $label = "grouptee", $echo = true);



References
初探 Zend_Db_Table Relationships
One To Many Relationship with Zend Framework

星期日, 5月 16, 2010

dokuwiki - gcalendar

不知大家拿來做什麼用
公司是拿來當工作日誌用...
所以有分預定計劃,實際執行Deadline
而event type當沒沒這麼巧的有這幾樣
不過可自定event type

作法
1.連結內容
=== 預定計劃 ===
*2010-5-3 - 2010-5-4 teegle
=== 實際執行 ===
*2010-5-3
=== Deadline ===
*2010-5-4


2.增加event type
到events.css增加與引用名稱相同的class名
path: [dokuwiki資料夾]/lib/plugins/gcalendar/user/events.css
/* 就是自己增加css的class */
.預定計劃
{
 color:grey; //改字型色彩
}
.實際執行
{
 background-image:url(images/gear.gif); //自行定義圖示
}
.Deadline
{
 color:red;
 bold:true;
 background-image:url(images/deadline.gif); //自行定義圖示
}


3.上傳圖片
就看自己寫到哪就傳到哪個資料夾囉
預設位置是[dokuwiki資料夾]/lib/plugins/gcalendar/user/images

結果如下
嗯 圖示的大小為15*16...
圖有點過大 不過效果還不錯...


Reference:dokuwiki - gcalendar

星期六, 5月 15, 2010

常用的10個jqgrid提示

網路上看的10 JQGrid Tips learned from my experience,再補點自己常遇到的

  1. Changing JQGrid width and height
    "//自動調寬度
    jQuery("#list2").jqGrid({
    autowidth: true, 
    ...
    //手動設定
    $("#list2").setGridWidth(200,true); //忘了true是什麼


    ColModel的屬性

    jQuery("#list2").jqGrid({
    ...
    colModel: [
    {
     name: 'rowid',  //將欄位名稱
     index: 'rowid asc, createddate', //click此欄位的排序會依據的order
      width: 50,
     sorttype: "int",
      align: "center",
     key:true, //將欄位設為pk
     search:true, //是否提供search
     hidden:false, //讓此欄位隱藏
    ...
  2. Grid without unnecessary scroll area
  3. Error due to missing locale file
  4. Callback function
    • loadComplete //ajax完成後的事件
      loadComplete: function(){
      var ids = jqgrid.jqGrid('getDataIDs'); //取得所有ids  
      alert(ids.length);
    • gridComplete //將所有資料讀進grid後的事件
    gridComplete及loadComplete差異
    $("#list").clearGridData();會觸發gridComplete
    利用ajax讀入資料時,jqgrida會先清掉grid內容,但不會觸發gridComplete,而讀完資料時,先後觸發gridComplete及loadComplete
    其他event
  5. Using pagers only for buttons (or icons)
  6. Hiding unwanted buttons in navigation bar
  7. Hiding the inline search by default
  8. Having your own icons for navigation bar buttons
  9. Removing title bar close button
  10. Adding toolbar    

常用指令
  • Get data from selected row
    var id = jQuery("#list2").jqGrid('getGridParam','selrow'); 
    if (id) {
        var ret = jQuery("#list2").jqGrid('getRowData',id); //3.6的方法
        //var ret = jQuery("#list2").getRowData(id);  //3.5以前的方法
        alert("id="+ret.id+" invdate="+ret.invdate+"...");
    } else {
        alert("Please select row");
    } 
  • 刪除
    //設定刪除事件
    $("#bDelete").click(function(){
    // Get the currently selected row
    toDelete = $("#mygrid").jqGrid('getGridParam','selrow');
    
    // You'll get a pop-up confirmation dialog, and if you say yes,
    // it will call "delete.php" on your server.
    $("#mygrid").jqGrid(
    'delGridRow',
    toDelete,
    { url: 'delete.php',
    reloadAfterSubmit:false}
    );
    });
    post資料有[oper] => del,[id] => 88
    Custom delete button in jqGrid

    //直接在navigator裡設刪除事件
    jQuery("#list2").jqGrid({
    ...
    }).navGrid('#pager2', {
    view: true,
    edit: true,
    add: false,
    del: true
    },{
       //依序view
    },{
        /edit
    },{
        //add
    },{
        //delete options 
        url: 'delete.php', //response的url
    
        //submit前驗證,其他看p.s.1
         beforeSubmit : function(id, formid) {
            if (id) {
               var ret = jQuery("#list2").jqGrid('getRowData',id);
               if (!(ret.xxx == "" )
                {
                    return [false,"xxx皆為空白才可以刪除"]; //false會顯示錯誤訊息
                }
            } else {
                return [false,"Please select row"];
            }
            return [true,""]; //true才會繼續
       
    }


    //刪除第12行row
    var su=jQuery("#list5").jqGrid('delRowData',12);
    if(su) 
        alert("Succes. Write custom code to delete row from server"); 
    else
        alert("Allready deleted or not in list"); 
    //清空grid內容
    $("#list1").clearGridData();


References

星期三, 5月 12, 2010

zend - 常見錯誤訊息

  • Action xxx does not exist and was not trapped in __call().
  • 大小寫都試過,最後換個全小寫名稱是成功了 還不知到底是什麼問題
  • Invalid controller specified (CourseTee)
    因為controller的名稱為2個字組合Course, Tee, 但zend不支援什麼駝峰字母,所以真正的名稱被改為Course-Tee 當利用zf create controller CourseTee時 會自動建立controolerview/script/course-tee
  • Zend沒有report error
  • Firefox 回報"伺服器要將此網址重新導向的要求無法完成"

星期二, 5月 11, 2010

jqueryui - dialog

在關閉dialog時 => $(this).dialog('close');
jqueryui會將input的內容清掉...
所以會抓不到.....
氣死... 搞好久才發現...