PHP.40-TP框架商城應用實例-後臺17-商品屬性3-商品分類的修改與刪除
商品分類的修改
1、改表單Goods/edit.html,加下拉框
2、因為商品屬性修改涉及商品屬性表goods_attr{id,attr_value,attr_id,goods_id}與屬性表attribute{id,attr_name,attr_option_values,type_id},而且考慮到當一個類型新增一個屬性時,修改表也應該將其顯示出來,所以應根據屬性表連接商品屬性表取出相關數據{同一類型所有屬性,該商品已存屬性值}
連表查詢數據輸出如下:
3、用PHP在表單edit.html中顯示顯示輸出
<!--商品屬性--> <table style="商品屬性表單輸出display:none;" width="90%" class="tab_table" align="center"> <tr ><td> 商品類型:<?php buildSelect(‘Type‘, ‘type_id‘, ‘id‘, ‘type_name‘, $data[‘type_id‘]); ?> </td></tr> <tr> <td><ul id="attr_list"> <!-- 循環所有原屬性值 --> <?php $attrId = array(); // 所有出現過的屬性ID foreach ($gaData as $k => $v): // 判斷如果這個屬性ID第一次出現就是+否則是- if(in_array($v[‘attr_id‘], $attrId)) $opt= ‘-‘; else { $opt = ‘+‘; $attrId[] = $v[‘attr_id‘]; } ?> <li> <input type="hidden" name="goods_attr_id[]" value="<?php echo $v[‘id‘]; ?>" /> <?php if($v[‘attr_type‘] == ‘可選‘): ?> <a onclick="addNewAttr(this);" href="#">[<?php echo $opt; ?>]</a> <?php endif; ?> <?php echo $v[‘attr_name‘]; ?> : <?php if($v[‘attr_option_values‘]): $attr = explode(‘,‘, $v[‘attr_option_values‘]); ?> <select name="attr_value[<?php echo $v[‘attr_id‘]; ?>][]"> <option value="">請選擇</option> <?php foreach ($attr as $k1 => $v1): if($v1 == $v[‘attr_value‘]) $select = ‘selected="selected"‘; else $select = ‘‘; ?> <option <?php echo $select; ?> value="<?php echo $v1; ?>"><?php echo $v1; ?></option> <?php endforeach; ?> </select> <?php else: ?> <input type="text" name="attr_value[<?php echo $v[‘attr_id‘]; ?>][]" value="<?php echo $v[‘attr_value‘]; ?>" /> <?php endif; ?> </li> <?php endforeach; ?> </ul></td> </tr> </table>
註意:同一種屬性中,應該第一個出現為+號,其他為-號
4、數據修改
思路:因為之後做的庫存量的功能需要用到商品屬性的ID,如果清空商品屬性重新添加的話,ID就都變了,導致庫存量的數據,會導致:每次修改商品後,庫存量的數據就都失效了需要重新添加,所以不能按以前的方法,將原數據全部刪除再更新
因此分三種情況
1、添加新屬性insert
2、修改原屬性update
3、刪除屬性:使用AJAX刪除
4.1表單中增加隱藏域,提交商品屬性對應的id
4.2修改商品模型GoodsModel.class.php/_before_update(),循環每個屬性值,尋找有沒有商品屬性ID,如果有就修改;如果沒有就添加:
/********** 修改商品屬性 **********/ $gaid = I(‘post.goods_attr_id‘); $attrValue = I(‘post.attr_value‘); $gaModel = M(‘goods_attr‘); $_i = 0; //循環次數 foreach ($attrValue as $k => $v) { foreach ($v as $k1 => $v1) { //這個replace into 可以實現同樣的功能 //replace into: 如果記錄存在就修改,記錄不存在就添加。以主鍵字段判斷一條記錄是否存在 //$gaModel->execute(‘REPLACE INTO p39_goods_attr VALUES("‘.$gaid[$_i].‘","‘.$v1.‘","‘.$k.‘","‘.$id.‘")‘); // 找這個屬性值是否有id if($gaid[$_i] == ‘‘) $gaModel->add(array( ‘goods_id‘ => $id, ‘attr_id‘ => $k, ‘attr_value‘ => $v1, )); else $gaModel->where(array( ‘id‘ => array(‘eq‘, $gaid[$_i]), ))->setField(‘attr_value‘, $v1); $_i++; } }處理商品屬性
註:replace into用法
replace into 跟 insert 功能類似,不同點在於:replace into 首先嘗試插入數據到表中, 1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)
則先刪除此行數據,然後插入新的數據。 2. 否則,直接插入新數據。
要註意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重復的數據。
4.3AJAX刪除
修改"-"號的JS代碼,傳入商品id
商品控制器中添加方法處理這個請求:
註:FIND_IN_SET(str,strlist):
str 要查詢的字符串
strlist 字段名 參數以”,”分隔 如 (1,2,6,8)
查詢字段(strlist)中包含(str)的結果,返回結果為null或記錄
但是:這個函數是全表掃描,無法優化!所以如果表中數據量非常大,並且這個查詢使用的非常頻繁就不要用這個函數!
PHP.40-TP框架商城應用實例-後臺17-商品屬性3-商品分類的修改與刪除