jqGridのcolModelをPHPで生成できなかった
目的
jqGridのcolModelをPHP側で設定したい。
結論
力及ばず。毎回コードを書くことにしました。
Javascriptのコールバック関数を各列毎に設定するのがめんどくさすぎる。
PHPのヒアドキュメント構文を駆使して作れないこともないけれど美しくない。
PHP側の設定
<?php class JqgridController extends Zend_Controller_Action { protected $_column = array( 'table' => 'sales', 'caption' => 'sales', 'colModel' => array( array("label" => "ID", "name" => "id", "width" => 50, "align" => "right", 'search' => false), array("label" => "状態", "name" => "status", "width" => 50, "align" => "right", 'search' => false), array("label" => "発生", "name" => "channel", "width" => 50, "align" => "right", 'search' => false), array("label" => "変更", "name" => "modified", "width" => 50, "align" => "right", 'search' => false) ) ); protected function _getCols() { $cols = array(); foreach ($this->_column['colModel'] as $model) { $cols[] = $model['name']; } return $cols; } public function indexAction() { $options = array( "url" => $this->_helper->url('search', 'Jqgrid'), "datatype" => 'json', "rowNum" => 25, "rowList" => array(25, 50, 100), "sortorder" => "asc", "caption" => $this->_column['caption'], "autowidth" => true, "height" => "95%", ); $this->view->options = json_encode($options); // model $this->view->model = json_encode(array('colModel' => $this->_column['colModel'])); } public function searchAction() { $this->_db = Zend_Registry::get('db'); $select = $this->_db->select()->from('sales', $this->getColsSQL()); $rows = $this->_db->fetchAll($select); $i = 0; foreach ($rows as $key => $value) { $ret->rows[$i]['id'] = $value['id']; $ret->rows[$i]['cell'] = array_values($value); $i++; } /* ここは大幅に省略中 */ $ret->page = 1; $ret->total = 1; $ret->records = 3; $json = json_encode($ret); $this->_helper->viewRenderer->setNoRender(true); header('Content-Type: application/json; charset=UTF-8'); echo $json; } }
HTML側の設定
<script type="text/javascript"> $(function() { // jqgrid_datepickerはヒアドキュメントにして // Zend_Viewの $this->headScript->prependScript() // とかで作成したい // modelに設定する // editoptions { dataInit: jqgrid_datepicker }} var jqgrid_datepicker = function(e) { $(e).datepicker({dateFormat: "yy-mm-dd"}); $('.ui-datepicker').css({"font-size":"70%"}); }; var sopt = $.parseJSON('<?php echo $this->options ?>'); var model = $.parseJSON('<?php echo $this->model ?>'); /* * ここら辺で $.extend(model(0), jqgrid_datepicker) * とかしてコールバックを設定したい */ var opt = { loadError : function (xhr, status, error) { alert(xhr.statusText); }, "postData" : {"_detect": "京"},// for mb_detect_encode "pager" : "#pager", "viewrecords" : true, "autowidth" : true, "height" : "95%", }; sopt = $.extend(sopt, model); opt = $.extend(sopt, opt); $("#list").jqGrid(opt) .jqGrid("navGrid", "#pager", { edit: false, add: false, del: false, search: false, refreshstate: "current"}, {height: 450, width: 350}, // edit {height: 450, width: 350}, // add {}, // delete {multipleSearch: true, closeAfterSearch: true, sopt: ['cn','le','ge','bw','ew','eq'] } // search ); }); </script>
もう一回挑戦するとき用メモ
JqGrid and Zend Framework | iphp::blog()
http://blog.iphp.co.uk/php/jqgrid-and-zend-framework/
jqGrid
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:common_rules#editoptions
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:search_config
PHP Array to Javascript Object
http://www.phpclasses.org/browse/file/15942.html
http://www.weberdev.com/get_example-4719.html