Maison > php教程 > PHP开发 > le corps du texte

Explication détaillée de l'utilisation de la pagination Yii2 et de ses méthodes d'extension

高洛峰
Libérer: 2016-12-23 17:02:05
original
1639 Les gens l'ont consulté

Ci-dessous, j'ai résumé quelques méthodes de pagination Yii et des exemples de codes couramment utilisés dans Yii. Voici la pagination ordinaire et la pagination ajax. J'espère que cet article sera utile à tout le monde.

Le premier type : pagination CListView Pour la pagination des données sous forme d'objet

Contrôleur :

public function actionAjax() { 
        $criteria = new CDbCriteria(); 
        //$criteria->order = 'news_id DESC'; 
        $criteria->condition = 'user_id = 1'; 
  
        $dataProvider = new CActiveDataProvider('News', array( 
                    'pagination' => array( 
                        'pageSize' => Yii::app()->params['pagesize'], 
                        'pageVar' => Yii::app()->params['pagevar'], 
                    ), 
                    'criteria' => $criteria, 
                )); 
  
  
        $this->render('view', array( 
            'dataProvider' => $dataProvider, 
        )); 
}
Copier après la connexion

Vue :

<?php 
$this->widget(&#39;zii.widgets.CListView&#39;, array( 
    &#39;dataProvider&#39; => $dataProvider, //数据 
    &#39;itemView&#39; => &#39;_view&#39;, //显示的模版 
    &#39;id&#39; => Yii::app()->controller->id, 
    &#39;itemsTagName&#39; => &#39;ul&#39;, 
    &#39;ajaxVar&#39; => &#39;&#39;, //默认为page或ajax 去掉后url更简洁 
    &#39;htmlOptions&#39; => array(&#39;class&#39; => Yii::app()->controller->id), 
    &#39;loadingCssClass&#39; => &#39;loading&#39;, //默认为list-view-loading 
    //&#39;template&#39; => &#39;{summary}{sorter}{items}{pager}&#39;,//显示的顺序 
    //&#39;ajaxUpdate&#39; => false, //是否ajax分页  false或分页显示的容器id 
    //&#39;beforeAjaxUpdate&#39; => &#39;before_ajax_update&#39;,   //回调函数 在common.js里完成 
    //&#39;afterAjaxUpdate&#39; => &#39;after_ajax_update&#39;,   
    &#39;emptyText&#39; => &#39; 
<DIV class="alert alert-waning"> 
    暂无数据! 
</DIV> 
&#39;, //无数据时显示内容 
                    &#39;pagerCssClass&#39; => &#39;pagination&#39;, //分页的class 
                    &#39;pager&#39; => array( 
                        &#39;selectedPageCssClass&#39; => &#39;active&#39;, //当前页的class 
                        &#39;hiddenPageCssClass&#39; => &#39;disabled&#39;, //禁用页的class 
                        &#39;header&#39; => &#39;&#39;, //分页前显示的内容 
                        &#39;maxButtonCount&#39; => 10, //显示分页数量 
                        &#39;htmlOptions&#39; => array(&#39;class&#39; => &#39;&#39;), 
                        &#39;firstPageLabel&#39; => &#39;首页&#39;, 
                        &#39;nextPageLabel&#39; => &#39;下一页&#39;, 
                        &#39;prevPageLabel&#39; => &#39;上一页&#39;, 
                        &#39;lastPageLabel&#39; => &#39;末页&#39;, 
                    ), 
                )); 
?>
Copier après la connexion

Le deuxième type : CLinkPager Pour les données de pagination sous forme de tableau

Contrôleur :

