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() {