zoukankan      html  css  js  c++  java
  • PHP.42-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或记录

      但是:这个函数是全表扫描,无法优化!所以如果表中数据量非常大,并且这个查询使用的非常频繁就不要用这个函数!

  • 相关阅读:
    luogu P1630 求和(枚举暴力)
    luogu P3414 SAC#1
    luogu P1869 愚蠢的组合数(质因数+瞎搞)
    luogu P1586 四方定理(背包)
    luogu P3795 钟氏映射(递推)
    2017.8.15 [Haoi2016]字符合并 区间dp+状压dp
    [NOI2002] 荒岛野人 扩展欧几里得算法
    [Noi2002]Savage 扩展欧几里得
    bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
    bzoj 3505: [Cqoi2014]数三角形
  • 原文地址:https://www.cnblogs.com/zixuanfy/p/7077259.html
Copyright © 2011-2022 走看看