当前位置:首页 > CMS教程 > 其它CMS > 列表

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-21 09:38:56 浏览: 评论:0 

本文实例讲述了YII2框架中ActiveDataProvider与GridView的配合使用操作,分享给大家供大家参考,具体如下:

YII2中ActiveDataProvider可以使用yii\db\Query或yii\db\ActiveQuery的对象,方便我们构造复杂的查询筛选语句。

配合强大的GridView,快速的显示我们想要的数据。

通过上面的两个工具,我们快速的显示用户表信息,用户表结构如下:

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

我们创建一个用户模型MyUser.php,代码如下:

  1. <?php 
  2.  
  3. namespace app\models; 
  4.  
  5. use yii\db\ActiveRecord; 
  6. use yii\data\ActiveDataProvider; 
  7.  
  8. class MyUser extends ActiveRecord 
  9. { 
  10.  
  11.   //返回要操作的表名 
  12.   public static function tableName() 
  13.   { 
  14.     return '{{%user}}'; 
  15.   } 
  16.  
  17.   //设置规则 
  18.   //注意,如果没有给字段设置规则,GridView的筛选项是不会出现的 
  19.   public function rules() 
  20.   { 
  21.     return [ 
  22.       [['id', 'name', 'sex', 'age'], 'trim'], 
  23.       [['id', 'sex', 'age'], 'integer'], 
  24.       ['name', 'string'], 
  25.     ]; 
  26.   } 
  27.  
  28.   //查询 
  29.   public function search($params) 
  30.   { 
  31.     //首先我们先获取一个ActiveQuery 
  32.     $query = self::find(); 
  33.     //然后创建一个ActiveDataProvider对象 
  34.     $provider = new ActiveDataProvider([ 
  35.       //为ActiveDataProvider对象提供一个查询对象 
  36.       'query' => $query, 
  37.       //设置分页参数 
  38.       'pagination' => [ 
  39.         //分页大小 
  40.         'pageSize' => 3, 
  41.         //设置地址栏当前页数参数名 
  42.         'pageParam' => 'p', 
  43.         //设置地址栏分页大小参数名 
  44.         'pageSizeParam' => 'pageSize', 
  45.       ], 
  46.       //设置排序 
  47.       'sort' => [ 
  48.         //默认排序方式 
  49.         'defaultOrder' => [ 
  50.           'id' => SORT_DESC, 
  51.         ], 
  52.         //参与排序的字段 
  53.         'attributes' => [ 
  54.           'id', 'name', 'sex', 'age' 
  55.         ], 
  56.       ], 
  57.     ]); 
  58.  
  59.     //如果验证没通过,直接返回 
  60.     if (!($this->load($params) && $this->validate())) { 
  61.       return $provider; 
  62.     } 
  63.  
  64.     //增加过滤条件 
  65.     $query->andFilterWhere(['id' => $this->id]) 
  66.       ->andFilterWhere(['like', 'name', $this->name]) 
  67.       ->andFilterWhere(['sex' => $this->sex]) 
  68.       ->andFilterWhere(['age' => $this->age]); 
  69.  
  70.     return $provider; 
  71.   } 
  72. } 

然后,创建控制器TestController.php,代码如下:

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use yii\web\Controller; 
  7. use app\models\MyUser; 
  8.  
  9. class TestController extends Controller 
  10. { 
  11.   public function actionTest() 
  12.   { 
  13.  
  14.     $user = new MyUser(); 
  15.     //调用模型search方法,把get参数传进去 
  16.     $provider = $user->search(YII::$app->request->get()); 
  17.  
  18.     return $this->render('test', [ 
  19.       'model' => $user, 
  20.       'provider' => $provider, 
  21.     ]); 
  22.   } 
  23. } 

