Simple widget for select Grid View page size
Screen shot ¶

Requirements ¶
Yii 1.1 or above
Usage ¶
// Extract and put PageSize folder into extensions directory
// Place the widget just before the GridView
<div align="right" class="row">
<?php
$this->widget('application.extensions.PageSize.PageSize', array(
'mGridId' => '<grid-id>', //Gridview id
'mPageSize' => @$_GET['pageSize'],
'mDefPageSize' => Yii::app()->params['defaultPageSize'],
'mPageSizeOptions'=>Yii::app()->params['pageSizeOptions'],// Optional, you can use with the widget default
));
?>
</div>
// Add below to your model search()
'pagination' => array( 'pageSize'=>Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']),
)
// Add below to your config/main.php params
'defaultPageSize' = 10,
'pageSizeOptions'=>array(10=>10,20=>20,50=>50,100=>100),
// Thats it.
Note: if you having issue with ajax submission fix this issue of framework
User Contributed Notes 8
Works beautifully in 1.1.8, including ajax
Works beautifully with no problems, including ajax submission, in 1.1.8 (no need to do the 'fix' in 1.1.8)
Just make sure, 'files-grid' matches your cgridview's 'id'
'mGridId' => 'files-grid'Thx for the plugin!
Thank you!
Good work!
another usage example !
it 's possible to use it in gii/giix to generate your admin view:
and no need to modify your model class :
$dataProvider = $model->search(); $pageSize = Yii::app()->user->getState('pageSize',10/*Yii::app()->params['defaultPageSize']*/); $dataProvider->getPagination()->setPageSize($pageSize);i v modified the original ext , want to support both CGridView and CListView ,but
encounter some problem , the js function $.fn.yiiGridView.update/$.fn.yiiListView internal use this code to generate url:
options.url = $.param.querystring(options.url, options.data);
in pathInfo mode ,after you selected the pageSize and click some pageButton some thing strange happens , see the address of the pageLink such as :
http://localhost/myProjName/user/admin/pageSize/5/ajax/user-grid/User_page/3?ajax=user-grid&pageSize=75
you see the latter pageSize will do not work
here i share my modified version , can use for both CGirdView and CListView;
@aruna470 i never mind you use my new version as yours( as 2.0 ) :) , because this version is based on your works , feel free to use it in anywhere:
<?php /** * Date: 12-2-13 * Time: pm 8:22 * @author Aruna Attanayake <aruna470@gmail.com> && yiqing95 <yiqing_95@qq.com> */ class EPageSize extends CWidget { /** * @var array * the optional pageSize you can select */ public $pageSizeOptions = array(10=>10, 25=>25, 50=>50, 75=>75, 100=>100); /** * @var int * current pageSize will be used for * GridView or ListView */ public $pageSize = 10; /** * @var string * --------------------- * the gridViewId * --------------------- */ public $gridViewId = ''; /** * @var string * -------------------- * the listViewId * -------------------- */ public $listViewId = ''; /** * @var int * ---------------------- * default pageSize for gridView or listView * ---------------------- */ public $defaultPageSize = 10; public $beforeLabel = 'select a pageSize:'; /** * @var array * ------------------------------------- * the htmlOptions passed to the underlying dropDownList * note: the name options will be ignored , will always use * the pageSize . * ------------------------------------- */ public $dropDownListHtmlOptions = array(); /** * @var string * ----------------------- * the list type , the CGridView and the CListView * both inherit from CBaseListView , so they are all * listView ; this param used to determine the sub type of CBaseListView * * ----------------------- */ protected $listViewType = 'Grid'; /** * @var string * ------------------------ * the CGridView or CListView id * ------------------------ */ protected $updateId ; /** * @throws CException */ public function init(){ if(! empty($this->gridViewId)){ $this->listViewType = 'Grid'; $this->updateId = $this->gridViewId; }elseif(! empty($this->listViewId)){ $this->listViewType = 'List'; $this->updateId = $this->listViewId ; }else{ //if(empty($this->gridViewId) || empty($this->listViewId)) throw new CException('you must specify the gridViewId or listViewId for using this widget!'); } parent::init(); } public function run() { //> store the current pageSize to user 's session Yii::app()->user->setState('pageSize', $this->pageSize); //> current pageSize to initialize the dropDownList $this->pageSize = (null == $this->pageSize) ? $this->defaultPageSize : $this->pageSize; //> the class property for the DropDownList $class4ddl = __CLASS__.'-'.$this->id . time(); // handle the ddlHtmlOptions , we add a unique css class to the dropDownList, and unset the name property. if(is_array($this->dropDownListHtmlOptions)){ if(isset($this->dropDownListHtmlOptions['name'])){ unset($this->dropDownListHtmlOptions['name']); } if(isset($this->dropDownListHtmlOptions['class'])){ $this->dropDownListHtmlOptions['class'] .= (' '.$class4ddl); }else{ $this->dropDownListHtmlOptions['class'] = ' '.$class4ddl; } }else{ $this->dropDownListHtmlOptions = array('class' => $class4ddl); } echo $this->beforeLabel , CHtml::dropDownList('pageSize', $this->pageSize, $this->pageSizeOptions,$this->dropDownListHtmlOptions); $jsPluginName = "$.fn.yii{$this->listViewType}View"; $jsCode = <<<ON_CHANGE $(".{$class4ddl}").change(function(){ var url = {$jsPluginName}.getUrl('{$this->updateId}'), pageSize = $(this).val(); //handle the url String , pathInfo and queryString url = url.replace(/pageSize\/\d+/, "pageSize/"+pageSize); url = url.replace(/pageSize=\d+/, "pageSize="+pageSize); /* you can refer here for Regexp study:https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions */ {$jsPluginName}.update('{$this->updateId}',{url:url,data:{pageSize:$(this).val() }} ); }); ON_CHANGE; Yii::app()->getClientScript()->registerScript($class4ddl,$jsCode,CClientScript::POS_READY); } }the usage is same to pageSize extension , in you index.php you may need a little modify :
<?php $this->widget('ext.PageSize.EPageSize', array( 'listViewId' => 'user_list', 'pageSize' => Yii::app()->request->getParam('pageSize',null), 'defaultPageSize' => 10 , // may use this : Yii::app()->params['defaultPageSize'], 'pageSizeOptions'=> array(5=>5, 10=>10, 25=>25, 50=>50, 75=>75, 100=>100), // you can config it in main.php under the config dir . Yii::app()->params['pageSizeOptions'],// Optional, you can use with the widget default )); ?> <?php $dataProvider = $model->search(); $pageSize = Yii::app()->user->getState('pageSize',10/*Yii::app()->params['defaultPageSize']*/); $dataProvider->getPagination()->setPageSize($pageSize); $this->widget('ext.bootstrap.widgets.BootListView',array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'id' => 'user_list' )); ?>you see every thing is ok . i just use the bootstrap extension and it works ,i didn't test the CListView ,but it should works too !
additionally you can give a htmlOptions for the CDropDownList , config the beforeLabel in your own language or just set it to empty string '' ;
modified version
@yiqing95 Thank you for your modifications. I will update them.
you are welcome , glad to help
@aruna470
about the dropdownlistHtmlOptions , i am not sure what's the best way to do that ;
you see in my code :
if(isset($this->dropDownListHtmlOptions['name'])){ unset($this->dropDownListHtmlOptions['name']); }i originally thought the generated DropDownList can used in a form block ,and enven if the js is disabled the action of controller can handle it !
$class4ddl = __CLASS__.'-'.$this->id . time();this is for unique porpus . multi wedget instances are possible !
one can use dropDownListHtmlOptions to register his/her onchange js eventHandler ,we shouldn't swollow it .(so i use a unique class for change event !)
so feel free to modify it . :)
pageSize in cbutton column
how can i make it as header of cbutton column in cgridview?
no links in the page numbers
the page seems without any 'href' an empty link when i click in page2 for example nothing happen i used firebug and i found that there is a request with this parameter
what do you think is the problem?
Leave a comment
If you have any questions, please ask in the forum instead.
Join the conversation to share a note.