Yii

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)