> 백엔드 개발 > PHP 튜토리얼 > Yii2는 검색을 통한 페이징 기능의 예인 페이징을 구현합니다.

Yii2는 검색을 통한 페이징 기능의 예인 페이징을 구현합니다.

不言
풀어 주다: 2023-03-24 15:08:01
원래의
1884명이 탐색했습니다.

이 글의 내용은 yii2에서의 페이징 구현에 대한 것이며, 검색이 포함된 페이징 기능의 예는 특정 참조 값을 가지고 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다. 세 가지 모델. 기사 카테고리 테이블과 기사 테이블은 gii로 생성할 수 있으며, 마지막은 검색 검증 모델이다. 그 중에서 다음 공동 테이블과 검색 검증에 대해서만 이야기합니다. 다른 작업은 필요하지 않습니다.

1. 기사 테이블 연결

<?php
//...other code
//关联
public function getCate(){
    return $this->hasOne(ArticleCate::className(),[&#39;id&#39; => &#39;cid&#39;]);
  }
?>
로그인 후 복사

2. 검색 모델

common/models/search/Create ArticleSearch.php

<?php
 
namespace common\models\search;
 
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\models\Article;
 
class ArticleSearch extends Article
{
  //public $cname;//文章类别名
   
  /**
   * @inheritdoc
   */
  public function rules()
  {
    return [
      [[&#39;cid&#39;,&#39;created_at&#39;, &#39;updated_at&#39;], &#39;integer&#39;],
      [[&#39;id&#39;, &#39;desc&#39;,&#39;title&#39;,&#39;cover&#39;,&#39;content&#39;], &#39;safe&#39;],
    ];
  }
 
  /**
   * @inheritdoc
   */
  public function scenarios()
  {
    // bypass scenarios() implementation in the parent class
    return Model::scenarios();
  }
 
  //搜索
  public function search($params)
  {
    $query = Article::find();
    // $query->joinWith([&#39;cate&#39;]);//关联文章类别表
    // $query->joinWith([&#39;author&#39; => function($query) { $query->from([&#39;author&#39; => &#39;users&#39;]); }]);
 
    $dataProvider = new ActiveDataProvider([
      &#39;query&#39; => $query,
      &#39;pagination&#39; => [
        &#39;pageSize&#39; => 2,
      ],
    ]);
    // 从参数的数据中加载过滤条件,并验证
    $this->load($params);
 
    if (!$this->validate()) {
      // uncomment the following line if you do not want to any records when validation fails
      // $query->where(&#39;0=1&#39;);
      return $dataProvider;
    }
 
    // 增加过滤条件来调整查询对象
    $query->andFilterWhere([
      // &#39;cname&#39; => $this->cate.cname,
      &#39;title&#39; => $this->title,
    ]);
 
    $query->andFilterWhere([&#39;like&#39;, &#39;title&#39;, $this->title]);
    //$query->andFilterWhere([&#39;like&#39;, &#39;cate.cname&#39;, $this->cname]) ;
 
    return $dataProvider;
  }
}
로그인 후 복사

두 번째, 페이징 사용


첫 번째 방법은 컨트롤러에서 액션, 페이징 객체를 생성하고 데이터로 채우기:

<?php
//other code
use yii\data\Pagination;
public function actionArticlelist()
  {
    //分页读取类别数据
    $model = Article::find()->with(&#39;cate&#39;);
    $pagination = new Pagination([
      &#39;defaultPageSize&#39; => 3,
      &#39;totalCount&#39; => $model->count(),
    ]);
 
    $model = $model->orderBy(&#39;id ASC&#39;)
      ->offset($pagination->offset)
      ->limit($pagination->limit)
      ->all();
 
    return $this->render(&#39;index&#39;, [
      &#39;model&#39; => $model,
      &#39;pagination&#39; => $pagination,
    ]);
  }
?>
로그인 후 복사
둘째, 뷰에서 우리가 출력하는 템플릿은 현재 페이지이고 페이징 객체를 통해 페이지에 연결됩니다:

<?php
use yii\widgets\LinkPager;
use yii\helpers\Html;
use yii\helpers\Url;
//other code
foreach ($models as $model) {
  // 在这里显示 $model
}
 
// 显示分页
echo LinkPager::widget([
  &#39;pagination&#39; => $pagination,
  &#39;firstPageLabel&#39;=>"First",
  &#39;prevPageLabel&#39;=>&#39;Prev&#39;,
  &#39;nextPageLabel&#39;=>&#39;Next&#39;,
  &#39;lastPageLabel&#39;=>&#39;Last&#39;,
]);
?>
로그인 후 복사


메서드 2


Controller :

<?php
    $query = Article::find()->with(&#39;cate&#39;);
 
    $provider = new ActiveDataProvider([
      &#39;query&#39; => $query,
      &#39;pagination&#39; => [
        &#39;pageSize&#39; => 3,
      ],
      &#39;sort&#39; => [
        &#39;defaultOrder&#39; => [
          //&#39;created_at&#39; => SORT_DESC,
          //&#39;title&#39; => SORT_ASC,
        ]
      ],
    ]);
    return $this->render(&#39;index&#39;, [
      &#39;model&#39; => $query,
      &#39;dataProvider&#39; => $provider
    ]);
?>
로그인 후 복사
View:

<?php
use yii\grid\GridView;
echo GridView::widget([
  &#39;dataProvider&#39; => $dataProvider,
  //每列都有搜索框 控制器传过来$searchModel = new ArticleSearch(); 
  //&#39;filterModel&#39; => $searchModel,
  &#39;layout&#39;=> &#39;{items}<p class="text-right tooltip-demo">{pager}</p>&#39;,
   &#39;pager&#39;=>[
        //&#39;options&#39;=>[&#39;class&#39;=>&#39;hidden&#39;]//关闭自带分页
        &#39;firstPageLabel&#39;=>"First",
        &#39;prevPageLabel&#39;=>&#39;Prev&#39;,
        &#39;nextPageLabel&#39;=>&#39;Next&#39;,
         &#39;lastPageLabel&#39;=>&#39;Last&#39;,
   ],
  &#39;columns&#39; => [
    //[&#39;class&#39; => &#39;yii\grid\SerialColumn&#39;],//序列号从1开始
    // 数据提供者中所含数据所定义的简单的列
    // 使用的是模型的列的数据
    &#39;id&#39;,
    &#39;username&#39;,
    [&#39;label&#39;=>&#39;文章类别&#39;, /*&#39;attribute&#39; => &#39;cid&#39;,产生一个a标签,点击可排序*/ &#39;value&#39; => &#39;cate.cname&#39; ],
    [&#39;label&#39;=>&#39;发布日期&#39;,&#39;format&#39; => [&#39;date&#39;, &#39;php:Y-m-d&#39;],&#39;value&#39; => &#39;created_at&#39;],
    // 更复杂的列数据
    [&#39;label&#39;=>&#39;封面图&#39;,&#39;format&#39;=>&#39;raw&#39;,&#39;value&#39;=>function($m){
     return Html::img($m->cover,[&#39;class&#39; => &#39;img-circle&#39;,&#39;width&#39; => 30]);
    }],
    [
      &#39;class&#39; => &#39;yii\grid\DataColumn&#39;, //由于是默认类型,可以省略 
      &#39;value&#39; => function ($data) {
        return $data->name; 
        // 如果是数组数据则为 $data[&#39;name&#39;] ,例如,使用 
 
SqlDataProvider 的情形。
      },
    ],
    [
     &#39;class&#39; => &#39;yii\grid\ActionColumn&#39;,
     &#39;header&#39; => &#39;操作&#39;, 
     &#39;template&#39; => &#39;{delete} {update}&#39;,//只需要展示删除和更新
     /*&#39;headerOptions&#39; => [&#39;width&#39; => &#39;80&#39;],*/
     &#39;buttons&#39; => [
       &#39;delete&#39; => function($url, $model, $key){
           return Html::a(&#39;<i class="glyphicon glyphicon-trash"></i> 删除&#39;,
               [&#39;artdel&#39;, &#39;id&#39; => $key], 
               [&#39;class&#39; => &#39;btn btn-default btn-xs&#39;,
               &#39;data&#39; => [&#39;confirm&#39; => &#39;你确定要删除文章吗?&#39;,]
               ]);
       },
      &#39;update&#39; => function($url, $model, $key){
           return Html::a(&#39;<i class="fa fa-file"></i> 更新&#39;,
              [&#39;artedit&#39;, &#39;id&#39; => $key], 
              [&#39;class&#39; => &#39;btn btn-default btn-xs&#39;]);
       },
      ],
     ],
  ],
]);
?>
로그인 후 복사


3. 페이징 기능으로 검색


검색 모델 만들기(이미 완료됨)

  • 수신 데이터 제어

  • View 디스플레이 컨트롤러 코드:

  • <?php
    public function actionIndex()
    {
     $searchModel = new ArticleSearch();
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
     
      return $this->render(&#39;index&#39;, [
        &#39;searchModel&#39; => $searchModel,
        &#39;dataProvider&#39; => $dataProvider,
      ]);
     }
    ?>
    로그인 후 복사
  • View:

    <?php $form = ActiveForm::begin([
      &#39;action&#39; => [&#39;index&#39;],
       &#39;method&#39; => &#39;get&#39;,
       &#39;id&#39; => &#39;cateadd-form&#39;,
       &#39;options&#39; => [&#39;class&#39; => &#39;form-horizontal&#39;],
    ]); ?>
               
    <?= $form->field($searchModel, &#39;title&#39;,[
       &#39;options&#39;=>[&#39;class&#39;=>&#39;&#39;],
       &#39;inputOptions&#39; => [&#39;placeholder&#39; => &#39;文章搜索&#39;,&#39;class&#39; => &#39;input-sm form-control&#39;],
    ])->label(false) ?>
      <?= Html::submitButton(&#39;Go!&#39;, [&#39;class&#39; => &#39;btn btn-sm btn-primary&#39;]) ?>
    <?php ActiveForm::end(); ?>
    <?= GridView::widget([
              &#39;dataProvider&#39; => $dataProvider,
              &#39;layout&#39;=> &#39;{items}<p class="text-right tooltip-demo">{pager}</p>&#39;,
              &#39;pager&#39;=>[
                //&#39;options&#39;=>[&#39;class&#39;=>&#39;hidden&#39;]//关闭自带分页
                &#39;firstPageLabel&#39;=>"First",
                &#39;prevPageLabel&#39;=>&#39;Prev&#39;,
                &#39;nextPageLabel&#39;=>&#39;Next&#39;,
                &#39;lastPageLabel&#39;=>&#39;Last&#39;,
              ],
           //这部分和上面的分页是一样的
    로그인 후 복사
    관련 권장 사항:


    yii는 모델에 기본값을 추가하는 방법을 구현합니다.


    Yii는 다중 레벨 연결 드롭을 구현합니다. 다운 메뉴

    Yii2는 양식 업로드 파일 기능을 구현합니다

    위 내용은 Yii2는 검색을 통한 페이징 기능의 예인 페이징을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