Вывод данных sql запроса в CGridView

Иногда для отображения некоторых данных проще и быстрее использовать SQL запрос с возможностью вывода полученных результатов в CGridView. Вроде бы простая задача, но и здесь для новичка не все очевидно. Итак, для начала запишем в переменную наш запрос:

$sql = "select * from test_table";

Далее, выполним команду и получим весь массив данных:

$rows = Yii::app()->db->createCommand($sql)->queryAll();

Определим количество элементов:

$count = count($rows);

Используя CSqlDataProvider получаем массив пригодный для вывода в CGridView. Вместе с SQL запросом передаем массив с параметрами, где keyField — это уникальный идентификатор в таблице базы данных, в моем случае он имеет имя id и является инкрементом, totalItemCount — количество элементов, полученное ранее, pagination — это массив задающий параметры постраничной навигации, обычно необходим когда информации много, pageSize — количество элементов на 1 странице. В общем случае параметр pagination может быть опущен.

$SqldataProvider = new CSqlDataProvider($sql, array(
	'keyField'=>'id',
	'totalItemCount'=>$count,
	'pagination'=>array(
		'pageSize'=>100,
	),
));

Ну и последний этап это собственно вывод таблицы с помощью компонента CGridView, который входит в стандартный пакет виджета zii фраймворка Yii.

$this->widget('zii.widgets.grid.CGridView', array(
	'dataProvider'=>$SqldataProvider,
	'enablePagination' => true,
));

В данном случае как dataProvider мы используем полученный ранее массив $SqldataProvider и параметром enablePagination со значением true включаем постраничную навигацию.

Ниже привожу весь листинг кода для вашего Yii представления.

$sql = "select * from test_table";
$rows = Yii::app()->db->createCommand($sql)->queryAll();
$count = count($rows);
$SqldataProvider = new CSqlDataProvider($sql, array(
	'keyField'=>'id',
	'totalItemCount'=>$count,
	'pagination'=>array(
		'pageSize'=>100,
	),
));
$this->widget('zii.widgets.grid.CGridView', array(
	'dataProvider'=>$SqldataProvider,
	'enablePagination' => true,
));

В результате выполнения у вас должно получиться что-то подобное:

test table

comments powered by HyperComments
Алексей Лихачев
2014-04-02 21:21:37
да, разнести конечно можно и даже лучше, но в данном случае для наглядности приводится пример как раз использования в представлении в итоге в контроллере должно после кода должно быть что-то вроде $this->render('index',array('SqldataProvider'=>$SqldataProvider)); Но не уверен и пишу по памяти, по возможности постараюсь написать рабочий вариант в следующих заметках
Денис
2014-01-11 02:19:13
Спасибо прикольно, пишите больше добавлю Вас в твит
Алексей Лихачев
2014-01-11 04:12:20
Рад что понравилось, будем стараться
Геннадий
2014-04-02 21:09:26
и можно ли разнести части этого примера так, чтобы $this->widget('zii.widgets.grid.CGridView', array( 'dataProvider'=>$SqldataProvider, 'enablePagination' => true, )); было во view, а все остальное предыдущее - в controller? а то у меня только если весь Ваш код во view писать - получается, а если первую часть с подготовкой источника данных поместить в контроллер - не выходит что-то
Геннадий
2014-04-02 20:36:27
спасибо. я новичок, для меня - это как раз кстати
Геннадий
2014-04-02 20:41:15
еще такой вопрос (повторюсь, я новичок, поэтому, может быть, вопрос ламерский и сильно простой). можно ли модифицировать код так, чтобы в последнем столбце была кнопка с onclick действием ajax для записи?
Алексей Лихачев
2014-04-02 21:23:17
я тоже новичек) а по теме будет что-то вроде этого http://play-stop.ru/yii/dopolnitelnaya-kolonka-v-cgridview-s-chekboksami.html только вместо чекбокса кнопку, а отправка и прием можно взять отсюда http://play-stop.ru/yii/variant-priyoma-i-otpravki-ajaxpost-zaprosov-v-yii.html
kg
2014-12-02 08:02:13
Отличная статья Пригодился Спасибо
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!