실습 jqGrid 버전: CDN 제공하는 v4.6 버전으로 테스트
jqGrid는 자식레코드를 처리하는 두가지 방법을 제공한다.
1. 서브그리드
2. 서브그리드에서의 그리드
Subgrid
- grid.subgrid.js 모듈이 로딩되어야 한다.
- 부모 그리드에서 선택한 레코드의 자식의 레코드를 손쉽게 보여주거나 편집해야 하는 경우가 있다.
- 물론 그리드에서 선택한 레코드의 자식레코드만 보여줄 것이며, 모든 자식레코드를 보여주지는 않는다.
* Subgrid는 부모그리드의 아래 속성, 이벤트, 메소드를 사용하기 때문에 그리드 옵션에 이러한 속성을 설정해야한다.
속성
1004lucifer
Property | Type | Description | Default |
---|---|---|---|
subGrid | boolean | true 설정 시 서브그리드를 사용한다. 서브그리드가 사용되면 기본 그리드의 왼쪽에 컬럼이 추가되며, 해당 컬럼에는 'plus' 이미지가 있고 해당 이미지를 클릭하면 row가 펼쳐진다. (기본적으로 row는 접혀있다.) |
false |
subGridOptions | object | 서브그리드의 옵션셋. 아래는 옵션의 기본값이다. { plusicon : “ui-icon-plus”, minusicon : “ui-icon-minus”, openicon: “ui-icon-carat-1-sw”, expandOnLoad: false, selectOnExpand : false, reloadOnExpand : true } plusicon 과 minusicon - 그리드의 확장/축소 아이콘을 정의하며, 테마Roller의 유효한 아이콘을 설정해야한다. openicon - 서브그리드의 row가 확장되었을 때 마이너스 아이콘 아래에 있는 아이콘 expandOnLoad - true 설정 시 신규 데이터셋이 로드될 때 모든 row가 자동으로 확장된다. selectOnLoad - true 설정 시 마우스로 플러스 아이콘을 클릭 시 row가 선택된다. reloadOnExpand - false 설정 시 서브그리드의 데이터를 한번만 불러오며, 다른 서브그리드는 ajax호출없이 보여주거나 숨기기만 한다. |
|
subGridModel | array | 이 속성은 subGrid 속성이 true인 경우에만 적용되며 subgrid의 모델을 설명하는 속성이다. 이 속성은 서브브리드 데이터에 대한 컬럼모델을 설명하는 배열이다. The syntax is : subGridModel : [ { name : ['name_1','name_2',…,'name_n'], width : [width_1,width_2,…,width_n] , align : ['left','center',…,'right'] , params : [param_1,…,param_n], mapping:['name_1_map','name_2_map',…,'name_n_map']} name: 서브그리드 컬럼의 라벨이 포함되어있는 배열 width: 컬럼의 width값을 포함하는 배열이며, name속성의 갯수와 동일해야 한다. align: 컬럼의 배치에 대한 배열이며, 값은 left / center / right (기본값: left) params: subGridUrl로 추가 파라메터를 전달할 메인그리드의 colModel name값 배열 mapping: subgrid의 repeatitems항목이 false인 경우에만 사용되며, 이경우 정의된 name배열을 서브그리드 name에 매핑한다. 만약 정의되어 있지 않고 repeatitems가 false라면 name옵션을 사용한다. |
|
subgridtype | mixed | 이 옵션은 서브그리드의 서비스를 로드할 수 있다. 설정되지 않으면 부모 그리드의 datatype이 사용된다. 아래 예제를 참조 |
null |
subGridWidth | integer | 서브그리드가 활성화 된경우 서브그리드의 컬럼width를 지정한다. | 20 |
subGridUrl | string | subGrid 옵션이 true인 경우에만 사용가능 이 옵션은 서브그리드의 데이터를 가져오는 URL을 가리킨다. jqGrid는 url파라메터에 row의 id를 추가하며, 추가 매개변수를 전달해야 하는경우 subGridModel의 params옵션을 사용한다. |
empty string |
ajaxSubgridOptions | object | 이 옵션은 서브그리드가 서버에 데이터를 요청할 때 ajax 전역설정을 셋팅할 수 있으며, 요청에 대한 complete 이벤트를 포함하고 현재 ajax설정을 덮어쓴다. | empty object |
서브그리드를 구성하려면 xmlReader 또는 jsonReader에서 서브그리드 항목을 구성해야 하며, 기본값은 다음과 같다.
xmlReader : { ... subgrid: { root: "rows", row: "row", repeatitems: true, cell: "cell" } }
jsonReader : { ... subgrid: { root: "rows", repeatitems: true, cell: "cell" } }매핑규칙은 기본 그리드와 동일하며 자세한 정보는 데이터조작 을 참조
서브그리드의 서비스호출에 대한 간단한 코드는 아래와 같다.
jQuery("#grid_id").jqGrid({ ... subgridtype: function(rowidprm) { jQuery.ajax({ url:'url_to_the_service', data:rowidprm, dataType:"json", complete: function(jsondata,stat){ if(stat=="success") { var thegrid = jQuery("#grid_id")[0]; thegrid.subGridJson(eval("("+jsondata.responseText+")"),rowidprm.id); } } }); },subgrid ... });rowidprm - row의 id와 subGridModel 파라메터를 설정하는데 필요한 다른 매개변수가 포함된 배열
subGridJson - 아래 설명의 메소드
이벤트
pID - 서브그리드가 활성화 되었을 때 내용을 넣을 수 있는 div요소의 고유id
id - row의 id
sPostData - 서브그리드가 서버에 요청할때 사용하는 데이터
1004lucifer
Event | Parameters | Description |
---|---|---|
subGridBeforeExpand | pID, id | 그리드를 확장하기전에 호출된다. 이 이벤트를 설정 시 true 또는 false를 반환해야 한다. false 반환 시 서브그리드 row는 확장되지 않으며 보여지지 않는다. |
subGridRowExpanded | pID, id | 서브그리드가 활성화 되어있고 사용자가 플러스(+)버튼을 클릭하면 호출된다. 서브그리드에 사용자정의 데이터를 넣을 때 사용한다. |
subGridRowColapsed | pID, id | 사용자가 마이너스(-)버튼을 누르면 호출된다. 이 이벤트는 true 또는 false를 반환해야 하며 false 반환 시 row는 축소되지 않는다. |
serializeSubGridData | sPostData | 설정 시 ajax요청 시 직렬화 데이터를 전달할 수 있다. 직렬화 데이터를 반환해야 하며, 서버에 사용자정의 데이터를 넘겨줄 때 사용할 수 있다. ex) JSON string, XML string 등등 |
메소드
Method | Parameters | Returns | Description |
---|---|---|---|
expandSubGridRow | rowid | jqGrid object | id=rowid를 사용하여 서브그리드를 동적으로 확장한다. |
collapseSubGridRow | rowid | jqGrid object | id=rowid를 사용하여 서브그리드를 동적으로 축소한다. |
toggleSubGridRow | rowid | jqGrid object | id=rowid를 사용하여 서브그리드를 동적으로 토글한다. |
subGridJson | json, rowid | false | 서브그리드 row에 데이터를 추가한다. json - json object rowid - 데이터가 추가된 후 row의 id |
subGridXml | xml, rowid | false | 서브그리드 row에 데이터를 추가한다. xml - xml dom element rowid - 데이터가 추가된 후 row의 id |
Ex)
<script type="text/javascript"> jQuery(document).ready(function(){ jQuery("#list").jqGrid({ url:'example.php', datatype: 'xml', mtype: 'GET', colNames:['Inv No','Date', 'Amount','Tax','Total','Notes'], colModel :[ {name:'invid', index:'invid', width:55}, {name:'invdate', index:'invdate', width:90}, {name:'amount', index:'amount', width:80, align:'right'}, {name:'tax', index:'tax', width:80, align:'right'}, {name:'total', index:'total', width:80, align:'right'}, {name:'note', index:'note', width:150, sortable:false} ], pager: '#pager', rowNum:10, rowList:[10,20,30], sortname: 'invid', sortorder: 'desc', viewrecords: true, caption: 'My first grid', subGrid: true, subGridUrl : "subgrid.php", subGridModel : [ { name : ['No', 'Item', 'Qty', 'Unit', 'Line Total'], width : [55, 200, 80, 80, 80], align : ['left','left','right','right','right'], params: ['invdate'] } ] }); }); </script>
subgrid <?php // get the id passed automatically to the request $id = $_GET['id']; // get the invoice date passed to this request via params array in //subGridModel. We do not use it here - this is only demostration $date_inv = $_GET['invdate']; suboptions = { plusicon : "ui-icon-plus", minusicon : "ui-icon-minus", openicon: "ui-icon-carat-1-sw", expandOnLoad: false, delayOnLoad : 50, selectOnExpand : false, reloadOnExpand : true }; // connect to the database $db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error()); mysql_select_db($database) or die("Error conecting to db."); // construct the query suboptions = { plusicon : "ui-icon-plus", minusicon : "ui-icon-minus", openicon: "ui-icon-carat-1-sw", expandOnLoad: false, delayOnLoad : 50, selectOnExpand : false, reloadOnExpand : true }; $SQL = "SELECT item_num, item, qty, unit FROM invlines WHERE invid=".$id." ORDER BY item"; $result = mysql_query( $SQL ) or die("Couldn?t execute query.".mysql_error()); // set the header information 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"); } echo "<?xml version='1.0' encoding='utf-8'?>"; echo "<rows>"; // be sure to put text data in CDATA while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { echo "<row>"; echo "<cell>". $row[item_num]."</cell>"; echo "<cell><![CDATA[". $row[item]."]]></cell>"; echo "<cell>". $row[qty]."</cell>"; echo "<cell>". $row[unit]."</cell>"; echo "<cell>". number_format($row[qty]*$row[unit],2,'.',' ')."</cell>"; echo "</row>"; } echo "</rows>"; ?>
서브그리드 활성화/비활성화
서브그리드는 동적으로 활성화/비활성화 할 수 있다.
1004lucifer
- 서브그리드 활성화
jQuery("#grid_id").showCol('subgrid');- 서브그리드 비활성화
jQuery("#grid_id").hideCol('subgrid');grid_id: 그리드의 id이며 name으로 대체가 가능
subgrid: 키워드가 아니며 다른 문자열로 대체할 수 없다.
* 이 작업을 수행하려면 jqGrid 속성에서 subGrid가 true로 설정되어있어야 한다.
참고
- http://www.trirand.com/jqgridwiki/doku.php?id=wiki:subgrid
댓글
댓글 쓰기