CGridView は、かなり複雑な指定ができるようで奥が深い。こんなことできないかなぁ、と思って試してみると思った通りの結果が得られて驚かされる。で、いつものように備忘録となります。標題は「指定2」で、「指定1」は「Yii actionAdminのsearch-formとCGridViewで悪戦苦闘」がそれに当たる。
<php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'price-grid', // データ件数、テーブル、ページネーションを囲むdivタグのid名 'dataProvider'=>$dataProvider, 'columns'=>array( 'id', 'title', array( 'name'=>'price', 'value'=>'number_format($data->price)', 'htmlOptions'=>array('style'=>'text-align:right'), ), ), )); ?>
DBのカラム名だけ指定すると、表のヘッダー名(thタグ)はモデルの「attributeLabels()」メソッドの値が使われる。
上の例のように、’name’ にDBのカラム名を指定すると、同様にモデルの「attributeLabels()」メソッドの値が利用される。あるいは、別の文字列を与えればそれが表示される。
3桁区切りは、PHPの number_format() 関数を利用すればよい。PHP 5.3 からは無名関数が利用できるので、複雑な処理ができるようになる。
表示の右寄せは CSS で指定するが、’htmlOptions’ を使って td タグ出力に属性を追加する事ができる。
1行に表示するデータで、そのデータの編集処理へのリンクを最後のカラムに置きたい場合、「その1」で述べた方法や次のような CHtml::link を使った方法がある。
<php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'price-grid', 'dataProvider'=>$dataProvider, 'columns'=>array( 'id', 'title', array( 'name'=>'price', 'value'=>'number_format($data->price)', 'htmlOptions'=>array('style'=>'text-align:right'), ), array( 'name'=>'処理', 'type'=>'raw', 'value'=>'CHtml::link("編集", array("edit", "id"=>$data->id))', ), ), )); ?>
では、編集処理のリンクの後ろに「編集 | 削除」のように、削除処理のリンクを追加したい場合はどうしたらよいのだろうか?
‘value’ の値に配列を指定すると、ビューからコントローラのメソッドを呼び出す仕掛けが用意されている。それを利用すればよい。これは、’value’ の値に array(データ, メソッド名) と指定する。
<php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'price-grid', 'dataProvider'=>$dataProvider, 'columns'=>array( 'id', 'title', array( 'name'=>'price', 'value'=>'number_format($data->price)', 'htmlOptions'=>array('style'=>'text-align:right'), ), array( 'name'=>'処理', 'type'=>'raw', 'value'=>array($this, 'linkRender') ), ), )); ?> //コントローラのメソッド protected function linkRender($data, $row, $grid) { $edit = CHtml::link('編集', array('edit', 'id'=>$data->id)); $delete = CHtml::link('削除', array('delete', 'id'=>$data->id)); return "{$edit} | {$delete}"; }
(100608 yii-1.1.2.r2086)