Yii CGridView パラメータの指定2
CGridView は、かなり複雑な指定ができるようで奥が深い。こんなことできないかなぁ、と思って試してみると思った通りの結果が得られて驚かされる。で、いつものように備忘録となります。標題は「指定2」で、「指定1」は「Yii actionAdminのsearch-formとCGridViewで悪戦苦闘」がそれに当たる。
項目のデータを、3桁区切りのコンマを付けて右寄せ表示したい
<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カラムにリンク項目を2つ以上セットしたい場合
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)

コメントはまだありません。