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 \'商品相册\';
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()进行设置

 

 

以上是关于PHP.30-TP框架商城应用实例-后台8-商品相册-添加的主要内容,如果未能解决你的问题,请参考以下文章

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

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

PHP.39-TP框架商城应用实例-后台16-商品属性2-AJAX添加删除

PHP.26-TP框架商城应用实例-后台2-商品列表页-搜索翻页排序

PHP.27-TP框架商城应用实例-后台3-商品修改删除

PHP.32-TP框架商城应用实例-后台10-商品分类-需求分析创建无限级商品分类,递归