モデルを使わないCGridViewサンプル

続いてモデルを使わずzii.widgets.CGridtViewを使ってみる。

サンプルコード

ボタンカラムは、データ各要素にprimaryKeyプロパティを要するのでコメントアウトしています。もちろん回避する方法はあるだろうが今回そこまでやらない。

protected/controllers/SiteController.php

<?php
    public function actionIndex()
    {
        $data = array(
            (object)array('id'=>1,'title'=>'アルファ','create_time'=>time(),
                'content'=>'<div>content</div>',
                'category'=>(object)array('name'=>'コメディ'),
                'author'=>(object)array('username'=>'アルファのauthor'),
            ),
            (object)array('id'=>2, 'title'=>'ベータ', 'create_time'=>time(),
                'content'=>'<div>content</div>',
                'category'=>(object)array('name'=>'アクション'),
                'author'=>(object)array('username'=>'ベータのauthor'),
            ),
            (object)array('id'=>3, 'title'=>'チャーリー', 'create_time'=>time(),
                'content'=>'<div>content</div>',
                'category'=>(object)array('name'=>'アニメ'),
                'author'=>(object)array('username'=>'チャーリーのauthor'),
            ),
            (object)array('id'=>4, 'title'=>'デルタ', 'create_time'=>time(),
                'content'=>'<div>content</div>',
                'category'=>(object)array('name'=>'ホラー'),
                'author'=>(object)array('username'=>'デルタのauthor'),
            ),
        );
    
        $dataProvider = new CArrayDataProvider($data);

        $this->widget('zii.widgets.grid.CGridView', array(
            'dataProvider'=>$dataProvider,
            'columns'=>array(
                'title',
                'category.name',  // display the 'name' attribute of the 'category' relation
                'content:html',   // display the 'content' attribute as purified HTML
                array(
                    'name'=>'create_time',
                    'value'=>'date("M j, Y", $data->create_time)',
                ),
                array(            // display 'author.username' using an expression
                    'name'=>'authorName',
                    'value'=>'$data->author->username',
                ),
//                array(            // display a column with "view", "update" and "delete" buttons
//                    'class'=>'CButtonColumn',
//                ),
            ),
        ));
    }

'category.name' としたり、array('value'=>'$data->author->username') としたりしています。

得られたHTML

table が得られた。単純なarrayからtableへの整形にも使えそうです。

<div id="yw0" class="grid-view">
  <div class="summary">Displaying 1-4 of 4 result(s).</div>
  <table class="items">
    <thead>
      <tr>
        <th id="yw0_c0">title</th><th id="yw0_c1">category.name</th><th id="yw0_c2">content</th><th id="yw0_c3">create_time</th><th id="yw0_c4">authorName</th>
      </tr>
    </thead>
    <tbody>
      <tr class="odd"><td>アルファ</td><td>コメディ</td><td><div>content</div></td><td>Mar 7, 2012</td><td>アルファのauthor</td></tr>
      <tr class="even"><td>ベータ</td><td>アクション</td><td><div>content</div></td><td>Mar 7, 2012</td><td>ベータのauthor</td></tr>
      <tr class="odd"><td>チャーリー</td><td>アニメ</td><td><div>content</div></td><td>Mar 7, 2012</td><td>チャーリーのauthor</td></tr>
      <tr class="even"><td>デルタ</td><td>ホラー</td><td><div>content</div></td><td>Mar 7, 2012</td><td>デルタのauthor</td></tr>
    </tbody>
  </table>
  <div class="keys" style="display:none" title="/test/"><span>1</span><span>2</span><span>3</span><span>4</span></div>
</div>

ソート&ページネーション

これでソート、ページネーションできた。 リレーションフィールドに対してはできなかったが、今回は(略)

<?php
        $dataProvider = new CArrayDataProvider($dt, array(
            'sort'=>array(                       // ソート設定
                'attributes'=>array('title', 'category.name', 'content', 'create_time', 'authorName'),
            ),
            'pagination'=>array(                // ページネーション設定
                'pageSize'=>10,
            ),
        ));