2015-02-17 22 views
0

我有一個使用表單編輯的網格設置。我希望用戶能夠僅編輯一些行。作爲開始,我認爲最簡單的方法是在我的服務器查詢中使用一列(可能是隱藏的),而XML則表示用戶擁有的Access或Role。所以基本上,網格現在有一列「訪問角色」,每行有'Y'或'N'。 (其中Y =用戶可以編輯,N =查看/只讀)jqGrid使一行只讀

我已經嘗試了幾件事情來實現這一點。最好的我想出了使用rowattr功能,但有缺陷的我所用,因爲它隱藏在網格中的行(我不想隱瞞不報,只是只讀):

function (rd) { 
console.log('Row = '+rd.WWBPITM_SURROGATE_ID); 
    if (rd.ACCROLE === "N") { 
     console.log('RowAttr '+rd.ACCROLE); 
     return {"style": "display:none"}; 
    } 

這可能是一開始,但我不知道該從哪裏出發,我不確定是否用rowattr咆哮錯誤的樹。

我也是在loadComplete功能使用setCell,這樣的嘗試:

function GridComplete() { 
    var grid = $('#list1'); 
    var rowids = grid.getDataIDs(); 
    var columnModels = grid.getGridParam().colModel; 
    console.log('Check ACCROLE'); 
    // check each visible row 
    for (var i = 0; i < rowids.length; i++) { 
    var rowid = rowids[i]; 
    var data = grid.getRowData(rowid); 
    console.log('ACCROLE for '+rowid+' is '+data.ACCROLE); 
    if (data.ACCROLE == 'N') {  // view only 
     // check each column 
     //console.log(data); 

     for (var j = 0; j < columnModels.length; j++) { 
     var model = columnModels[j]; 

     if (model.editable) { 
     console.log('Is Editable? '+model.editable); 
      //grid.setCell(rowid, model.name, '', 'not-editable-cell', {editable: false, edithidden: true}); 
      grid.setCell(rowid, model.name, '', 'not-editable-cell', {editoptions: { readonly: 'readonly', disabled: 'disabled' }}); 
     } 
     } 
    } 
    } 
} 

但editoptions似乎並沒有做這樣的事情。

任何想法如何做到這一點?

+0

我也想過也許我可以使用現有的事件,但我不確定是否有像「beforeEdit」這樣的表單編輯。我也願意修改或擴展源代碼來捕獲編輯Click事件......但我需要知道在哪裏尋找... – Bean 2015-02-17 21:08:27

回答

1

好的感謝解釋關於表單編輯。下面是如何防止在特定的記錄編輯爲的jqGrid與表單編輯爲例:顯示編輯表單之前http://www.ok-soft-gmbh.com/jqGrid/MulticolumnEdit.htm

  • 使用beforeInitData事件來檢查您的數據:

    • 開始與jqGrid的形式編輯的這個例子。請注意,這是綁定到尋呼機對象。
    • 使用getGridParam和getCell方法獲取所需的當前值。在我的示例中,我抓住客戶名稱
    • 添加您自己的業務邏輯以進行檢查(我不允許在'test2'上進行編輯)
    • 返回false以防止編輯表單彈出。
    • 此示例只處理編輯,不插入或刪除。
    • 從示例與此替換$ grid.jqGrid( 「navGrid」, 「#pager」,...):

      $grid.jqGrid("navGrid", "#pager", {view: true}, 
          // Events for edit 
          { 
           beforeInitData: function (formid) { 
            var selectedRow = jQuery("#list").jqGrid('getGridParam','selrow'); //get selected rows 
            var selectedClient = $("#list").jqGrid('getCell', selectedRow, 'name'); 
            if(selectedClient == 'test2') 
            { 
             alert('You are not allowed to edit records for client "' + selectedClient + '"'); 
             return false; 
            } 
           }  
          }, 
          // Events for add 
          { 
           beforeShowForm: function (formid) { 
           }  
          } 
      ); 
      
  • +0

    這很好用! – Bean 2015-02-18 18:02:58

    +0

    在這個地方,我意識到我的邏輯是有缺陷的......它完美地阻止用戶提出編輯表單來防止編輯,但由於用戶具有讀取權限,他們應該能夠查看。問題是,由於我的Grid沒有顯示我的數據的所有列,你必須去編輯表單才能看到所有的數據......這讓我回想起需要使每行不可編輯的東西。我打算髮揮我在OP中發佈的功能,但是如果您有任何想法,我都會全力以赴......我可能還會打開另一張票,因爲它是一個單獨的問題 - 有點類似。 – Bean 2015-02-18 19:39:44

    +1

    您可以將列保留在數據和網格中,但只是將其隱藏起來。查看錶單和編輯表單也會隱藏該字段。示例: colModel:{name:「name」,align:「center」,width:65,editrules:{required:true}, formoptions:{rowpos:1,colpos:1}}, {name :「ACCROLE」,hidden:true}, 爲了確保安全,在保存請求有效的情況下,如果黑客使用JavaScript混淆,則必須在後端進行仔細檢查。 – 2015-02-19 02:55:35

    0

    您沒有提供更多有關如何更新行的信息(JQGrid網頁演示中提供了各種方法,但是我猜想了解可能的解決方案。我從底部的示例開始此頁面(trirand網站維基inline_editing)http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing

    • 增加了一個新的數據列securityGroup,並把數據像 'A', 'B', 'C'
    • ,並做了一些改動。在網格中顯示新數據列
    • 該示例使用onSelectRow事件開始編輯行,如果單擊了o新的一排。我更新了這個回調檢查行[ 'securityGroup']的值,只有開始.editRow如果它在securityGroupA
    • 的jsfiddle在http://jsfiddle.net/brianwoelfel/52rrunar/

    這裏的回調:

    onSelectRow: function(id){ 
        var row = $(this).getLocalRow(id); 
    
        if(id && id!==lastsel2){ 
        jQuery('#rowed5').restoreRow(lastsel2); 
        if(row['securityGroup'] == 'A') { 
         jQuery('#rowed5').editRow(id,true); 
        } 
         lastsel2=id; 
        } 
    }, 
    

    如果這方法不適合你,請提供更多關於你如何使用jqGrid進行編輯的信息。這個例子顯然是非常微不足道的,甚至不會發布到PHP或MySQL或任何東西。

    +0

    非常感謝您的回覆......我正在使用表單編輯,而不是內聯編輯...所以這是行不通的。 – Bean 2015-02-18 15:42:28

    0

    萬一這將是對他人有所幫助,這裏是

    在editoptions,使用beforeShowForm事件,像這樣:

    beforeShowForm: function (formid) { 
    console.log('Checking for READONLY '+formid.name);       
          var selectedRow = jQuery("#list1").jqGrid('getGridParam','selrow'); //get selected rows 
          var selRole = $("#list1").jqGrid('getCell', selectedRow, 'ACCROLE'); 
          if(selRole == 'N' || selRole == 'S' || selRole == 'R') 
          { 
           //$("<div>Sorry, you do not have access to edit this record.</div>").dialog({title: "Access Denied"}); 
           formid.find("input,select,textarea") 
           .prop("readonly", "readonly") 
           .addClass("ui-state-disabled") 
           .closest(".DataTD") 
           .prev(".CaptionTD") 
           .prop("disabled", true) 
           .addClass("ui-state-disabled"); 
    
           formid.parent().find('#sData').hide(); 
           var title=$(".ui-jqdialog-title","#edithd"+"list1").html(); 
           title+=' - READONLY VIEW'; 
           $(".ui-jqdialog-title","#edithd"+"list1").html(title); 
           formid.prepend('<span style="color: Red; font-size: 1em; font-weight: bold;">You viewing READONLY data.</span>'); 
    
          } 
    
    如何我在表單編輯模式,在此基礎上指定的用戶必須每行的訪問級別的列執行只讀行, 0