From 86c5e6dcebe8b06d9a47934ed0715c6a9e31cce1 Mon Sep 17 00:00:00 2001 From: devil_gong Date: Thu, 25 Jul 2019 17:11:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/index/controller/Goods.php | 9 +++ .../index/view/default/goods/index.html | 31 +++++++-- application/service/BuyService.php | 36 +++++------ application/service/GoodsService.php | 63 +++++++++++++++---- application/tags.php | 8 +++ public/static/index/default/css/goods.css | 15 +++-- public/static/index/default/js/goods.js | 60 ++++++++++++++---- 7 files changed, 168 insertions(+), 54 deletions(-) diff --git a/application/index/controller/Goods.php b/application/index/controller/Goods.php index ef01f5221..f44cc49bb 100755 --- a/application/index/controller/Goods.php +++ b/application/index/controller/Goods.php @@ -225,6 +225,15 @@ class Goods extends Common 'goods_id' => $goods_id, 'goods' => &$goods, ])); + + // 商品页面基础信息面板售价顶部钩子 + $this->assign('plugins_view_goods_detail_panel_price_top_data', Hook::listen('plugins_view_goods_detail_panel_price_top', + [ + 'hook_name' => 'plugins_view_goods_detail_panel_price_top', + 'is_backend' => false, + 'goods_id' => $goods_id, + 'goods' => &$goods, + ])); } /** diff --git a/application/index/view/default/goods/index.html b/application/index/view/default/goods/index.html index 9a820244c..5465c4f28 100755 --- a/application/index/view/default/goods/index.html +++ b/application/index/view/default/goods/index.html @@ -173,20 +173,39 @@
{{if isset($goods['original_price']) and $goods['original_price'] gt 0 and !empty($goods['show_field_original_price_text'])}} -
+ +
{{$goods.show_field_original_price_text|raw}}
- ¥ {{$goods.original_price}} + ¥{{$goods.original_price}}
{{/if}} + + + {{if isset($shopxo_is_develop) and $shopxo_is_develop eq true and (!isset($is_footer) or $is_footer eq 1)}} +
+ plugins_view_goods_detail_panel_price_top +
+ {{/if}} + {{if !empty($plugins_view_goods_detail_panel_price_top_data) and is_array($plugins_view_goods_detail_panel_price_top_data)}} + {{foreach $plugins_view_goods_detail_panel_price_top_data as $hook}} + {{if is_string($hook) or is_int($hook)}} + {{$hook|raw}} + {{/if}} + {{/foreach}} + {{/if}} + +
{{if empty($goods['show_field_price_text'])}}销售价{{else /}}{{$goods.show_field_price_text|raw}}{{/if}}
- ¥ - {{$goods.price}} + + {{$goods.price}}
+ +
@@ -281,7 +300,7 @@
- ¥{{$goods.price}} + ¥{{$goods.price}}
@@ -516,7 +535,7 @@

{{$v.title}}

- ¥{{$v.price}} + ¥{{$v.price}}

