1. 程式人生 > >PHP.40-TP框架商城應用實例-後臺17-商品屬性3-商品分類的修改與刪除

PHP.40-TP框架商城應用實例-後臺17-商品屬性3-商品分類的修改與刪除

屬性表 into alt replace 後臺 ron nbsp explode 不存在

商品分類的修改

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-商品分類的修改與刪除