1. 程式人生 > >PHP.29-TP框架商城應用實例-後臺7-商品會員修改-頁面優化,多表數據更新

PHP.29-TP框架商城應用實例-後臺7-商品會員修改-頁面優化,多表數據更新

color 創建 判斷 插入數據 market 字段 鉤子 check image

商品表修改功能

1、頁面優化,類似添加頁面

技術分享

技術分享技術分享

技術分享
  1 <layout name="layout" />
  2 
  3 <div class="tab-div">
  4     <div id="tabbar-div">
  5         <p>
  6             <span class="tab-front" >通用信息</span>
  7             <span class="tab-back" >商品描述</span>
  8             <span class
="tab-back" >會員價格</span> 9 <span class="tab-back" >商品屬性</span> 10 <span class="tab-back" >商品相冊</span> 11 </p> 12 </div> 13 <div id="tabbody-div"> 14 <form enctype="multipart/form-data" action="__SELF__" method="post" > 15
<input type="hidden" name="id" value="<?php echo $data[‘id‘];?>" /> 16 <!--基本信息--> 17 <table width="90%" class="tab_table" align="center"> 18 <tr> 19 <td class="label">所在品牌:</td> 20 <td> 21
<?php buildSelect(‘brand‘, ‘brand_id‘, ‘id‘, ‘brand_name‘, $data[‘brand_id‘]); ?> 22 </td> 23 </tr> 24 <tr> 25 <td class="label">商品名稱:</td> 26 <td><input type="text" name="goods_name" value="<?php echo $data[‘goods_name‘];?>"size="30" /> 27 <span class="require-field">*</span></td> 28 </tr> 29 <tr> 30 <td class="label">市場售價:</td> 31 <td> 32 <input type="text" name="market_price" value="<?php echo $data[‘market_price‘];?>" size="20" /> 33 <span class="require-field">*</span> 34 </td> 35 </tr> 36 <tr> 37 <td class="label">本店售價:</td> 38 <td> 39 <input type="text" name="shop_price" value="<?php echo $data[‘shop_price‘];?>" size="20"/> 40 <span class="require-field">*</span> 41 </td> 42 </tr> 43 <tr> 44 <td class="label">是否上架:</td> 45 <td> 46 <input type="radio" name="is_on_sale" value="1" <?php if($data[‘is_on_sale‘]==‘1‘) echo ‘checked="checked"‘; ?> /> 47 <input type="radio" name="is_on_sale" value="0" <?php if($data[‘is_on_sale‘]==‘0‘) echo ‘checked="checked"‘; ?> /> 48 </td> 49 </tr> 50 </table> 51 <!--商品描述--> 52 <table style="display:none;" width="100%" class="tab_table" align="center"> 53 <tr> 54 <td> 55 <textarea id="goods_desc" name="goods_desc" /><?php echo $data[‘goods_desc‘];?></textarea> 56 </td> 57 </tr> 58 </table> 59 <!--會員價格--> 60 <table style="display:none;" width="90%" class="tab_table" align="center"> 61 <tr align="center"> 62 <td> 63 <?php foreach ($mlData as $k => $v): ?> 64 <p> 65 <strong><?php echo $v[‘level_name‘]; ?></strong> : 66 ¥<input type="text" name="member_price[<?php echo $v[‘id‘];?>]" value="<?php echo $mpData[$v[‘id‘]][‘price‘]; ?>" size="8" /> 67 <p> 68 <?php endforeach; ?> 69 </td> 70 </tr> 71 </table> 72 <!--商品屬性--> 73 <table style="display:none;" width="90%" class="tab_table" align="center"> 74 75 </table> 76 <!--商品相冊--> 77 <table style="display:none;" width="90%" class="tab_table" align="center"> 78 <tr> 79 <td class="label">LOGO: </td> 80 <td> 81 <img src="/Public/Uploads/<?php echo $data[‘mid_logo‘];?>"> 82 <br /> 83 <input type="file" name="logo" size="30" /> 84 </tr> 85 </table> 86 <div class="button-div"> 87 <input type="submit" value=" 確定 " class="button"/> 88 <input type="reset" value=" 重置 " class="button" /> 89 </div> 90 </form> 91 </div> 92 </div> 93 94 <!--導入在線編輯器--> 95 <link href="__PUB__/umeditor1.2.3-utf8-php/themes/default/css/umeditor.css" type="text/css" rel="stylesheet"> 96 <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/jquery.min.js"></script> 97 <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/third-party/template.min.js"></script> 98 <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.config.js"></script> 99 <script type="text/javascript" charset="utf-8" src="__PUB__/umeditor1.2.3-utf8-php/umeditor.min.js"></script> 100 <script type="text/javascript" src="__PUB__/umeditor1.2.3-utf8-php/lang/zh-cn/zh-cn.js"></script> 101 <script> 102 UM.getEditor(‘goods_desc‘, { 103 initialFrameWidth: "100%", 104 initialFrameHeight: 150 105 }); 106 /******切換代碼******/ 107 $("#tabbar-div p span").click(function(){ 108 //點擊的第幾個按鈕 109 var i = $(this).index(); 110 //先隱藏所有的table 111 $(".tab_table").hide(); 112 //顯示第i個table 113 $(".tab_table").eq(i).show(); 114 //先取消原按鈕的選中狀態 115 $(".tab-front").removeClass("tab-front").addClass("tab-back"); 116 //設置當前按鈕選中 117 $(this).removeClass("tab-back").addClass("tab-front"); 118 }); 119 </script>
edit.html

