ThinkPHP的超链接
ThinkPHP将模板输出之前会进行模板替换,将预定义的一些特殊字符进行替换操作。下面几个就是最常用的替换规则,你可以将其写在index.html页面中看看效果。
__URL__ :会替换成当前模块的URL地址,例如:/Myweb/index.php/Index
__APP__ :会替换成当前项目的URL地址,例如:/Myweb/index.php
__PUBLIC__ :会被替换成当前网站的公共目录 通常是 /Public/,例如:/Myweb/Public
__ROOT__ :会替换成当前网站的地址,例如:/Myweb
以上几个是最常用的,除此以外还有:
__GROUP__:会替换成当前分组的URL地址
__ACT
__SELF__: 会替换成当前的页面URL
以上字符替换出来的结果是可自行测试。
读取新闻
上一章我们读取了新闻并做成列表,本章我们来读取新闻内容。
首先在Tpl/Index下新建HTML页面info.html。打开Lib/Act
public function info(){
$this->display();
}
然后我们修改下index.html页面,将
<td>{$mynews.fTitle}</td>
修改为
<td><a 链接="__URL__/info/id/{$mynews.fID}">{$mynews.fTitle}</a></td>
然后回到控制器,读取指定新闻:
public function info(){
$id=$_GET['id'];
$DBnews=M('news');
$res=$DBnews->where("fID='".$id."'")->find();
$this->assign('title', '新闻站');
$this->assign('news',$res);
$this->display();
}
$id获取到在index.html中传的新闻fID值,然后使用where语句在表中查找。注意where放在find()之前。find()是只从表中取出一条数据,相当于select()加限制只取一条数据。但是find()与select()最大区别在于,find()取出的值是一维数组,select()取出值是二维数组,即便只取一条数据也是二维数组。最后把info.html页面内容写好即可
修改新闻
<div><a链接="__URL__/edit/id/{$news.fID}">修改新闻</a></div>
然后在Tpl/Index下新建一个edit.html页面。
<!DOCTYPE html>
<html>
<head>
<title>{$title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1 align="center">{$title}</h1>
<hr/>
<form act
<table>
<tr>
<td>标题</td>
<td><input type="text" name="fTitle" value="{$news.fTitle}" /></td>
</tr>
<tr>
<td>作者</td>
<td><input type="text" name="fAuthor" value="{$news.fAuthor}" /></td>
</tr>
<tr>
<td>内容</td>
<td><textarea rows="10" cols="70" name="fContent">{$news.fContent}</textarea></td>
</tr>
<tr>
<td><input type="hidden" name="fID" value="{$news.fID}" /></td>
<td><button type="submit">提交</button></td>
</tr>
</table>
</form>
</body>
</html>
再到控制器里写好该方法:
public function edit(){
$id = $_GET['id'];
$DBnews = M('news');
$res = $DBnews->where("fID='" . $id . "'")->find();
$this->assign('title', '新闻站');
$this->assign('news', $res);
$this->display();
}
这样就可以在文本框中显示出当前修改的新闻内容了。最后我们来做提交后的处理。看到上面代码中act
public function doedit(){
$da
$da
$da
$da
$da
$DBnews=M('news');
if($DBnews->save($da
$this->success('修改成功!', '__URL__/index');
}else{
$this->error('修改失败!', '__URL__/index');
}
}
首先用$_POST[]分别接收每个提交的数据,然后分别放入一个数组中,然后使用save()来保存数据,ThinkPHP会自动根据主键fID 来查找更新的是哪条数据。最后用success()和error()函数来做页面跳转并提醒用户修改是否成功。在success()中第一个变量是提示信 息,第二个是跳转到的地址,error()使用方法相同。
但是这样保存数据有个问题,在表单中有大量数据需要保存时,我们岂不是需要一个一个的用$_POST[]接收过来再处理,这会非常麻烦。那么有没有 方便的方法来做呢?ThinkPHP人性化的提供了create()方法来处理这种情况,下面就是用这种方法改写的doedit():
public function doedit(){
$DBnews=M('news');
$DBnews->create();
$DBnews->fTime=time();
if($DBnews->save()){
$this->success('修改成功!', '__URL__/index');
}else{
$this->error('修改失败!', '__URL__/index');
}
}
表单post和get传值,均可这样处理;但此方法前提是表单每个数据的name属性必须与数据库里的字段名相同。不然就像$DBnews->fTime=time();这样来接收和处理数据。
一般在处理类似情况时,不会单独写一个doedit()方法,而是在edit()方法中既显示页面又处理更新。
添加新闻
加新闻原理跟修改新闻其实非常类似,就是把文本框里的数据保存到数据库中,只不过修改新闻是根据id修改,添加新闻是新增一条。
那么首先要在index.html页面加上一个添加新闻的连接:
<a链接="__URL__/add">添加新闻</a>
然后写add.html页面。讲之前的edit.html页面复制稍微修改即可:
<!DOCTYPE html>
<html>
<head>
<title>{$title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1 align="center">{$title}</h1>
<hr/>
<form act
<table>
<tr>
<td>标题</td>
<td><input type="text" name="fTitle" /></td>
</tr>
<tr>
<td>作者</td>
<td><input type="text" name="fAuthor" /></td>
</tr>
<tr>
<td>内容</td>
<td><textarea rows="10" cols="70" name="fContent"></textarea></td>
</tr>
<tr>
<td><input type="hidden" name="complete" value="true" /></td>
<td><button type="submit">提交</button></td>
</tr>
</table>
</form>
</body>
</html>
前面提到可将doedit和edit写在一起,这里就演示将doadd和add写在一起。首先仔细看add.html中,有这么一句代码:
<td><input type="hidden" name="complete" value="true" /></td>
这句告诉程序我们是要提交数据还是要显示这个页面。于是在IndexAction.class.php中可以这样写:
public function add() {
if (!empty($_POST['complete'])) {
$DBnews = M('news');
$DBnews->create();
$DBnews->fTime = time();
if ($DBnews->add()) {
$this->success('添加成功!', '__URL__/index');
} else {
$this->error('添加失败!', '__URL__/index');
}
} else {
$this->assign('title', '新闻站');
$this->display();
}
}
删除新闻
其实删除操作是添加(Create),更新(Update),读取(Read),删除(Delete)这四个操作(统称CURD)中最简单的。
首先还是要修改下index.html页面,为每条新闻增加一个删除按钮
<a 链接="__URL__/delete/id/{$mynews.fID}">删除</a>
由于删除无需页面,直接写控制器即可,在IndexAction.class.php添加一个delete()方法:
public function delete() {
$id = $_GET['id'];
$DBnews = M('news');
$res = $DBnews->where("fID='" . $id . "'")->delete();
if ($res) {
$this->success('删除成功!', '__URL__/index');
} else {
$this->error('删除失败!', '__URL__/index');
}
}
如果删除成功,其返回值也就是$res为被删除的条数,如果删除失败则返回false。所以我们只要判断下$res就可以了。这也说明了删除是可以一次性删除多条数据的,所以在进行删除操作时要仔细,别一下把整个表的数据都删了。
删除操作还有一种写法是:$res = $DBnews->delete($id);
因为当delete()内的参数为数字或者字符串的时候表示主键值。ThinkPHP很聪明地明白你在这里写的$id是对应数据库表里的fID这个字段。但不建议这样用,若不小心容易把整个表的数据都删掉。