ThinkPHP---TP功能类之公文管理功能2----------继续完善
【前言】
之前已经完成了公文的添加和列表展示功能,今天继续完善。做下公文的编辑和删除功能。
【主体】
(1)分析
控制器:DocController.class.php
方法:edit(将模板展示和数据保存写在一起)
模板文件:edit.html
下面分步操作:
第一步:修改模板文件,添加编辑按钮
<td>
<a href="javascript:;" class="showBtn" data="{$vol.id}"" data-title="{$vol.title}">查看</a> |
<a href="__CONTROLLER__/edit/id/{$vol.id}" class="editBtn">编辑</a>
</td>
第二部:控制器编写edit方法,展示数据和模板
//编辑方法
public function edit(){
//接收id
$id = I('get.id');
//查询数据
$data = M('doc')->find($id);
//变量分配
$this->assign('data',$data);
//展示模板
$this->display();
}
第三部:复制模板文件edit.html到指定位置Application\Admin\View\Doc\edit.html,并换掉静态资源路径
第四部:修改add.html模板文件,在模板文件中展示当前修改记录的原始数据。先不考虑附件,展示其他
<form action="" method="post" enctype="multipart/form-data">
<fieldset>
<legend>编辑公文</legend>
<p><label for="title">标题:</label><input type="text" name="title" id="title" value={$data.title}></p>
<p><label for="filename">附件</label>
<input type="file" name="file" id="filename">
</p>
<p><label for="author">作者</label><input type="text" name="author" id="author" value={$data.author}></p>
<p><label for="content">内容:</label>
<script id="editor" name="content" type="text/plain" style="width:800px;height:300px;">
{$data.content}
</script>
</p>
<div>
<a href="javascript:;" id="submitBtn">提交</a>
<a href="javascript:;" id="resetBtn">清空</a>
</div>
</fieldset>
</form>
展示效果:

