商品相册【是商品的其他相片】

添加相册需求:

每张图片生成三张缩略图{50*50、350*350、650*650}

1、建表p39_goods_pic{id,pic,sm_pic,mid_pic,big_pic,goods_id

  1. drop table if exists p39_goods_pic;
  2. create table p39_goods_pic(
  3. id mediumint unsigned not null auto_increment comment 'Id',
  4. pic varchar(150) not null default '' comment '原图',
  5. sm_pic varchar(150) not null default '' comment '小图',
  6. mid_pic varchar(150) not null default '' comment '中图',
  7. big_pic varchar(150) not null default '' comment '大图',
  8. goods_id mediumint unsigned not null comment '商品Id',
  9. primary key(id),
  10. key goods_id(goods_id)
  11. )engine=InnoDB default charset=utf8 comment '商品相册';

p39_goods_pic

2、在添加表单的商品相册处制作一个“添加一张”的按钮,通过JS实现点击一次增加一个文本域

  1. //添加一张
  2. $("#btn_add_pic").click(function(){
  3. var file = '<li><input type="file" name="pic[]" /></li>';
  4. $("#ul_pic_list").append(file);

JS demo

3、在商品模型GoodsModel.class.php/_after_inser()中添加处理商品相册的代码

思路

1.利用已经封装好的函数uploadOne(名称,存放目录,[缩略图尺寸数组]),上传一张图片

  1. function uploadOne($imgName, $dirName, $thumb = array())
  2. {
  3. // 上传LOGO
  4. if(isset($_FILES[$imgName]) && $_FILES[$imgName]['error'] == 0)
  5. {
  6. $ic = C('IMAGE_CONFIG');
  7. $upload = new \Think\Upload(array(
  8. 'rootPath' => $ic['rootPath'],
  9. 'maxSize' => $ic['maxSize'],
  10. 'exts' => $ic['exts'],
  11. ));// 实例化上传类
  12. $upload->savePath = $dirName . '/'; // 图片二级目录的名称
  13. // 上传文件
  14. // 上传时指定一个要上传的图片的名称,否则会把表单中所有的图片都处理,之后再想其他图片时就再找不到图片了
  15. $info = $upload->upload(array($imgName=>$_FILES[$imgName]));
  16. if(!$info)
  17. {
  18. return array(
  19. 'ok' => 0,
  20. 'error' => $upload->getError(),
  21. );
  22. }
  23. else
  24. {
  25. $ret['ok'] = 1;
  26. $ret['images'][0] = $logoName = $info[$imgName]['savepath'] . $info[$imgName]['savename'];
  27. // 判断是否生成缩略图[$thumb数组存储尺寸]
  28. if($thumb)
  29. {
  30. $image = new \Think\Image();
  31. // 循环生成缩略图
  32. foreach ($thumb as $k => $v)
  33. {
  34. $ret['images'][$k+1] = $info[$imgName]['savepath'] . 'thumb_'.$k.'_' .$info[$imgName]['savename'];
  35. // 打开要处理的图片
  36. $image->open($ic['rootPath'].$logoName);
  37. $image->thumb($v[0], $v[1])->save($ic['rootPath'].$ret['images'][$k+1]);
  38. }
  39. }
  40. return $ret;
  41. }
  42. }
  43. }

uploadOne()

2、循环每张图片调用uploadOne一个一个处理,处理完插入到相册表中

先观察文件数据的结构,如下:

两种文件,一是商品logo{logo};而是商品相册pic{pic},一维数组logo;二维数组pic

因为商品图片pic是二维数组,而uploaOne只能处理一维数组,类似logo那样的数组结构,因此要转换为一维数组$pics[]

再进行图片处理

  1. //钩子方法_after_insert:添加操作成功后执行
  2. protected function _after_insert($data, $option)
  3. {
  4. /**********商品相册处理********/
  5. $pics = array();
  6. //var_dump($_FILES['pic']['name']);die();
  7. //二维数组转成一维
  8. foreach ($_FILES['pic']['name'] as $k => $v)
  9. {
  10. $pics[] = array(
  11. 'name' => $v,
  12. 'type' => $_FILES['pic']['type'][$k],
  13. 'tmp_name' => $_FILES['pic']['tmp_name'][$k],
  14. 'error' => $_FILES['pic']['error'][$k],
  15. 'size' => $_FILES['pic']['size'][$k],
  16. );
  17. }
  18. //var_dump($pics);die();
  19. $_FILES = $pics; //把处理好的数组赋给$_FILES,因为uploadOne函数是在$_FILES中获取图片的
  20. $gpModel = M('goods_pic');
  21. //循环每个上传
  22. foreach ($pics as $k => $v)
  23. {
  24. if($v['error'] == 0)
  25. {
  26. $ret = uploadOne($k, 'Goods', array(
  27. array(650, 650),
  28. array(350, 350),
  29. array(50, 50),
  30. ));
  31. //var_dump($ret);die();
  32. if($ret['ok'] == 1)
  33. {
  34. $gpModel->add(array(
  35. 'pic' => $ret['images'][0],
  36. 'big_pic' => $ret['images'][1],
  37. 'mid_pic' => $ret['images'][2],
  38. 'sm_pic' => $ret['images'][3],
  39. 'goods_id' => $data['id'],
  40. ));
  41. }
  42. }
  43. }
  44. /**********会员价格处理********/
  45. $mp = I('post.member_price'); //接收post提交过来的会员价格数据
  46. $mpModel = D('member_price');
  47. foreach ($mp as $k => $v)
  48. {
  49. $_v = (float)$v; //强制转为浮点型,以免插入字符等错误数据
  50. //设置会员价格>0就插入到表中
  51. if($_v > 0)
  52. {
  53. $mpModel->add(array(
  54. 'price' => $_v,
  55. 'level_id' => $k, //级别Id
  56. 'goods_id' => $data['id'],
  57. ));
  58. }
  59. }
  60. }

_after_insert

注意:批量上传时,uploaOne是处理不了二维数组的,必须转成一维数组,再用foreach循环插入数据库

问题:

1、上传的图片数量在表单看来是没有限制的,倒是在php.ini中限制了post_max_size,所以在商品添加表单还需做点优化,限制用户上传图片的尺寸和数量

2、PHP脚本默认的执行时间是30秒,可能会导致数据处理不完。可根据需求,在表单数据处理前使用set_time_limit()进行设置

PHP.32-TP框架商城应用实例-后台8-商品相册-添加的更多相关文章

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

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

  2. PHP.29-TP框架商城应用实例-后台6-商品会员添加-价格、级别

    首先把需求分析搞清楚 主要实现两个功能 1.会员管理,设置成为会员的要求 2.添加商品时,可设置会员优惠价格 具体实现 1.建表[会员级别限定表p39_member_level{Id,级别名称,积分下 ...

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

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

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

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

  5. PHP.31-TP框架商城应用实例-后台7-商品会员修改-页面优化,多表数据更新

    商品表修改功能 1.页面优化,类似添加页面 <layout name="layout" /> <div class="tab-div"> ...

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

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

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

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

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

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

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

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

随机推荐

  1. ArcGisJS的layers-add-result事件总结

    map.on("layers-add-result", initEditing);当地图控件中的所有图层加载完毕之后触发. 注意图层加载完成后返回的的结果:event. funct ...

  2. 栅格那点儿事(四A)---栅格的显示与渲染

    栅格的显示与渲染 通过前两章的学习,应该对栅格这个东西不那么陌生了.在这一个部分,我们来看看如何展示出栅格数据最美丽的地方,在ArcGIS中栅格的显示与渲染.在进入细节之前,先来看看在ArcGIS中都 ...

  3. css3实现iPhone滑动解锁

    该效果的主要实现思路是给文字添加渐变的背景,然后对背景进行裁剪,按文字裁剪(目前只有webkit内核浏览器支持该属性),最后给背景添加动画,即改变背景的位置,背景动画效果如下(GIF录制时有卡顿,代码 ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  5. Bootstrap开发

    1.BootStrap开发工具 任意前端工具 专门Bootstrap工具:Jetstrap(下载地址:jetstrap.com) 2.官网: www.bootcss.com(“下载Bootstrap” ...

  6. js&jquery:添加事件的三种方法和常用的一些事件

    一.添加事件的方法 1.EventTarget.addEventListener添加 获取事件目标元素,通过addEventListener函数添加 // Assuming myButton is a ...

  7. Windows下安装ElasticSearch及工具

    转载自个人主页 前言 什么是ElasticSearch 官网如是介绍:Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的数据以搜索.分析和探索的能 ...

  8. JavaScript基础:逻辑运算符——&&和||(短路判断)和!

    一.&&:所有条件都为true,返回true:只要有一个是false,返回false:不一定返回boolean类型值 1.可以操作任意类型的数据,不只是布尔型:(除了null.unde ...

  9. Html + JS : 点击对应的按钮,进行选择是隐藏还是显示(用户回复功能)

    例如: 当我点击按钮1时,点击第一下进行显示This is comment 01,点击第二下隐藏This is comment 01 当我点击按钮2时,点击第一下进行显示This is comment ...

  10. 通过CSS3实现:鼠标悬停图片360度旋转效果

    效果很好玩,代码很简单: 效果: 鼠标放置在图片上:360度顺时针旋转 鼠标离开图片:图片260度逆时针旋转 只要将下面代码拷贝过去,并将图片改成你想要的就可以看到效果 <!doctype ht ...