產品表每次更新商品都會變動的,ID不能用,可是購物車還是用了,這就導致每次保存商品,哪怕什么都沒有改動,也會導致用戶的購物車失效。
~~~
其實可以考慮不是每次更新商品就除所有的SKU,畢竟有時什么都沒修改呢,只改一個價格呢,或者增加一個SKU呢,其實這個問題做細一點有好的處理方式的。
比如商品增加一個版本號字段,SKU也增加一個版本字段,如果SKU規格值變動了那么刪除,如果發現規格值還在,只是價格或其它的改變了,那么則只需要改變版本號就可以了,但其實這里面的細節很多,考慮得比較麻煩,還是干脆不要用SKU的ID了,如果能不用SKU的ID,那就全部都不要用,購物車里面也只記錄商品的ID和規格字符串就可以了,根據規格字符串查詢SKU,如果找不到那就是沒有。
~~~
規格不是屬于模型,而是模型有個字段可以包含多個規格。多個規格值使用json編碼保存。
屬性是屬于模型的。多個屬性值使用逗號分隔。
商品展示時規格怎么獲取,跟后臺可不一樣,后臺是可以看到模型下面的所有規格,但不一地你給選用該規格,而前臺是要展現所有SKU,請注意這個區別。
iwebshop是將商品的所有規格組(SKU)都放入了goods表,顯示時使用了這兒的數據。而tpshop是從sku表中獲取的。
classes/goods_class.php 119 line
~~~
//是否存在貨品
$goodsUpdateData['spec_array'] = '';
if(isset($postData['_spec_array']))
{
//生成goods中的spec_array字段數據
$goods_spec_array = array();
foreach($postData['_spec_array'] as $key => $val)
{
foreach($val as $v)
{
$tempSpec = JSON::decode($v);
if(!isset($goods_spec_array[$tempSpec['id']]))
{
$goods_spec_array[$tempSpec['id']] = array('id' => $tempSpec['id'],'name' => $tempSpec['name'],'type' => $tempSpec['type'],'value' => array());
}
$goods_spec_array[$tempSpec['id']]['value'][] = $tempSpec['value'];
}
}
foreach($goods_spec_array as $key => $val)
{
$val['value'] = array_unique($val['value']);
$goods_spec_array[$key]['value'] = join(',',$val['value']);
}
$goodsUpdateData['spec_array'] = JSON::encode($goods_spec_array);
}
~~~
products.html 模板
~~~
{if:$spec_array}
{set:$specArray = JSON::decode($spec_array);}
{foreach:items=$specArray}
- {$item['name']}
- {set:$specVal=explode(',',trim($item['value'],','))}
{foreach:items=$specVal item=$spec_value}
{if:$item['type'] == 1}
- {$spec_value}
{else:}
{/if}
{/foreach}
{/foreach}
{/if}
~~~
* * * * *
### 擴展討論:標類與非標
當商品比較容易標準化,規范化時使用類型來決定規格這種形式比較好(根據商品類型定義規格模型),但是有一些場景這樣就不太靈活了,比如當商品很難標準化,規范化時,比如外賣的餐品,不是每一個餐品都有規格,都有辣度規格,大份小份等規格,所以此時應該尋找另外一種解決方案了,比如使用自定義的規格,這樣就靈活很多了,這里就有個很好的實例:[這是商品不依賴類型,自定義規格的完美解決方案!](https://coding.net/u/xiasf/p/gcb/git/commit/6d4116b91cc05e4db483e9eb49bd58611510f0e5#commit-comment-91257) ,當然如果情況復雜特殊,使用兩種方式結合也是我們愿意看到的,不過設計起來可能比較復雜,以后有實際案例再討論。
* * * * *
update:2017-3-16 11:18:03