PHP.32-TP框架商城应用实例-后台8-商品相册-添加

时间:2022-09-04 17:23:41

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

添加相册需求:

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

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

PHP.32-TP框架商城应用实例-后台8-商品相册-添加PHP.32-TP框架商城应用实例-后台8-商品相册-添加
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 '商品相册';
p39_goods_pic

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

PHP.32-TP框架商城应用实例-后台8-商品相册-添加

PHP.32-TP框架商城应用实例-后台8-商品相册-添加PHP.32-TP框架商城应用实例-后台8-商品相册-添加
//添加一张
$("#btn_add_pic").click(function(){
var file = '<li><input type="file" name="pic[]" /></li>';
$(
"#ul_pic_list").append(file);
JS demo

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

思路

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

PHP.32-TP框架商城应用实例-后台8-商品相册-添加PHP.32-TP框架商城应用实例-后台8-商品相册-添加
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;
}
}
}
uploadOne()

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

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

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

PHP.32-TP框架商城应用实例-后台8-商品相册-添加

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

PHP.32-TP框架商城应用实例-后台8-商品相册-添加

再进行图片处理

PHP.32-TP框架商城应用实例-后台8-商品相册-添加

PHP.32-TP框架商城应用实例-后台8-商品相册-添加PHP.32-TP框架商城应用实例-后台8-商品相册-添加
//钩子方法_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'],
));
}
}
}
_after_insert

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

问题:

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

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