PHP.29-TP框架商城應用實例-後臺7-商品會員修改-頁面優化,多表數據更新
阿新 • • 發佈:2017-06-09
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 classedit.html="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>
因為一件商品不一定會有會員價格,而價格(會員價格)不能默認為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-商品會員修改-頁面優化,多表數據更新