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

库存量管理

  思想:为商品的每个多选属性设置库存量!!要把多选属性排列组合分别指定库存量!!

  效果如下:【由商品已经添加的属性决定】

1、建表goods_number{goods_id,goods_number,goods_str_id【商品属性id】}

drop if exists p39_goods_number;
create table p39_goods_number
(
    goods_id mediumint unsigned not null comment ‘商品Id‘,
    goods_number mediumint unsigned not null default ‘0‘ comment ‘库存量‘,
    goods_attr_id varchar(150) not null comment ‘商品属性表ID{如果有多个,就拼接成字符串保存在这个字段中}‘,
    key goods_id(goods_id)
)engine=InnoDB default charset=utf8 comment ‘库存量‘;

库存量表(goods_number)

2、在控制器GoodsController.class.php中取出属性值,输出到表单中

注:A:循环输出商品属性时,将二维数组转成三维

B:库存量添加时,约束:前后台,ID必须升序排列。后台存时转升序,同理前台查询也先排序再查。避免前台调用数据时,属性反转的情况

C:修改时,删除原库存量,重新添加

    //    处理库存量
    public function goods_number()
    {
        //接收商品ID
        $id = I(‘get.id‘);
        $gnModel = M(‘goods_number‘);

        //处理表单
        if(IS_POST)
        {
            // 先删除原库存,再添加,实现修改
            $gnModel->where(array(
                ‘goods_id‘ => array(‘eq‘, $id),
            ))->delete();
            $gaid = I(‘post.goods_attr_id‘);
            $gnum = I(‘post.goods_number‘);
            //统计数量,计算比例
            $cgaid = count($gaid);
            $cgnum = count($gnum);
            $rate = $cgaid/$cgnum;

            //循环库存量
            $_i = 0;
            foreach ($gnum as $k => $v)
            {
                $_goodsAttrId = array();
                //从商品属性ID数组中取出 $rate 个,循环一次取一个
                for($i=0; $i<$rate; $i++)
                {
                    $_goodsAttrId[] = $gaid[$_i];
                    $_i++;
                }
                //升序排列
                sort($_goodsAttrId, SORT_NUMERIC);    //以数字的形式排序
                //把取出来的商品属性ID转化成字符串
                $_goodsAttrId = (string)implode(‘,‘, $_goodsAttrId);
                $gnModel->add(array(
                    ‘goods_id‘ => $id,
                    ‘goods_attr_id‘ => $_goodsAttrId,
                    ‘goods_number‘ => $v,
                ));
            }
        }
        //(库存量修改)先取出这件商品已经设置过的库存量
        $gnData = $gnModel->where(array(
            ‘goods_id‘ => $id,
        ))->select();

        //根据商品ID取出这件商品所有属性的值和根据属性id,取出属性表中的属性名称
        $gaModel = M(‘goods_attr‘);
        $gaData = $gaModel->field(‘a.*, b.attr_name, b.attr_type‘)
        ->alias(‘a‘)
        ->join(‘LEFT JOIN __ATTRIBUTE__ b ON a.attr_id = b.id ‘)
        ->where(array(
            ‘goods_id‘ => array(‘eq‘, $id),
            ‘b.attr_type‘ => array(‘eq‘, ‘可选‘),
        ))->select();

        //处理$gaData数据,将二维转为三维数组:把属性相同的归类
        $_gaData = array();
        foreach ($gaData as $k => $v)
        {
            $_gaData[$v[‘attr_name‘]][] = $v;        //以属性名称作为下标
        }
        //var_dump($_gaData);die;

        $this->assign(array(
            ‘gnData‘ => $gnData,
            ‘gaData‘ => $_gaData,
            ‘_page_title‘ => ‘库存量管理‘,
            ‘_page_btn_name‘ => ‘返回列表‘,
            ‘_page_btn_link‘ => U(‘lst‘),
        ));
        //显示表单
        $this->display();
    }

3、在表单goods_number.html中显示

注:A:JS无效,调试出现如下错误:Uncaught ReferenceError: $ is not defined  (anonymous function)

解决方法:导入jquery类库

B:在表单页面中循环打印已有库存量

<layout name="layout" />

<!-- 库存列表 -->
<div class="list-div" id="listDiv">
<form method="POST" action="__SELF__">
    <table cellpadding="3" cellspacing="1">
        <tr>
            <!-- 循环输出属性 -->
            <?php foreach ($gaData as $k => $v): ?>
                <th><?php echo $k; ?></th>
            <?php endforeach; ?>
            <th width="120">库存量</th>
            <th width="60">操作</th>
        </tr>
        <?php if($gnData): ?>
            <?php foreach ($gnData as $k0 => $v0): ?>
            <tr class="tron">
                <?php
                $gaCount = count($gaData);
                foreach ($gaData as $k => $v): ?>
                    <td>
                        <select name="goods_attr_id[]">
                            <option value="">请选择</option>
                            <?php foreach ($v as $k1 => $v1):
                                    $_attr = explode(‘,‘, $v0[‘goods_attr_id‘]);
                                    if(in_array($v1[‘id‘], $_attr))
                                        $select = ‘selected="selected"‘;
                                    else
                                        $select = ‘‘;
                            ?>
                                <option <?php echo $select; ?> value="<?php echo $v1[‘id‘]; ?>"><?php echo $v1[‘attr_value‘]; ?></option>
                            <?php endforeach; ?>
                        </select>
                    </td>
                <?php endforeach; ?>
                <td><input type="text" name="goods_number[]" value="<?php echo $v0[‘goods_number‘]; ?>" /></td>
                <td><input onclick="addNewTr(this);" type="button" value="<?php echo $k0==0?‘+‘:‘-‘; ?>" /></td>
            </tr>
            <?php endforeach; ?>
        <?php else: ?>
            <tr class="tron">
                <?php
                $gaCount = count($gaData);
                foreach ($gaData as $k => $v): ?>
                    <td>
                        <select name="goods_attr_id[]">
                            <option value="">请选择</option>
                            <?php foreach ($v as $k1 => $v1): ?>
                                <option value="<?php echo $v1[‘id‘]; ?>"><?php echo $v1[‘attr_value‘]; ?></option>
                            <?php endforeach; ?>
                        </select>
                    </td>
                <?php endforeach; ?>
                <td><input type="text" name="goods_number[]" value="" /></td>
                <td><input onclick="addNewTr(this);" type="button" value="+" /></td>
            </tr>
        <?php endif; ?>
        <tr id="submit">
            <td align="center" colspan="<?php echo $gaCount+2; ?>"><input type="submit" value="提交" /></td>
        </tr>
    </table>
</form>
</div>

<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script>
<script type="text/javascript">
    function addNewTr(btn)
    {
        var tr = $(btn).parent().parent();
        if($(btn).val() == "+")
        {
            var newTr = tr.clone();
            newTr.find(":button").val("-");
            $("#submit").before(newTr);
        }
        else
            tr.remove();

    }
</script>
<script src="__PUB__/Admin/Js/tron.js"></script>

 4、在模型类GoodsModel.class.php中处理删除 =》删除商品,库存量一并删除

时间: 2024-10-28 19:43:08

PHP.43-TP框架商城应用实例-后台16-商品属性3-库存量管理的相关文章

PHP.38-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型

思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L--;颜色:白色,黑色--}唯一属性:材质 首先把类型与属性关联起来 1.建表 类型表{p39_type} drop table if exists p39_type; create table p39_type ( id mediumint unsigned not null auto_increment comment 'Id', type

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

 添加商品属性 思路:根据[后台15]类型表{id,type_name}与属性表{id,attr_name,attr_type,attr_option_values,type_id} 1.建表商品属性表p39_goods_attr{id,attr_value,attr_id,goods_id} /********商品属性表[多对多:一个属性可以有多个值,一个商品可以有多个属性,一个属性可以对应多个商品]*******/ drop if exists p39_goods_attr; create

PHP.40-TP框架商城应用实例-后台17-商品属性3-商品分类的修改与删除

商品分类的修改 1.改表单Goods/edit.html,加下拉框 2.因为商品属性修改涉及商品属性表goods_attr{id,attr_value,attr_id,goods_id}与属性表attribute{id,attr_name,attr_option_values,type_id},而且考虑到当一个类型新增一个属性时,修改表也应该将其显示出来,所以应根据属性表连接商品属性表取出相关数据{同一类型所有属性,该商品已存属性值} 连表查询数据输出如下: 3.用PHP在表单edit.html

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

添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace Admin\Controller; use Think\Controller; //后台添加商品功能控制器 class GoodsController extends Controller { //显示和处理表单 public function add() { //判断用户是否提交了表单(如果提交了,就

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

商品表修改功能 1.页面优化,类似添加页面 1 <layout name="layout" /> 2 3 <div class="tab-div"> 4 <div id="tabbar-div"> 5 <p> 6 <span class="tab-front" >通用信息</span> 7 <span class="tab-back&quo

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

权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,=>增加一个父控制器验证Session 让所有后台的控制器[除了Login控制器之外的]都继承自这个控制器 5.在管理员访问后台的任何一个页面之前先到数据库中查看当前管理员所在的角色是否有权限访问这个页面 在权限模型中增加此检查方法,在父类登录控制器中调用 6.后台左侧只显示当前管理员有权限访问的按钮

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

Gii安装[GII适用于商城项目] 将Gii文件夹复到application 是,访问http://xx.com/index.php/gii Gii规则[Gii使用规则与建表规则密切相关] 1.建表字段必须有中文名,则Gii在生成代码时才能识别某字段的中文名是什么: 2.某字段验证规则不能为空:设置该建表字段为not null:一般所有字段都为not null,若不希望生成验证规则,则加上默认值default(默认值可为空): 3.生成上传图片代码:字段名中需包含logo|image|pic|f

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

商品相册图片删除 当商品删除时,把相册中的图片一并从硬盘和数据库中删除,根据商品id[因为每一张商品相片都会生成三张缩略图,所以删除时要将其缩略图一并删除] //钩子方法_before_delete:删除前的操作 protected function _before_delete($option) { $id = $option['where']['id']; //要删除的商品的ID /***********删除商品相片********/ //先查询出原商品相册的路径 $gpModel = M(

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

商品分类删除 1.删除商品时,根据商品id删除扩展分类表数据 商品扩展分类修改 1.在控制器GoodsController.class.php/edit()中根据商品id取出对应的所有扩展分类 2.在修改页面edit.html中显示对应扩展分类foreach,类似添加页面 注:考虑当没有扩展分类时的显示,使用if($gcData) 3.在模型类GoodsModel.class.php/_before_update()中处理扩展分类,先删除原数据,再插入新数据[多对多时,通常的用法] <?php