功能一:利用后置勾子,处理好商品主键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. Soup协议-即普通post请求,内容域xml

    1.基础问题 1.1 soup-Simple Object Access Protocal简单对象访问协议 a).承载在http协议之上,http支持传输img/html/文件等,soup请求和响应域 ...

  2. druid监控sql

    我这里是以运维的角度查看sql, 前面的配置需要开发配合,参考:https://blog.csdn.net/u010391342/article/details/80606482 1.首先在注册中心( ...

  3. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  4. 解决Maven依赖下载不全的问题

    背景描述 在日常学习过程中使用Maven构建SpringBoot+SpringCloud服务时,有时会使用非正式版的SpringBoot和SpringCloud(非正式版是指不是最终发布的版本,而是测 ...

  5. pysnmp使用

    install yum install python-pysnmp yum install python-pyasn1 or pip install pysnmp pip install pyasn1 ...

  6. PHP snippets

    Friendly file size string public static function bytesToSize($bytes) { if ($bytes < 1024) { retur ...

  7. Vultr VPS建站攻略 – 一键安装LNMP无面板高性能WEB环境

    在"Vultr VPS建站攻略 - 一键安装宝塔面板架设LNMP/LAMP Web环境"文章中,VULTR中文网分享到我们常用的可视化面板宝塔面板安装在VULTR VPS主机中建站 ...

  8. Hybris Enterprise Commerce Platform 服务层的设计与实现

    Hybris Enterprise Commerce Platform这个系列之前已经由我的同事,SAP成都研究院Hybris开发团队的同事张健(Zhang Jonathan)发布过两篇文章了.这里J ...

  9. Select与SelectMany

    SelectMany在MSDN中的解释:将序列的每个元素投影到 IEnumerable(T) 并将结果序列合并为一个序列. 不用去用foreach进行两次遍历,就可以将子循环需要的元素过滤出来... ...

  10. Spark运行命令示例

    local单机模式:结果xshell可见:./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[1] ...