今天遇到個問題,我將CSqlDataProvider數據代入CGridView的時候,數據能正常使用,但按鈕就不能使用了,會提示出錯。 php
問過些朋友,原來sqlDataProvider 中的數據集 是一個二維數組,原始的CGRidView 裏面的CColumnButton 默認用的是一個Ar 但你用sqlDataProvider後就變成了關聯數組了。因此 url生成那裏就出錯了。 sql
$data 可能表示一個AR 或者是一個數組 數組
當用SqlDataProvider ,ArrayDataProvider 時就是一個數組,這時候 CButtonColumn 的三個默認url 就須要本身手動修改了 否則就出錯了
app
下面附上一段自動生成CGridView的代碼,只須要將你獲得的CSqlDataProvider數據輸入便可。 ide
/** * @param CSqlDataProvider $dp * 針對CSqlDataProvider自動生成CGridView的代碼 */ static public function gridView4sqlDataProvider(CSqlDataProvider $dp) { $rowSet = $dp->getData(); $firstRow = array(); if (!empty($rowSet)) { $firstRow = current($rowSet); } $columns = ''; foreach (array_keys($firstRow) as $column) { $columnItem = <<<COL_ITEM array( 'name'=>'{$column}', 'header'=>'{$column}', 'value'=>'\$data["{$column}"]' ), COL_ITEM; $columns .= "\n".$columnItem; } $code = <<<TPL \$this->widget('zii.widgets.grid.CGridView', array( 'id'=>'yourId', 'dataProvider'=>\$dataProvider, 'columns'=>array({$columns} array( 'class' => 'CButtonColumn', 'viewButtonUrl' => 'Yii::app()->controller->createUrl("view",array("id"=>\$data["id"]))', 'updateButtonUrl' => 'Yii::app()->controller->createUrl("update",array("id"=>\$data["id"]))', 'deleteButtonUrl' => 'Yii::app()->controller->createUrl("delete",array("id"=>\$data["id"]))', ), ), ) ); TPL; echo $code ; // self::renderCode($code); }