PHP.43-TP框架商城应用实例-后台18-商品属性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中处理删除 =》删除商品,库存量一并删除

PHP.43-TP框架商城应用实例-后台18-商品属性3-库存量管理的更多相关文章
- PHP.40-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型
思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L……;颜色:白色,黑色……}唯一属性:材质 首 ...
- PHP.41-TP框架商城应用实例-后台16-商品属性2-AJAX添加、删除
添加商品属性 思路:根据[后台15]类型表{id,type_name}与属性表{id,attr_name,attr_type,attr_option_values,type_id} 1.建表商品属性 ...
- PHP.42-TP框架商城应用实例-后台17-商品属性3-商品分类的修改与删除
商品分类的修改 1.改表单Goods/edit.html,加下拉框 2.因为商品属性修改涉及商品属性表goods_attr{id,attr_value,attr_id,goods_id}与属性表att ...
- PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图
添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...
- PHP.31-TP框架商城应用实例-后台7-商品会员修改-页面优化,多表数据更新
商品表修改功能 1.页面优化,类似添加页面 <layout name="layout" /> <div class="tab-div"> ...
- PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证
权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,= ...
- PHP.28-TP框架商城应用实例-后台5-多表操作-商品表与品牌表
表与表之间的关系:1:1 1:多 多:多 功能需求决定表关系 此处的表关系为:品牌表:商品表=1:多 1.首先在表结构上关联,在多的表(商品表)添加一个字段,关联一的表(品牌表)的ID(主键) 添加字 ...
- PHP.27-TP框架商城应用实例-后台4-使用Gii生成品牌表的代码
Gii安装[GII适用于商城项目] 将Gii文件夹复到application 是,访问http://xx.com/index.php/gii Gii规则[Gii使用规则与建表规则密切相关] 1.建表字 ...
- PHP.44-TP框架商城应用实例-后台19-权限管理-RBAC需求分析
RBAC:Role Based Access Control:基于角色的访问控制 需求分析:[类似效果如下图] 1.权限,角色,管理员 2.权限管理[无限级] 注意:权限会被分配给角色,而不是给管理员 ...
随机推荐
- CRM中间件里的CSA队列有什么用
我们有时候会在中间件的事务码SMQ2即Inbound队列查看器里观察到以CSA开头的队列: 这些队列的作用是什么呢?在SAP community上已经有很多朋友提出了相同的问题,也有专家在下列两个连接 ...
- Android(java)学习笔记56:Android InputMethodManager输入法简介
参见博客: http://blog.csdn.net/pi9nc/article/details/9196779
- Android(java)学习笔记45:深入分析Java ClassLoader原理
1. 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块. 当 ...
- cftool拟合&函数逼近
cftool拟合&函数逼近 cftool 真是神奇,之前我们搞的一些线性拟合解方程,多项式拟合,函数拟合求参数啊,等等. 已经超级多了,为啥还得搞一个cftool拟合啊?而且毫无数学理论. 如 ...
- 对selenium自动化框架重构
近期在编写自动化脚本的时候发现以前写的部分不是特别友好,在此进行重构.废话不说 搭建自动化框架,首先先理清思路: 使用的技术python+unittest+selenium+excel 文件目录有: ...
- 2018.11.29 Struts2中拦截器的学习&项目的实际运用
struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...
- 行云管家V4.9正式发布:监控全面提升,首页、主机详情大幅优化,新增大量实用功能.md
让大家久等啦!4.9版本中我们对监控模块进行了重构,在数据准确性与稳定性方面做了大幅提升.我们也对首页及主机详情页面做了大幅重构,以追求为您提供极致的用户体验.同时我们在新版本中增加了如:运维报表.用 ...
- js中json对象取键和值
1.json中输出各个键值: var ohp = {"星期一":18,"星期二":16,"星期三":19,"星期四":1 ...
- 【洛谷P3469】[POI2008]BLO-Blockade
BLO-Blockade 题目链接 若一个点为割点:统计出每个子树的大小,两两相乘再相加, 再加上n-1,为这个点与其他点的拜访数, 因为拜访是互相的,最后再乘二即可 若一个点不是割点:只有(n-1) ...
- 学习MySql和MongoDB笔记
首先了解下关系型数据库和非关系型数据库 关系型数据库 SQL关系型数据库采用了关系模式来组织数据,即关系模式为二维表格模型. 主要的数据库:SQL Server,Oracle,Mysql,Postgr ...