Wiki

Clone wiki

yii-stuff / gridview_paging_dropdown

Как задать количество позиций на странице CGridView через выпадающее меню

/protected/config/main.php:

	<?php	
	// ..
		// Доступно через Yii::app()->params['defaultPageSize']
		'params'=>array (
			// ..
			'defaultPageSize'=>20,
			// ..
		)
	// ..
	?>

/protected/controllers/MyController.php:

	<?php
	// ..
	public function actionAdmin()
	{
		// если изменилась настройка
		if (isset($_GET['pageSize'])) {
			Yii::app()->user->setState('pageSize',(int)$_GET['pageSize']);
			unset($_GET['pageSize']);  // сбросим, чтобы не пересекалось с настройками пейджера
		}
		// ..
	}
	// ..
	?>

/protected/models/MyModel.php:

	<?php
		public function search()
		{
			// ..
			return new CActiveDataProvider(get_class($this),array(
				'pagination'=>array(
					'pageSize'=> Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']),
				),
				'criteria'=>$criteria,
			));
		}
	?>

/protected/views/my/admin.php:

	<?php
	// считываем настройку
	$pageSize=Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']);		
	?>
	<?php 
	// выводим датагрид
	$this->widget('zii.widgets.grid.CGridView', array(
	    'id'=>'user-grid',
	    'dataProvider'=>$model->search(),
	    'filter'=>$model,
	    'columns'=>array(
	        'id',
	        'username',
	        'email',
	        // наша колонка с настройками
	        array(
	            'class'=>'CButtonColumn',
	            'header'=>CHtml::dropDownList(
	                'pageSize',
	                $pageSize,
	                array(5=>5,20=>20,50=>50,100=>100),
	                array('class'=>'change-pagesize')
	            ),
	        ),
	    ),
	)); ?>
	<?php
	// немножко JS, чтобы на лету все обновлялось
	Yii::app()->clientScript->registerScript('initPageSize',<<<EOD
	    $('.change-pagesize').live('change', function() {
	        $.fn.yiiGridView.update('user-grid',{ data:{ pageSize: $(this).val() }})
	    });
	EOD
	,CClientScript::POS_READY); ?>

Автор: Mike

Updated