Yii2 学习笔记之 GridView DetailView
时间:2022-05-14
本文章向大家介绍Yii2 学习笔记之 GridView DetailView,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在 GridView 小部件是从数据提供者获取数据,并以一个表格的形式呈现数据。表中的每一行代表一个单独的数据项,列表示该项目的属性。 在 DataGrid 小部件中的列是在 yiigridColumn 类中进行配置的。它代表一个模型属性,并可以进行过滤和排序。
GridView 列显示常用操作
<?php
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'published_at:datetime',
[
'label' => '排序值(越大越靠前)',
'value' => function ($model) {
return $model->order_num;
}
],
// 是否显示某列:意思是如果参数 type 为1的情况,该列就显示
[
'attribute' => 'buy_num',
'label' => '商品总价(元)',
'value' => function($model){
return $model->buy_num * $model->product_price_num;
}
'visible' => Yii::$app->request->get('type') == 1,
],
// 设定宽度:如 title 列太长了,可以限定一下
[
'attribute' => 'title',
'headerOptions'=> ['width'=> '100'],
],
// 短的时间显示:Y-m-d
'create_at:date',
// 长的时间显示:Y-m-d H:i:s
'create_at:datetime',
[
'label' => '子类链接', //为字段加超链接
'format' => 'raw',
'value' => function ($model){
return Html::a('属性列表', ['test/index','id'=>$model->id]);
}
],
],
]);
自定义按钮
<?php
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yiigridSerialColumn'],
'id',
'nickname',
'sex',
[
'class' => 'yiigridActionColumn',
'template' => '{view} {update} {delete} {refresh}',
'buttons' => [
'refresh'=>function ($url, $model, $key) {
return Html::a('刷新', ['user/refresh', 'id' => $model->id, 'status'=>0], ['class' => "btn btn-xs btn-danger"]);
}
]
],
],
]); ?>
使用多选框
一般用于批量设置状态或者批量删除等。
<?php
echo GridView::widget([
// ......
"options" => ["class" => "grid-view","style"=>"overflow:auto", "id" => "grid"],
"columns" => [
[
"class" => "yiigridCheckboxColumn",
"name" => "id",
],
'id',
'name',
],
]);
echo Html::a("批量删除", "javascript:void(0);", ["class" => "btn btn-success mybtn"]);
$this->registerJs('
$(document).on('click', '.mybtn', function () {
//可以把选中的id通过ajax提交到后端,然后借助yii的deleteAll()语句进行删除或操作
var keys = $("#grid").yiiGridView("getSelectedRows");
console.log(keys);
});
');
?>
GridView(搜索)数据筛选
要筛选数据,表格视图需要一个模型从过滤的表单取得输入数据,并调整 dataprovider 的查询语句到期望的搜索条件。使用active records的惯例是建立一个搜索模型类继承活动记录类。然后用这个类定义搜索的验证规则和提供 search() 方法来返回 data provider 。 要给 Article 模型添加搜索能力,可以创建 ArticleSearch ,如下所示:
修改Article模型
<?php
//包含如下关联表数据
public function getAuthor()
{
return $this->hasOne(Author::className(), ['id' => 'author_id']);
}
public function getArticleType()
{
return $this->hasOne(ArticleType::className(), ['id' => 'article_type_id']);
}
创建ArticleSearch模型
<?php
namespace appmodels;
use Yii;
use yiibaseModel;
use yiidataActiveDataProvider;
class ArticleSearch extends Article
{
public function rules()
{
public $author_name;
// 只有在 rules() 的字段才能被搜索
return [
[['status', 'article_type_id'], 'integer'],
[['title','author_name'], 'safe'],
];
}
public function scenarios()
{
return Model::scenarios();
}
public function search($params)
{
$query = Article::find();
//这里因为要调用author表进行作者名查询,所以要用到joinWith
$query->joinWith('author');
//在视图中,会调用级联的article_type表,调用他的分类名,所以为了性能,在这里join一下
$query->join('articleType');
//如果增加的字段需要表头排序,则可加入以下代码
$dataProvider->setSort([
'attributes' => [
// 其它字段不要动,下面这段是加入的
'customer_name' => [
'asc' => ['author.author_name' => SORT_ASC],
'desc' => ['author.author_name' => SORT_DESC],
'label' => '作者'
],
]
]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
// 加载搜索表单数据并验证
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'status' => $this->status,
'article_type_id' => $this->article_type_id,
]);
// 时间搜索,用户在view上面输入的是字符串的时间,而数据库存放的是时间戳,需转换匹配
if ($this->created_at) {
$createdAt = strtotime($this->created_at);
$createdAtEnd = $createdAt + 24*3600;
$query->andWhere("created_at >= {$createdAt} AND created_at <= {$createdAtEnd}");
}
// 通过添加过滤器来调整查询语句
$query->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'author.name', $this->author_name]);
return $dataProvider;
}
}
控制器调用
<?php
$searchModel = new ArticleSearch();
$dataProvider = $searchModel->search($_GET);
return $this->render('view', [
'dataProvider' => $dataProvider,
'searchModel' => $searchModel,
]);
视图显示
<?php
<?= GridView::widget([
'dataProvider' => $dataProvider,
// 表格列值搜索功能,注意一定要配合attribute才会显示
// $searchModel = new ArticleSearch();
'filterModel' => $searchModel,
'options' => [
'class' => 'grid-view table-responsive'
],
'columns' => [
'id',
// 自定义搜索输入框,比如增加“haha样式”、和onclick事件
[
'attribute' => 'title',
'filter' => Html::activeTextInput($searchModel, 'title', ['class' => 'form-control haha','onclick'=>'haha()']),
],
// 此处用到了$model的关联数据,hasOne
[
'attribute'=>'author_id',
'value'=>function ($model) {
return $model->author->name;
}
],
// 下拉框搜索11 在搜索条件(过滤条件)中使用下拉框来搜索
[
'attribute'=>'status',
'filter' => ['1'=>'可用','0'=>'不可用']
],
// or~~~~
[
'class'=>commongridEnumColumn::className(),
'attribute'=>'status',
'enum'=>[
'1' => '可用状态',
'0' => '禁用状态',
]
],
// or~~~~~
[
'attribute'=>'status',
'filter' => Html::activeDropDownList($searchModel,'status',['1'=>'可用','0'=>'不可用'],['prompt'=>'全部','class'=>'form-control'])
],
// 下拉框搜索22 文章分类作为下拉框选项进行索引
[
'attribute'=>'article_type',
'value'=>function ($model) {
return $model->articleType->title;
},
'filter'=>yiihelpersArrayHelper::map(ArticleType::find()->all(), 'id', 'title')
],
'created_at:datetime'
['class' => 'yiigridActionColumn']
]
]); ?>
DetailView
<?php
<?= echo DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'package_id',
'customer_id',
'status',
[
'attribute' => 'status',
'value' => getStatus($model)
],
'create_at:datetime',
],
]) ?>
function getStatus($model){
return $model->status == 0? '已禁用': '可用';
}
(完)
- Java基础-day07-知识点相关题-自定义数据类型;ArrayList
- windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- 最近的几个技术问题总结和答疑(九)(r10笔记第16天)
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
- 【Go 语言社区】Golang语言操作redis连接池的方法
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
- 关于Flashback的小测试(r10笔记第15天)
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
- 【Go 语言社区】Golang语言获取系统环境变量的方法
- Oracle中的PUBLIC(r10笔记第14天)
- Data Guard高级玩法:通过闪回恢复switchover主库 (r10笔记第13天)
- WinForm/MIS项目开发之中按钮级权限实践
- 恢复控制文件避免使用resetlogs选项 (r10笔记第12天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux 搭建Git服务器的方法
- Linux中无法远程连接数据库问题的解决方法
- VIM实现文件快速跳转插件详解
- 详解linux usb host驱动编写入门
- CentOS服务器平台搭建mysql主从复制与读写分离的方法
- Centos7中添加、删除Swap交换分区的方法
- Bash中文件描述符的详细介绍
- Linux 块设备驱动代码编写
- ubuntu中终端命令提示符太长的修改方法汇总
- CentOS 6.5 环境实现本地局域网搭建YUM的方法【基于FTP】
- iPhone手机越狱-逆向砸壳-代码注入
- Flutter基础widgets教程-SizedBox篇
- 详解linux 看门狗驱动编写
- CentOS 6.5平台本地YUM配置的方法
- Linux环境(CentOS6.7 64位)下安装subversion1.9.5的方法