PHP.31-TP框架商城应用实例-后台7-商品会员修改-页面优化,多表数据更新
商品表修改功能
1、页面优化,类似添加页面
<layout name="layout" /> <div class="tab-div">
<div id="tabbar-div">
<p>
<span class="tab-front" >通用信息</span>
<span class="tab-back" >商品描述</span>
<span class="tab-back" >会员价格</span>
<span class="tab-back" >商品属性</span>
<span class="tab-back" >商品相册</span>
</p>
</div>
<div id="tabbody-div">
<form enctype="multipart/form-data" action="__SELF__" method="post" >
<input type="hidden" name="id" value="<?php echo $data['id'];?>" />
<!--基本信息-->
<table width="90%" class="tab_table" align="center">
<tr>
<td class="label">所在品牌:</td>
<td>
<?php buildSelect('brand', 'brand_id', 'id', 'brand_name', $data['brand_id']); ?>
</td>
</tr>
<tr>
<td class="label">商品名称:</td>
<td><input type="text" name="goods_name" value="<?php echo $data['goods_name'];?>"size="30" />
<span class="require-field">*</span></td>
</tr>
<tr>
<td class="label">市场售价:</td>
<td>
<input type="text" name="market_price" value="<?php echo $data['market_price'];?>" size="20" />
<span class="require-field">*</span>
</td>
</tr>
<tr>
<td class="label">本店售价:</td>
<td>
<input type="text" name="shop_price" value="<?php echo $data['shop_price'];?>" size="20"/>
<span class="require-field">*</span>
</td>
</tr>
<tr>
<td class="label">是否上架:</td>
<td>
<input type="radio" name="is_on_sale" value="1" <?php if($data['is_on_sale']=='1') echo 'checked="checked"'; ?> /> 是
<input type="radio" name="is_on_sale" value="0" <?php if($data['is_on_sale']=='0') echo 'checked="checked"'; ?> /> 否
</td>
</tr>
</table>
<!--商品描述-->
<table style="display:none;" width="100%" class="tab_table" align="center">
<tr>
<td>
<textarea id="goods_desc" name="goods_desc" /><?php echo $data['goods_desc'];?></textarea>
</td>
</tr>
</table>
<!--会员价格-->
<table style="display:none;" width="90%" class="tab_table" align="center">
<tr align="center">
<td>
<?php foreach ($mlData as $k => $v): ?>
<p>
<strong><?php echo $v['level_name']; ?></strong> :
¥<input type="text" name="member_price[<?php echo $v['id'];?>]" value="<?php echo $mpData[$v['id']]['price']; ?>" size="8" />元
<p>
<?php endforeach; ?>
</td>
</tr>
</table>
<!--商品属性-->
<table style="display:none;" width="90%" class="tab_table" align="center"> </table>
<!--商品相册-->
<table style="display:none;" width="90%" class="tab_table" align="center">
<tr>
<td class="label">LOGO: </td>
<td>
<img src="/Public/Uploads/<?php echo $data['mid_logo'];?>">
<br />
<input type="file" name="logo" size="30" />
</tr>
</table>
<div class="button-div">
<input type="submit" value=" 确定 " class="button"/>
<input type="reset" value=" 重置 " class="button" />
</div>
</form>
</div>
</div> <!--导入在线编辑器-->
<link href="__PUB__/umeditor1.2.3-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script>
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/template.min.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.min.js"></script>
<script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/lang/zh-cn/zh-cn.js"></script>
<script>
UM.getEditor('goods_desc', {
initialFrameWidth: "100%",
initialFrameHeight: 150
});
/******切换代码******/
$("#tabbar-div p span").click(function(){
//点击的第几个按钮
var i = $(this).index();
//先隐藏所有的table
$(".tab_table").hide();
//显示第i个table
$(".tab_table").eq(i).show();
//先取消原按钮的选中状态
$(".tab-front").removeClass("tab-front").addClass("tab-back");
//设置当前按钮选中
$(this).removeClass("tab-back").addClass("tab-front");
});
</script>
edit.html
因为一件商品不一定会有会员价格,而价格(会员价格)不能默认为0,所以此时会员价格表没有该商品会员价格的信息
因此显示会员级别时,不能使用商品价格表{price,level_id,goods_id}连表查询得到商品级别表{id,level_name,jifen_bottom,jifen_top}中level_name,要用到member_level表的实例化,否则当商品没有会员价格时,就不会显示会员级别的表单
当修改商品时,想新修改/添加会员价格,要用到member_price表是实例化
所以会员价格表单中要使用两个数据组$mlData(所有会员级别信息)和$mpData(对应商品id的会员价格)
2、在控制器GoodsController.class.php中,实例化会员级别表和会员价格表
注:因为当商品id存在时,会有四个会员价格对应四个会员级别,从数据库中读取的数据是按行读取的,类似如下左图,这样在页面中是难以输出的,因此应该把二维数组转为一维数组,使level_id的值作为数组下标【如右图】
3、提交表单后把会员价格更新到会员价格表
思路:先删除原有的数据,再添加新的会员价格
<?php
namespace Admin\Model;
use Think\Model; class GoodsModel extends Model
{
//添加调用create方法允许接收的字段
protected $insertFields = 'goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id';
//修改调用create方法允许接收的字段
protected $updateFields = 'id,goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id,member_price'; //定义验证规则 validate:TP模型层提供的一种数据验证方法
//a.静态方式:在模型类里面通过$_validate属性定义验证规则。b.动态方式:使用模型类的validate方法动态创建自动验证规则
//定义好验证规则后,就可以在使用create方法创建数据对象的时候自动调用
protected $_validate = array(
array('goods_name', 'require', '商品名称不能为空!', '1'),
array('market_price', 'currency', '市场价格必须是货币!', '1'),
array('shop_price', 'currency', '本店价格必须是货币类型!', '1'),
); //钩子方法_before_insert:添加前插入,在添加前会自动调用
//第一个参数:表单中即将要被插入数据库中的数据=>数组
//&按引用传递:函数外部的变量的值要在函数内部修改的话,必须按引用传递,除非传递的为对象,因为对象默认按引用传递
protected function _before_insert(&$data, $option)
{
$id = $option['where']['id']; //要修改的商品的ID /**************处理LOGO******************/
//判断有没有选择图片
if($_FILES['logo']['error'] == 0)
{
$ret = uploadOne('logo', 'Goods', array(
array(700, 700),
array(350, 350),
array(130, 130),
array(50, 50),
));
$data['logo'] = $ret['images'][0];
$data['mbig_logo'] = $ret['images'][1];
$data['big_logo'] = $ret['images'][2];
$data['mid_logo'] = $ret['images'][3];
$data['sm_logo'] = $ret['images'][4];
}
//获取当前时间并添加到表单中,这样就会插入数据库中
$data['addtime'] = date('Y-m-d H:i:s', time()); //过滤这个字段 【必须对所有输入内容进行过滤】
$data['goods_desc'] = removeXSS($_POST['goods_desc']);
} //钩子方法_before_update:更新前插入,在添加前会自动调用
protected function _before_update(&$data, $option)
{
$id = $option['where']['id']; //要修改的商品的ID
/************处理会员价格****************/
$mp = I('post.member_price');
$mpModel = M('member_price');
//先删除原来的会员价格
$mpModel->where(array(
'goods_id' => array('eq', $id),
))->delete();
foreach ($mp as $k => $v)
{
$_v = (float)$v;
//如果设置了会员价格就插入到表中
if($_v > 0)
{
$mpModel->add(array(
'price' => $_v,
'level_id' => $k,
'goods_id' => $id,
));
}
}
/**************处理LOGO******************/
//判断有没有选择图片
if($_FILES['logo']['error'] == 0)
{
$ret = uploadOne('logo', 'Goods', array(
array(700, 700),
array(350, 350),
array(130, 130),
array(50, 50),
));
$data['logo'] = $ret['images'][0];
$data['mbig_logo'] = $ret['images'][1];
$data['big_logo'] = $ret['images'][2];
$data['mid_logo'] = $ret['images'][3];
$data['sm_logo'] = $ret['images'][4]; //先查询出原来的图片的路径
$oldLogo = $this->field('logo,mbig_logo,big_logo,mid_logo,sm_logo')->find($id);
//从硬盘上删除图片
deleteImage($oldLogo);
}
//过滤这个字段 【必须对所有输入内容进行过滤】
$data['goods_desc'] = removeXSS($_POST['goods_desc']);
}
/* protected function _after_update(&$data, $option)
{
var_dump($data);
var_dump($option);
die();
} */ //钩子方法_before_delete:删除前的操作
protected function _before_delete($option)
{
$id = $option['where']['id']; //要删除的商品的ID
//先查询出原来的图片的路径
$oldLogo = $this->field('logo,mbig_logo,big_logo,mid_logo,sm_logo')->find($id); deleteImage($oldLogo);
/****** 删除会员价格 ********/
//根据商品表id 删除操作
/* $mpModel = D('member_price');
$mpModel->where(array(
'goods_id' => array('eq', $id),
))->delete(); */
} //钩子方法_after_insert:添加操作成功后执行
protected function _after_insert($data, $option)
{
$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'],
));
}
}
} /**
*实现翻页、搜索、排序
*
*/
public function search($perPage = 5) //$perPage控制显示条数
{
/***********搜索(获取get提交的数据)************/
$where =array(); //空的where条件
//商品名称
$gn = I('get.gn');
if($gn)
$where['a.goods_name'] = array('like', "%$gn%"); //WHERE goods_name LIKE '%$gn%'
//品牌
$brandId = I('get.brand_id');
if($brandId)
$where['a.brand_id'] = array('eq', "$brandId"); //WHERE goods_name LIKE '%$gn%'
//市场价格
$fp = I('get.fp');
$tp = I('get.tp');
if($fp && $tp)
$where['a.shop_price'] = array('between', array($fp, $tp)); //WHERE shop_price BETWEEN $fp AND $tp
elseif($fp)
$where['a.shop_price'] = array('egt', $fp); //WHERE shop_price >= $fp
elseif($tp)
$where['a.shop_price'] = array('elt', $tp); //WHERE shop_price <= $tp
//是否上架
$ios = I('get.ios');
if($ios)
$where['a.is_on_sale'] = array('eq', $ios); //WHERE is_on_sale = $ios
//添加时间
$fa = I('get.fa');
$ta = I('get.ta');
if($fa && $ta)
$where['a.addtime'] = array('between', array($fa, $ta)); //WHERE addtime BETWEEN $fa ADD $ta
elseif($fa)
$where['a.addtime'] = array('egt', $fa); //WHERE addtime >= $fa
elseif($ta)
$where['a.addtime'] = array('elt', $ta); //WHERE addtime <= $ta /***********翻页**********/
//取出总的记录数
$count = $this->alias('a')->where($where)->count();
//生成翻页类的对象
$pageObj = new \Think\Page($count, $perPage);
//设置样式
$pageObj->setConfig('next', '下一页');
$pageObj->setConfig('prev', '上一页');
//生成页面下面显示的上一页、下一页的字符串
$pageString = $pageObj->show(); /**********排序********************/
$orderby = 'a.id'; //默认的排序字段
$orderway = 'desc'; //默认的排序方式(降序)
$odby = I('get.odby');
if($odby)
{
if($odby == 'id_asc') //时间升序,id为自增
$orderway = 'asc';
elseif($odby == 'price_desc') //价格降序(默认降序)
$orderby = 'a.shop_price';
elseif($odby == 'price_asc') //价格升序
{
$orderby = 'a.shop_price';
$orderway = 'asc';
}
} /**********取某一页的数据**********/
/***
* SELECT a.*,b.brand_name FROM p39_goods a LEFT JOIN p39_brand b ON a.brand_id=b.id;
**/ $data = $this->order("$orderby $orderway")
->field('a.*, b.brand_name')
->alias('a') //加别名
->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id')
->where($where)
->limit($pageObj->firstRow.','.$pageObj->listRows)
->select(); /************返回数据$data*************/
return array(
'data' => $data, //数据
'page' => $pageString, //翻页字符串
);
} }
?>
GoodsModel.class.php
find()返回一维数组,可直接传入主键查询
PHP.31-TP框架商城应用实例-后台7-商品会员修改-页面优化,多表数据更新的更多相关文章
- PHP.33-TP框架商城应用实例-后台9-商品相册-修改、删除(AJAX)
商品相册图片删除 当商品删除时,把相册中的图片一并从硬盘和数据库中删除,根据商品id[因为每一张商品相片都会生成三张缩略图,所以删除时要将其缩略图一并删除] //钩子方法_before_delete: ...
- PHP.30-TP框架商城应用实例-后台6-商品会员价格删除-外键,级联操作
商品会员价格删除 需求:当删除一件商品时,这件商品对应的会员价格也应该从会员价格表{price,level_id,goods_id}中删除掉. 有两种删除方法 1.在钩子函数_before_delet ...
- PHP.29-TP框架商城应用实例-后台6-商品会员添加-价格、级别
首先把需求分析搞清楚 主要实现两个功能 1.会员管理,设置成为会员的要求 2.添加商品时,可设置会员优惠价格 具体实现 1.建表[会员级别限定表p39_member_level{Id,级别名称,积分下 ...
- PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图
添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...
- PHP.38-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除、修改
商品分类删除 1.删除商品时,根据商品id删除扩展分类表数据 商品扩展分类修改 1.在控制器GoodsController.class.php/edit()中根据商品id取出对应的所有扩展分类 2.在 ...
- 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.权限管理[无限级] 注意:权限会被分配给角色,而不是给管理员 ...
随机推荐
- Java 空对象设计模式(Null Object Pattern) 讲解
转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...
- Azure 3 月新公布
Azure 3 月新发布:Power BI Embedded,R Server 和 IoT 套件预测性维护预配置解决方案正式发布,ExpressRoute 部署变更,以及计量名称变更 Power BI ...
- ui.datepicker的回显问题
应用场景: 页面上有一些现有的输入框,需要调用日期插件,同时还要clone一份,动态添加到页面中,动态生成的输入框在调用datepicker的时候,click事件有效,但是选择的时间无法回显到对应的输 ...
- VR社交软件测试-AltspaceVR
该VR社交软件中的主界面主要分为,Events:事件:Activities:多人游戏:Words:别人创建的虚拟世界.进入游戏后可以进入场景与世界各地的人进行交谈,以虚拟3D人物的方式显示用户,具有较 ...
- IOS 弹框AlterView的使用(IOS8.0以前使用)UIAlertController(IOS9.0使用)
#pragma mark - 代理方法 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath ...
- MySQL锁小结
锁的作用:避免并发请求时对同一个数据对象同时修改,导致数据不一致. 怎么加锁: 1.事务T1在对某个数据对象R1操作之前,先向系统发出请求,对其加锁L1. 2.之后,事务T1对该数据对象R1有了相 ...
- Spring Security 实现手机验证码登录
思路:参考用户名密码登录过滤器链,重写认证和授权 示例如下(该篇示例以精简为主,演示主要实现功能,全面完整版会在以后的博文中发出): 由于涉及内容较多,建议先复制到本地工程中,然后在细细研究. 1. ...
- C# while语句
一.C# while语句 while语句是用于重复执行程序代码的语句. 语法格式如下: while(boolean-expression){ embedded-statement} 当boole ...
- C#中类的声明
一.C#中类的声明 在C#中必须先声明类,然后才能在程序中使用. 类的声明格式如下: [类的属性] [访问修饰符] class 类名称 [: 父类名]{ [成员修饰符] 类的成员变量或者成员函数 ...
- LeetCode426.Convert Binary Search Tree to Sorted Doubly Linked List
题目 Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right point ...