public function actionIndex() { 
  
        $criteria = new CDbCriteria(); 
        $criteria->order = &#39;news_id DESC&#39;; 
        $criteria->condition = &#39;user_id = 1&#39;; 
  
        $count = News::model()->count($criteria); 
        $pages = new CPagination($count); 
  
        $pages->pageSize = 10; 
        $pages->applyLimit($criteria); 
        $list = News::model()->findAll($criteria); 
  
        $this->render(&#39;index&#39;, array(&#39;list&#39; => $list, &#39;pages&#39; => $pages)); 
}
Copier après la connexion

Vue :

<UL> 
    <?php foreach ($list as $item): ?> 
    <LI> 
          
        <DIV class=page-header> 
            <?php echo $item--->news_title; ?> 
        </DIV> 
  
        <DIV class=content> 
            <?php echo $item--->news_intro; ?> 
        </DIV> 
  
    </LI> 
<?php endforeach; ?> 
</UL> 
  
<DIV class=pagination> 
    <?php 
    $this--->widget(&#39;CLinkPager&#39;, array( 
        &#39;pages&#39; => $pages, 
        &#39;selectedPageCssClass&#39; => &#39;active&#39;, //当前页的class 
        &#39;hiddenPageCssClass&#39; => &#39;disabled&#39;, //禁用页的class 
        &#39;header&#39; => &#39;&#39;, //分页前显示的内容 
        &#39;maxButtonCount&#39; => 10, //显示分页数量 
        &#39;htmlOptions&#39; => array(&#39;class&#39; => &#39;&#39;), 
        &#39;firstPageLabel&#39; => &#39;首页&#39;, 
        &#39;nextPageLabel&#39; => &#39;下一页&#39;, 
        &#39;prevPageLabel&#39; => &#39;上一页&#39;, 
        &#39;lastPageLabel&#39; => &#39;末页&#39;, 
            ) 
    ); 
    ?> 
</DIV>
Copier après la connexion

Le troisième type : DAO implémente la pagination.

Contrôleur Couche :

public function actionReport()
{
$sql = "select remitdate, sum(rate) sumrate from td_delivery 
group by remitdate 
order by remitdate desc";
$criteria=new CDbCriteria();
$result = Yii::app()->db->createCommand($sql)->query();
$pages=new CPagination($result->rowCount);
$pages->pageSize=2; 
$pages->applyLimit($criteria); 
$result=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit"); 
$result->bindValue(&#39;:offset&#39;, $pages->currentPage*$pages->pageSize); 
$result->bindValue(&#39;:limit&#39;, $pages->pageSize); 
$posts=$result->query();
$this->render(&#39;report&#39;,array( 
&#39;posts&#39;=>$posts, 
&#39;pages&#39;=>$pages, 
));
}
Copier après la connexion

Couche de vue :

<?php foreach($posts as $row):?> 
 <?php echo CHtml::link($row["remitdate"],array(&#39;delivery/view&#39;,&#39;remitdate&#39;=>$row["sumrate"]));?>
 <?php echo $row["sumrate"]."<br />" ?>
 <?php endforeach;?>
 <?php 
 //分页widget代码: 
 $this->widget(&#39;CLinkPager&#39;,array(&#39;pages&#39;=>$pages));
?>
Copier après la connexion

Avantages : DAO est très efficace Inconvénients : La couche de vue doit écrire elle-même certains styles, ce qui est un peu gênant <🎜 ; >

Chapitre quatre types : le widget implémente la pagination

Couche de modèle :

/**
* @var string attribute : 日运费 (统计用)
* 需要对新增加的字段做个声明
*/
public $dayrate;
/*
* 统计功能: 统计每日的运费
*/
public function statistics()
{
$criteria = new CDbCriteria;
$criteria->select = &#39;remitdate, sum(rate) AS dayrate&#39;;
$criteria->group = &#39;remitdate&#39;;
return new CActiveDataProvider(get_class($this), array(
&#39;criteria&#39;=>$criteria,
&#39;sort&#39;=>array(
// 表头设置点击排序的字段
&#39;attributes&#39;=>array(
&#39;remitdate&#39;,
&#39;dayrate&#39;=>array(
&#39;asc&#39;=>&#39;dayrate&#39;,
&#39;desc&#39;=>&#39;dayrate DESC&#39;,
)
),
&#39;defaultOrder&#39;=>&#39;remitdate desc&#39;,
),
)); 
}
Copier après la connexion
Couche de contrôleur :

/**
* 运单统计功能:
* 按日期统计
*/
public function actionReport()
{
$model=new Delivery(&#39;statistics&#39;);
$model->unsetAttributes(); // clear any default values
  
$this->render(&#39;report&#39;,array(
&#39;model&#39;=>$model,
));
}
Copier après la connexion
Couche d'affichage :

<?php $this->widget(&#39;zii.widgets.grid.CGridView&#39;, array(
&#39;id&#39;=>&#39;delivery-grid&#39;,
&#39;dataProvider&#39;=>$model->statistics(),
&#39;filter&#39;=>$model,
&#39;columns&#39;=>array(
&#39;remitdate&#39;,
&#39;dayrate&#39;,
array(
&#39;class&#39;=>&#39;CButtonColumn&#39;,
),
),
));
?>
Copier après la connexion
Avantages : vous pouvez utiliser le style intégré ; Inconvénients : efficacité légèrement faible.


