PHP.30-TP框架商城应用实例-后台8-商品相册-添加
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP.30-TP框架商城应用实例-后台8-商品相册-添加相关的知识,希望对你有一定的参考价值。
商品相册【是商品的其他相片】
添加相册需求:
每张图片生成三张缩略图{50*50、350*350、650*650}
1、建表p39_goods_pic{id,pic,sm_pic,mid_pic,big_pic,goods_id
drop table if exists p39_goods_pic; create table p39_goods_pic( id mediumint unsigned not null auto_increment comment \'Id\', pic varchar(150) not null default \'\' comment \'原图\', sm_pic varchar(150) not null default \'\' comment \'小图\', mid_pic varchar(150) not null default \'\' comment \'中图\', big_pic varchar(150) not null default \'\' comment \'大图\', goods_id mediumint unsigned not null comment \'商品Id\', primary key(id), key goods_id(goods_id) )engine=InnoDB default charset=utf8 comment \'商品相册\';
2、在添加表单的商品相册处制作一个“添加一张”的按钮,通过JS实现点击一次增加一个文本域
//添加一张 $("#btn_add_pic").click(function(){ var file = \'<li><input type="file" name="pic[]" /></li>\'; $("#ul_pic_list").append(file);
3、在商品模型GoodsModel.class.php/_after_inser()中添加处理商品相册的代码
思路:
1.利用已经封装好的函数uploadOne(名称,存放目录,[缩略图尺寸数组]),上传一张图片
function uploadOne($imgName, $dirName, $thumb = array()) { // 上传LOGO if(isset($_FILES[$imgName]) && $_FILES[$imgName][\'error\'] == 0) { $ic = C(\'IMAGE_CONFIG\'); $upload = new \\Think\\Upload(array( \'rootPath\' => $ic[\'rootPath\'], \'maxSize\' => $ic[\'maxSize\'], \'exts\' => $ic[\'exts\'], ));// 实例化上传类 $upload->savePath = $dirName . \'/\'; // 图片二级目录的名称 // 上传文件 // 上传时指定一个要上传的图片的名称,否则会把表单中所有的图片都处理,之后再想其他图片时就再找不到图片了 $info = $upload->upload(array($imgName=>$_FILES[$imgName])); if(!$info) { return array( \'ok\' => 0, \'error\' => $upload->getError(), ); } else { $ret[\'ok\'] = 1; $ret[\'images\'][0] = $logoName = $info[$imgName][\'savepath\'] . $info[$imgName][\'savename\']; // 判断是否生成缩略图[$thumb数组存储尺寸] if($thumb) { $image = new \\Think\\Image(); // 循环生成缩略图 foreach ($thumb as $k => $v) { $ret[\'images\'][$k+1] = $info[$imgName][\'savepath\'] . \'thumb_\'.$k.\'_\' .$info[$imgName][\'savename\']; // 打开要处理的图片 $image->open($ic[\'rootPath\'].$logoName); $image->thumb($v[0], $v[1])->save($ic[\'rootPath\'].$ret[\'images\'][$k+1]); } } return $ret; } } }
2、循环每张图片调用uploadOne一个一个处理,处理完插入到相册表中
先观察文件数据的结构,如下:
两种文件,一是商品logo{logo};而是商品相册pic{pic},一维数组logo;二维数组pic
因为商品图片pic是二维数组,而uploaOne只能处理一维数组,类似logo那样的数组结构,因此要转换为一维数组$pics[]
再进行图片处理
//钩子方法_after_insert:添加操作成功后执行 protected function _after_insert($data, $option) { /**********商品相册处理********/ $pics = array(); //var_dump($_FILES[\'pic\'][\'name\']);die(); //二维数组转成一维 foreach ($_FILES[\'pic\'][\'name\'] as $k => $v) { $pics[] = array( \'name\' => $v, \'type\' => $_FILES[\'pic\'][\'type\'][$k], \'tmp_name\' => $_FILES[\'pic\'][\'tmp_name\'][$k], \'error\' => $_FILES[\'pic\'][\'error\'][$k], \'size\' => $_FILES[\'pic\'][\'size\'][$k], ); } //var_dump($pics);die(); $_FILES = $pics; //把处理好的数组赋给$_FILES,因为uploadOne函数是在$_FILES中获取图片的 $gpModel = M(\'goods_pic\'); //循环每个上传 foreach ($pics as $k => $v) { if($v[\'error\'] == 0) { $ret = uploadOne($k, \'Goods\', array( array(650, 650), array(350, 350), array(50, 50), )); //var_dump($ret);die(); if($ret[\'ok\'] == 1) { $gpModel->add(array( \'pic\' => $ret[\'images\'][0], \'big_pic\' => $ret[\'images\'][1], \'mid_pic\' => $ret[\'images\'][2], \'sm_pic\' => $ret[\'images\'][3], \'goods_id\' => $data[\'id\'], )); } } } /**********会员价格处理********/ $mp = I(\'post.member_price\'); //接收post提交过来的会员价格数据 $mpModel = D(\'member_price\'); foreach ($mp as $k => $v) { $_v = (float)$v; //强制转为浮点型,以免插入字符等错误数据 //设置会员价格>0就插入到表中 if($_v > 0) { $mpModel->add(array( \'price\' => $_v, \'level_id\' => $k, //级别Id \'goods_id\' => $data[\'id\'], )); } } }
注意:批量上传时,uploaOne是处理不了二维数组的,必须转成一维数组,再用foreach循环插入数据库
问题:
1、上传的图片数量在表单看来是没有限制的,倒是在php.ini中限制了post_max_size,所以在商品添加表单还需做点优化,限制用户上传图片的尺寸和数量
2、PHP脚本默认的执行时间是30秒,可能会导致数据处理不完。可根据需求,在表单数据处理前使用set_time_limit()进行设置
以上是关于PHP.30-TP框架商城应用实例-后台8-商品相册-添加的主要内容,如果未能解决你的问题,请参考以下文章
PHP.31-TP框架商城应用实例-后台9-商品相册-修改删除(AJAX)
PHP.36-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除修改
PHP.39-TP框架商城应用实例-后台16-商品属性2-AJAX添加删除