前面我写过一篇关于ecshop的如何存储商品数量的:ecshop保存价格和数量,今天我尝试了一下自己去写,虽然没有写全,但是还是很爽的。还有我是参考了ECSHOP存储数据的格式,但是没有参考他的源码。还有下面的内容只是为了帮助我以后能更好的理解,所以基本没有直接贴代码,或者给全部代码。还有,我只能说按照这样的形式是可以实现功能的,至于是不是最优解,那么我就真的不知道了,人总要有点自信嘛。
多属性价格保存
具体数据库设计
goods_attr
- id
- attr_id
- goods_id
- attr_values
- attr_price
products
- product_id
- goods_id
- goods_attr
- product_number
前端页面
首先就是商品的输入页面,先看效果图:
这里具体的输入格式是这样的:
<!--
根据商品的attr_input_type进行选择下面输入方式,具体的值如下:
手工输入:0
下拉框选择:1
多文本输入:2
-->
<input type='text' name='attr_values["+val.attr_id+"][]'>
<select name='attr_values["+val.attr_id+"][]'>
<textarea name='attr_values["+val.attr_id+"][]'>
重点是name的设置:attr_values[“+val.attr_id+”][],如果要输入同一属性的多个值下的多个价格的话,那么就把上面的内容复制一份,进行输入就可以了。
接着就是判断attr_type了,如果attr_type是单选属性或者复选属性的话,那么就在后面添加一个输入价格的输入框,这个价格的格式是这样的:
价格:<input type='text' name='attr_price["+val.attr_id+"][]'><br>
按照这样的格式输入完成后,先来看传入的参数:
最后是后台使用var_dump打印的数据:
可以看到,上面的attr_values下不同的值是以数组的形式保存的,所以可以传入多个单选属性,复选属性或者唯一属性。
而同时,attr_price下面也是数组形式,这就能保证同一属性下的不同值下能设置不同的价格,这也就是想ECSHOP处理的那样,在勾选一个单选属性或者复选属性之后,价格会产生变化。
后台处理
其实数据都传到了后台了嘛,怎么处理其实就是一样的了,基本是代码了,我就不贴了,因为基本就是一个很烦取数据,组合成数组的过程。
库存数量保存
同样先来看商品的效果图:
在这里的表格列数(属性1,属性2,属性3等)需要根据你的商品有多少属性具体生成,其中的每一列都需要设置一个下拉菜单,其中保存有该商品所拥有的属性的全部可选值,这里就结合上面的数据库结构,看看下面的代码就可以了,这里还是简单的:
调用该方法时需要传入进行设置的商品id。
public function addStore($goods_id){
$attr_values=array();
$attr_ids=M('goods_attr')->where('goods_id='.$goods_id)->field('distinct attr_id')->select();
$rows=count($attr_ids);
foreach ($attr_ids as $attr_id){
$attr_values[$attr_id['attr_id']]=M('goods_attr')->where('attr_id='.$attr_id['attr_id'])->select();
}
$this->assign('goods_id',$goods_id);
$this->assign('count',$rows);
$this->assign('attr_values',$attr_values);
$this->display('Goods/add2');
}
接着就是前台页面的显示:
<table border="1">
<tr>
<th>新增</th>
<volist name="attr_values" id="temp">
<th>属性{$i}</th>
</volist>
<th>库存数量</th>
</tr>
<tr>
<!--这里添加增加下一列的事件-->
<td><a href="#">+</a></td>
<volist name="attr_values" id="attr_values">
<td>
<select>
<volist name="attr_values" id="values">
<option value="{$values.id}">{$values.attr_values}</option>
</volist>
</select>
</td>
</volist>
<td><input type="text" name="product_number[]"></td>
</tr>
</table>
<button>确定</button>
后面需要用js读取值来传入进行存储,由于有专门的前端人员,所以。。。。。我就不想考虑了。。。。。。好吧,我是懒了很多。。。。。。。
总结
这个玩意我写之前都在考虑怎么办,觉得会很难,总是在考虑这考虑那的,结果被我拖了4天,可是后来自己写完之后才发现,基本靠这两条原则:
- 什么都不要多想,把数据尽量多的传入后台,只要有数据,就不会愁处理数据的过程
- 前台显示可能一下子没有思路,或者觉得很难,套用一句毛泽东的话:都是纸老虎,慢慢试,现在技术这么发达,肯定能解决你的问题