一、增加查询
1.application\index\view\Teacher\index.html
增加如下代码
<!-- 【1】查询 -->
<div class="col-md-8">
<form class="form-inline">
<div class="form-group">
<!-- 显示查询的姓名 -->
<label class="sr-only" for="name">姓名</label>
<input name="name" type="text" class="form-control" placeholder="姓名...">
</div>
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i> 查询</button>
</form>
</div>
当我们点击查询的时候,又跳回了当前页。form action为空表示提交到当前页
是的,如果我们只想跳回到当前页,那么在url()函数中,是不需要有任何参数的。url()表示生成当前模块当前控制器当前触发器的链接,没错,在这里,就是我们想要的。
地址栏占查询后变:http://tp5/index.php/index/teacher/index?name=张三
2.改application\index\controller\TeacherController.php
// 【1】获取查询名
$name=Request::instance()->get('name');
echo $name;
$Teacher = new Teacher;
// $teachers = $Teacher->select(); //获取所有条数
// 【2】查询数据库
if(!empty($name)){
$Teacher->where('name','like','%'.$name.'%');
}
<?php
namespace app\index\controller; // 该文件的位于application\index\controller文件夹
use think\Controller; // 用于与V层进行数据传递
use think\Request; // 引用Request
use app\common\model\Teacher; // 教师模型
/**
* 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
*/
class TeacherController extends Controller
{
public function index()
{
try {
$page_size=5; //0设置每页条数
// 【1】获取查询名
$name=Request::instance()->get('name');
echo $name;
$Teacher = new Teacher;
// $teachers = $Teacher->select(); //获取所有条数
// 【2】查询数据库
if(!empty($name)){
$Teacher->where('name','like','%'.$name.'%');
}
$teachers=$Teacher->paginate($page_size); //1进行分页,每页展示page_size条,代替获取所有条数
// 向V层传数据 3传入数据到v
$this->assign('teachers', $teachers);
// 取回打包后的数据
$htmls = $this->fetch();
// 将数据返回给用户
return $htmls;
} catch(\think\HttpResponseException\Exception $e){
throw $e;
}
catch (\Exception $e) {
// 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下代码的注释去掉。
// throw $e;
return '系统错误' . $e->getMessage();
}
}
效果:http://tp5/index.php/index/teacher?name=小七
二、完善查询
1.保留输入框的内容v层修改
添加属性value="{:input('get.name')}"
外层的双引号,内层的单引号不要忘记加
<input name="name" type="text" class="form-control" placeholder="姓名..." value="{:input('get.name')}">
即给value一个值,这个值是获取的GET信息。
input和url一样,同为助手函数。input('get.name')
作用同Request::instance()->get('name')
,适用于在V层调用。
效果:查询时输入框会保留输入的内容
2.点查询出结果后,再点第二页查询结果就没了
原
变:
但是我们发现,当我们点击第二页时,这个关键字就消失了。
通过生成的URL,我们的方法,它除了把url中page信息生成了以外,并没有生成我们的name信息。
http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2
正确的URL应该是这样:
http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2&name=王
或
http://127.0.0.1/thinkphp5/public/index/teacher/index/name/王.html?page=2
但是吧,显然thinkphp5并没有考虑用户直接用 ? 的形式来传值的感受,也就是说,它不会生成这样的链接:http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2&name=王
ThinkPHP提前想到了这个需求,在调用paginate时,接收3个参数。我们来看一下源码的注释:
namespace think\db;
class Query
...
/**
* 分页查询
* @param int|null $listRows 每页数量
* @param int|bool $simple 简洁模式或者总记录数
* @param array $config 配置参数
* page:当前页,
* path:url路径,
* query:url额外参数,
* fragment:url锚点,
* var_page:分页变量,
* list_rows:每页数量
* type:分页类名
* @return \think\paginator\Collection
* @throws DbException
*/
public function paginate($listRows = null, $simple = false, $config = [])
{
其中第三个参数接收一个数组,这个数组接收一个键的名称为:query
,指额外参数。query:url额外参数
/**
* 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
*/
class TeacherController extends Controller
{
public function index()
{
...
$teachers=$Teacher->paginate($page_size,false,[
'query'=>[
'name'=>$name
],
]); //
//进行分页,每页展示page_size条,代替获取所有条数
再查询点下一页就能保持查询效果了页数不变了
附完整代码
1.c层
application\index\controller\TeacherController.php
<?php
namespace app\index\controller; // 该文件的位于application\index\controller文件夹
use think\Controller; // 用于与V层进行数据传递
use think\Request; // 引用Request
use app\common\model\Teacher; // 教师模型
/**
* 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
*/
class TeacherController extends Controller
{
public function index()
{
try {
$page_size=5; //0设置每页条数
// 【1】获取查询名
$name=Request::instance()->get('name');
echo $name;
$Teacher = new Teacher;
// $teachers = $Teacher->select(); //获取所有条数
// 【2】查询数据库
if(!empty($name)){
$Teacher->where('name','like','%'.$name.'%');
}
$teachers=$Teacher->paginate($page_size,false,[
'query'=>[
'name'=>$name
],
]); //进行分页,每页展示page_size条,代替获取所有条数
// 向V层传数据 3传入数据到v
$this->assign('teachers', $teachers);
// 取回打包后的数据
$htmls = $this->fetch();
// 将数据返回给用户
return $htmls;
} catch(\think\HttpResponseException\Exception $e){
throw $e;
}
catch (\Exception $e) {
// 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下代码的注释去掉。
// throw $e;
return '系统错误' . $e->getMessage();
}
}
/**
* 插入新数据
* @return html
* @author pasa
* @DateTime 2020-8-07T12:31:24+0800
*/
public function insert()
{
$message='';
try{
// 接收传入数据
$postData = Request::instance()->post();
// 实例化Teacher空对象
$Teacher = new Teacher();
// 为对象赋值
$Teacher->name = $postData['name'];
$Teacher->username = $postData['username'];
$Teacher->sex = $postData['sex'];
$Teacher->email = $postData['email'];
// 新增对象至数据表
$result = $Teacher->validate(true)->save();
// 反馈结果
if (false === $result) {
$message='新增失败:' . $Teacher->getError();
} else {
return $this->success($Teacher->name.'用户新增成功!',url('index'));
}
}catch(\think\Exception\HttpResponseException $e){
throw $e;
}
catch(\Exception $e){
var_dump($e);
return $e->getMessage();
}
return $this->error($message);
}
/**
* 新增数据交互
* @author pasa
* @DateTime 2020-8-07T12:41:23+0800
*/
public function add()
{
$htmls = $this->fetch();
return $htmls;
}
/**
* 删除
* @return 跳转
* @author pasa
* @DateTime 2020-8-07T13:52:07+0800
*/
public function delete()
{
// 获取pathinfo传入的ID值.
$id = Request::instance()->param('id/d'); // 获取从地址传过来的参数 id /d 表示将数值转化为 整形
// $id=100; //用于测试
//没获取到id则抛出异常
if (0 === $id) {
// return $this->error('未获取到ID信息');
throw \Exception('没获取到ID信息',1);
}
// 获取要删除的对象
$Teacher = Teacher::get($id);
// 要删除的对象不存在
if (is_null($Teacher)) {
return $this->error('不存在id为' . $id . '的教师,删除失败');
}
// 删除对象
if (!$Teacher->delete()) {
return $this->error('删除失败:' . $Teacher->getError());
}
// 进行跳转
return $this->success('删除成功', url('index'));
}
/**
* 编辑
* @return html
* @author pasa
* @DateTime 2020-8-07T13:52:29+0800
*/
public function edit()
{
// 获取传入ID
$id = Request::instance()->param('id/d');
// 在Teacher表模型中获取当前记录
if (is_null($Teacher = Teacher::get($id))) {
return '系统未找到ID为' . $id . '的记录';
}
// 将数据传给V层
$this->assign('Teacher', $Teacher);
// 获取封装好的V层内容
$htmls = $this->fetch();
// 将封装好的V层内容返回给用户
return $htmls;
}
/**
* 更新
* @return
* @author pasa
* @DateTime 2020-8-07T14:03:41+0800
*/
public function update()
{
try {
// 接收数据,取要更新的关键字信息
$id = Request::instance()->post('id/d');
$message = '';
// 获取当前对象
$teacher = Teacher::get($id);
if (!is_null($teacher)) {
// 写入要更新的数据
$teacher->name = Request::instance()->post('name');
$teacher->username = Request::instance()->post('username');
$teacher->sex = Request::instance()->post('sex/d');
$teacher->email = Request::instance()->post('email');
// 更新
if (false === $teacher->validate(true)->save())
{
$message = '更新失败' . $teacher->getError();
}
} else {
throw new \Exception("所更新的记录不存在", 1); // 调用PHP内置类时,需要在前面加上 \
}
} catch (\Exception $e) {
// 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下的代码的注释去掉
// throw $e;
$message = $e->getMessage();
}
return $message;
}
}
2.v层
application\index\view\Teacher\index.html
<!DOCTYPE html>
<html lang="zh-hans">
<head>
<meta charset="UTF-8">
<title>教师管理</title>
<!-- <link rel="stylesheet" type="text/css" href="/tp5/public/static/bootstrap-3.3.5-dist/css/bootstrap.min.css"> -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container">
<div class="row">
<div class="col-md-12">
<hr />
<div class="row">
<!-- 【1】查询 -->
<div class="col-md-8">
<form class="form-inline">
<div class="form-group">
<label class="sr-only" for="name">姓名</label>
<input name="name" type="text" class="form-control" placeholder="姓名..." value="{:input('get.name')}">
</div>
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i> 查询</button>
</form>
</div>
<!-- 【2】添加 -->
<div class="col-md-4 text-right">
<a href="{:url('add')}" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i> 添加</a>
</div>
</div>
<hr />
<table class="table table-hover table-bordered">
<tr class="info">
<th>序号</th>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>用户名</th>
<th>操作</th>
</tr>
{volist name="teachers" id="teacher" key="key"}
<tr>
<td>{$key}</td>
<td>{$teacher->getData('name')}</td>
<td>{eq name='teacher->getData("sex")' value='0'}男{else /}女{/eq}</td>
<td>{$teacher->getData('email')}</td>
<td>{$teacher->getData('username')}</td>
<td>
<a href="{:url('edit?id=' . $teacher->getData('id'))}">编辑</a>
<a href="{:url('delete?id=' . $teacher->getData('id'))}">删除</a>
</td>
</tr>
{/volist}
</table>
<!-- 【1】展示分页 -->
{$teachers->render()}
</div>
</div>
</body>
</html>