Pagination && Pagesize

Bonsoir tous le monde voilla je debute sur Yii frameworke et je travaille sur un site ou je doit faire un boutton de page size il permettra d’afficher le nombre d’elements par page 8 16 24 … je ne sais pas comment le faire dans protected/components/clinkPageFrontend j’ai la fonction qui suit:




 public function createPageSizeButtons()

	{

		// possible pageSize

		$list=array(8,16,24,32);

		$lines=array();

		

		// generate pageSize link

		foreach($list as $l)

		{

			if($this->pageSize==$l)

				continue;

			$lines[]='<li><a href="'.$this->getController()->createUrl(Yii::app()->controller->action->id,array('id'=>$this->id,'pageSize'=>$l)).'">'.$l.'</a></li>';

		}

		

		$pageSizeSelect='<div id="resutle">

									<ul id="numbs" onclick="$(this).children(\'ul\').toggle()">

										<li class="push"><span>'.$this->pageSize.'</span><span class="picto"></span></li>

										<ul class="drop">

											'.implode('',$lines).'

										</ul>

									</ul>

									<span class="txt">Résultats par page</span>

								</div>';

		

		return $pageSizeSelect;

	}






ici dans le controller de la page INDEX voila ske jai




 public function actionIndex()

	{

		

		$pageSize=(!empty($_GET['pageSize']))?$_GET['pageSize']:7;

		$marque=(!empty($_GET['m']))?$_GET['m']:null;

		$categorie=(!empty($_GET['c']))?$_GET['c']:null;

		

		$criteria = new CDbCriteria();

		$criteria->compare('id_marque',$marque);

		$criteria->compare('id_categorie',$categorie);

		

		$count=Produit::model()->count($criteria);

		$pages=new CPagination($count);

		

		// results per page

		$pages->pageSize=$pageSize;

		$pages->applyLimit($criteria);

		$criteria->limit=$pages->getLimit();

        $criteria->offset=$pages->getOffset();

		$dataProvider = Produit::model()->findAll($criteria);

		

		

		

		// get categorie/marque id/titre for search purpose

		$sql="select id,titre from categorie WHERE id=:id LIMIT 1";

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

		$cmd->bindParam(':id',$categorie,PDO::PARAM_INT);	

		$categorieData = $cmd->queryRow();

		

		$sql="select id,titre from marque WHERE id=:id LIMIT 1";

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

		$cmd->bindParam(':id',$marque,PDO::PARAM_INT);	

		$marqueData = $cmd->queryRow();

		

	

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

			'pagination'=>$pages,

			'pageSize'=>$pageSize,

			'marque'=>$marqueData,

			'categorie'=>$categorieData,

		));

	}






sachant que je n’ai rien ajouter pour crée le boutton de size j’ai juste fait la pagination (suivant precedent)

dans le view voila se que j’ai mis pour afficher les boutton suivant precedent




<div id="contenu" class="container">

					<span id="arrow"></span>		

				   <div id="top_access">

						<div class="clear"></div>

							<div id="bread">

									<?php 

										$this->breadcrumbs=array(

										'Liste produits'

													);	?>

								</div>

							 <div>

									<?php 

										$begin=$pagination->getOffset()+1;

										$end=($pagination->getLimit() * ($pagination->getCurrentPage()+1));

										$end=($end -> $pagination->getItemCount())?$pagination->getItemCount():$end;

										?>

								

										<!--<h3>Affichage de <?php echo $begin; ?> à <?php echo $end; ?> résultats sur <?php echo $pagination->getItemCount();  ?> accessoires correspondants</h3>-->

										

										<?php $this->widget('CLinkPagerFrontend', array(

												'pages' => $pagination,

												'firstPageLabel'=>false,

												'lastPageLabel'=>false,

												'cssFile'=>false,

												'pageSize'=>$pageSize,

												'header'=>false,

												'htmlOptions'=>array('class'=>'pagin'),

											)) ?>	

								

						   </div>

					</div>	

					<div class="clear"></div>

		     </div>




ma questions

comment je vais proceder pour integer le boutton pagesize ?

esque vous pouvais comment fonctionne pagination en detaile et comment faire appelle a elle quand j’en aurais besoin merci ?

Pour cela j’ai fait un Behavior que j’ai attaché au CGridView concerné en mettant dans son template la référence à la méthode créée par ce Behavior. Lorsque le template contient ‘pagerlist’, le gridview essaie d’appeler la méthode ‘renderPagerlist’.

Utilisation du CGridView:




$this->widget(

CGRIDVIEW, // Constante faisant référence au gridview.

            'template'=>CHtml::tag('div',array('class'=>'grid-pager-head'),"{pager} {pagerlist}")."\n{items}\n{exportbuttons}",

            'behaviors'=>array(

                    array(

                            'class'=>'YPagerListBehavior',

                            'pagerlist'=>array('10'=>10,'25'=>25,'50'=>50,'100'=>100,'300'=>300,'1000'=>1000)

                            )

                    ),

Structure de la classe pour le Pager:


class YPagerListBehavior extends CBehavior {

   public $pagerlist;

   [...]


    public function renderPagerlist()

    {

	[...]

        // Rendu de la liste, ... .

    }

}

Cette technique permet la réutilisation du Pager.

slt,

ça m’interesse de savoir pourquoi la propriété ‘pageSize’ de la classe ‘CPagination’ n’est pas utilisée directement pour répondre à ce besoin?

Apparemment on peut imposer un nombre d’objets par page en passant la valeur à cette propriété…

exemple


function actionIndex(){

    $criteria=new CDbCriteria();

    $count=Article::model()->count($criteria);

    $pages=new CPagination($count);


    // results per page

    $pages->pageSize=10;  //////////////////////////<<<

    $pages->applyLimit($criteria);

    $models=Article::model()->findAll($criteria);


    $this->render('index', array(

    'models' => $models,

         'pages' => $pages

    ));

}

Quelle est la bonne pratique Yii?

Ne pourrait-on pas plutôt traiter ça par une form dans la view qui permet de changer la valeur par defaut de pageSize? ou pas?

cad

un truc du genre dans la view


echo CHtml::form('', 'post', array('class'=>'navbar-form'));

      echo CHtml::dropDownList('pagesizeSelector' , Yii::app()->getPageSize(),array('10','18','24','48'), array(

 		'submit'=>'', 

 		'csrf'=>true, 

 		'class'=>'span1',

 		'id'=>'pagesizeSelector',

		)<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' />;

      echo CHtml::endForm();

avec une analyse du request dans le controleur


if(Yii::app()->request->getPost('pagesizeSelector') !== null && in_array($_POST['pagesizeSelector'], array('10','18','24','48'), true)){mise à jour de la valeur de pagesize }

avant le traitement du CGridView…