商品修改{修改页一般与添加页有百分之九十的相似度}

  create($_POST,Model::MODEL_UPDATE):系统内置的数据操作包括Model::MODEL_INSERT(或者1)和Model::MODEL_UPDATE(或者2),当没有指定的时候,系统根据数据源是否包含主键数据来自动判断,如果存在主键数据,就当成Model::MODEL_UPDATE操作。

  save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数

1、控制器GoodsController.class.php中增加edit方法

 public function edit()
{
//判断用户是否提交了表单(如果提交了,就在if中处理表单,否则显示表单)
if(IS_POST){ //IS_POST:TP自带常量:当前是否POST请求
$model = D('goods'); //D()实例化/Model/中模型goods
//2.CREATE方法:a.接收数据并保存到模型中 b.根据模型中定义的规则验证表单
/**
*第一个参数:要接收的数据默认是$_POST
*第二个参数:表单的类型。当前是添加还是修改的表单,1:添加 2:修改
*$_POST:表单中原始的数据,I('post.'):过滤后的$_POST的数据,过滤XSS攻击
**/
if($model->create(I('post'), 2))
{
//save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数【如果修改前跟修改后相同就返回0】
if(FALSE !== $model->save())
{
//显示成功信息并等待1秒之后跳转
$this->success('操作成功!', U('lst'));
exit;
}
}
//如果上面失败了在这里处理失败的请求
//从模型中取出失败的原因
$error = $model->getError();
//由控制器显示错误信息,并在3秒跳回上一个页面[error()默认3秒]
$this->error($error);
}
//显示表单
$this->display();
}

function edit()

2、修改商品模型GoodsModel.class.php控制允许修改的字段

//修改调用create方法允许接收的字段
protected $updateFields = 'id,goods_name,market_price,shop_price,is_on_sale,goods_desc';

3、修改lst.html添加修改按钮,使之传递id参数  U()

  4、在修改的表单中显示原来的数据

先根据ID取出原数据的信息 -> 修改控制器GoodsController.class.php中的edit方法;注意:这里的模型实例化则不能在if里面

//修改商品表单
public function edit()
{
$id = I('get.id'); //获取要修改的商品的id
$model = D('goods'); //D()实例化/Model/中模型goods
//判断用户是否提交了表单(如果提交了,就在if中处理表单,否则显示表单)
if(IS_POST)
{ //IS_POST:TP自带常量:当前是否POST请求
//2.CREATE方法:a.接收数据并保存到模型中 b.根据模型中定义的规则验证表单
/**
*第一个参数:要接收的数据默认是$_POST
*第二个参数:表单的类型。当前是添加还是修改的表单,1:添加 2:修改
*$_POST:表单中原始的数据,I('post.'):过滤后的$_POST的数据,过滤XSS攻击
**/
if($model->create(I('post'), 2))
{
//save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数【如果修改前跟修改后相同就返回0】
if(FALSE !== $model->save())
{
//显示成功信息并等待1秒之后跳转
$this->success('操作成功!', U('lst'));
exit;
}
}
//如果上面失败了在这里处理失败的请求
//从模型中取出失败的原因
$error = $model->getError();
//由控制器显示错误信息,并在3秒跳回上一个页面[error()默认3秒]
$this->error($error);
}
//根据ID取出要修改的商品的原信息
$data = $model->find($id);
$this->assign('data', $data);
//显示表单
$this->display();
}

function edit()

修改edit.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ECSHOP 管理中心 - 修改商品 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<link href="__PUB__/Admin/Styles/general.css" rel="stylesheet" type="text/css" />
<link href="__PUB__/Admin/Styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>
<span class="action-span"><a href="__GROUP__/Goods/goodsList">商品列表</a>
</span>
<span class="action-span1"><a href="__GROUP__">ECSHOP 管理中心</a></span>
<span id="search_id" class="action-span1"> - 修改商品 </span>
<div style="clear:both"></div>
</h1> <div class="tab-div">
<div id="tabbar-div">
<p>
<span class="tab-front" id="general-tab">通用信息</span>
</p>
</div>
<div id="tabbody-div">
<form enctype="multipart/form-data" action="__SELF__" method="post" >
<input type="hidden" name="id" value="<?php echo $data['id'];?>" />
<table width="90%" id="general-table" align="center">
<tr>
<td class="label">商品名称:</td>
<td><input type="text" name="goods_name" value="<?php echo $data['goods_name'];?>"size="30" />
<span class="require-field">*</span></td>
</tr>
<tr>
<td class="label">LOGO: </td>
<td>
<img src="/Public/Uploads/<?php echo $data['mid_logo'];?>">
<br />
<input type="file" name="logo" size="30" />
</tr>
<tr>
<td class="label">市场售价:</td>
<td>
<input type="text" name="market_price" value="<?php echo $data['market_price'];?>" size="20" />
<span class="require-field">*</span>
</td>
</tr>
<tr>
<td class="label">本店售价:</td>
<td>
<input type="text" name="shop_price" value="<?php echo $data['id'];?>" size="20"/>
<span class="require-field">*</span>
</td>
</tr>
<tr>
<td class="label">是否上架:</td>
<td>
<input type="radio" name="is_on_sale" value="1" <?php if($data['is_on_sale']=='1') echo 'checked="checked"'; ?> /> 是
<input type="radio" name="is_on_sale" value="0" <?php if($data['is_on_sale']=='0') echo 'checked="checked"'; ?> /> 否
</td>
</tr>
<tr>
<td class="label">商品描述:</td>
<td>
<textarea id="goods_desc" name="goods_desc" /><?php echo $data['goods_desc'];?>"</textarea>
</td>
</tr>
</table>
<div class="button-div">
<input type="submit" value=" 确定 " class="button"/>
<input type="reset" value=" 重置 " class="button" />
</div>
</form>
</div>
</div> <div id="footer">
共执行 9 个查询,用时 0.025161 秒,Gzip 已禁用,内存占用 3.258 MB<br />
版权所有 &copy; 2005-2012 上海商派网络科技有限公司,并保留所有权利。</div>
</body>
</html> <!--导入在线编辑器-->
<link href="__PUB__/umeditor1.2.3-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script>
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/template.min.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.min.js"></script>
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/lang/zh-cn/zh-cn.js"></script>
<script>
UM.getEditor('goods_desc', {
initialFrameWidth: "100%",
initialFrameHeight: 150
});
</script>

edit.html

 注:1、显示logo图片

  2、radio之类的选择按钮

5、在模型GoodsModel.class.php中添加_before_update()用于处理图片

思路:判断是否有图片上传,类似_before_insert()中处理logo的方法;先获取id,处理图片,在插入数据库前删除原图数据unlink

//钩子方法_before_update:更新前插入,在添加前会自动调用
protected function _before_update(&$data, $option)
{
$id = $option['where']['id']; //要修改的商品的ID /**************处理LOGO******************/
//判断有没有选择图片
if($_FILES['logo']['error'] == 0){
$upload = new \Think\Upload(); //实例化上传类
$upload->maxSize = 1024*1024; //1M
$upload->exts = array('jpg', 'gif', 'png', 'jpeg'); //设置附件上传类型
$upload->rootPath = './Public/Uploads/'; //设置附件上传根目录
$upload->savePath = 'Goods/'; //设置附件上传子目录
//上传文件
$info = $upload->upload();
if(!$info){
//获取失败原因把错误信息保存到模型的error属性中,然后在控制器里调用$model—>getError()获取错误信息并由控制器打印
$this->error = $upload->getError();
return FALSE;
}else{
//上传成功,并生成缩略图
//先拼成原图上的路径
$logo = $info['logo']['savepath'] . $info['logo']['savename'];
//拼出缩略图的路径和名称
$mbiglogo = $info['logo']['savepath'] .'mbig_'. $info['logo']['savename'];
$biglogo = $info['logo']['savepath'] .'big_'. $info['logo']['savename'];
$midlogo = $info['logo']['savepath'] .'mid_'. $info['logo']['savename'];
$smlogo = $info['logo']['savepath'] .'sm_'. $info['logo']['savename'];
$image = new \Think\Image();
//打开要生成缩略图的图片
$image->open('./Public/Uploads/'.$logo);
//生成缩略图
$image->thumb(700, 700)->save('./Public/Uploads/'.$mbiglogo);
$image->thumb(350, 350)->save('./Public/Uploads/'.$biglogo);
$image->thumb(130, 130)->save('./Public/Uploads/'.$midlogo);
$image->thumb(50, 50)->save('./Public/Uploads/'.$smlogo);
/**************把路径放到表单中*****************/
$data['logo'] = $logo;
$data['mbig_logo'] = $mbiglogo;
$data['big_logo'] = $biglogo;
$data['mid_logo'] = $midlogo;
$data['sm_logo'] = $smlogo; /*******插入数据前,删除原来的图片*************/
//先查询出原来的图片的路径
$oldLogo = $this->field('logo,mbig_logo,big_logo,mid_logo,sm_logo')->find($id);
//从硬盘上删除图片
unlink('./Public/Uploads/'.$oldLogo['logo']);
unlink('./Public/Uploads/'.$oldLogo['sm_logo']);
unlink('./Public/Uploads/'.$oldLogo['mid_logo']);
unlink('./Public/Uploads/'.$oldLogo['big_logo']);
unlink('./Public/Uploads/'.$oldLogo['mbig_logo']);
}
} //过滤这个字段 【必须对所有输入内容进行过滤】
$data['goods_desc'] = removeXSS($_POST['goods_desc']);
}

_before_update

商品删除

思路:通过id,把数据从数据库中删除,同时删除对应的logo图片

1、在lst.html中添加删除按钮,onclick控制是否确认删除,避免失误操作

2、在商品控制器GoodsController.class.php中添加删除方法

//删除商品表单
public function delete()
{
$model = D('goods');
if(FALSE !== $model->delete(I('get.id')))
$this->success('删除成功!', U('lst'));
else
$this->error('删除失败!原因:'.$model->getError());
}

3、在模型类GoodsModel.class.php中添加一个删除之前的钩子方法,删除五个LOGO图片_before_delete()

//钩子方法_before_delete:删除前的操作
protected function _before_delete($option)
{
$id = $option['where']['id']; //要删除的商品的ID
//先查询出原来的图片的路径
$oldLogo = $this->field('logo,mbig_logo,big_logo,mid_logo,sm_logo')->find($id);
//从硬盘上删除图片
unlink('./Public/Uploads/'.$oldLogo['logo']);
unlink('./Public/Uploads/'.$oldLogo['sm_logo']);
unlink('./Public/Uploads/'.$oldLogo['mid_logo']);
unlink('./Public/Uploads/'.$oldLogo['big_logo']);
unlink('./Public/Uploads/'.$oldLogo['mbig_logo']);
}

PHP.26-TP框架商城应用实例-后台3-商品修改、删除的更多相关文章

  1. PHP.35-TP框架商城应用实例-后台11-商品分类-删除分类(2种方法)、添加、修改

    删除分类 删除一个分类的同时,其所有子分类都删除 在控制器CategoryCtroller.class.php中添加删除函数(delete) 在分类模型中添加钩子函数_before_delete()[ ...

  2. PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图

    添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...

  3. PHP.38-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除、修改

    商品分类删除 1.删除商品时,根据商品id删除扩展分类表数据 商品扩展分类修改 1.在控制器GoodsController.class.php/edit()中根据商品id取出对应的所有扩展分类 2.在 ...

  4. PHP.33-TP框架商城应用实例-后台9-商品相册-修改、删除(AJAX)

    商品相册图片删除 当商品删除时,把相册中的图片一并从硬盘和数据库中删除,根据商品id[因为每一张商品相片都会生成三张缩略图,所以删除时要将其缩略图一并删除] //钩子方法_before_delete: ...

  5. PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证

    权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,= ...

  6. PHP.28-TP框架商城应用实例-后台5-多表操作-商品表与品牌表

    表与表之间的关系:1:1 1:多 多:多 功能需求决定表关系 此处的表关系为:品牌表:商品表=1:多 1.首先在表结构上关联,在多的表(商品表)添加一个字段,关联一的表(品牌表)的ID(主键) 添加字 ...

  7. PHP.27-TP框架商城应用实例-后台4-使用Gii生成品牌表的代码

    Gii安装[GII适用于商城项目] 将Gii文件夹复到application 是,访问http://xx.com/index.php/gii Gii规则[Gii使用规则与建表规则密切相关] 1.建表字 ...

  8. PHP.44-TP框架商城应用实例-后台19-权限管理-RBAC需求分析

    RBAC:Role Based Access Control:基于角色的访问控制 需求分析:[类似效果如下图] 1.权限,角色,管理员 2.权限管理[无限级] 注意:权限会被分配给角色,而不是给管理员 ...

  9. PHP.43-TP框架商城应用实例-后台18-商品属性3-库存量管理

    库存量管理 思想:为商品的每个多选属性设置库存量!!要把多选属性排列组合分别指定库存量!! 效果如下:[由商品已经添加的属性决定] 1.建表goods_number{goods_id,goods_nu ...

随机推荐

  1. HTML5 笔记之 HTML5 的常见用法介绍

    阅读目录 介绍 网页标题.文章标题.文章段落 介绍 字体大小.字体颜色.字体类型.字体位置.背景颜色 介绍 插入图片 介绍 网页内的超链接.网页间的超链接 介绍 有序列表.无序列表 介绍 表格制作 介 ...

  2. tnagios - query handler

    启动日志 [root@bjyh-48-86 nagios]# cat nagios.log [1433471109] Nagios 4.1.0rc1 starting... (PID=5136) [1 ...

  3. PHP:substr和mb_substr的区别

    substr和mb_substr函数都是获取字符串中的某个部分 那么,它们的区别在哪儿呢? 区别: substr :全部是英语.数字就正常:但有一些的字元是占用多个位元的,substr()就得不到你预 ...

  4. May 05th 2017 Week 18th Friday

    No matter what have happened today, the sun will just rise in the morning of tomorrow. 无论今天发生了什么,明天早 ...

  5. java 内存举例

    1. java内存的主要划分 2.  OOTest02.java 的内存划分 public class OOTest02{ public static void main(String[] args) ...

  6. java集合框架——Map

    一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  7. IOS instancetype的使用好处

    instancetype的类型表示上,跟id一样,可以表示任何对象类型 instancetype只能用在返回值类型上,不能像 id 一样用在参数类型上 instancetype 比 id 多一个好处 ...

  8. 前端高质量知识(三)-JS变量对象详解

    在JavaScript中,我们肯定不可避免的需要声明变量和函数,可是JS解析器是如何找到这些变量的呢?我们还得对执行上下文有一个进一步的了解. 在上一篇文章中,我们已经知道,当调用一个函数时(激活), ...

  9. Windows Thin PC(7月2日发布)下载+激活+汉化

    在7月2日Windows 7 瘦身版Windows Thin PC(WinTPC)完成了RTM版的编译开发,WinTPC是一个面向企业用户的产品,主要面向虚   拟桌面基础架构(VDI)消费者,Win ...

  10. jQuery UI datepicker z-index默认为1 怎么处理

    最近在维护一个后台系统的时候遇到这样的一个坑:后台系统中日期控件使用的是jQuery UI datepicker. 这个控件生成的日期选择框的z-index = 1.问题来了.页面上有不少z-inde ...