PHP.51-TP框架商城應用例項-前臺3-樓層
阿新 • • 發佈:2018-11-15
PHP.51-TP框架商城應用例項-前臺3-樓層推薦、TP框架雪崩問題
樓層推薦
效果圖
1、增加表字段
商品表
分類表
2、修改商品模型和分類模型接收欄位is_floor
3、修改商品和分類相關的表單
4、後臺製作推薦方法
4.1在分類模型中增加獲取前臺樓層資料的方法
/****** 獲取前臺首頁樓層中的資料 ***********/ public function floorData() { $floorData = S('floorData'); if($floorData) return $floorData; else { // 先取出推薦到樓層的頂級分類 $ret = $this->where(array( 'parent_id' => array('eq', 0), 'is_floor' => array('eq', '是') ))->select(); //var_dump($ret);die; $goodsModel = D('Admin/Goods'); // 迴圈每個樓層取出樓層中的資料 foreach ($ret as $k => $v) { /*********** 這個樓層中的品牌資料 *************/ // 先取出這個樓層下所有的商品ID $goodsId = $goodsModel->getGoodsIdByCatId($v['id']); // 再取出這些商品所用到的品牌 $ret[$k]['brand'] = $goodsModel->alias('a') ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id') ->field('DISTINCT brand_id,b.brand_name,b.logo') ->where(array( 'a.id' => array('in', $goodsId), 'a.brand_id' => array('neq', 0), ))->limit(9)->select(); //var_dump($ret[0]['brand']);die; /**** 取出未推薦的二級分類並儲存到這個頂級分類的subCat欄位中 ****/ $ret[$k]['subCat'] = $this->where(array( 'parent_id' => array('eq', $v['id']), 'is_floor' => array('eq', '否'), ))->select(); //var_dump($ret[0]['subCat']);die; /****** 取出推薦的二級分類並儲存到這個頂級分類的subCat欄位中 *******/ $ret[$k]['recSubCat'] = $this->where(array( 'parent_id' => array('eq', $v['id']), 'is_floor' => array('eq', '是'), ))->select(); //var_dump($ret[0]['recSubCat']);die; /***** 迴圈每個推薦的二級分類取出分類下的8件被推薦到樓層的商品 ****/ foreach ($ret[$k]['recSubCat'] as $k1 => &$v1) { //取出這個分類下所有商品的ID並返回一維陣列 $gid = $goodsModel->getGoodsIdByCatId($v1['id']); $gids = implode(",", $gid); //var_dump($gids);die; // 再根據商品ID取出商品的詳細資訊 $v1['goods'] = $goodsModel->field('id,mid_logo,goods_name,shop_price') ->where(array( 'is_on_sale' => array('eq', '1'), 'is_floor' => array('eq', '是'), 'id' => array('in', $gids), ))->order('sort_num ASC')->limit(8)->select(); //var_dump($v1['goods']);die; } } S('floorData', $ret, 5); return $ret; } }
4.2在IndexController.class.php控制器中取出資料
4.3在首頁中迴圈輸出 ==> 包括品牌資訊
5、為前臺頁面生成快取
擴充套件:解決TP框架雪崩問題
生成靜態快取的雪崩問題:如果網站的併發量在100【每秒有100個重新整理】,在快取頁面失效的一瞬間,100個併發同時進入到後端資料庫有可能讓資料庫崩潰。
解決方法:修改TP底層原始碼,在生成靜態快取頁時加鎖,在快取失效時只讓一個客戶端進入控制器 ==> PHP檔案鎖