视图页面test.php,代码如下:

  1. <?php 
  2. use yii\helpers\Url; 
  3. use yii\helpers\Html; 
  4. use yii\grid\GridView; 
  5. ?> 
  6.  
  7. <div id="page-wrapper"> 
  8.   <div class="row"> 
  9.     <div class="col-lg-12"> 
  10.       <button class="btn btn-primary" id="showSelBtn">显示我选中的</button> 
  11.     </div> 
  12.   </div> 
  13.   <div class="row"> 
  14.     <div class="col-lg-12"> 
  15.       <?php echo GridView::widget([ 
  16.         //设置GridView的ID 
  17.         'id' => 'myUserGridView', 
  18.         //设置数据提供器 
  19.         'dataProvider' => $provider, 
  20.         //设置筛选模型 
  21.         'filterModel' => $model, 
  22.         'columns' => [ 
  23.           //复选框列 
  24.           ['class' => 'yii\grid\CheckboxColumn'], 
  25.           //显示序号列 
  26.           ['class' => 'yii\grid\SerialColumn'], 
  27.           [ 
  28.             //设置字段显示标题 
  29.             'label' => 'ID', 
  30.             //字段名 
  31.             'attribute' => 'id', 
  32.             //格式化 
  33.             'format' => 'raw', 
  34.             //设置单元格样式 
  35.             'headerOptions' => [ 
  36.               'style' => 'width:120px;', 
  37.             ], 
  38.           ], 
  39.           [ 
  40.             'label' => '姓名', 
  41.             'attribute' => 'name', 
  42.             'format' => 'raw', 
  43.           ], 
  44.           [ 
  45.             'label' => '头像', 
  46.             'attribute' => 'head_img', 
  47.             'format' => 'raw', 
  48.             //通过该返回值,我们可以任意控制列数据的显示 
  49.             //$data指向的是当前行的数据结果集 
  50.             'value' => function ($data) { 
  51.               return '<img src="' . '/' . ltrim($data->head_img, '/') . '" width="60px">'; 
  52.             }, 
  53.           ], 
  54.           [ 
  55.             'label' => '性别', 
  56.             //设置筛选选项 
  57.             'filter' => [0 => '男', 1 => '女'], 
  58.             'attribute' => 'sex', 
  59.             'format' => 'raw', 
  60.             'value' => function ($data) { 
  61.               return ($data->sex == 0) ? '男' : '女'; 
  62.             } 
  63.           ], 
  64.           [ 
  65.             'label' => '年龄', 
  66.             'attribute' => 'age', 
  67.             'format' => 'raw', 
  68.           ], 
  69.           [ 
  70.             'header' => '操作', 
  71.             'class' => 'yii\grid\ActionColumn', 
  72.             //设置显示模板 
  73.             'template' => '{upd} {del}', 
  74.             //下面的按钮设置,与上面的模板设置相关联 
  75.             'buttons' => [ 
  76.               'upd' => function ($url, $model, $key) { 
  77.                 return '<a href="' . Url::toRoute(['test/upd', 'id' => $key]) . '" rel="external nofollow" class="btn btn-warning">修改</a>'; 
  78.               }, 
  79.               'del' => function ($url, $model, $key) { 
  80.                 return '<a href="' . Url::toRoute(['test/del', 'id' => $key]) . '" rel="external nofollow" class="btn btn-danger">删除</a>'; 
  81.               }, 
  82.             ], 
  83.           ], 
  84.         ], 
  85.       ]); ?> 
  86.     </div> 
  87.   </div> 
  88. </div> 
  89.  
  90. <?php echo Html::jsFile('@web/js/jquery-3.3.1.min.js'); ?> 
  91. <script type="text/javascript"> 
  92.   $("#showSelBtn").on("click", function () { 
  93.     var keys = $("#myUserGridView").yiiGridView('getSelectedRows'); 
  94.     alert(keys); 
  95.   }); 
  96. </script> 
  97. <?php 
  98. use yii\helpers\Url; 
  99. use yii\helpers\Html; 
  100. use yii\grid\GridView; 
  101. ?> 
  102.  
  103. <div id="page-wrapper"> 
  104.   <div class="row"> 
  105.     <div class="col-lg-12"> 
  106.       <button class="btn btn-primary" id="showSelBtn">显示我选中的</button> 
  107.     </div> 
  108.   </div> 
  109.   <div class="row"> 
  110.     <div class="col-lg-12"> 
  111.       <?php echo GridView::widget([ 
  112.         //设置GridView的ID 
  113.         'id' => 'myUserGridView', 
  114.         //设置数据提供器 
  115.         'dataProvider' => $provider, 
  116.         //设置筛选模型 
  117.         'filterModel' => $model, 
  118.         'columns' => [ 
  119.           //复选框列 
  120.           ['class' => 'yii\grid\CheckboxColumn'], 
  121.           //显示序号列 
  122.           ['class' => 'yii\grid\SerialColumn'], 
  123.           [ 
  124.             //设置字段显示标题 
  125.             'label' => 'ID', 
  126.             //字段名 
  127.             'attribute' => 'id', 
  128.             //格式化 
  129.             'format' => 'raw', 
  130.             //设置单元格样式 
  131.             'headerOptions' => [ 
  132.               'style' => 'width:120px;', 
  133.             ], 
  134.           ], 
  135.           [ 
  136.             'label' => '姓名', 
  137.             'attribute' => 'name', 
  138.             'format' => 'raw', 
  139.           ], 
  140.           [ 
  141.             'label' => '头像', 
  142.             'attribute' => 'head_img', 
  143.             'format' => 'raw', 
  144.             //通过该返回值,我们可以任意控制列数据的显示 
  145.             //$data指向的是当前行的数据结果集 
  146.             'value' => function ($data) { 
  147.               return '<img src="' . '/' . ltrim($data->head_img, '/') . '" width="60px">'; 
  148.             }, 
  149.           ], 
  150.           [ 
  151.             'label' => '性别', 
  152.             //设置筛选选项 
  153.             'filter' => [0 => '男', 1 => '女'], 
  154.             'attribute' => 'sex', 
  155.             'format' => 'raw', 
  156.             'value' => function ($data) { 
  157.               return ($data->sex == 0) ? '男' : '女'; 
  158.             } 
  159.           ], 
  160.           [ 
  161.             'label' => '年龄', 
  162.             'attribute' => 'age', 
  163.             'format' => 'raw', 
  164.           ], 
  165.           [ 
  166.             'header' => '操作', 
  167.             'class' => 'yii\grid\ActionColumn', 
  168.             //设置显示模板 
  169.             'template' => '{upd} {del}', 
  170.             //下面的按钮设置,与上面的模板设置相关联 
  171.             'buttons' => [ 
  172.               'upd' => function ($url, $model, $key) { 
  173.                 return '<a href="' . Url::toRoute(['test/upd', 'id' => $key]) . '" rel="external nofollow" class="btn btn-warning">修改</a>'; 
  174.               }, 
  175.               'del' => function ($url, $model, $key) { 
  176.                 return '<a href="' . Url::toRoute(['test/del', 'id' => $key]) . '" rel="external nofollow" class="btn btn-danger">删除</a>'; 
  177.               }, 
  178.             ], 
  179.           ], 
  180.         ], 
  181.       ]); ?> 
  182.     </div> 
  183.   </div> 
  184. </div> 
  185.  
  186. <?php echo Html::jsFile('@web/js/jquery-3.3.1.min.js'); ?> 
  187. <script type="text/javascript"> 
  188.   $("#showSelBtn").on("click", function () { 
  189.     var keys = $("#myUserGridView").yiiGridView('getSelectedRows'); 
  190.     alert(keys); 
  191.   }); 
  192. </script> 

显示结果如下:

YII2框架中ActiveDataProvider与GridView的配合使用操作示例

Tags: ActiveDataProvider GridView

分享到: