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

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

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

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

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

function edit()

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

  1. //修改调用create方法允许接收的字段
  2. 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里面

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

function edit()

修改edit.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>ECSHOP 管理中心 - 修改商品 </title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
  6. <link href="__PUB__/Admin/Styles/general.css" rel="stylesheet" type="text/css" />
  7. <link href="__PUB__/Admin/Styles/main.css" rel="stylesheet" type="text/css" />
  8. </head>
  9. <body>
  10. <h1>
  11. <span class="action-span"><a href="__GROUP__/Goods/goodsList">商品列表</a>
  12. </span>
  13. <span class="action-span1"><a href="__GROUP__">ECSHOP 管理中心</a></span>
  14. <span id="search_id" class="action-span1"> - 修改商品 </span>
  15. <div style="clear:both"></div>
  16. </h1>
  17.  
  18. <div class="tab-div">
  19. <div id="tabbar-div">
  20. <p>
  21. <span class="tab-front" id="general-tab">通用信息</span>
  22. </p>
  23. </div>
  24. <div id="tabbody-div">
  25. <form enctype="multipart/form-data" action="__SELF__" method="post" >
  26. <input type="hidden" name="id" value="<?php echo $data['id'];?>" />
  27. <table width="90%" id="general-table" align="center">
  28. <tr>
  29. <td class="label">商品名称:</td>
  30. <td><input type="text" name="goods_name" value="<?php echo $data['goods_name'];?>"size="30" />
  31. <span class="require-field">*</span></td>
  32. </tr>
  33. <tr>
  34. <td class="label">LOGO: </td>
  35. <td>
  36. <img src="/Public/Uploads/<?php echo $data['mid_logo'];?>">
  37. <br />
  38. <input type="file" name="logo" size="30" />
  39. </tr>
  40. <tr>
  41. <td class="label">市场售价:</td>
  42. <td>
  43. <input type="text" name="market_price" value="<?php echo $data['market_price'];?>" size="20" />
  44. <span class="require-field">*</span>
  45. </td>
  46. </tr>
  47. <tr>
  48. <td class="label">本店售价:</td>
  49. <td>
  50. <input type="text" name="shop_price" value="<?php echo $data['id'];?>" size="20"/>
  51. <span class="require-field">*</span>
  52. </td>
  53. </tr>
  54. <tr>
  55. <td class="label">是否上架:</td>
  56. <td>
  57. <input type="radio" name="is_on_sale" value="1" <?php if($data['is_on_sale']=='1') echo 'checked="checked"'; ?> /> 是
  58. <input type="radio" name="is_on_sale" value="0" <?php if($data['is_on_sale']=='0') echo 'checked="checked"'; ?> /> 否
  59. </td>
  60. </tr>
  61. <tr>
  62. <td class="label">商品描述:</td>
  63. <td>
  64. <textarea id="goods_desc" name="goods_desc" /><?php echo $data['goods_desc'];?>"</textarea>
  65. </td>
  66. </tr>
  67. </table>
  68. <div class="button-div">
  69. <input type="submit" value=" 确定 " class="button"/>
  70. <input type="reset" value=" 重置 " class="button" />
  71. </div>
  72. </form>
  73. </div>
  74. </div>
  75.  
  76. <div id="footer">
  77. 共执行 9 个查询,用时 0.025161 秒,Gzip 已禁用,内存占用 3.258 MB<br />
  78. 版权所有 &copy; 2005-2012 上海商派网络科技有限公司,并保留所有权利。</div>
  79. </body>
  80. </html>
  81.  
  82. <!--导入在线编辑器-->
  83. <link href="__PUB__/umeditor1.2.3-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
  84. <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script>
  85. <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/template.min.js"></script>
  86. <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.config.js"></script>
  87. <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.min.js"></script>
  88. <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/lang/zh-cn/zh-cn.js"></script>
  89. <script>
  90. UM.getEditor('goods_desc', {
  91. initialFrameWidth: "100%",
  92. initialFrameHeight: 150
  93. });
  94. </script>

edit.html

 注:1、显示logo图片

  2、radio之类的选择按钮

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

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

  1. //钩子方法_before_update:更新前插入,在添加前会自动调用
  2. protected function _before_update(&$data, $option)
  3. {
  4. $id = $option['where']['id']; //要修改的商品的ID
  5.  
  6. /**************处理LOGO******************/
  7. //判断有没有选择图片
  8. if($_FILES['logo']['error'] == 0){
  9. $upload = new \Think\Upload(); //实例化上传类
  10. $upload->maxSize = 1024*1024; //1M
  11. $upload->exts = array('jpg', 'gif', 'png', 'jpeg'); //设置附件上传类型
  12. $upload->rootPath = './Public/Uploads/'; //设置附件上传根目录
  13. $upload->savePath = 'Goods/'; //设置附件上传子目录
  14. //上传文件
  15. $info = $upload->upload();
  16. if(!$info){
  17. //获取失败原因把错误信息保存到模型的error属性中,然后在控制器里调用$model—>getError()获取错误信息并由控制器打印
  18. $this->error = $upload->getError();
  19. return FALSE;
  20. }else{
  21. //上传成功,并生成缩略图
  22. //先拼成原图上的路径
  23. $logo = $info['logo']['savepath'] . $info['logo']['savename'];
  24. //拼出缩略图的路径和名称
  25. $mbiglogo = $info['logo']['savepath'] .'mbig_'. $info['logo']['savename'];
  26. $biglogo = $info['logo']['savepath'] .'big_'. $info['logo']['savename'];
  27. $midlogo = $info['logo']['savepath'] .'mid_'. $info['logo']['savename'];
  28. $smlogo = $info['logo']['savepath'] .'sm_'. $info['logo']['savename'];
  29. $image = new \Think\Image();
  30. //打开要生成缩略图的图片
  31. $image->open('./Public/Uploads/'.$logo);
  32. //生成缩略图
  33. $image->thumb(700, 700)->save('./Public/Uploads/'.$mbiglogo);
  34. $image->thumb(350, 350)->save('./Public/Uploads/'.$biglogo);
  35. $image->thumb(130, 130)->save('./Public/Uploads/'.$midlogo);
  36. $image->thumb(50, 50)->save('./Public/Uploads/'.$smlogo);
  37. /**************把路径放到表单中*****************/
  38. $data['logo'] = $logo;
  39. $data['mbig_logo'] = $mbiglogo;
  40. $data['big_logo'] = $biglogo;
  41. $data['mid_logo'] = $midlogo;
  42. $data['sm_logo'] = $smlogo;
  43.  
  44. /*******插入数据前,删除原来的图片*************/
  45. //先查询出原来的图片的路径
  46. $oldLogo = $this->field('logo,mbig_logo,big_logo,mid_logo,sm_logo')->find($id);
  47. //从硬盘上删除图片
  48. unlink('./Public/Uploads/'.$oldLogo['logo']);
  49. unlink('./Public/Uploads/'.$oldLogo['sm_logo']);
  50. unlink('./Public/Uploads/'.$oldLogo['mid_logo']);
  51. unlink('./Public/Uploads/'.$oldLogo['big_logo']);
  52. unlink('./Public/Uploads/'.$oldLogo['mbig_logo']);
  53. }
  54. }
  55.  
  56. //过滤这个字段 【必须对所有输入内容进行过滤】
  57. $data['goods_desc'] = removeXSS($_POST['goods_desc']);
  58. }

_before_update

商品删除

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

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

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

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

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

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

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. Debug get/set property

    1. Select "Debug -> Windows -> Breakpoints" from VS menu. 2. Click "New -> B ...

  2. wechat开发笔记之1.线上环境搭建与测试

    Wechat开发笔记 线上环境搭建: 申请一个wechat公众平台. 手机个人微信可以用webwechat来测试. Website:https://web.weixin.qq.com/ 手机客户端扫一 ...

  3. Struts2_Namespace

    namespace 决定了action的访问路径,默认为"",可以接收所有路径的action,当精确的index.action处理不了的时候,就会找到这个action;namesp ...

  4. Java实习问题记录

    1. $(window).height() 获取屏幕高度2. $("#chartbottomdiv").width() 某个控件的属性 用"."3. // 保留 ...

  5. 动态原型模式 js

    动态原型模式 function Person(name,age){ this.name = name; this.age = age; if(typeof this.sayName != " ...

  6. 罗技G502设置

    这个鼠标默认内置了3个档案模式,用G9键来调节. p2 蓝色 1个灯 p2 蓝色 2个灯 p3 蓝色 3个灯 如此循环设置

  7. IOS SVN源代码管理工具使用

    01.    源代码管理工具概述(PPT)===================================================* 源代码管理工具的作用:# 能追踪一个项目从诞生一直到 ...

  8. DFS+BFS(POJ3083)

    题目链接:http://poj.org/problem?id=3083 解题报告:这个题目,搜最短路,没有什么问题.优先走左边,走右边,有很多说法,思路大概都相同,都是记录当前朝向,根据数学公式(i+ ...

  9. BZOJ 2824: [AHOI2012]铁盘整理

    BZOJ 2824: [AHOI2012]铁盘整理 标签(空格分隔): OI-BZOJ OI-搜索 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...

  10. 2018.7.15 解决css中input输入框点击时去掉外边框方法

    .input_css{ background:no-repeat 0 0 scroll #EEEEEE; border:none; outline:medium; }