www.gusucode.com > iCMS 基于HTML5的多终端建站系统 v6.0.7源码程序 > icms_v6.0.7.1/app/article/article.func.php
<?php /** * @package iCMS * @copyright 2007-2010, iDreamSoft * @license http://www.idreamsoft.com iDreamSoft * @author coolmoo <idreamsoft@qq.com> * @$Id: article.tpl.php 2408 2014-04-30 18:58:23Z coolmoo $ */ defined('iPHP') OR exit('What are you doing?'); iPHP::app('tag.class','static'); function article_list($vars){ if($vars['loop']==="rel" && empty($vars['id'])){ return false; } $resource = array(); $map_where = array(); $status = '1'; isset($vars['status']) && $status = (int)$vars['status']; $where_sql = "WHERE `status`='{$status}'"; $vars['call'] =='user' && $where_sql.= " AND `postype`='0'"; $vars['call'] =='admin' && $where_sql.= " AND `postype`='1'"; $hidden = iCache::get('iCMS/category/hidden'); $hidden && $where_sql.=iPHP::where($hidden,'cid','not'); $maxperpage = isset($vars['row'])?(int)$vars['row']:10; $cache_time = isset($vars['time'])?(int)$vars['time']:-1; isset($vars['userid'])&& $where_sql.= " AND `userid`='{$vars['userid']}'"; isset($vars['weight']) && $where_sql.= " AND `weight`='"._int($vars['weight'])."'"; if(isset($vars['ucid']) && $vars['ucid']!=''){ $where_sql.= " AND `ucid`='{$vars['ucid']}'"; } if(isset($vars['cid!'])){ $ncids = explode(',',$vars['cid!']); $vars['sub'] && $ncids+=iCMS::get_category_ids($ncids,true); $where_sql.= iPHP::where($ncids,'cid','not'); } if($vars['cid'] && !isset($vars['cids'])){ $cid = explode(',',$vars['cid']); $vars['sub'] && $cid+=iCMS::get_category_ids($cid,true); $where_sql.= iPHP::where($cid,'cid'); } if(isset($vars['cids']) && !$vars['cid']){ $cids = explode(',',$vars['cids']); $vars['sub'] && $cids+=iCMS::get_category_ids($vars['cids'],true); if($cids){ iPHP::import(iPHP_APP_CORE .'/iMAP.class.php'); map::init('category',iCMS_APP_ARTICLE); $map_where+=map::where($cids); } } if(isset($vars['pid']) && !isset($vars['pids'])){ $where_sql.= iPHP::where($vars['pid'],'pid'); } if(isset($vars['pids']) && !isset($vars['pid'])){ iPHP::import(iPHP_APP_CORE .'/iMAP.class.php'); map::init('prop',iCMS_APP_ARTICLE); $map_where+=map::where($vars['pids']); } if(isset($vars['tids'])){ iPHP::import(iPHP_APP_CORE .'/iMAP.class.php'); map::init('tags',iCMS_APP_ARTICLE); $map_where+=map::where($vars['tids']); } if(isset($vars['keywords'])){//最好使用 iCMS:article:search if(empty($vars['keywords'])) return; if(strpos($vars['keywords'],',')===false){ $vars['keywords'] = str_replace(array('%','_'),array('\%','\_'),$vars['keywords']); $where_sql.= " AND CONCAT(title,keywords,description) like '%".addslashes($vars['keywords'])."%'"; }else{ $kws = explode(',',$vars['keywords']); foreach($kws AS $kwv){ $keywords.= addslashes($kwv)."|"; } $keywords = substr($keywords,0,-1); $where_sql.= " AND CONCAT(title,keywords,description) REGEXP '$keywords' "; } } $vars['id'] && $where_sql.= iPHP::where($vars['id'],'id'); $vars['id!']&& $where_sql.= iPHP::where($vars['id!'],'id','not'); $by=$vars['by']=="ASC"?"ASC":"DESC"; isset($vars['pic']) && $where_sql.= " AND `haspic`='1'"; isset($vars['nopic'])&& $where_sql.= " AND `haspic`='0'"; switch ($vars['orderby']) { case "id": $order_sql = " ORDER BY `id` $by"; break; case "hot": $order_sql = " ORDER BY `hits` $by"; break; case "week": $order_sql = " ORDER BY `hits_week` $by"; break; case "month": $order_sql = " ORDER BY `hits_month` $by"; break; case "comment": $order_sql = " ORDER BY `comments` $by"; break; case "pubdate": $order_sql = " ORDER BY `pubdate` $by"; break; case "disorder": $order_sql = " ORDER BY `ordernum` $by"; break; case "rand": $order_sql = " ORDER BY rand() $by"; break; case "weight": $order_sql = " ORDER BY `weight`,`ordernum` ASC"; break; default:$order_sql = " ORDER BY `id` $by"; } isset($vars['startdate'])&& $where_sql .= " AND `pubdate`>='".strtotime($vars['startdate'])."'"; isset($vars['enddate']) && $where_sql .= " AND `pubdate`<='".strtotime($vars['enddate'])."'"; isset($vars['where']) && $where_sql .= $vars['where']; if($map_where){ $map_sql = iCMS::map_sql($map_where,'join'); //join //empty($vars['cid']) && $map_order_sql = " ORDER BY map.`iid` $by"; $map_table = 'map'; $vars['map_order_table'] && $map_table = $vars['map_order_table']; $map_order_sql = " ORDER BY {$map_table}.`iid` $by"; //$map_order_sql = " ORDER BY `icms_article`.`id` $by"; // $where_sql.= ' AND '.$map_sql['where']; $where_sql = ",{$map_sql['from']} {$where_sql} AND `#iCMS@__article`.`id` = {$map_table}.`iid`"; //derived // $where_sql = ",({$map_sql}) map {$where_sql} AND `id` = map.`iid`"; } $offset = 0; $limit = "LIMIT {$maxperpage}"; if($vars['page']){ $total_type = $vars['total_cache']?$vars['total_cache']:null; $total = iPHP::total('sql.md5',"SELECT count(*) FROM `#iCMS@__article` {$where_sql}",$total_type); $pagenav = isset($vars['pagenav'])?$vars['pagenav']:"pagenav"; $pnstyle = isset($vars['pnstyle'])?$vars['pnstyle']:0; $multi = iCMS::page(array('total_type'=>$total_type,'total'=>$total,'perpage'=>$maxperpage,'unit'=>iPHP::lang('iCMS:page:list'),'nowindex'=>$GLOBALS['page'])); $offset = $multi->offset; $limit = "LIMIT {$offset},{$maxperpage}"; iPHP::assign("article_list_total",$total); } $hash = md5($where_sql.$order_sql.$limit); if($offset){ if($vars['cache']){ $map_cache_name = iPHP_DEVICE.'/article_page/'.$hash; $ids_array = iCache::get($map_cache_name); } if(empty($ids_array)){ $ids_order_sql = $map_order_sql?$map_order_sql:$order_sql; $ids_array = iDB::all("SELECT `#iCMS@__article`.`id` FROM `#iCMS@__article` {$where_sql} {$ids_order_sql} {$limit}"); iPHP_SQL_DEBUG && iDB::debug(1); $vars['cache'] && iCache::set($map_cache_name,$ids_array,$cache_time); } $ids = iCMS::get_ids($ids_array); $ids = $ids?$ids:'0'; $where_sql = "WHERE `id` IN({$ids})"; $limit = ''; }else{ if($map_order_sql){ $order_sql = $map_order_sql; } } if($vars['cache']){ $cache_name = iPHP_DEVICE.'/article/'.$hash; $resource = iCache::get($cache_name); } // $func = '__article_array'; // if($vars['func']=="user_home"){ //暂时只有一个选项 // $func = '__article_user_home_array'; // } if(empty($resource)){ $resource = iDB::all("SELECT `#iCMS@__article`.* FROM `#iCMS@__article` {$where_sql} {$order_sql} {$limit}"); iPHP_SQL_DEBUG && iDB::debug(1); $resource = __article_array($vars,$resource); $vars['cache'] && iCache::set($cache_name,$resource,$cache_time); } //print_r($resource); return $resource; } function article_search($vars){ if(empty(iCMS::$config['sphinx']['host'])) return array(); $resource = array(); $hidden = iCache::get('iCMS/category/hidden'); $hidden && $where_sql .=iPHP::where($hidden,'cid','not'); $SPH = iCMS::sphinx(); $SPH->init(); $SPH->SetArrayResult(true); if(isset($vars['weights'])){ //weights='title:100,tags:80,keywords:60,name:50' $wa=explode(',',$vars['weights']); foreach($wa AS $wk=>$wv){ $waa=explode(':',$wv); $FieldWeights[$waa[0]]=$waa[1]; } $FieldWeights OR $FieldWeights=array("title" => 100,"tags" => 80,"name" => 60,"keywords" => 40); $SPH->SetFieldWeights($FieldWeights); } $page = (int)$_GET['page']; $maxperpage = isset($vars['row'])?(int)$vars['row']:10; $start = ($page && isset($vars['page']))?($page-1)*$maxperpage:0; $SPH->SetMatchMode(SPH_MATCH_EXTENDED); if($vars['mode']){ $vars['mode'] =="SPH_MATCH_BOOLEAN" && $SPH->SetMatchMode(SPH_MATCH_BOOLEAN); $vars['mode'] =="SPH_MATCH_ANY" && $SPH->SetMatchMode(SPH_MATCH_ANY); $vars['mode'] =="SPH_MATCH_PHRASE" && $SPH->SetMatchMode(SPH_MATCH_PHRASE); $vars['mode'] =="SPH_MATCH_ALL" && $SPH->SetMatchMode(SPH_MATCH_ALL); $vars['mode'] =="SPH_MATCH_EXTENDED" && $SPH->SetMatchMode(SPH_MATCH_EXTENDED); } isset($vars['userid']) && $SPH->SetFilter('userid',array($vars['userid'])); isset($vars['postype'])&& $SPH->SetFilter('postype',array($vars['postype'])); if(isset($vars['cid'])){ $cids = $vars['sub']?iCMS::get_category_ids($vars['cid'],true):(array)$vars['cid']; $cids OR $cids = (array)$vars['cid']; $cids = array_map("intval", $cids); $SPH->SetFilter('cid',$cids); } if(isset($vars['startdate'])){ $startime = strtotime($vars['startdate']); $enddate = empty($vars['enddate'])?time():strtotime($vars['enddate']); $SPH->SetFilterRange('pubdate',$startime,$enddate); } $SPH->SetLimits($start,$maxperpage,10000); $orderby = '@id DESC, @weight DESC'; $order_sql = ' order by id DESC'; $vars['orderby'] && $orderby = $vars['orderby']; $vars['ordersql']&& $order_sql = ' order by '.$vars['ordersql']; $vars['pic'] && $SPH->SetFilter('haspic',array(1)); $vars['id!'] && $SPH->SetFilter('@id',array($vars['id!']),true); $SPH->setSortMode(SPH_SORT_EXTENDED,$orderby); $query = str_replace(',','|',$vars['q']); $vars['acc']&& $query = '"'.$vars['q'].'"'; $vars['@'] && $query = '@('.$vars['@'].') '.$query; $res = $SPH->Query($query,iCMS::$config['sphinx']['index']); if (is_array($res["matches"])){ foreach ( $res["matches"] as $docinfo ){ $aid[]=$docinfo['id']; } $aids=implode(',',(array)$aid); } if(empty($aids)) return; $where_sql=" `id` in($aids)"; $offset = 0; if($vars['page']){ $total = $res['total']; iPHP::assign("article_search_total",$total); $pagenav = isset($vars['pagenav'])?$vars['pagenav']:"pagenav"; $pnstyle = isset($vars['pnstyle'])?$vars['pnstyle']:0; $multi = iCMS::page(array('total'=>$total,'perpage'=>$maxperpage,'unit'=>iPHP::lang('iCMS:page:list'),'nowindex'=>$GLOBALS['page'])); $offset = $multi->offset; } $resource = iDB::all("SELECT * FROM `#iCMS@__article` WHERE {$where_sql} {$order_sql} LIMIT {$maxperpage}"); iPHP_SQL_DEBUG && iDB::debug(1); $resource = __article_array($vars,$resource); return $resource; } function __article_array($vars,$variable){ $resource = array(); if($variable){ $articleApp = iPHP::app("article"); $vars['category_lite'] = true; foreach ($variable as $key => $value) { $value = $articleApp->value($value,false,$vars); if($value===false){ continue; } if($vars['page']){ $value['page'] = $GLOBALS['page']?$GLOBALS['page']:1; $value['total'] = $total; } if($vars['archive']=="date"){ $_date = archive_date($value['postime']); //var_dump($_date); //$_date = get_date($value['postime'],'Ymd'); unset($resource[$key]); $resource[$_date][$key] = $value; }else{ $resource[$key] = $value; } } } return $resource; }