PHP.27-TP框架商城应用实例-后台3-商品修改删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP.27-TP框架商城应用实例-后台3-商品修改删除相关的知识,希望对你有一定的参考价值。

商品修改{修改页一般与添加页有百分之九十的相似度}

  create($_POST,Model::MODEL_UPDATE):系统内置的数据操作包括Model::MODEL_INSERT(或者1)和Model::MODEL_UPDATE(或者2),当没有指定的时候,系统根据数据源是否包含主键数据来自动判断,如果存在主键数据,就当成Model::MODEL_UPDATE操作。

  save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数

1、控制器GoodsController.class.php中增加edit方法

 public function edit()
    {
            //判断用户是否提交了表单(如果提交了,就在if中处理表单,否则显示表单)
        if(IS_POST){    //IS_POST:TP自带常量:当前是否POST请求
            $model = D(\'goods\');    //D()实例化/Model/中模型goods
                //2.CREATE方法:a.接收数据并保存到模型中  b.根据模型中定义的规则验证表单
                /**
                *第一个参数:要接收的数据默认是$_POST
                *第二个参数:表单的类型。当前是添加还是修改的表单,1:添加    2:修改
                *$_POST:表单中原始的数据,I(\'post.\'):过滤后的$_POST的数据,过滤XSS攻击
                **/
            if($model->create(I(\'post\'), 2))
            {
                    //save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数【如果修改前跟修改后相同就返回0】
                if(FALSE !== $model->save())
                {
                        //显示成功信息并等待1秒之后跳转
                    $this->success(\'操作成功!\', U(\'lst\'));
                    exit;
                }
            }
                //如果上面失败了在这里处理失败的请求
                //从模型中取出失败的原因
            $error = $model->getError();
                //由控制器显示错误信息,并在3秒跳回上一个页面[error()默认3秒]
            $this->error($error);
        }
        //显示表单
        $this->display();
    }
function edit()

2、修改商品模型GoodsModel.class.php控制允许修改的字段

//修改调用create方法允许接收的字段
        protected $updateFields = \'id,goods_name,market_price,shop_price,is_on_sale,goods_desc\';

3、修改lst.html添加修改按钮,使之传递id参数  U()

  4、在修改的表单中显示原来的数据

 先根据ID取出原数据的信息 -> 修改控制器GoodsController.class.php中的edit方法;注意:这里的模型实例化则不能在if里面

 

//修改商品表单
    public function edit()
    {
        $id = I(\'get.id\');        //获取要修改的商品的id
        $model = D(\'goods\');    //D()实例化/Model/中模型goods
            //判断用户是否提交了表单(如果提交了,就在if中处理表单,否则显示表单)
        if(IS_POST)
        {    //IS_POST:TP自带常量:当前是否POST请求
                //2.CREATE方法:a.接收数据并保存到模型中  b.根据模型中定义的规则验证表单
                /**
                *第一个参数:要接收的数据默认是$_POST
                *第二个参数:表单的类型。当前是添加还是修改的表单,1:添加    2:修改
                *$_POST:表单中原始的数据,I(\'post.\'):过滤后的$_POST的数据,过滤XSS攻击
                **/
            if($model->create(I(\'post\'), 2))
            {
                    //save():用于更新数据库信息;如果失败返回false,如果成功返回受影响条数【如果修改前跟修改后相同就返回0】
                if(FALSE !== $model->save())
                {
                        //显示成功信息并等待1秒之后跳转
                    $this->success(\'操作成功!\', U(\'lst\'));
                    exit;
                }
            }
                //如果上面失败了在这里处理失败的请求
                //从模型中取出失败的原因
            $error = $model->getError();
                //由控制器显示错误信息,并在3秒跳回上一个页面[error()默认3秒]
            $this->error($error);
        }
        //根据ID取出要修改的商品的原信息
        $data = $model->find($id);
        $this->assign(\'data\', $data);
        //显示表单
        $this->display();
    }
function edit()

修改edit.html 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ECSHOP 管理中心 - 修改商品 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<link href="__PUB__/Admin/Styles/general.css" rel="stylesheet" type="text/css" />
<link href="__PUB__/Admin/Styles/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>
    <span class="action-span"><a href="__GROUP__/Goods/goodsList">商品列表</a>
    </span>
    <span class="action-span1"><a href="__GROUP__">ECSHOP 管理中心</a></span>
    <span id="search_id" class="action-span1"> - 修改商品 </span>
    <div style="clear:both"></div>
</h1>

<div class="tab-div">
    <div id="tabbar-div">
        <p>
            <span class="tab-front" id="general-tab">通用信息</span>
        </p>
    </div>
    <div id="tabbody-div">
        <form enctype="multipart/form-data" action="__SELF__" method="post" >
            <input type="hidden" name="id" value="<?php echo $data[\'id\'];?>" />
            <table width="90%" id="general-table" align="center">
                <tr>
                    <td class="label">商品名称:</td>
                    <td><input type="text" name="goods_name" value="<?php echo $data[\'goods_name\'];?>"size="30" />
                    <span class="require-field">*</span></td>
                </tr>
                <tr>
                    <td class="label">LOGO: </td>
                        <td>
                        <img src="/Public/Uploads/<?php echo $data[\'mid_logo\'];?>">
                        <br />
                    <input type="file" name="logo" size="30" />
                </tr>
                <tr>
                    <td class="label">市场售价:</td>
                    <td>
                        <input type="text" name="market_price" value="<?php echo $data[\'market_price\'];?>" size="20" />
                         <span class="require-field">*</span>
                    </td>
                </tr>
                <tr>
                    <td class="label">本店售价:</td>
                    <td>
                        <input type="text" name="shop_price" value="<?php echo $data[\'id\'];?>" size="20"/>
                        <span class="require-field">*</span>
                    </td>
                </tr> 
                <tr>
                    <td class="label">是否上架:</td>
                    <td>
                        <input type="radio" name="is_on_sale" value="1" <?php if($data[\'is_on_sale\']==\'1\') echo \'checked="checked"\'; ?> /><input type="radio" name="is_on_sale" value="0" <?php if($data[\'is_on_sale\']==\'0\') echo \'checked="checked"\'; ?> /></td>
                </tr>
                <tr>
                    <td class="label">商品描述:</td>
                    <td>
                        <textarea id="goods_desc" name="goods_desc" /><?php echo $data[\'goods_desc\'];?>"</textarea>
                    </td>
                </tr>
            </table>
            <div class="button-div">
                <input type="submit" value=" 确定 " class="button"/>
                <input type="reset" value=" 重置 " class="button" />
            </div>
        </form>
    </div>
</div>

<div id="footer">
共执行 9 个查询,用时 0.025161 秒,Gzip 已禁用,内存占用 3.258 MB<br />
版权所有 &copy; 2005-2012 上海商派网络科技有限公司,并保留所有权利。</div>
</body>
</html>

<!--导入在线编辑器-->
   <link href="__PUB__/umeditor1.2.3-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
    <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script>
    <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/template.min.js"></script>
    <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.config.js"></script>
    <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.min.js"></script>
    <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/lang/zh-cn/zh-cn.js"></script>
    <script>
        UM.getEditor(\'goods_desc\', {
            initialFrameWidth: "100%",
            initialFrameHeight: 150
        });
    </script>
edit.html

 注:1、显示logo图片

   2、radio之类的选择按钮

 5、在模型GoodsModel.class.php中添加_before_update()用于处理图片

思路:判断是否有图片上传,类似_before_insert()中处理logo的方法;先获取id,处理图片,在插入数据库前删除原图数据unlink

//钩子方法_before_update:更新前插入,在添加前会自动调用
        protected function _before_update(&$data, $option)
        {
            $id = $option[\'where\'][\'id\'];    //要修改的商品的ID
            
            /**************处理LOGO******************/
            //判断有没有选择图片
            if($_FILES[\'logo\'][\'error\'] == 0){
                $upload = new \\Think\\Upload();    //实例化上传类
                $upload->maxSize = 1024*1024;    //1M
                $upload->exts = array(\'jpg\', \'gif\', \'png\', \'jpeg\');    //设置附件上传类型
                $upload->rootPath = \'./Public/Uploads/\';        //设置附件上传根目录
                $upload->savePath = \'Goods/\';        //设置附件上传子目录
                //上传文件
                $info =  $upload->upload();
                if(!$info){
                    //获取失败原因把错误信息保存到模型的error属性中,然后在控制器里调用$model—>getError()获取错误信息并由控制器打印
                    $this->error = $upload->getError();
                    return FALSE;
                }else{
                    //上传成功,并生成缩略图
                    //先拼成原图上的路径
                    $logo = $info[\'logo\'][\'savepath\'] . $info[\'logo\'][\'savename\'];
                    //拼出缩略图的路径和名称
                    $mbiglogo = $info[\'logo\'][\'savepath\'] .\'mbig_\'. $info[\'logo\'][\'savename\'];
                    $biglogo = $info[\'logo\'][\'savepath\'] .\'big_\'. $info[\'logo\'][\'savename\'];
                    $midlogo = $info[\'logo\'][\'savepath\'] .\'mid_\'. $info[\'logo\'][\'savename\'];
                    $smlogo = $info[\'logo\'][\'savepath\'] .\'sm_\'. $info[\'logo\'][\'savename\'];
                    $image = new \\Think\\Image();
                    //打开要生成缩略图的图片
                    $image->open(\'./Public/Uploads/\'.$logo);
                    //生成缩略图
                    $image->thumb(700, 700)->save(\'./Public/Uploads/\'.$mbiglogo);
                    $image->thumb(350, 350)->save(\'./Public/Uploads/\'.$biglogo);
                    $image->thumb(130, 130)->save(\'./Public/Uploads/\'.$midlogo);
                    $image->thumb(50, 50)->save(\'./Public/Uploads/\'.$smlogo);
                    /**************把路径放到表单中*****************/
                    $data[\'logo\'] = $logo;
                    $data[\'mbig_logo\'] = $mbiglogo;
                    $data[\'big_logo\'] = $biglogo;
                    $data[\'mid_logo\'] = $midlogo;
                    $data[\'sm_logo\'] = $smlogo;
                    
                    /*******插入数据前,删除原来的图片*************/
                    //先查询出原来的图片的路径
                    $oldLogo = $this->field(\'logo,mbig_logo,big_logo,mid_logo,sm_logo\')->find($id);
                    //从硬盘上删除图片
                    unlink(\'./Public/Uploads/\'.$oldLogo[\'logo\']);
                    unlink(\'./Public/Uploads/\'.$oldLogo[\'sm_logo\']);
                    unlink(\'./Public/Uploads/\'.$oldLogo[\'mid_logo\']);
                    unlink(\'./Public/Uploads/\'.$oldLogo[\'big_logo\']);
                    unlink(\'./Public/Uploads/\'.$oldLogo[\'mbig_logo\']);
                }
            }
            
            //过滤这个字段    【必须对所有输入内容进行过滤】
            $data[\'goods_desc\'] = removeXSS($_POST[\'goods_desc\']);
        }
_before_update

 

商品删除

 思路:通过id,把数据从数据库中删除,同时删除对应的logo图片

1、在lst.html中添加删除按钮,onclick控制是否确认删除,避免失误操作

 2、在商品控制器GoodsController.class.php中添加删除方法

//删除商品表单
    public function delete()
    {
        $model = D(\'goods\');
        if(FALSE !== $model->delete(I(\'get.id\')))
            $this->success(\'删除成功!\', U(\'lst\'));
        else
            $this->error(\'删除失败!原因:\'.$model->getError());
    }

3、在模型类GoodsModel.class.php中添加一个删除之前的钩子方法,删除五个LOGO图片_before_delete()

//钩子方法_before_delete:删除前的操作
        protected function _before_delete($option)
        {
            $id = $option[\'where\'][\'id\'];    //要删除的商品的ID
            //先查询出原来的图片的路径
            $oldLogo = $this->field(\'logo,mbig_logo,big_logo,mid_logo,sm_logo\')->find($id);
            //从硬盘上删除图片
            unlink(\'./Public/Uploads/\'.$oldLogo[\'logo\']);
            unlink(\'./Public/Uploads/\'.$oldLogo[\'sm_logo\']);
            unlink(\'./Public/Uploads/\'.$oldLogo[\'mid_logo\']);
            unlink(\'./Public/Uploads/\'.$oldLogo[\'big_logo\']);
            unlink(\'./Public/Uploads/\'.$oldLogo[\'mbig_logo\']);
        }

 

以上是关于PHP.27-TP框架商城应用实例-后台3-商品修改删除的主要内容,如果未能解决你的问题,请参考以下文章

PHP.43-TP框架商城应用实例-后台16-商品属性3-库存量管理

PHP.36-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除修改

PHP.32-TP框架商城应用实例-后台10-商品分类-需求分析创建无限级商品分类,递归

PHP.30-TP框架商城应用实例-后台8-商品相册-添加

PHP.31-TP框架商城应用实例-后台9-商品相册-修改删除(AJAX)

PHP.30-TP框架商城应用实例-后台6-商品会员-价格级别