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>