会发现,UE编辑器区域内包含转义字符。需要解码。
为什么会这样?因为数据库保存的时候就是转义保存的,为了防止SQL注入。下面用htmlspecialchars_decode方法解码,该方法需要传递一个参数,这里传递变量本身用###
<p><label for="content">内容:</label>
<script id="editor" name="content" type="text/plain" style="width:800px;height:300px;">
{$data.content|htmlspecialchars_decode=###}
</script>
</p>
显示效果:现在显示正常

第五步:操作附件
如果需要修改则显示文件,留空则表示不修改
注意:
①关于文件域的值,在文件域中输出value属性没有意义。所以可以采用和修改密码一样的原理。如果用户选择了文件则表示修改文件,如果没有选择则表示不修改文件。
②由于content之前写入数据表时经过I方法进行了转码处理,所以在展示时需要进行解码,还原之前形式,使用到PHP内置函数htmlspecialchars_decode方法
第六步:检查表单,添加隐藏域(通过隐藏域的表单项来传递值id或{$Think.get.id})
<input type="hidden" name="id" value="{$data.id}">
第七步:改写edit方法,做一个分支判断,判断请求类型实现数据的保存
//编辑方法
public function edit(){
if (IS_POST) {
//实现数据保存提交------1.接收数据;2.实例化自定义模型;3. 数据的保存提交
$post = I('post.');
//实例化自定义模型
$model=D('Doc');
//调用updateData方法,实现数据保存
$result = $model->updateData($post,$_FILES['file']);
if($result){
$this->success('修改成功',U('showList'),3);
}else{
$this->error('修改失败');
}
}else{
//接收id
$id = I('get.id');
//查询数据
$data = M('doc')->find($id);
//变量分配
$this->assign('data',$data);
//展示模板
$this->display();
}
}
第八步:编写模型中保存方法updateData
先判断是否有文件需要处理,如果有则进行处理
判断文件有无可以通过两个条件进行判断①$file['error']或者②$file['size']
//更新数据保存
public function updateData($post,$file){
if(!$file['error']){
//配置数组
$cfg = array(
'rootPath' => WORKING_PATH.UPLOAD_ROOT_PATH
);
// 实例化上传类
$upload = new \Think\Upload($cfg);
//上传
$info = $upload->uploadOne($file);
dump($info);die;
}else{
//没有文件,则不进行处理
}
//写入数据
return $this->save($post);
}
对上面上传文件进行输出,浏览器显示(若成功则返回一维数组,9个数据)
array(9) {
["name"] => string(36) "008ba1edbe4c0365a538b71189546615.jpg"
["type"] => string(10) "image/jpeg"
["size"] => int(265610)
["key"] => int(0)
["ext"] => string(3) "jpg"
["md5"] => string(32) "ade1a4a4634de862a818a4626b5f4166"
["sha1"] => string(40) "2f45b527ac015a48b14c7c95cc37b45b6024b002"
["savename"] => string(17) "5ac323c6f0338.jpg"
["savepath"] => string(11) "2018-04-03/"
}
注意:数据库设计时没有考虑更新时间,只考虑了添加时间addtime,所以这里咱们也先不考虑更新时间
接下来判断上传结果,若为真则成功,成功的话只对附件的3个字段进行修改即可;失败的话不用考虑
//判断是否上传成功
if($info){//上传成功,成功的话针对附件的三个字段进行修改即可
//补全剩余的三个字段
// 图片路径为相对路径---固定目录+日期+文件名+后缀
//因为后期数据库存的数据是给浏览器看的,所以路径上----不能带盘符,相对于站点根目录形式UPLOAD_ROOT_PATH
$post['filepath'] = UPLOAD_ROOT_PATH . $info['savepath'] . $info['savename'];
$post['filename'] = $info['name'];//文件的原始名
$post['hasfile'] = 1;//是否有文件
}else{//上传失败 }
这里我输出下上传数据:$post
array(7) {
["title"] => string(10) "4.3添加1"
["id"] => string(2) "23"
["author"] => string(9) "4.3添加"
["content"] => string(779) "<p>
</p><p><br/></p><p><br/></p><p><br/></p><p>
<span style="color: rgb(75, 172, 198);"><strong>今天04.03,哈哈<span style="
color: rgb(255, 0, 0);">哈哈哈哈</span></strong></span></p><p>是</p>
<p>我的</p><p>生日哦<img src="http://img.baidu.com/hi/jx2/j_0014.gif"/></p>
<p><img src="/ueditor/php/upload/image/20180403/1522722138136582.jpg" title="
1522722138136582.jpg" alt="c356da8d5eaa4c6b9bc730e6c56ddf99.jpg"/></p><p><br/>
</p><p><br/></p><p><br/></p><p>
</p>"
["filepath"] => string(43) "/Public/Upload/2018-04-03/5ac3257e01757.jpg"
["filename"] => string(36) "008ba1edbe4c0365a538b71189546615.jpg"
["hasfile"] => int(1)
}
ThinkPHP---TP功能类之公文管理功能2----------继续完善的更多相关文章
- ThinkPHP---TP功能类之公文管理功能
[一]准备工作 (1)创建数据表 表名:sp_doc create table sp_doc( id int(11) not null auto_increment, title varchar(50 ...
- ThinkPHP---案例--实现知识管理功能
[一]准备工作 (1)数据表sp_knowledge SQL语句:知识管理数据表结构 create table sp_knowledge( id int(11) not null auto_incre ...
- .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加
在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...
- C#开发微信门户及应用(37)--微信公众号标签管理功能
微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...
- yii2-basic后台管理功能开发之三:自定义GridView列显示
在第二篇 yii2-basic后台管理功能开发之二:创建CRUD增删改查 中,我们利用gii工具生成的结果一般并不是我们想要的结果. 我们需要根据自己的需求自定义列显示.我遇到的主要是一下变更: 时间 ...
- [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己的订单状态看到店家已经发货.从上面的业务逻辑可以看出,当用户 ...
- DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能 一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己 ...
- vultr vps发布多用户管理功能
中国用户购买海外vps,有一个麻烦之处是付款环节,可能你没有visa信用卡,vultr和digitalocean和linode这类vps不支持支付宝,给一些朋友带来不便.由此产生的vps代购行业,其实 ...
- 我的第一个python web开发框架(36)——后台菜单管理功能
对于后台管理系统来说,要做好权限管理离不开菜单项和页面按钮控件功能的管理.由于程序没法智能的知道有什么菜单和控件,哪些人拥有哪些操作权限,所以首先要做的是菜单管理功能,将需要管理的菜单项和各个功能项添 ...
随机推荐
- iOS开发——优化篇—— 25个性能优化/内存优化常用方法
1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你 ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
大意:一个数组,三个操作,第一种是区间[a,b]每个数乘乘,第二种是区间[a,b]每个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的只往下传标记.每次传乘法标记时,要把加法标 ...
- HttpClient-01基本概念
Http 协议应该是互联网中最重要的协议.持续增长的 web 服务.可联网的家用电器等都在继承并拓 展着 Http 协议,向着浏览器之外的方向发展. 虽然 jdk 中的 java.net 包中提供了一 ...
- oracle导入dmp文件时出现异常
oracle导入dmp文件时出现错误 今天在给oracle导入dmp文件时老是出现错误,无论是命令行或PL/SQL,错误截图如下: 经查是导入用户的权限不足,导入用户并没有DBA权限,而导出的dmp文 ...
- Java 基础 —— enum
枚举的遍历: enum Suit { CLUB, DIAMOND, HEART, SPADE } Collection<Suit> suitTypes = Arrays.asList(Su ...
- HTTP方式播放FLV/mp4 :nginx+Yamdi/MP4BOX
[导语]chrome浏览器确实很强,直接支持MP4拖动播放,对于其他播放器,可以使用以下方法来支持拖动播放.拖动的关键在于生成关键帧等元数据信息,便于服务器和播放器支持拖动. 另外,nginx web ...
- Eclipse 配置 Python 环境
1.将下载好的Pydev4.5.2(http://sourceforge.net/projects/pydev/files/pydev/ 里面有很多版本) 文件夹里的两个文件夹(features+p ...
- springboot根据yml配置文件选择性加载bean
@Slf4j @Aspect @Component @ConditionalOnProperty(value = "localCache.apiCache", havingValu ...
- sql数据库如何在数据库里面把其中一个数据库的表复制到另一个数据库里面
在sqlserver数据库里面,我们肯定有这样一个情况,假如我用的是SQL2008,如何把数据库里面的整个表以及表内数据复制到另外一个表中.那应该如何操作??有两种方法,我们一起来看一下 复制表结构: ...
- CodeForces 446A DZY Loves Sequences (DP+暴力)
题意:给定一个序列,让你找出一个最长的序列,使得最多改其中的一个数,使其变成严格上升序列. 析:f[i] 表示以 i 结尾的最长上升长度,g[i] 表示以 i 为开始的最长上升长度,这两个很容易就求得 ...