homeUrl = Url::to(['/web/default/index'],true); $this->navList = $this->getNavData(2);//默认取PC内页导航数据 $this->footerLinks = $this->getNavData(4); $this->wapNavList = $this->getNavData(6); $this->userInfo = Identify::getUserInfo(); $this->initFilterConfig(); } public function behaviors() { parent::behaviors(); return [ [ 'class' => 'app\common\filters\FrontEndTokenFilter', ], ]; } //获取导航/链接数据 public function getNavData($type) { $allNavList = json_decode(Yii::$app->cache->get(CacheId::navCacheId()),true); $navList = $allNavList[$type]; $navData = []; if(is_array($navList))foreach($navList as $nav) { if($nav['parent_id']>0)continue; if($nav['is_dropdown']&&$nav['dropdown_level']>0) { if($nav['content_model_id']) { $modelList = json_decode(Yii::$app->cache->get(CacheId::modelListCacheId()),true); $functionName = $modelList[$nav['content_model_id']]['table_name'].'List'; //SiteUrl::$functionName(8); $categoryList = json_decode(Yii::$app->cache->get(CacheId::categoryItemsCacheId($nav['content_model_id'])),true); $childs = []; if(is_array($categoryList))foreach($categoryList as $category) { if(empty($category['parent_id'])) { //二级菜单 $secChilds = []; if(is_array($categoryList))foreach($categoryList as $secCategory) { if($secCategory['parent_id']==$category['cat_id']) { //三级菜单 $thirdChilds = []; if(is_array($categoryList))foreach($categoryList as $thirdCategory) { if($thirdCategory['parent_id']==$secCategory['cat_id']) { $thirdChilds[] = array('title'=>$thirdCategory['cat_name'],'url'=>SiteUrl::$functionName($thirdCategory['cat_id']),'blank'=>$nav['blank']); } } $secChilds[] = array('title'=>$secCategory['cat_name'],'url'=>SiteUrl::$functionName($secCategory['cat_id']),'blank'=>$nav['blank'],'childs'=>$thirdChilds); } } $childs[] = array('title'=>$category['cat_name'],'url'=>SiteUrl::$functionName($category['cat_id']),'blank'=>$nav['blank'],'childs'=>$secChilds); } } $navData[] = array('title'=>$nav['title'],'url'=>$nav['url'],'blank'=>$nav['blank'],'width'=>$nav['width'],'is_dropdown'=>$nav['is_dropdown'],'dropdown_level'=>$nav['dropdown_level'],'iconfont'=>$nav['iconfont'],'childs'=>$childs); } else { $childs = []; if(is_array($navList))foreach($navList as $childNav) { if($childNav['parent_id']==$nav['id']) { $secChilds = []; if(is_array($navList))foreach($navList as $secNav) { if($secNav['parent_id']==$childNav['id']) { //三级菜单 $thirdChilds = []; if(is_array($navList))foreach($navList as $thirdNav) { if($thirdNav['parent_id']==$secNav['id']) { $thirdChilds[] = array('title'=>$thirdNav['title'],'url'=>$thirdNav['url'],'blank'=>$thirdNav['blank'],'is_new'=>$thirdNav['is_new'],'is_hot'=>$thirdNav['is_hot'],'iconfont'=>$thirdNav['iconfont']); } } $secChilds[] = array('title'=>$secNav['title'],'url'=>$secNav['url'],'blank'=>$secNav['blank'],'is_new'=>$secNav['is_new'],'is_hot'=>$secNav['is_hot'],'iconfont'=>$secNav['iconfont'],'childs'=>$thirdChilds); } } $childs[] = array('title'=>$childNav['title'],'url'=>$childNav['url'],'blank'=>$childNav['blank'],'is_new'=>$childNav['is_new'],'is_hot'=>$childNav['is_hot'],'iconfont'=>$childNav['iconfont'],'childs'=>$secChilds); } } $navData[] = array('title'=>$nav['title'],'url'=>$nav['url'],'blank'=>$nav['blank'],'width'=>$nav['width'], 'is_dropdown'=>$nav['is_dropdown'],'dropdown_level'=>$nav['dropdown_level'],'iconfont'=>$nav['iconfont'],'childs'=>$childs); } } else { $childs = []; if(is_array($navList))foreach($navList as $childNav) { if($childNav['parent_id']==$nav['id']) { $secChilds = []; if(is_array($navList))foreach($navList as $secNav) { if($secNav['parent_id']==$childNav['id']) { //三级菜单 $thirdChilds = []; if(is_array($navList))foreach($navList as $thirdNav) { if($thirdNav['parent_id']==$secNav['id']) { $thirdChilds[] = array('title'=>$thirdNav['title'],'url'=>$thirdNav['url'],'blank'=>$thirdNav['blank'],'is_new'=>$thirdNav['is_new'],'is_hot'=>$thirdNav['is_hot'],'iconfont'=>$thirdNav['iconfont']); } } $secChilds[] = array('title'=>$secNav['title'],'url'=>$secNav['url'],'blank'=>$secNav['blank'],'is_new'=>$secNav['is_new'],'is_hot'=>$secNav['is_hot'],'iconfont'=>$secNav['iconfont'],'childs'=>$thirdChilds); } } $childs[] = array('title'=>$childNav['title'],'url'=>$childNav['url'],'blank'=>$childNav['blank'],'is_new'=>$childNav['is_new'],'is_hot'=>$childNav['is_hot'],'iconfont'=>$childNav['iconfont'],'childs'=>$secChilds); } } $navData[] = array('title'=>$nav['title'],'url'=>$nav['url'],'blank'=>$nav['blank'],'is_dropdown'=>$nav['is_dropdown'],'dropdown_level'=>$nav['dropdown_level'],'iconfont'=>$nav['iconfont'],'childs'=>$childs); } } return $navData; } //单条记录字段值修改 public function actionSetfield() { $table = strtolower(safe_replace($_GET['table'])); $fileldName = safe_replace($_GET['field']); $fieldValue = safe_replace($_GET['value']); $pk = safe_replace($_GET['pk']); $pkField = \app\common\models\EActiveRecord::getPrikey($table); if(!empty($pk)&&!empty($fileldName)) { if(empty($this->userInfo)) { $msgdata = ['error' => 1,'msg' => '操作失败']; } else { $result = Yii::$app->db->createCommand("UPDATE {{%$table}} SET $fileldName='$fieldValue' WHERE $pkField='$pk' and user_id=".$this->userInfo['user_id'])->execute(); if($result) { $msgdata = ['error' => 0,'msg' => '操作成功']; } else { $msgdata = ['error' => 1,'msg' => '操作失败']; } } } else { $msgdata = ['error' => 1,'msg' => '操作失败']; } echo_json($msgdata); } //获取广告数据 public function getAdData($space_id) { $dataList = AdData::find()->where("space_id='".$space_id."' and status=1 and end_time>".TIMESTAMP)->orderBy(['list_order'=>SORT_ASC])->all(); return $dataList; } //判断当前用户是否已关注该记录 public function checkFavor($table_name,$data_id) { if($this->hasLogined()) { $user_id = Identify::getUserInfo(null,'user_id'); $exist = UserFavorite::find()->where("user_id=$user_id and table_name='".$table_name."' and data_id='".$data_id."'")->exists(); if($exist) { return true; } else { return false; } } else { return false; } } //返回个人主页链接 function getUpage($user_id,$open_home=0) { if(defined('IN_WAP')&&IN_WAP==TRUE) { $str = 'href="javascript:;"'; } else { if($open_home) { $str = 'href="'.\app\common\components\SiteUrl::uHome($user_id).'" target="_blank"'; } else { $str = 'href="javascript:;"'; } } return $str; } //返回前台创作者名称信息 function getOwnername($user_id,$nick_name='') { if(empty($user_id))return '游客'; $store = ShoppingStore::find()->where("user_id=$user_id")->one(); if($store) { return $store->store_name; } else { if(!empty($nick_name)) { return $nick_name; } else { $user = \app\modules\ucenter\models\User::findOne($user_id); return $user->nick_name; } } } //返回前台创作者名称信息 function getOwneravatar($user_id,$avatar='') { if(empty($user_id))return; $store = ShoppingStore::find()->where("user_id=$user_id")->one(); if($store) { return $store->logo; } else { if(!empty($avatar)) { return $avatar; } else { $user = \app\modules\ucenter\models\User::findOne($user_id); return $user->avatar; } } } //返回前台主页简介 function getOwnerdes($user_id,$des='') { if(empty($user_id))return ''; $store = ShoppingStore::find()->where("user_id=$user_id")->one(); if($store) { return $store->desc; } else { if(!empty($des)) { return $des; } else { $user = \app\modules\ucenter\models\User::findOne($user_id); return $user->signature; } } } //返回前台主页关键词 function getOwnerkeywords($user_id,$keywords='') { if(empty($user_id))return ''; $store = ShoppingStore::find()->where("user_id=$user_id")->one(); if($store) { return $store->keywords; } else { return $keywords; } } //初始化列表多条件筛选配置 public function initFilterConfig() { //文档筛选条件 $this->filterConfig['doc'] = array( 'fieldConfig' => array( 'c'=>array('type'=>'cat_ids','flag'=>'like','field'=>'cat_ids'), 'xa'=>array('type'=>'equal','flag'=>'=','field'=>'ext_type_1'), 'xb'=>array('type'=>'equal','flag'=>'=','field'=>'ext_type_2'), 'xc'=>array('type'=>'equal','flag'=>'=','field'=>'ext_type_3'), 'xd'=>array('type'=>'equal','flag'=>'=','field'=>'ext_type_4'), 'xe'=>array('type'=>'equal','flag'=>'=','field'=>'ext_type_5'), 'sp'=>array('type'=>'boollist','flag'=>'=','field'=>array('is_new','is_hot','is_original','is_recommend')), 'vp'=>array('type'=>'boollist','flag'=>'=','field'=>array('is_vip','vip_free','is_free')), ), 'sortConfig' => array( '1'=>array('value'=>1, 'order'=>'create_time desc','title'=>'最新上传','tips'=>'点击按上传时间排序'), '2'=>array('value'=>2, 'order'=>'downs desc','title'=>'热门下载','tips'=>'点击按下载量排序'), '3'=>array('value'=>3, 'order'=>'views desc','title'=>'浏览优先','tips'=>'点击按浏览量排序'), '4'=>array('value'=>4, 'order'=>'favors desc','title'=>'收藏优先','tips'=>'点击按收藏量排序'), ), 'sortConfigWap' => array( '1'=>array('value'=>1, 'order'=>'create_time desc','title'=>'综合','tips'=>'点击按上传时间排序'), '2'=>array('value'=>2, 'order'=>'downs desc','title'=>'下载量','tips'=>'点击按下载量排序'), '3'=>array('value'=>3, 'order'=>'views desc','title'=>'浏览量','tips'=>'点击按浏览量排序'), ), 'xConfig' => array('1'=>'xa','2'=>'xb','3'=>'xc','4'=>'xd','5'=>'xe'), 'spConfig' => array('1'=>'最新','2'=>'最热','3'=>'原创','4'=>'推荐'), 'vpConfig' => array('1'=>'VIP专享','2'=>'VIP免费','3'=>'免费') ); //资讯筛选条件 $this->filterConfig['news'] = array( 'fieldConfig' => array( 'c'=>array('type'=>'cat_ids','flag'=>'like','field'=>'cat_ids'), 'sp'=>array('type'=>'boollist','flag'=>'=','field'=>array('is_new','is_hot','is_recommend')), ), 'sortConfig' => array( '1'=>array('value'=>1, 'order'=>'create_time desc','title'=>'最新发布','tips'=>'点击按发布时间排序'), '2'=>array('value'=>2, 'order'=>'digs desc','title'=>'点赞优先','tips'=>'点击按点赞量排序'), '3'=>array('value'=>3, 'order'=>'views desc','title'=>'浏览优先','tips'=>'点击按浏览量排序'), '4'=>array('value'=>4, 'order'=>'favors desc','title'=>'收藏优先','tips'=>'点击按收藏量排序'), ), 'spConfig' => array('1'=>'最新','2'=>'最热','3'=>'推荐'), ); } //搜索逻辑处理 public function doSearch($kw,$model_id,$higherconfig=null) { if(!empty($higherconfig))$mapp = true; require(BASE_PATH.'common'.DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'sphinxapi.php'); $higherconfig = $higherconfig?$higherconfig:Yii::$app->controller->module->higherconfig; //每页显示数量 $pageSize = 10; //记录搜索热点 $kwModel = SearchRecord::find()->where("keyword='".$kw."' and content_model_id=$model_id")->one(); if(!empty($kwModel)) { $kwModel->times++; $kwModel->save(); } else { $kwModel = new SearchRecord(); $kwModel->content_model_id = $model_id; $kwModel->keyword = $kw; $kwModel->times = 1; $kwModel->create_time = TIMESTAMP; $kwModel->save(); } //获取排序配置 $searchModelList = getSysconfigValue('search_models_flag'); $contentFilterConfig = $this->filterConfig[$searchModelList[$model_id]]; //筛选条件解析 $multiSearch = MultiSearchUrl::getSelfInstance(array('fieldConfig'=> $contentFilterConfig['fieldConfig'],'sortConfig'=>$contentFilterConfig['sortConfig'])); $searchConditions = $multiSearch->getSearchConditions(); //序列化多维度筛选 $sqlInfo = $multiSearch->sqllizeConditions(); $st = $multiSearch->getConditionValueByType($searchConditions,'st'); //没有排序条件,默认按最新上传时间 if(empty($sqlInfo['order']))$sqlInfo['order']="order by create_time desc"; $page = Yii::$app->request->get('page',1); if($higherconfig['open_sphinx']) { $cl = new \SphinxClient (); $q = $kw; $host = "localhost"; $port = 9312; //此处变量名称与内容模型主表名一一对应 $index = $higherconfig[$searchModelList[$model_id].'_index']; $cl->SetServer ( $host, $port ); $connect = $cl->_Connect(); if(!$connect) { $this->showMessage(array('class'=>'danger','message'=>'sphinx连接失败'),1); } $cl->SetConnectTimeout ( 1 ); $cl->SetArrayResult ( true ); $cl->SetMatchMode(SPH_MATCH_ALL); $cl->SetLimits(($page-1)*$pageSize,$pageSize); $cl->SetFieldWeights(array('title'=>10,'tags'=>5,'keywords'=>5,'description'=>3)); if(!empty($st)) { $cl->SetSortMode(SPH_SORT_EXTENDED, str_replace("order by ","",$sqlInfo['order'])); } else { $cl->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC,@id DESC");//按照相关度排序 } $res = $cl->Query ( $q, $index ); $count = $res['total_found']; $resultList = []; //定义关键字标注内容 $opts = array('before_match'=>'','after_match'=>''); if(is_array($res['matches']))foreach($res['matches'] as $k=>$match) { // "mysql" 我的索引名 “你好”要标红的关键字; $go = $cl->BuildExcerpts(array($match['attrs']['title']),$index,$kw,$opts); $res['matches'][$k]['attrs']['title'] = $go[0]; $resultList[$k] = $res['matches'][$k]['attrs']; $resultList[$k]['id'] = $match['id']; $resultList[$k]['description'] = str_replace($kw,"$kw",$resultList[$k]['description']); } $pages = new Pagination([ 'totalCount' => $count, 'pageSize' => $pageSize, 'defaultPageSize' => $pageSize, //添加默认 ]); } else { $contentModel = ContentModel::findOne($model_id); $contentModelFieldList = ContentModelField::find()->where("model_id=$model_id")->all(); if($contentModel->table_name=='doc') { $tableName = Yii::$app->db->tablePrefix.$contentModel->table_name.'_real'; } else { $tableName = Yii::$app->db->tablePrefix.$contentModel->table_name; } //增加标记判断 if(is_array($contentModelFieldList))foreach($contentModelFieldList as $contentModelField) { if(in_array($contentModelField->field,['is_delete','is_del','disabled'])) { $sqlother[] = " and ".$contentModelField->field.'=0'; } } if(!empty($sqlother))$sqlother = join(" ",$sqlother); $query = new \yii\db\Query(); $query->from($tableName); $sql = "(title like '%".$kw."%' or keywords like '%".$kw."%' or description like '%".$kw."%') and status=1 ".$sqlother; $query->where($sql); $query->orderBy(str_replace('order by ','',$sqlInfo['order'])); $countQuery = clone $query; $count = $countQuery->count(); $pages = new Pagination([ 'totalCount' => $count, 'pageSize' => $pageSize, 'defaultPageSize' => $pageSize, //添加默认 ]); //获取当前页内容 $resultList = $query->offset($pages->offset)->limit($pages->limit)->all(); if(is_array($resultList))foreach($resultList as $k=>$result) { $resultList[$k]['title'] = str_replace($kw,"$kw",$resultList[$k]['title']); $resultList[$k]['description'] = str_replace($kw,"$kw",$resultList[$k]['description']); } } if(!$mapp) { $badwords = getSearchBadWords(); $hournow = get_date(TIMESTAMP,'H'); $filter = true; if(Yii::$app->controller->module->badwordconfig['hours']) { $hours = explode(",",Yii::$app->controller->module->badwordconfig['hours']); if(!in_array($hournow,$hours)) { $filter = false; } } if($filter) { //设定过滤条件(爬虫过滤) if(isSpider()&&Yii::$app->controller->module->badwordconfig['open_spider']) { if(is_array($badwords))foreach($badwords as $badword) { if(strpos($kw,$badword)!==false) { return ['resultList'=>[],'searchConditions'=>$searchConditions,'st'=>[],'count'=>0,'pages'=>[],'pageCount'=>0,'contentFilterConfig'=>[],'currentPage'=>0,'pageSize'=>0]; } } } //设定过滤条件(手机站) if(!isSpider()&&defined('IN_WAP')&&IN_WAP==TRUE&&Yii::$app->controller->module->badwordconfig['open_wap']) { if(is_array($badwords))foreach($badwords as $badword) { if(strpos($kw,$badword)!==false) { return ['resultList'=>[],'searchConditions'=>$searchConditions,'st'=>[],'count'=>0,'pages'=>[],'pageCount'=>0,'contentFilterConfig'=>[],'currentPage'=>0,'pageSize'=>0]; } } } //设定过滤条件(PC站) if(!isSpider()&&defined('REQUEST_FROM')&&REQUEST_FROM==1&&Yii::$app->controller->module->badwordconfig['open_pc']) { if(is_array($badwords))foreach($badwords as $badword) { if(strpos($kw,$badword)!==false) { return ['resultList'=>[],'searchConditions'=>$searchConditions,'st'=>[],'count'=>0,'pages'=>[],'pageCount'=>0,'contentFilterConfig'=>[],'currentPage'=>0,'pageSize'=>0]; } } } } } return ['resultList'=>$resultList,'searchConditions'=>$searchConditions,'st'=>$st,'count'=>$count,'pages'=>$pages,'pageCount'=>ceil($count/$pageSize),'contentFilterConfig'=>$contentFilterConfig,'currentPage'=>$page,'pageSize'=>$pageSize]; } //列表页Sphinx查询 public function doList($query,$sql,$sqlInfo,$table,$pageSize,$higherconfig=null) { require(BASE_PATH.'common'.DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'sphinxapi.php'); $page = Yii::$app->request->get('page',1); $higherconfig = $higherconfig?$higherconfig:Yii::$app->controller->module->higherconfig; if($higherconfig['open_sphinx']) { $contentModel = ContentModel::find()->where("table_name='".$table."'")->one(); $cl = new \SphinxClient (); $host = "localhost"; $port = 9312; //此处变量名称与内容模型主表名一一对应 $searchModelList = getSysconfigValue('search_models_flag'); $index = $higherconfig[$searchModelList[$contentModel->model_id].'_index']; $cl->SetServer ( $host, $port ); $connect = $cl->_Connect(); if(!$connect) { $this->showMessage(array('class'=>'danger','message'=>'sphinx连接失败'),1); } $cl->SetConnectTimeout ( 1 ); $cl->SetArrayResult ( true ); $cl->SetMatchMode(SPH_MATCH_EXTENDED2); $cl->SetLimits(($page-1)*$pageSize,$pageSize); if(empty($sqlInfo['order']))$sqlInfo['order']="order by create_time desc"; $cl->SetSortMode(SPH_SORT_EXTENDED, str_replace("order by ","",$sqlInfo['order'])); $fieldList = ContentModelField::find()->where("model_id=".$contentModel->model_id)->all(); if(is_array($fieldList))foreach($fieldList as $field) { $sql = str_replace($field->field,'@'.$field->field,$sql); } $sql = str_replace('and','&',$sql); $sql = str_replace('or','|',$sql); $sql = str_replace('%','',$sql); $sql = str_replace('like','',$sql); $res = $cl -> query($sql,$index); $count = $res['total_found']; /* echo $sql; echo "Query failed: " . $cl->GetLastError() . ".\n"; echo json_encode($res);*/ $resultList = []; //定义关键字标注内容 if(is_array($res['matches']))foreach($res['matches'] as $k=>$match) { $resultList[$k] = $res['matches'][$k]['attrs']; $resultList[$k]['id'] = $match['id']; } $pages = new Pagination([ 'totalCount' => $count, 'pageSize' => $pageSize, 'defaultPageSize' => $pageSize, //添加默认 ]); $return = [ 'count'=>$count, 'pages'=>$pages, 'pageSize'=>$pageSize, 'resultList'=>$resultList, ]; } else { $query->where($sql); //没有排序条件,默认按最新上传时间 if(empty($sqlInfo['order']))$sqlInfo['order']="order by create_time desc"; $query->orderBy(str_replace('order by ','',$sqlInfo['order'])); //分页 $countQuery = clone $query; $pages = new Pagination([ 'totalCount' => $countQuery->count(), 'pageSize' => $pageSize, 'defaultPageSize' => $pageSize //添加默认 ]); $resultList = $query->offset($pages->offset)->limit($pages->limit)->all(); $return = [ 'count'=>$countQuery->count(), 'pages'=>$pages, 'pageSize'=>$pageSize, 'resultList'=>$resultList, ]; } return $return; } }