La cinquième méthode : pagination Ajax

Il existe de nombreuses façons d'implémenter la pagination ajax dans YII. La méthode la plus traditionnelle consiste à écrire du JS dans la vue pour y parvenir, ce qui ressemble à peu près à ceci :

La logique approximative de js dans la vue est la suivante

$(&#39;#listview .yiiPager a&#39;).live(&#39;click&#39;,function(){
        $.ajax({
            url:$(this).attr(&#39;href&#39;),
            success:function(html){
                $(&#39;#listview&#39;).html(html);
            }
        });
        return false;//阻止a标签
});
Copier après la connexion
Ensuite, jugez la requête ajax dans le contrôleur, puis utilisez la méthode renderPartial pour restituer la vue Liste partielle, puis la vue partielle sera remplie dans le div partiellement actualisé par la méthode ajax dans la vue. La logique approximative du contrôleur est la suivante :

if (Yii::app()->request->isAjaxRequest) {
$this->renderPartial(&#39;_comments&#39;,array(
    &#39;model&#39; => $model,
    &#39;comments&#39; => $comments,//在局部视图中foreach得到每条数据
    &#39;pages&#39; => $pages,
   ));
    Yii::app()->end();
}
Copier après la connexion
Plus tard, j'ai découvert que CListview dans YII est plus pratique, encapsulant la pagination, foreach affiche la liste et prend également en charge le tri des données. Les détails peuvent être trouvés dans le manuel de l'API YII. CListview est paginé par ajax par défaut. La méthode d'utilisation est la suivante :


Dans le contrôleur :

$criteria = new CDbCriteria();
$criteria->order = &#39;`create_time` DESC&#39;;
$dataProvider = new CActiveDataProvider(&#39;Comments&#39;, array(
    &#39;pagination&#39;=>array(
      &#39;pageSize&#39;=>Yii::app()->params[&#39;commentsPerPage&#39;],//设置分页条数以确定取出数据的条数
  ),
  &#39;criteria&#39;=>$criteria,
  ));
$this->render(&#39;comments&#39;,array(
         &#39;model&#39; => $model,
         &#39;dataProvider&#39; => $dataProvider,
));
Copier après la connexion
Puis dans la vue :

<?php $this->widget(&#39;zii.widgets.CListView&#39;, array(
  &#39;dataProvider&#39;=>$dataProvider,
  &#39;itemView&#39;=>&#39;_comments&#39;,
  //&#39;ajaxUpdate&#39;=> false,//这样就不会AJAX翻页
  &#39;pager&#39; => array(//pager 的配置信息。默认为<CODE>array(&#39;class&#39;=>&#39;CLinkPager&#39;)</CODE>.也可以自己配置
   &#39;nextPageLabel&#39; => &#39;下一页 »&#39;,
   &#39;prevPageLabel&#39; => &#39;« 上一页&#39;
  ),
//在这里还可以配置一些排序规则,具体可以查阅手册
));
?>
Copier après la connexion
Cela implémente la pagination Ajax, ce qui est très pratique.


J'espère que cet article sera utile à la conception de programmes PHP de chacun basés sur le framework Yii.

Pour des explications plus détaillées sur l'utilisation de la pagination Yii2 et ses méthodes d'extension, veuillez faire attention au site PHP chinois !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal