功能一:利用后置勾子,处理好商品主键id,会员的价格,再插入member_price表里.

要实现的功能:

html的表单里提交过数据到控制器,控制器调用model里的save()方并过滤掉不需要的数据后保存到goods表,

保存后会自动调用模型里的后置勾子afterInsert(),后置勾子的回调$goods里得到goods表里新插入的主键后组装好数据,

再插入到number_price表里

思路:

  1. 控制器里的用调用模型用save()方法保存,在模型里的用protected $field=true; //当插入到当然模型对应表里不存在的字段时,就会被忽略掉
  2. 数据插入到goods表后就会自动执行模型里的afterInsert()方法
  3. afterInsert()方法里回调的$goods里就会获取到插入goods表里的数据,并获取到插入后的主键id
  4. 在html表格里用name="mp[{$ml.id}]"带主键的方式提交,这样数据的字段名和字段值就能对应上了
  5. 新插入goods表里的商品主键id有了,三种会员的价格也有了,现在可以在afterInsert()里循环把这三种价格数据分别插入到tp_member_price表里了

html里

<!-- 会员价格  -->
<div id="mbprice" class="tab-pane">
{volist name="mlRes" id="ml"}
<div class="form-group">
<label for="username" class="col-sm-2 control-label no-padding-right">{$ml.level_name}</label>
<div class="col-sm-6">
<input class="form-control" placeholder="" name="mp[{$ml.id}]" type="text">
</div>
<p class="help-block col-sm-4 red">单位:元 精确到小数点后2位</p>
</div>
{/volist}
</div>
<!-- 给主图上批量生成三张缩略图 -->
<div id="goodsphoto" class="tab-pane">
<div class="form-group">
<label for="username" class="col-sm-2 control-label no-padding-right"></label>
<div class="col-sm-6">
<a href="#" onclick="addrow(this);">[+]</a><input class="form-control" style="border:none; box-shadow:none; width:50%; display:inline-block;" name="goods_photo[]" type="file">
</div>
</div>
<div id="goods_photo"></div>
</div>

控制器里

 public function add()
{
if(request()->isPost()){
//接收所有的表单所有的post数据
$data=input('post.');
// dump($data); die; //验证post数据
// dump($_FILES);die;
$validate = validate('goods');
if(!$validate->check($data)){
$this->error($validate->getError());
} //调用模型添加数据,添加之前会运行 Goods::beforeInsert方法
//调用模型添加数据,添加之后会运行 Goods::afterInsert方法
$add=model('goods')->save($data);
if($add){
$this->success('添加商品成功!','lst');
}else{
$this->error('添加商品失败!');
}
return;
}
}

模型里的后置勾子afterInsert()

protected static function init()
{
//$goods获取到的是插入goods表里的数据,并获取到插入后的主键id
Goods::afterInsert(function($goods){
//接受表单数据
$goodsData=input('post.'); // 批量写入会员价格
$mpriceArr=$goods->mp;
$goodsId=$goods->id;
if($mpriceArr){
foreach ($mpriceArr as $k => $v) {
if(trim($v) == ''){
continue;
}else{
db('member_price')->insert(['mlevel_id'=>$k,'mprice'=>$v,'goods_id'=>$goodsId]);
}
}
} // 商品相册处理 给主图上批量生成三张缩略图
if($goods->_hasImgs($_FILES['goods_photo']['tmp_name'])){
$files = request()->file('goods_photo');
foreach($files as $file){
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS .'static'. DS .'uploads');
if($info){
// 输出 42a79759f284b767dfcb2a0197904287.jpg
$photoName=$info->getFilename();
$ogphoto=date("Ymd"). DS . $photoName;
$bigphoto=date("Ymd"). DS . 'big_'.$photoName;
$midphoto=date("Ymd"). DS . 'mid_'.$photoName;
$smphoto=date("Ymd"). DS . 'sm_'.$photoName;
$image = \think\Image::open(IMG_UPLOADS.$ogphoto);
$image->thumb(500, 500)->save(IMG_UPLOADS.$bigphoto);
$image->thumb(200, 200)->save(IMG_UPLOADS.$midphoto);
$image->thumb(80, 80)->save(IMG_UPLOADS.$smphoto);
db('goods_photo')->insert(['goods_id'=>$goodsId,'og_photo'=>$ogphoto,'big_photo'=>$bigphoto,'mid_photo'=>$midphoto,'sm_photo'=>$smphoto]);
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
}
}


功能二:利用后置勾子,上传图片,批量生成缩略图,再插入goods_photo表里.

要实现的功能:

利用后置勾子,批量上传,处理上传图片生成缩略图相册插入到goods里

判断$_FILES['goods_photo']['tmp_name']是否为空来判断是否有图片上传

控制器里的用调用模型用save()方法保存

  1. 控制器里的用调用模型用save()方法保存,在模型里的用protected $field=true; //当插入到当然模型对应表里不存在的字段时,就会被忽略掉
  2. 数据插入到goods表后就会自动执行模型里的afterInsert()方法
  3. afterInsert()方法里回调的$goods里就会获取到插入goods表里的数据,并获取到插入后的主键id
  4. 在后置勾子里处理好缩略图,组装好数据再依次插入goods_photo表里

模型里的后置勾子afterInsert()

protected static function init()
{
Goods::afterInsert(function($goods){
// 商品相册处理
if($goods->_hasImgs($_FILES['goods_photo']['tmp_name'])){
$files = request()->file('goods_photo');
foreach($files as $file){
// 移动到框架应用根目录/public/uploads/ 目录下
$info = $file->move(ROOT_PATH . 'public' . DS .'static'. DS .'uploads');
if($info){
// 输出 42a79759f284b767dfcb2a0197904287.jpg
$photoName=$info->getFilename();
$ogphoto=date("Ymd"). DS . $photoName;
$bigphoto=date("Ymd"). DS . 'big_'.$photoName;
$midphoto=date("Ymd"). DS . 'mid_'.$photoName;
$smphoto=date("Ymd"). DS . 'sm_'.$photoName;
$image = \think\Image::open(IMG_UPLOADS.$ogphoto);
$image->thumb(500, 500)->save(IMG_UPLOADS.$bigphoto);
$image->thumb(200, 200)->save(IMG_UPLOADS.$midphoto);
$image->thumb(80, 80)->save(IMG_UPLOADS.$smphoto);
db('goods_photo')->insert(['goods_id'=>$goodsId,'og_photo'=>$ogphoto,'big_photo'=>$bigphoto,'mid_photo'=>$midphoto,'sm_photo'=>$smphoto]);
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
}
}

功能三:批量处理商品属性和对应的价格用后置勾子插入到goods_attr表里

上实现的功能

  1. 控制器里的用调用模型用save()方法保存,在模型里的用protected $field=true; //当插入到当然模型对应表里不存在的字段时,就会被忽略掉
  2. 数据插入到goods表后就会自动执行模型里的afterInsert()方法
  3. afterInsert()方法里回调的$goods里就会获取到插入goods表里的数据,并获取到插入后的主键id
  4. 在后置勾子里处理好商品属性和对应的价格,组装好数据再依次插入goods_attr表里

从attr表里拿到的数据展示到html模板里

html里提交数据时

<select name='goods_attr["+v.id+"][]'>

<select name="goods_attr[1][]"><option value="">请选择</option>
<option value="黑色">黑色</option>
<option value="银色">银色</option>
<option value="白色">白色</option>
</select>

提交后打印的效果:



模型里的后置勾子afterInsert()

protected static function init()
{
Goods::afterInsert(function($goods){
//接受表单数据
$goodsData=input('post.'); // 处理商品属性
$i=0; //用来保证属性和价格的对应顺序保持一致的,属性每次处理后$i+,拿$i去价格数据里取值
if(isset($goodsData['goods_attr'])){
foreach ($goodsData['goods_attr'] as $k => $v) {
if(is_array($v)){
if(!empty($v)){
foreach ($v as $k1 => $v1) {
if(!$v1){
$i++;
continue;
}
db('goods_attr')->insert(['attr_id'=>$k,'attr_value'=>$v1,'attr_price'=>$goodsData['attr_price'][$i],'goods_id'=>$goodsId]);
$i++;
}
}
}else{
// 处理唯一属性类型 唯一属性没有价格
db('goods_attr')->insert(['attr_id'=>$k,'attr_value'=>$v,'goods_id'=>$goodsId]);
}
}
}
}
}

用后置勾子插入到goods_attr表里:

第39-43课 thinkphp5完成商品会员价格功能(后置勾子afterInsert)的更多相关文章

  1. 第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)

    目录 手册地址: before_insert(新增之前的操作) 要实现的功能 思路 触发条件: 1. 控制器里必须要调用模型的save()方式保存数据,用insert()触发不了勾子函数的 2. 模型 ...

  2. 第48课 thinkphp5添加商品库

    目录 思路: 1. html页面里属性下拉框里的值是从goods_attr联attr里的查出来传到模板里的.在属性的下拉栏里展示出来 2. html页面里用二维数组的结构goods_attr[{$k} ...

  3. PHP.30-TP框架商城应用实例-后台6-商品会员价格删除-外键,级联操作

    商品会员价格删除 需求:当删除一件商品时,这件商品对应的会员价格也应该从会员价格表{price,level_id,goods_id}中删除掉. 有两种删除方法 1.在钩子函数_before_delet ...

  4. 利用nodejs+phantomjs+casperjs采集淘宝商品的价格

    因为一些业务需求需要采集淘宝店铺商品的销售价格,但是淘宝详情页面的价格显示是通过js动态调用显示的.所以就没法通过普通的获取页面html然后通过正则或者xpath的方式获取到想到的信息了. 所幸我们现 ...

  5. 求解:php商品条件筛选功能你是怎么做出来的?

    求解:php商品条件筛选功能你是怎么做出来的? 2013-09-25 13:43 chenhang607 | 浏览 2756 次 资源共享 求思路或者方法,最好能有些代码 2013-09-25 14: ...

  6. php商品条件筛选功能你是怎么做出来的?

    php商品条件筛选功能你是怎么做出来的? php按条件筛选商品的功能,还是比较简单的.其实就是根据不同的条件组成SQL查询条件,从数据库里查出不同的商品出来.举个例子:用户可以按价格范围.按品牌.按商 ...

  7. MVC会员注销功能Cookie的应用

    我们实现了<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html 有登录就会有注销功能.此次Insus.NET练习一个MV ...

  8. 写个简单的chrome插件-京东商品历史价格查询

    说chrome插件编写的先关文章, 首推小茗的[干货]Chrome插件(扩展)开发全攻略. 有非常完善的理论,引用和demo代码. 但是还是建议看官方的 chrome extensions. chro ...

  9. thinkphp5使用前置后置操作

    下面举个例子,前置删除的例子   模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的   控制器中实例化类   $cate=model('cate'); $cate-> ...

随机推荐

  1. (四)Redis主从复制(单机版,不集群)

    持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可 ...

  2. 安装flask-mysqldb的时候,提示 mysql_config not found 的解决方法

    解决办法: sudo apt-get install libmysqlclient-dev sudo updatedb locate mysql_config 然后进入mysql_config的路径( ...

  3. java8Stream map和flatmap的区别

    map和flatmap的区别 map只是一维 1对1 的映射 而flatmap可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层 , 所以名称上就把map加了个flat 叫flat ...

  4. 从零开始的全栈工程师——js篇2.8

    DOM(document object model) DOM主要研究htmll中的节点(也就是标签) 对节点进行操作    可以改变标签  改变标签属性  改变css样式  添加事件 一.操作流程 1 ...

  5. 比例缩放 on() prop() 正则表达式

    $('#banner-section').css('height',$(window).width() / 1900 * 490 ); $(window).resize(function(){    ...

  6. Catch the moments of your life. Catch them while you're young and quick.

    Catch the moments of your life. Catch them while you're young and quick.趁你还年轻利落,把握住生活中的美好瞬间吧!

  7. H5如何做手机app(移动Web App)?图片轮播?ionic、MUI

    移动Web App 跨平台开发 用户不需要去卖场来下载安装App 任何时候都可以发布App只需要一个开发项目 可以使用HTML5,CSS3以及JavaScript以及服务器端语言来完成(PHP,Rub ...

  8. ASP.NET MVC中使用窗体验证出现上下文的模型在数据库创建后发生更改,导致调试失败(一)

    在ASP.NET MVC中使用窗体验证.(首先要明白,验证逻辑是应该加在Model.View和Controller哪一个里面?由于Model的责任就是负责信息访问与商业逻辑验证的,所以我们把验证逻辑加 ...

  9. CheckPoint_vSEC_Cluster_R77.30

    CheckPoint_vSEC_Cluster_R77.30 平台: arm 类型: ARM 模板 软件包: Check Point vSEC Gateway R77.30-041.161 Anti- ...

  10. linux 命令——56 netstat(转)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...