因為一件商品不一定會有會員價格而價格(會員價格)不能默認為0,所以此時會員價格表沒有該商品會員價格的信息

因此顯示會員級別時,不能使用商品價格表{price,level_id,goods_id}連表查詢得到商品級別表{id,level_name,jifen_bottom,jifen_top}中level_name,要用到member_level表的實例化,否則當商品沒有會員價格時,就不會顯示會員級別的表單

當修改商品時,想新修改/添加會員價格,要用到member_price表是實例化

  所以會員價格表單中要使用兩個數據組$mlData(所有會員級別信息)和$mpData(對應商品id的會員價格)

技術分享

2、在控制器GoodsController.class.php中,實例化會員級別表和會員價格表

技術分享

註:因為當商品id存在時,會有四個會員價格對應四個會員級別,從數據庫中讀取的數據是按行讀取的,類似如下左圖,這樣在頁面中是難以輸出的,因此應該把二維數組轉為一維數組,使level_id的值作為數組下標【如右圖

技術分享技術分享

3、提交表單後把會員價格更新到會員價格表

  思路:先刪除原有的數據,再添加新的會員價格

技術分享

技術分享
<?php
    namespace Admin\Model;
    use Think\Model;
    
    class GoodsModel extends Model
    {    
        //添加調用create方法允許接收的字段
        protected $insertFields = ‘goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id‘;
        //修改調用create方法允許接收的字段
        protected $updateFields = ‘id,goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id,member_price‘;
        
        
        //定義驗證規則    validate:TP模型層提供的一種數據驗證方法 
            //a.靜態方式:在模型類裏面通過$_validate屬性定義驗證規則。b.動態方式:使用模型類的validate方法動態創建自動驗證規則 
            //定義好驗證規則後,就可以在使用create方法創建數據對象的時候自動調用
        protected $_validate = array(
            array(‘goods_name‘, ‘require‘, ‘商品名稱不能為空!‘, ‘1‘),
            array(‘market_price‘, ‘currency‘, ‘市場價格必須是貨幣!‘, ‘1‘),
            array(‘shop_price‘, ‘currency‘, ‘本店價格必須是貨幣類型!‘, ‘1‘),
        );
        
        
        
        //鉤子方法_before_insert:添加前插入,在添加前會自動調用
        //第一個參數:表單中即將要被插入數據庫中的數據=>數組
        //&按引用傳遞:函數外部的變量的值要在函數內部修改的話,必須按引用傳遞,除非傳遞的為對象,因為對象默認按引用傳遞
        protected function _before_insert(&$data, $option)
        {
            $id = $option[‘where‘][‘id‘];    //要修改的商品的ID
            
            /**************處理LOGO******************/
            //判斷有沒有選擇圖片
            if($_FILES[‘logo‘][‘error‘] == 0)
            {
                $ret = uploadOne(‘logo‘, ‘Goods‘, array(
                    array(700, 700),
                    array(350, 350),
                    array(130, 130),
                    array(50, 50),
                ));
                $data[‘logo‘] = $ret[‘images‘][0];
                $data[‘mbig_logo‘] = $ret[‘images‘][1];
                $data[‘big_logo‘] = $ret[‘images‘][2];
                $data[‘mid_logo‘] = $ret[‘images‘][3];
                $data[‘sm_logo‘] = $ret[‘images‘][4];
            }
            //獲取當前時間並添加到表單中,這樣就會插入數據庫中
            $data[‘addtime‘] = date(‘Y-m-d H:i:s‘, time());
            
            //過濾這個字段    【必須對所有輸入內容進行過濾】
            $data[‘goods_desc‘] = removeXSS($_POST[‘goods_desc‘]);
        }
        
        //鉤子方法_before_update:更新前插入,在添加前會自動調用
        protected function _before_update(&$data, $option)
        {
            $id = $option[‘where‘][‘id‘];    //要修改的商品的ID
            /************處理會員價格****************/
            $mp = I(‘post.member_price‘);
            $mpModel = M(‘member_price‘);
            //先刪除原來的會員價格
            $mpModel->where(array(
                ‘goods_id‘ => array(‘eq‘, $id),
            ))->delete();
            foreach ($mp as $k => $v)
            {
                $_v = (float)$v;
                //如果設置了會員價格就插入到表中
                if($_v > 0)
                {
                    $mpModel->add(array(
                        ‘price‘ => $_v,
                        ‘level_id‘ => $k,
                        ‘goods_id‘ => $id,
                    ));
                }
            }
            /**************處理LOGO******************/
            //判斷有沒有選擇圖片
            if($_FILES[‘logo‘][‘error‘] == 0)
            {
                $ret = uploadOne(‘logo‘, ‘Goods‘, array(
                    array(700, 700),
                    array(350, 350),
                    array(130, 130),
                    array(50, 50),
                ));
                $data[‘logo‘] = $ret[‘images‘][0];
                $data[‘mbig_logo‘] = $ret[‘images‘][1];
                $data[‘big_logo‘] = $ret[‘images‘][2];
                $data[‘mid_logo‘] = $ret[‘images‘][3];
                $data[‘sm_logo‘] = $ret[‘images‘][4];
                    
                    //先查詢出原來的圖片的路徑
                $oldLogo = $this->field(‘logo,mbig_logo,big_logo,mid_logo,sm_logo‘)->find($id);
                    //從硬盤上刪除圖片
                deleteImage($oldLogo);
            }
            //過濾這個字段    【必須對所有輸入內容進行過濾】
            $data[‘goods_desc‘] = removeXSS($_POST[‘goods_desc‘]);
        }
        /* protected function _after_update(&$data, $option)
        {
            var_dump($data);
            var_dump($option);
            die();
        } */
    
        //鉤子方法_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);
            
            deleteImage($oldLogo);
            /****** 刪除會員價格 ********/
            //根據商品表id 刪除操作
            /* $mpModel = D(‘member_price‘);
            $mpModel->where(array(
                ‘goods_id‘ => array(‘eq‘, $id),
            ))->delete(); */
        }
        
        //鉤子方法_after_insert:添加操作成功後執行
        protected function _after_insert($data, $option)
        {
            $mp = I(‘post.member_price‘);    //接收post提交過來的會員價格數據
            $mpModel = D(‘member_price‘);
            foreach ($mp as $k => $v)
            {
                $_v = (float)$v;    //強制轉為浮點型,以免插入字符等錯誤數據
                //設置會員價格>0就插入到表中
                if($_v > 0)
                {
                    $mpModel->add(array(
                        ‘price‘ => $_v,
                        ‘level_id‘ => $k,        //級別Id
                        ‘goods_id‘ => $data[‘id‘],
                    ));
                }
            }
        }
        
        /**
         *實現翻頁、搜索、排序
         *
         */
        public function search($perPage = 5)    //$perPage控制顯示條數
        {
            /***********搜索(獲取get提交的數據)************/
            $where =array();    //空的where條件
                //商品名稱
            $gn = I(‘get.gn‘);
            if($gn)
                $where[‘a.goods_name‘] = array(‘like‘, "%$gn%");    //WHERE goods_name LIKE ‘%$gn%‘
                //品牌
            $brandId = I(‘get.brand_id‘);
            if($brandId)
                $where[‘a.brand_id‘] = array(‘eq‘, "$brandId");    //WHERE goods_name LIKE ‘%$gn%‘
                //市場價格
            $fp = I(‘get.fp‘);
            $tp = I(‘get.tp‘);
            if($fp && $tp)
                $where[‘a.shop_price‘] = array(‘between‘, array($fp, $tp));    //WHERE shop_price BETWEEN $fp AND $tp
            elseif($fp)
                $where[‘a.shop_price‘] = array(‘egt‘, $fp);    //WHERE shop_price >= $fp
            elseif($tp)
                $where[‘a.shop_price‘] = array(‘elt‘, $tp);    //WHERE shop_price <= $tp
                //是否上架
            $ios = I(‘get.ios‘);
            if($ios)
                $where[‘a.is_on_sale‘] = array(‘eq‘, $ios);    //WHERE is_on_sale = $ios
                //添加時間
            $fa = I(‘get.fa‘);
            $ta = I(‘get.ta‘);
            if($fa && $ta)
                $where[‘a.addtime‘] = array(‘between‘, array($fa, $ta));    //WHERE addtime BETWEEN $fa ADD $ta
            elseif($fa)
                $where[‘a.addtime‘] = array(‘egt‘, $fa);    //WHERE addtime >= $fa
            elseif($ta)
                $where[‘a.addtime‘] = array(‘elt‘, $ta);    //WHERE addtime <= $ta
            
            /***********翻頁**********/
                //取出總的記錄數
            $count = $this->alias(‘a‘)->where($where)->count();
                //生成翻頁類的對象
            $pageObj = new \Think\Page($count, $perPage);
                //設置樣式
            $pageObj->setConfig(‘next‘, ‘下一頁‘);
            $pageObj->setConfig(‘prev‘, ‘上一頁‘);
                //生成頁面下面顯示的上一頁、下一頁的字符串
            $pageString = $pageObj->show();
            
            /**********排序********************/
            $orderby = ‘a.id‘;        //默認的排序字段
            $orderway = ‘desc‘;        //默認的排序方式(降序)
            $odby = I(‘get.odby‘);
            if($odby)
            {
                if($odby == ‘id_asc‘)    //時間升序,id為自增
                    $orderway = ‘asc‘;
                elseif($odby == ‘price_desc‘)    //價格降序(默認降序)
                    $orderby = ‘a.shop_price‘;
                elseif($odby == ‘price_asc‘)    //價格升序
                {
                    $orderby = ‘a.shop_price‘;
                    $orderway = ‘asc‘;
                }
            }
            
            /**********取某一頁的數據**********/
            /***
             * SELECT a.*,b.brand_name FROM p39_goods a LEFT JOIN p39_brand b ON a.brand_id=b.id;
             **/

            $data = $this->order("$orderby $orderway")
            ->field(‘a.*, b.brand_name‘)
            ->alias(‘a‘)                //加別名
            ->join(‘LEFT JOIN __BRAND__ b ON a.brand_id=b.id‘)
            ->where($where)
            ->limit($pageObj->firstRow.‘,‘.$pageObj->listRows)
            ->select();
            
            /************返回數據$data*************/
            return array(
                ‘data‘ => $data,    //數據
                ‘page‘ => $pageString,    //翻頁字符串
            );
        }

    }
?>
GoodsModel.class.php

find()返回一維數組,可直接傳入主鍵查詢

PHP.29-TP框架商城應用實例-後臺7-商品會員修改-頁面優化,多表數據更新