PHP.32-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 '商品相册';
p39_goods_pic

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

//添加一张
        $("#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(名称,存放目录,[缩略图尺寸数组]),上传一张图片

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

因为商品图片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'],
                    ));
                }
            }
        }
_after_insert

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

问题:

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

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

 

 

posted on 2017-06-09 20:42  子轩非鱼  阅读(526)  评论(0编辑  收藏  举报

导航