1. 程式人生 > >第39課 thinkphp5完成商品會員價格功能(後置勾子afterInsert)

第39課 thinkphp5完成商品會員價格功能(後置勾子afterInsert)

-s quest num 根目錄 ane 回調 post數據 input val

目錄

  • 要實現的功能
  • 思路:
  • html裏
  • 控制器裏
  • 模型裏的後置勾子beforeUpdate()

要實現的功能

html的表單裏提交過數據到控制器,控制器調用model裏的save()方並過濾掉不需要的數據後保存到goods表,
保存後會自動調用模型裏的後置勾子afterInsert(),後置勾子的回調$goods裏得到goods表裏新插入的主鍵後組裝好數據,
再插入到number_price表裏

思路:

  1. 控制器裏的用調用模型用save()方法保存,在模型裏的用protected $field=true; //當插入到當然模型對應表裏不存在的字段時,就會被忽略掉
  2. 數據插入到goods表後就會自動執行模型裏的afterInsert()
    方法
  3. afterInsert()方法裏回調的$goods裏就會獲取到插入goods表裏的數據,並獲取到插入後的主鍵id
  4. 在html表格裏用name="mp[{$ml.id}]"帶主鍵的方式提交,這樣數據的字段名和字段值就能對應上了
  5. 新插入goods表裏的商品主鍵id有了,三種會員的價格也有了,現在可以在afterInsert()裏循環把這三種價格數據分別插入到tp_member_price表裏了

html裏

<!-- 會員價格  -->
<div id="mbprice" class="tab-pane">
    {volist name="mlRes" id="ml"}
        <div class="form-group">
            <label for="username" class="col-sm-2 control-label no-padding-right">{$ml.level_name}</label>
            <div class="col-sm-6">
                <input class="form-control" placeholder="" name="mp[{$ml.id}]" type="text">
            </div>
            <p class="help-block col-sm-4 red">單位:元 精確到小數點後2位</p>
        </div>
    {/volist}
</div>
<!-- 給主圖上批量生成三張縮略圖  -->
<div id="goodsphoto" class="tab-pane">
    <div class="form-group">
        <label for="username" class="col-sm-2 control-label no-padding-right"></label>
        <div class="col-sm-6">
            <a href="#" onclick="addrow(this);">[+]</a><input class="form-control" style="border:none; box-shadow:none; width:50%; display:inline-block;" name="goods_photo[]" type="file">
        </div>
    </div>
    <div id="goods_photo"></div>
</div>

控制器裏

 public function add()
{
    if(request()->isPost()){
        //接收所有的表單所有的post數據
        $data=input(‘post.‘);
        // dump($data); die;

        //驗證post數據
        // dump($_FILES);die;
        $validate = validate(‘goods‘);
        if(!$validate->check($data)){
            $this->error($validate->getError());
        }

        //調用模型添加數據,添加之前會運行 Goods::beforeInsert方法
        //調用模型添加數據,添加之後會運行 Goods::afterInsert方法
        $add=model(‘goods‘)->save($data);
        if($add){
            $this->success(‘添加商品成功!‘,‘lst‘);
        }else{
            $this->error(‘添加商品失敗!‘);
        }
        return;
    }
}

模型裏的後置勾子beforeUpdate()

protected static function init()
{
    //$goods獲取到的是插入goods表裏的數據,並獲取到插入後的主鍵id
    Goods::afterInsert(function($goods){
        //接受表單數據
        $goodsData=input(‘post.‘);
        
        // 批量寫入會員價格
        $mpriceArr=$goods->mp;
        $goodsId=$goods->id;
        if($mpriceArr){
            foreach ($mpriceArr as $k => $v) {
                if(trim($v) == ‘‘){
                    continue;
                }else{
                    db(‘member_price‘)->insert([‘mlevel_id‘=>$k,‘mprice‘=>$v,‘goods_id‘=>$goodsId]);
                }
            }
        }
        
        // 商品相冊處理 給主圖上批量生成三張縮略圖
        if($goods->_hasImgs($_FILES[‘goods_photo‘][‘tmp_name‘])){
            $files = request()->file(‘goods_photo‘);
            foreach($files as $file){
                // 移動到框架應用根目錄/public/uploads/ 目錄下
                $info = $file->move(ROOT_PATH . ‘public‘ . DS .‘static‘. DS .‘uploads‘);
                if($info){
                    // 輸出 42a79759f284b767dfcb2a0197904287.jpg
                    $photoName=$info->getFilename();
                    $ogphoto=date("Ymd"). DS . $photoName;
                    $bigphoto=date("Ymd"). DS . ‘big_‘.$photoName;
                    $midphoto=date("Ymd"). DS . ‘mid_‘.$photoName;
                    $smphoto=date("Ymd"). DS . ‘sm_‘.$photoName;
                    $image = \think\Image::open(IMG_UPLOADS.$ogphoto);
                    $image->thumb(500, 500)->save(IMG_UPLOADS.$bigphoto);
                    $image->thumb(200, 200)->save(IMG_UPLOADS.$midphoto);
                    $image->thumb(80, 80)->save(IMG_UPLOADS.$smphoto);
                    db(‘goods_photo‘)->insert([‘goods_id‘=>$goodsId,‘og_photo‘=>$ogphoto,‘big_photo‘=>$bigphoto,‘mid_photo‘=>$midphoto,‘sm_photo‘=>$smphoto]);
                }else{
                    // 上傳失敗獲取錯誤信息
                    echo $file->getError();
                }    
            }
        }
    }
}

技術分享圖片

判斷$_FILES[‘goods_photo‘][‘tmp_name‘]是否為空來判斷是否有圖片上傳
技術分享圖片

技術分享圖片
技術分享圖片

第39課 thinkphp5完成商品會員價格功能(後置勾子afterInsert)