モデルを使わないCListViewサンプル
モデルを使わずzii.widgets.CListViewを使ってみる。
CListViewで何が得られるのか検証したかったのですが、モデルを用意するのが面倒だったので書きました。
サンプルコード
protected/controllers/SiteController.php
<?php public function actionIndex() { $data = array( (object)array('id'=>1, 'title'=>'アルファ', 'create_time'=>time()), (object)array('id'=>2, 'title'=>'ベータ', 'create_time'=>time()), (object)array('id'=>3, 'title'=>'チャーリー', 'create_time'=>time()), (object)array('id'=>4, 'title'=>'デルタ', 'create_time'=>time()), ); $dataProvider = new CArrayDataProvider($data); $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_post', // refers to the partial view named '_post' 'sortableAttributes'=>array( 'title', 'create_time'=>'Post Time', ), )); }
protected/views/site/_post.php
<div class="post"> <span class="id"><?php echo CHtml::encode($data->id); ?></span> <span class="title"><?php echo CHtml::encode($data->title); ?></span> </div>
得られたHTML
<div id="yw1" class="list-view"> <div class="summary">Displaying 1-4 of 4 result(s).</div> <div class="sorter"> Sort by: <ul> <li>title</li> <li>Post Time</li> </ul> </div> <div class="items"> <div class="post"><span class="id">1</span><span class="title">アルファ</span></div> <div class="post"><span class="id">2</span><span class="title">ベータ</span></div> <div class="post"><span class="id">3</span><span class="title">チャーリー</span></div> <div class="post"><span class="id">4</span><span class="title">デルタ</span></div> </div> <div class="keys" style="display:none" title="/yiiprac4/"><span>1</span><span>2</span><span>3</span><span>4</span></div> </div>
DataProviderを通して渡したデータが_post.phpへ$dataとして渡されます。
ページネーション、ソートはできませんが、_post.php やCListView.templateプロパティ、CListView.summaryTextプロパティなどをカスタマイズしていけば何が得られるのかわかってくると思います。
ソート&ページネーション - 追記
DataProviderを次のようにしてやるとソート、ページネーションしてくれます。すてき。
SQLの order,limit に依存しているから Arrayはできないと思い込んでいた。
<?php $dataProvider = new CArrayDataProvider($data, array( 'sort'=>array( // ソート設定 'attributes'=>array('title', 'create_time',), ), 'pagination'=>array( // ページネーション設定 'pageSize'=>10, ), ));