您现在的位置是:首页 > cms教程 > Ecshop商城教程Ecshop商城教程
ecshop属性表attribute商品属性表goods_attr货品表prduct)商品数
尤帅齐2024-12-25Ecshop商城教程已有人查阅
导读ecshop属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goods_attr里
ecshop属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goods_attr里goods_attr与(attribute)想关联,商品表里有商品数量的字段goods_number
为什么有这个货品表呢?
因为 某件商品有多种属性的时候,那这个商品就成为了货品,也就是说不同属性的相同商品应该也存在差异,所以当设置商品属性的attr_type=1(表示单选属性)的时候,
在 前台include/lib_comment.php 函数sort_goods_attr_id_array将 goods_attr_id 的序列按照 attr_id 重新排序 可以找到 非规格属性的id会被排除这句话,在连接这个函数写的sql语句
首先我们来看看这个到货通知是怎样处理的:
从模板goods.dwt里我们找到
我们在来看看这个 goods_attr_number在php页面是怎样得到的
$res['goods_attr_number'] = get_product_attr_num($goods_id,$_REQUEST['attr']);----attr是ajax调来的数据,往上找会看到它的处理
继续找get_product_attr_num
get_product_attr_num 获取相关属性的库存* @param int $goodid 商品id * @param string(array) $attrids 商品属性id的数组或者逗号分开的字符串
仔细看函数的流程,我们发现如果一个商品没有属性,那它的attrid就是空的,又一个商品有多个属性,那就对应多个goods_attr_id
在这里的话 goods_attr_number =就直接等于商品表里goods_number对应的数量
好了,再往下看,如果有属性,那么就 重新排序 就是我上面提到的方法
问题就在这里了,那我们在看看后台商品属性功能
在编辑属性处有这样三个单选,属性是否可选:唯一属性 单选属性 复选属性 而这里就是attr_type对应 的三种值
在页面有这样的说明:
选择"单选/复选属性"时,可以对商品该属性设置多个值,同时还能对不同属性值指定不同的价格加价,用户购买商品时需要选定具体的属性值。选择"唯一属性"时,商品的该属性值只能设置一个值,用户只能查看该值。
但是 出现问题来了,如果没有选择单单选属性 那么在商品列表里或者再添加商品的时候这个商品的属性不是单选属性那么就不会出现货品管理这个功能
因为在这个功能处也有个逻辑
在后台的goods.php?业剑?
为什么有这个货品表呢?
因为 某件商品有多种属性的时候,那这个商品就成为了货品,也就是说不同属性的相同商品应该也存在差异,所以当设置商品属性的attr_type=1(表示单选属性)的时候,
在 前台include/lib_comment.php 函数sort_goods_attr_id_array将 goods_attr_id 的序列按照 attr_id 重新排序 可以找到 非规格属性的id会被排除这句话,在连接这个函数写的sql语句
/重新排序
$sql = "SELECT a.attr_type, v.attr_value, v.goods_attr_id
FROM " .$GLOBALS['ecs']->table('attribute'). " AS a
LEFT JOIN " .$GLOBALS['ecs']->table('goods_attr'). " AS v
ON v.attr_id = a.attr_id
AND a.attr_type = 1
WHERE v.goods_attr_id " . db_create_in($goods_attr_id_array) . "
ORDER BY a.attr_id $sort";
我个人觉得attr_type=1表示规格属性,然后就是由于这样的处理,导致attr_type=0 attr_type=2的商品 他们虽然有商品数量,但是货品库存查不出来从而导致到货通知这个功能出现异常首先我们来看看这个到货通知是怎样处理的:
从模板goods.dwt里我们找到
function changePrice()
{
var attr = getSelectedAttributes(document.forms['ECS_FORMBUY']);
var qty = document.forms['ECS_FORMBUY'].elements['number'].value;
if(qty <=0 ){
document.forms['ECS_FORMBUY'].elements['number'].value = 1;
qty = 1;
}
Ajax.call('goods.php', 'act=price&id=' + goodsId + '&attr=' + attr + '&number=' + qty, changePriceResponse, 'GET', 'JSON');
}
/**
* 接收返回的信息
*/
function changePriceResponse(res)
{
if (res.err_msg.length > 0)
{
alert(res.err_msg);
}
else
{
document.forms['ECS_FORMBUY'].elements['number'].value = res.qty;
if (document.getElementById('ECS_GOODS_AMOUNT')){
document.getElementById('ECS_GOODS_AMOUNT').innerHTML = res.result;
}
if(document.getElementById('ECS_GOODS_NUMBER')){
document.getElementById('ECS_GOODS_NUMBER').innerHTML = res.goods_attr_number;
if(res.goods_attr_number > 0){
document.getElementById('ECS_ADD_TO_CART').style.display="block";
document.getElementById('ECS_ONE_STEP_BUY').style.display="block";
document.getElementById('ECS_DAOHUO').style.display="none";
}else{
document.getElementById('ECS_ADD_TO_CART').style.display="none";
document.getElementById('ECS_ONE_STEP_BUY').style.display="none";
document.getElementById('ECS_DAOHUO').style.display="block";
}
就是这里,通过发送一个ajax请求回传到goods.php里,得到最终的attr,然后在goods.php里通过:
//-- 改变属性、数量时重新计算商品价格
/*------------------------------------------------------ */
if (!empty($_REQUEST['act']) && $_REQUEST['act'] == 'price')
{
include('includes/cls_json.php');
$json = new JSON;
$res = array('err_msg' => '', 'result' => '', 'qty' => 1);
$attr_id = isset($_REQUEST['attr'])&&!empty($_REQUEST['attr']) ? explode(',', $_REQUEST['attr']) : array();
$number = (isset($_REQUEST['number'])) ? intval($_REQUEST['number']) : 1;
if ($goods_id == 0)
{
$res['err_msg'] = $_LANG['err_change_attr'];
$res['err_no'] = 1;
}
else
{
if ($number == 0)
{
$res['qty'] = $number = 1;
}
else
{
$res['qty'] = $number;
}
$exclusive = $GLOBALS['db']->getOne("select exclusive from ".$GLOBALS['ecs']->table('goods')." where goods_id = $goods_id");
$shop_price = get_final_price($goods_id, $number, true, $attr_id);
$res['is_exclusive'] = is_exclusive($exclusive,$shop_price);
$res['result'] = price_format($shop_price * $number);
$res['result_jf'] = floor($shop_price * $number);
$res['goods_attr_number'] = get_product_attr_num($goods_id,$_REQUEST['attr']);
回传json数据到模板,通过
if(document.getElementById('ECS_GOODS_NUMBER')){
document.getElementById('ECS_GOODS_NUMBER').innerHTML = res.goods_attr_number;
if(res.goods_attr_number > 0){
document.getElementById('ECS_ADD_TO_CART').style.display="block";
document.getElementById('ECS_ONE_STEP_BUY').style.display="block";
document.getElementById('ECS_DAOHUO').style.display="none";
}else{
document.getElementById('ECS_ADD_TO_CART').style.display="none";
document.getElementById('ECS_ONE_STEP_BUY').style.display="none";
document.getElementById('ECS_DAOHUO').style.display="block";
}
就可以实现到货通知我们在来看看这个 goods_attr_number在php页面是怎样得到的
$res['goods_attr_number'] = get_product_attr_num($goods_id,$_REQUEST['attr']);----attr是ajax调来的数据,往上找会看到它的处理
继续找get_product_attr_num
get_product_attr_num 获取相关属性的库存* @param int $goodid 商品id * @param string(array) $attrids 商品属性id的数组或者逗号分开的字符串
仔细看函数的流程,我们发现如果一个商品没有属性,那它的attrid就是空的,又一个商品有多个属性,那就对应多个goods_attr_id
在这里的话 goods_attr_number =就直接等于商品表里goods_number对应的数量
好了,再往下看,如果有属性,那么就 重新排序 就是我上面提到的方法
问题就在这里了,那我们在看看后台商品属性功能
在编辑属性处有这样三个单选,属性是否可选:唯一属性 单选属性 复选属性 而这里就是attr_type对应 的三种值
在页面有这样的说明:
选择"单选/复选属性"时,可以对商品该属性设置多个值,同时还能对不同属性值指定不同的价格加价,用户购买商品时需要选定具体的属性值。选择"唯一属性"时,商品的该属性值只能设置一个值,用户只能查看该值。
但是 出现问题来了,如果没有选择单单选属性 那么在商品列表里或者再添加商品的时候这个商品的属性不是单选属性那么就不会出现货品管理这个功能
因为在这个功能处也有个逻辑
在后台的goods.php?业剑?
/* 获取商品规格列表 */
$attribute = get_goods_specifications_list($goods_id);
在lib_goods.php?业嚼 飧龊?/**
* 获取商品类型中包含规格的类型列表
*
* @access public
* @return array
*/
function get_goods_type_specifications()
{
// 查询
$sql = "SELECT DISTINCT cat_id
FROM " .$GLOBALS['ecs']->table('attribute'). "
WHERE attr_type = 1";
$row = $GLOBALS['db']->GetAll($sql);
$return_arr = array();
if (!empty($row))
{
foreach ($row as $value)
{
$return_arr[$value['cat_id']] = $value['cat_id'];
}
}
return $return_arr;
}
不难发现,这里也只有attr_type = 1 才会出现货品这个功能。
本文标签:
很赞哦! ()
相关教程
图文教程
通过AJAX方式动态更新ecshop购物车页面的商品数量的方法
每次用户进入ecshop购物流程的时候当需要更改购物车里的商品数量的时候必须要手动点击更新按钮
ecshop文章页怎么增加显示文章浏览次数
在ecshop中,如何增加文章的浏览量,专业 也比较强,这个问题很多用户相当的关心,在此分享一下经验:
ecshop促销管理夺宝奇兵活动设置教程和参数说明
夺宝奇兵活动是一种提高网店人气的游戏。每期活动设定一个整数范围,参与者在网上任意填写一个该范围内的整数,如果该数字是同期所有竞拍数字中很小且的
ecshop购物车结算页面显示商品品牌的方法
1、先打开 includes/lib_order.php 文件(建议使用editplus)2、下面这一步千万要认真,不能马虎,还是在includes/lib_order.php 文件中查找先找到
相关源码
-
(自适应响应式)刷卡机POS机无线支付设备pbootcms网站源码下载本模板基于PbootCMS系统开发,为支付终端设备企业设计,特别适合POS机、移动支付终端、刷卡设备等金融科技产品展示。采用响应式布局技术,确保各类支付终端产品在不同设备查看源码 -
(PC+WAP)红色家装设计智能家居家具建材pbootcms网站源码下载本模板基于PbootCMS系统开发,为智能家居、家装设计及家具建材行业设计。采用现代化布局风格,突出家居设计行业特色,适合展示各类家居产品、设计方案和建材信息。查看源码 -
(PC+WAP)绿色环保设备环保企业网站模板源码下载基于PbootCMS内核开发的响应式企业模板,为环保设备制造、环境技术服务等企业打造,通过模块化设计实现多行业快速适配。查看源码 -
(PC+WAP)化工材料企业环保能源绿色营销型pbootcms模板源码下载本模板为化工材料及环保能源企业设计,采用PbootCMS开发,可展示各类化工产品、环保技术及能源解决方案。查看源码 -
自适应APP应用程序介绍推广落地页pbootcms网站源码下载移动应用开发商设计的营销型落地页模板,基于PbootCMS内核深度开发采用前沿响应式架构,无缝适配手机端操作习惯与PC端展示需求。查看源码 -
(自适应)html5中英双语通用机械设备pbootcms模板下载本模板基于PbootCMS内核精心开发,为机械设备制造企业量身打造。设计风格大气稳重,充分展现机械行业的专业特质与技术实力。采用HTML5技术构建,支持中英文双语切换,满足国际化业务需求。整站布局合理,充分展示企业产品、案例与服务,帮助访客快速了解企业核心优势。查看源码
| 分享笔记 (共有 篇笔记) |