diff --git a/application/service/BuyService.php b/application/service/BuyService.php index dfef8577a..aa75221c1 100755 --- a/application/service/BuyService.php +++ b/application/service/BuyService.php @@ -97,8 +97,8 @@ class BuyService 'goods_id' => $goods_id, 'title' => $goods['title'], 'images' => $goods['images'], - 'original_price'=> $goods_base['data']['original_price'], - 'price' => $goods_base['data']['price'], + 'original_price'=> $goods_base['data']['spec_base']['original_price'], + 'price' => $goods_base['data']['spec_base']['price'], 'stock' => intval($params['stock']), 'spec' => empty($spec) ? '' : json_encode($spec), ]; @@ -197,12 +197,12 @@ class BuyService $goods_base = GoodsService::GoodsSpecDetail(['id'=>$v['goods_id'], 'spec'=>$v['spec']]); if($goods_base['code'] == 0) { - $v['inventory'] = $goods_base['data']['inventory']; - $v['price'] = (float) $goods_base['data']['price']; - $v['original_price'] = (float) $goods_base['data']['original_price']; - $v['spec_weight'] = $goods_base['data']['weight']; - $v['spec_coding'] = $goods_base['data']['coding']; - $v['spec_barcode'] = $goods_base['data']['barcode']; + $v['inventory'] = $goods_base['data']['spec_base']['inventory']; + $v['price'] = (float) $goods_base['data']['spec_base']['price']; + $v['original_price'] = (float) $goods_base['data']['spec_base']['original_price']; + $v['spec_weight'] = $goods_base['data']['spec_base']['weight']; + $v['spec_coding'] = $goods_base['data']['spec_base']['coding']; + $v['spec_barcode'] = $goods_base['data']['spec_base']['barcode']; } else { return $goods_base; } @@ -406,12 +406,12 @@ class BuyService $goods_base = GoodsService::GoodsSpecDetail(['id'=>$ret['data'][0]['goods_id'], 'spec'=>$ret['data'][0]['spec']]); if($goods_base['code'] == 0) { - $ret['data'][0]['inventory'] = $goods_base['data']['inventory']; - $ret['data'][0]['price'] = (float) $goods_base['data']['price']; - $ret['data'][0]['original_price'] = (float) $goods_base['data']['original_price']; - $ret['data'][0]['spec_weight'] = $goods_base['data']['weight']; - $ret['data'][0]['spec_coding'] = $goods_base['data']['coding']; - $ret['data'][0]['spec_barcode'] = $goods_base['data']['barcode']; + $ret['data'][0]['inventory'] = $goods_base['data']['spec_base']['inventory']; + $ret['data'][0]['price'] = (float) $goods_base['data']['spec_base']['price']; + $ret['data'][0]['original_price'] = (float) $goods_base['data']['spec_base']['original_price']; + $ret['data'][0]['spec_weight'] = $goods_base['data']['spec_base']['weight']; + $ret['data'][0]['spec_coding'] = $goods_base['data']['spec_base']['coding']; + $ret['data'][0]['spec_barcode'] = $goods_base['data']['spec_base']['barcode']; } else { return $goods_base; } @@ -630,8 +630,8 @@ class BuyService $goods_base = GoodsService::GoodsSpecDetail(['id'=>$v['goods_id'], 'spec'=>isset($v['spec']) ? $v['spec'] : []]); if($goods_base['code'] == 0) { - $goods['price'] = $goods_base['data']['price']; - $goods['inventory'] = $goods_base['data']['inventory']; + $goods['price'] = $goods_base['data']['spec_base']['price']; + $goods['inventory'] = $goods_base['data']['spec_base']['inventory']; } else { return $goods_base; } @@ -983,7 +983,7 @@ class BuyService if($base['code'] == 0) { // 扣除规格操作 - if(!Db::name('GoodsSpecBase')->where(['id'=>$base['data']['id'], 'goods_id'=>$v['goods_id']])->setDec('inventory', $v['buy_number'])) + if(!Db::name('GoodsSpecBase')->where(['id'=>$base['data']['spec_base']['id'], 'goods_id'=>$v['goods_id']])->setDec('inventory', $v['buy_number'])) { return DataReturn('规格库存扣减失败['.$params['order_id'].'-'.$v['goods_id'].'('.$goods['inventory'].'-'.$v['buy_number'].')]', -10); } @@ -1089,7 +1089,7 @@ class BuyService if($base['code'] == 0) { // 回滚规格操作 - if(!Db::name('GoodsSpecBase')->where(['id'=>$base['data']['id'], 'goods_id'=>$v['goods_id']])->setInc('inventory', $buy_number)) + if(!Db::name('GoodsSpecBase')->where(['id'=>$base['data']['spec_base']['id'], 'goods_id'=>$v['goods_id']])->setInc('inventory', $buy_number)) { return DataReturn('规格库存回滚失败['.$params['order_id'].'-'.$v['goods_id'].']', -10); } diff --git a/application/service/GoodsService.php b/application/service/GoodsService.php index e2b284188..8c26f2136 100755 --- a/application/service/GoodsService.php +++ b/application/service/GoodsService.php @@ -294,6 +294,16 @@ class GoodsService return $ret; } + // 商品价格容器 + $v['price_container'] = [ + 'price' => isset($v['price']) ? $v['price'] : 0.00, + 'min_price' => isset($v['min_price']) ? $v['min_price'] : 0.00, + 'max_price' => isset($v['max_price']) ? $v['max_price'] : 0.00, + 'original_price' => isset($v['original_price']) ? $v['original_price'] : 0.00, + 'min_original_price' => isset($v['min_original_price']) ? $v['min_original_price'] : 0.00, + 'max_original_price' => isset($v['max_original_price']) ? $v['max_original_price'] : 0.00, + ]; + // 商品url地址 if(!empty($v['id'])) { @@ -1916,13 +1926,21 @@ class GoodsService // 单位 .00 处理 $base['weight'] = PriceBeautify($base['weight']); - // 商品处理前钩子 + // 处理好的数据 + // 扩展元素标记与html内容数据 + // extends_element下包含多个元素 ['element'=>'', 'content'=>''] + $data = [ + 'spec_base' => $base, + 'extends_element' => [], + ]; + + // 商品获取规格钩子 $hook_name = 'plugins_service_goods_spec_base'; $ret = Hook::listen($hook_name, [ 'hook_name' => $hook_name, 'is_backend' => true, - 'params' => &$params, - 'spec_base' => &$base, + 'params' => $params, + 'data' => &$data, 'goods_id' => $goods_id ]); if(isset($ret['code']) && $ret['code'] != 0) @@ -1931,7 +1949,7 @@ class GoodsService } // 返回成功 - return DataReturn('操作成功', 0, $base); + return DataReturn('操作成功', 0, $data); } return DataReturn('没有相关规格', -100); @@ -1972,9 +1990,9 @@ class GoodsService $where = [ 'goods_id' => intval($params['id']), ]; - $value = []; // 规格不为数组则为json字符串 + $value = []; if(!is_array($params['spec'])) { $params['spec'] = json_decode(htmlspecialchars_decode($params['spec']), true); @@ -1994,18 +2012,18 @@ class GoodsService if(!empty($temp_data)) { // 根据基础值id分组 - $data = []; + $group = []; foreach($temp_data as $v) { - $data[$v['goods_spec_base_id']][] = $v; + $group[$v['goods_spec_base_id']][] = $v; } // 获取当前操作元素索引 $last = end($params['spec']); $index = count($params['spec'])-1; $spec_str = implode('', array_column($params['spec'], 'value')); - $value = []; - foreach($data as $v) + $spec_type = []; + foreach($group as $v) { $temp_str = implode('', array_column($v, 'value')); if(isset($v[$index+1]) && stripos($temp_str, $spec_str) !== false) @@ -2014,11 +2032,34 @@ class GoodsService $inventory = Db::name('GoodsSpecBase')->where(['id'=>$v[$index+1]['goods_spec_base_id']])->value('inventory'); if($inventory > 0) { - $value[$v[$index+1]['value']] = $v[$index+1]['value']; + $spec_type[$v[$index+1]['value']] = $v[$index+1]['value']; } } } - return DataReturn('操作成功', 0, array_values($value)); + + // 处理好的数据 + // 扩展元素标记与html内容数据 + // extends_element下包含多个元素 ['element'=>'', 'content'=>''] + $data = [ + 'spec_type' => array_values($spec_type), + 'extends_element' => [], + ]; + + // 商品获取规格类型钩子 + $hook_name = 'plugins_service_goods_spec_type'; + $ret = Hook::listen($hook_name, [ + 'hook_name' => $hook_name, + 'is_backend' => true, + 'params' => $params, + 'data' => &$data, + 'goods_id' => $goods_id + ]); + if(isset($ret['code']) && $ret['code'] != 0) + { + return $ret; + } + + return DataReturn('操作成功', 0, $data); } } return DataReturn('没有相关规格类型', -100); diff --git a/application/tags.php b/application/tags.php index 0784aa077..5ef4fba40 100755 --- a/application/tags.php +++ b/application/tags.php @@ -68,5 +68,13 @@ return array ( array ( 0 => 'app\\plugins\\membershiplevel\\Hook', ), + 'plugins_view_goods_detail_panel_price_top' => + array ( + 0 => 'app\\plugins\\membershiplevel\\Hook', + ), + 'plugins_service_goods_spec_type' => + array ( + 0 => 'app\\plugins\\membershiplevel\\Hook', + ), ); ?> \ No newline at end of file diff --git a/public/static/index/default/css/goods.css b/public/static/index/default/css/goods.css index 3fd75be1f..b40aa896a 100755 --- a/public/static/index/default/css/goods.css +++ b/public/static/index/default/css/goods.css @@ -181,18 +181,17 @@ fieldset legend{margin-left:15px;padding-left:3px;padding-right:3px;color:#333;} /*价格*/ .tb-detail-price{text-align: left; position: relative;} .tb-detail-price .price em {font-family: arial;} -.iteminfo_price .sys_item_mktprice{text-decoration:line-through;padding-top:7px ;padding-bottom: 0px; font-size:14px; } +.tb-detail-price .original-price-value {text-decoration:line-through; font-size:14px; } .iteminfo_mktprice {padding-top: 10px;} -.iteminfo_mktprice em, .sys_item_price { color:#c00;} -.sys_item_price { font-size:20px;} - .tb-detail-price dd {display: inline-block;} - .goods-favor-count { color: #999; } +.iteminfo_mktprice em, .goods-price { color:#c00;} +.tb-detail-price dd {display: inline-block;} +.goods-favor-count { color: #999; } .iteminfo_parameter a:hover{text-decoration: none;color:initial ;} .tm-indcon .tm-label, .tb-detail-price dt, .specpara-title { white-space:nowrap; color:#666; font-weight: 400; } -.tb-detail-price{ background: #fcf1e3 url(../images/goods-meta-bg.png); background-size: cover; -moz-background-size: cover; background-repeat: no-repeat; height:75px;padding:10px; } -.tb-detail-price .items {display: block;margin-left:0 !important;} +.tb-detail-price{ background: #fcf1e3 url(../images/goods-meta-bg.png); background-size: cover; -moz-background-size: cover; background-repeat: no-repeat; height:auto;padding:10px; } +.tb-detail-price .items {display: block; margin: 5px 0;} .tb-detail-price .items dt { float:left; text-align: left;} -.sys_item_price{font-size: 24px;font-weight: bold; line-height: 16px;} +.tb-detail-price .goods-price {font-size: 24px;font-weight: bold; line-height: 16px;} /* 二维码 */ .goods-qrcode{position: absolute; bottom: 5px; right: 10px; cursor: pointer; color: #666; width: 150px; text-align: right;} diff --git a/public/static/index/default/js/goods.js b/public/static/index/default/js/goods.js index e1b014905..ed39cd688 100755 --- a/public/static/index/default/js/goods.js +++ b/public/static/index/default/js/goods.js @@ -255,16 +255,29 @@ function GoodsSpecDetail() $.AMUI.progress.done(); if(result.code == 0) { - $('.text-info .price-now').text('¥'+result.data.price); - $('.sys_item_price').text(result.data.price); - $('.number-tag input[type="number"]').attr('max', result.data.inventory); - $('.stock-tips .stock').text(result.data.inventory); - if(result.data.original_price > 0) + $('.text-info .price-now').text('¥'+result.data.spec_base.price); + $('.goods-price').text(result.data.spec_base.price); + $('.number-tag input[type="number"]').attr('max', result.data.spec_base.inventory); + $('.stock-tips .stock').text(result.data.spec_base.inventory); + if(result.data.spec_base.original_price > 0) { - $('.sys_item_mktprice').text('¥'+result.data.original_price); - $('.sys_item_mktprice').show(); + $('.goods-original-price').text('¥'+result.data.spec_base.original_price); + $('.goods-original-price').show(); } else { - $('.sys_item_mktprice').hide(); + $('.goods-original-price').hide(); + } + + // 扩展数据处理 + var extends_element = result.data.extends_element || []; + if(extends_element.length > 0) + { + for(var i in extends_element) + { + if((extends_element[i]['element'] || null) != null && extends_element[i]['content'] !== null) + { + $(extends_element[i]['element']).html(extends_element[i]['content']); + } + } } } else { if($(window).width() < 640) @@ -336,7 +349,7 @@ function GoodsSpecType() { $(this).removeClass('sku-dont-choose'); var value = $(this).data('value').toString(); - if(result.data.indexOf(value) == -1) + if(result.data.spec_type.indexOf(value) == -1) { $(this).addClass('sku-items-disabled'); } else { @@ -344,6 +357,19 @@ function GoodsSpecType() } }); } + + // 扩展数据处理 + var extends_element = result.data.extends_element || []; + if(extends_element.length > 0) + { + for(var i in extends_element) + { + if((extends_element[i]['element'] || null) != null && extends_element[i]['content'] !== null) + { + $(extends_element[i]['element']).html(extends_element[i]['content']); + } + } + } } else { if($(window).width() < 640) { @@ -377,10 +403,22 @@ function GoodsSpecType() function GoodsBaseRestore() { $('.text-info .price-now').text('¥'+$('.text-info .price-now').data('original-price')); - $('.sys_item_mktprice').text($('.sys_item_mktprice').data('original-price')); - $('.sys_item_price').text($('.sys_item_price').data('original-price')); + $('.goods-price').text($('.goods-price').data('original-price')); $('.number-tag input[type="number"]').attr('max', $('.number-tag input[type="number"]').data('original-max')); $('.stock-tips .stock').text($('.stock-tips .stock').data('original-stock')); + + // 价格处理 + if($('.tb-detail-price .original-price-value').length > 0) + { + $('.tb-detail-price .original-price-value').each(function(k, v) + { + var price = $(this).data('original-price'); + if(price !== undefined) + { + $(this).text('¥'+price); + } + }); + } } $(function() {