862 lines
23 KiB
PHP
862 lines
23 KiB
PHP
<?php
|
||
|
||
/**
|
||
* [Discuz!] (C)2001-2099 Comsenz Inc.
|
||
* This is NOT a freeware, use is subject to license terms
|
||
*
|
||
* $Id: SearchHelper.php 33013 2013-04-08 03:31:33Z liulanbo $
|
||
*/
|
||
|
||
if(!defined('IN_DISCUZ')) {
|
||
exit('Access Denied');
|
||
}
|
||
|
||
class Cloud_Service_SearchHelper {
|
||
|
||
protected static $_instance;
|
||
|
||
public static function getInstance() {
|
||
|
||
if (!(self::$_instance instanceof self)) {
|
||
self::$_instance = new self();
|
||
}
|
||
|
||
return self::$_instance;
|
||
}
|
||
|
||
public function __construct() {
|
||
|
||
}
|
||
|
||
public function getTables($table) {
|
||
if(!in_array($table, array('post', 'thread'))) {
|
||
return false;
|
||
}
|
||
$infos = getglobal($table.'table_info');
|
||
if ($infos) {
|
||
$tables = array();
|
||
foreach($infos as $id => $row) {
|
||
$tables[$id] = $id;
|
||
}
|
||
} else {
|
||
$tables = array(0);
|
||
}
|
||
return $tables;
|
||
}
|
||
|
||
private function _convertForum($row) {
|
||
$result = array();
|
||
$map = array(
|
||
'fid' => 'fId',
|
||
'fup' => 'pId',
|
||
'name' => 'fName',
|
||
'type' => 'type',
|
||
'displayorder' => 'displayOrder',
|
||
);
|
||
foreach($row as $k => $v) {
|
||
if (array_key_exists($k, $map)) {
|
||
$result[$map[$k]] = $v;
|
||
continue;
|
||
}
|
||
|
||
if ($k == 'status') {
|
||
$isGroup = false;
|
||
switch ($v) {
|
||
case '0' :
|
||
$displayStatus = 'hidden';
|
||
break;
|
||
case '1' :
|
||
$displayStatus = 'normal';
|
||
break;
|
||
case '2' :
|
||
$displayStatus = 'some';
|
||
break;
|
||
case '3' :
|
||
$displayStatus = 'normal';
|
||
$isGroup = true;
|
||
break;
|
||
default :
|
||
$displayStatus = 'unknown';
|
||
}
|
||
$result['displayStatus'] = $displayStatus;
|
||
$result['isGroup'] = $isGroup;
|
||
}
|
||
}
|
||
$formula = dunserialize($row['formulaperm']);
|
||
$result['isFormula'] = $formula[1] ? TRUE : FALSE;
|
||
$result['sign'] = md5(serialize($result));
|
||
return $result;
|
||
}
|
||
|
||
public function getForums($fIds = array()) {
|
||
|
||
if($fIds) {
|
||
$forums = C::t('forum_forum')->fetch_all_info_by_fids($fIds);
|
||
} else {
|
||
$forums = C::t('forum_forum')->fetch_all_info_by_fids(0, 0, 0, 0, 0, 0, 1);
|
||
}
|
||
|
||
$result = array();
|
||
$result['totalNum'] = count($forums);
|
||
|
||
foreach($forums as $forum) {
|
||
$result['data'][$forum['fid']] = self::_convertForum($forum);
|
||
}
|
||
|
||
if (!$fIds) {
|
||
$result['sign'] = md5(serialize($result['data']));
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function getUserGroupPermissions($userGroupIds) {
|
||
|
||
global $_G;
|
||
$userGroups = array();
|
||
if ($_G['setting']['verify']['enabled']) {
|
||
foreach ($userGroupIds as $groupId) {
|
||
if (dintval($groupId) > 65500) {
|
||
$vGid = $groupId - 65500;
|
||
if ($_G['setting']['verify'][$vGid]['available']) {
|
||
$key = array_search($groupId, $userGroupIds);
|
||
unset($userGroupIds[$key]);
|
||
$userGroups['v' . $vGid] = array();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$fields = array(
|
||
'groupid' => 'userGroupId',
|
||
'grouptitle' => 'userGroupName',
|
||
'readaccess' => 'readPermission',
|
||
'allowvisit' => 'allowVisit',
|
||
'allowsearch' => 'searchLevel',
|
||
);
|
||
$userGroup= C::t('common_usergroup')->fetch_all((array)$userGroupIds);
|
||
$userGroupField = C::t('common_usergroup_field')->fetch_all_fields((array)$userGroupIds, array('readaccess', 'allowsearch'));
|
||
foreach(array_merge($userGroup, $userGroupField) as $row) {
|
||
foreach($row as $k => $v) {
|
||
if (array_key_exists($k, $fields)) {
|
||
if ($k == 'allowsearch') {
|
||
$userGroups[$row['groupid']]['allowSearchAlbum'] = ($v & 8) ? true : false;
|
||
$userGroups[$row['groupid']]['allowSearchBlog'] = ($v & 4) ? true : false;
|
||
$userGroups[$row['groupid']]['allowSearchForum'] = ($v & 2) ? true : false;
|
||
$userGroups[$row['groupid']]['allowSearchPortal'] = ($v & 1) ? true : false;
|
||
$userGroups[$row['groupid']]['allowFulltextSearch'] = ($v & 32) ? true : false;
|
||
} else {
|
||
$userGroups[$row['groupid']][$fields[$k]] = $v;
|
||
}
|
||
}
|
||
$userGroups[$row['groupid']]['forbidForumIds'] = array();
|
||
$userGroups[$row['groupid']]['allowForumIds'] = array();
|
||
$userGroups[$row['groupid']]['specifyAllowForumIds'] = array();
|
||
}
|
||
}
|
||
|
||
$fIds = array();
|
||
foreach(C::t('forum_forum')->fetch_all_by_status('1') as $row) {
|
||
$fIds[$row['fid']] = $row['fid'];
|
||
}
|
||
|
||
$fieldForums = array();
|
||
foreach(C::t('forum_forumfield')->fetch_all_by_fid($fIds) as $row) {
|
||
$fieldForums[$row['fid']] = $row;
|
||
}
|
||
|
||
foreach($fIds as $fId) {
|
||
$row = $fieldForums[$fId];
|
||
$allowViewGroupIds = array();
|
||
if ($row['viewperm']) {
|
||
$allowViewGroupIds = explode("\t", $row['viewperm']);
|
||
}
|
||
foreach($userGroups as $gid => $_v) {
|
||
if ($row['password']) {
|
||
$userGroups[$gid]['forbidForumIds'][] = $fId;
|
||
continue;
|
||
}
|
||
$perm = dunserialize($row['formulaperm']);
|
||
if(is_array($perm)) {
|
||
$spviewperm = explode("\t", $row['spviewperm']);
|
||
if (in_array($gid, $spviewperm)) {
|
||
$userGroups[$gid]['allowForumIds'][] = $fId;
|
||
$userGroups[$gid]['specifyAllowForumIds'][] = $fId;
|
||
continue;
|
||
}
|
||
if ($perm[0] || $perm[1] || $perm['users']) {
|
||
$userGroups[$gid]['forbidForumIds'][] = $fId;
|
||
continue;
|
||
}
|
||
}
|
||
if (!$allowViewGroupIds) {
|
||
$userGroups[$gid]['allowForumIds'][] = $fId;
|
||
} elseif (!in_array($gid, $allowViewGroupIds)) {
|
||
$userGroups[$gid]['forbidForumIds'][] = $fId;
|
||
} elseif (in_array($gid, $allowViewGroupIds)) {
|
||
$userGroups[$gid]['allowForumIds'][] = $fId;
|
||
$userGroups[$gid]['specifyAllowForumIds'][] = $fId;
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach ($userGroups as $groupId => $v) {
|
||
if (substr($groupId, 0, 1) == 'v') {
|
||
$verifyKey = 65500 + dintval(substr($groupId, 1));
|
||
$v['userGroupId'] = $verifyKey;
|
||
$userGroups[$verifyKey] = $v;
|
||
unset($userGroups[$groupId]);
|
||
}
|
||
}
|
||
|
||
foreach($userGroups as $k => $v) {
|
||
ksort($v);
|
||
$userGroups[$k]['sign'] = md5(serialize($v));
|
||
}
|
||
return $userGroups;
|
||
}
|
||
|
||
public function getGuestPerm($gfIds = array()) {
|
||
$perm = self::getUserGroupPermissions(array(7));
|
||
$guestPerm = $perm[7];
|
||
if ($gfIds) {
|
||
foreach(C::t('forum_forumfield')->fetch_all_by_fid($gfIds) as $row) {
|
||
if ($row['gviewperm'] == 1) {
|
||
$guestPerm['allowForumIds'][] = $row['fid'];
|
||
} else {
|
||
$guestPerm['forbidForumIds'][] = $row['fid'];
|
||
}
|
||
}
|
||
|
||
}
|
||
return $guestPerm;
|
||
}
|
||
|
||
public function convertThread($row) {
|
||
$result = array();
|
||
$map = array(
|
||
'tid' => 'tId',
|
||
'fid' => 'fId',
|
||
'authorid' => 'authorId',
|
||
'author' => 'authorName',
|
||
'special' => 'specialType',
|
||
'price' => 'price',
|
||
'subject' => 'subject',
|
||
'readperm' => 'readPermission',
|
||
'lastposter' => 'lastPoster',
|
||
'views' => 'viewNum',
|
||
'replies' => 'replyNum',
|
||
'displayorder' => 'stickLevel',
|
||
'highlight' => 'isHighlight',
|
||
'digest' => 'digestLevel',
|
||
'rate' => 'rate',
|
||
'attachment' => 'isAttached',
|
||
'moderated' => 'isModerated',
|
||
'closed' => 'isClosed',
|
||
'supe_pushstatus' => 'supeSitePushStatus',
|
||
'recommends' => 'recommendTimes',
|
||
'recommend_add' => 'recommendSupportTimes',
|
||
'recommend_sub' => 'recommendOpposeTimes',
|
||
'heats' => 'heats',
|
||
'pid' => 'pId',
|
||
'isgroup' => 'isGroup',
|
||
'posttableid' => 'postTableId',
|
||
'favtimes' => 'favoriteTimes',
|
||
'sharetimes'=> 'shareTimes',
|
||
'icon' => 'icon',
|
||
);
|
||
$map2 = array(
|
||
'dateline' => 'createdTime',
|
||
'lastpost' => 'lastPostedTime',
|
||
);
|
||
foreach($row as $k => $v) {
|
||
if (array_key_exists($k, $map)) {
|
||
if ($k == 'special') {
|
||
switch($v) {
|
||
case 1:
|
||
$v = 'poll';
|
||
break;
|
||
case 2:
|
||
$v = 'trade';
|
||
break;
|
||
case 3:
|
||
$v = 'reward';
|
||
break;
|
||
case 4:
|
||
$v = 'activity';
|
||
break;
|
||
case 5:
|
||
$v = 'debate';
|
||
break;
|
||
case 127:
|
||
$v = 'plugin';
|
||
break;
|
||
default:
|
||
$v = 'normal';
|
||
}
|
||
}
|
||
|
||
if ($k == 'displayorder') {
|
||
if ($v >= 0) {
|
||
$result['displayStatus'] = 'normal';
|
||
} elseif ($v == -1) {
|
||
$result['displayStatus'] = 'recycled';
|
||
} elseif ($v == -2) {
|
||
$result['displayStatus'] = 'unapproved';
|
||
} elseif ($v == -3) {
|
||
$result['displayStatus'] = 'ignored';
|
||
} elseif ($v == -4) {
|
||
$result['displayStatus'] = 'draft';
|
||
} else {
|
||
$result['displayStatus'] = 'unknown';
|
||
}
|
||
|
||
switch($v) {
|
||
case 1:
|
||
$v = 'board';
|
||
break;
|
||
case 2:
|
||
$v = 'group';
|
||
break;
|
||
case 3:
|
||
$v = 'global';
|
||
break;
|
||
case 0:
|
||
default:
|
||
$v = 'none';
|
||
}
|
||
}
|
||
|
||
if (in_array($k, array('highlight', 'moderated', 'closed', 'isgroup'))) {
|
||
$v = $v ? true : false;
|
||
}
|
||
$result[$map[$k]] = $v;
|
||
} elseif (array_key_exists($k, $map2)) {
|
||
$result[$map2[$k]] = dgmdate($v, 'Y-m-d H:i:s', 8);
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function preGetThreads($tableid, $tIds) {
|
||
$result = array();
|
||
if($tIds) {
|
||
foreach(C::t('forum_thread')->fetch_all_by_tid($tIds, 0, 0, $tableid) as $thread) {
|
||
$result[$thread['tid']] = self::convertThread($thread);
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function getThreadPosts($tIds) {
|
||
$result = array();
|
||
foreach($tIds as $postTableId => $_tIds) {
|
||
foreach(C::t('forum_post')->fetch_all_by_tid($postTableId, $_tIds, true, '', 0, 0, 1) as $post) {
|
||
$result[$post['tid']] = self::convertPost($post);
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function getThreads($tIds, $isReturnPostId = true) {
|
||
global $_G;
|
||
$tables = array();
|
||
$infos = $_G['setting']['threadtable_info'];
|
||
if ($infos) {
|
||
foreach($infos as $id => $row) {
|
||
$tables[] = $id;
|
||
}
|
||
} else {
|
||
$tables = array('forum_thread');
|
||
}
|
||
|
||
$tableNum = count($tables);
|
||
$res = $data = $_tableInfo = array();
|
||
for($i = 0; $i < $tableNum; $i++) {
|
||
$_threads = self::preGetThreads($tables[$i], $tIds);
|
||
if ($_threads) {
|
||
if (!$data) {
|
||
$data = $_threads;
|
||
} else {
|
||
$data = $data + $_threads;
|
||
}
|
||
if (count($data) == count($tIds)) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if ($isReturnPostId) {
|
||
$threadIds = array();
|
||
foreach($data as $tId => $thread) {
|
||
$postTableId = $thread['postTableId'];
|
||
$threadIds[$postTableId][] = $tId;
|
||
}
|
||
|
||
$threadPosts = self::getThreadPosts($threadIds);
|
||
foreach($data as $tId => $thread) {
|
||
$data[$tId]['pId'] = $threadPosts[$tId]['pId'];
|
||
}
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
public function convertPost($row) {
|
||
$result = array();
|
||
$map = array('pid' => 'pId',
|
||
'tid' => 'tId',
|
||
'fid' => 'fId',
|
||
'authorid' => 'authorId',
|
||
'author' => 'authorName',
|
||
'useip' => 'authorIp',
|
||
'anonymous' => 'isAnonymous',
|
||
'subject' => 'subject',
|
||
'message' => 'content',
|
||
'invisible' => 'displayStatus',
|
||
'htmlon' => 'isHtml',
|
||
'attachment' => 'isAttached',
|
||
'rate' => 'rate',
|
||
'ratetimes' => 'rateTimes',
|
||
'dateline' => 'createdTime',
|
||
'first' => 'isThread',
|
||
);
|
||
$map2 = array(
|
||
'bbcodeoff' => 'isBbcode',
|
||
'smileyoff' => 'isSmiley',
|
||
'parseurloff' => 'isParseUrl',
|
||
);
|
||
foreach($row as $k => $v) {
|
||
if (array_key_exists($k, $map)) {
|
||
if ($k == 'invisible') {
|
||
switch($v) {
|
||
case 0:
|
||
$v = 'normal';
|
||
break;
|
||
case -1:
|
||
$v = 'recycled';
|
||
break;
|
||
case -2:
|
||
$v = 'unapproved';
|
||
break;
|
||
case -3:
|
||
$v = 'ignored';
|
||
break;
|
||
case -4:
|
||
$v = 'draft';
|
||
break;
|
||
default:
|
||
$v = 'unkonwn';
|
||
}
|
||
}
|
||
if ($k == 'dateline') {
|
||
$result[$map[$k]] = dgmdate($v, 'Y-m-d H:i:s', 8);
|
||
continue;
|
||
}
|
||
|
||
if (in_array($k, array('htmlon', 'attachment', 'first', 'anonymous'))) {
|
||
$v = $v ? true : false;
|
||
}
|
||
|
||
$result[$map[$k]] = $v;
|
||
} elseif (array_key_exists($k, $map2)) {
|
||
$result[$map2[$k]] = $v ? false : true;
|
||
}
|
||
}
|
||
$result['isWarned'] = $result['isBanned'] = false;
|
||
if ($row['status'] & 1) {
|
||
$result['isBanned'] = true;
|
||
}
|
||
if ($row['status'] & 2) {
|
||
$result['isWarned'] = true;
|
||
}
|
||
$attachInfo = array();
|
||
if ($result['isAttached']) {
|
||
$attachIndex = C::t('forum_attachment')->fetch_all_by_id('pid', $row['pid']);
|
||
$attachment = C::t('forum_attachment_n')->fetch_all_by_id('pid:'.$row['pid'], 'pid', $row['pid'], 'aid');
|
||
$attachMap = array(
|
||
'aid' => 'aId',
|
||
'tid' => 'tId',
|
||
'pid' => 'pId',
|
||
'uid' => 'uId',
|
||
'dateline' => 'uploadedTime',
|
||
'filename' => 'fileName',
|
||
'filesize' => 'fileSize',
|
||
'attachment' => 'filePath',
|
||
'remote' => 'isRemote',
|
||
'description' => 'description',
|
||
'readperm' => 'readPerm',
|
||
'price' => 'price',
|
||
'isimage' => 'isImage',
|
||
'width' => 'width',
|
||
'thumb' => 'isThumb',
|
||
'picid' => 'picId',
|
||
);
|
||
foreach ($attachment as $k => $v) {
|
||
$attachTemp = array();
|
||
foreach ($v as $key => $val) {
|
||
if ($key == 'dateline') {
|
||
$attachTemp[$attachMap[$key]] = dgmdate($val, 'Y-m-d H:i:s', 8);
|
||
continue;
|
||
}
|
||
$attachTemp[$attachMap[$key]] = $val;
|
||
}
|
||
$attachInfo[$k] = $attachTemp;
|
||
$attachInfo[$k]['downloadTimes'] = $attachIndex[$k]['downloads'];
|
||
}
|
||
}
|
||
|
||
$result['attachInfo'] = $attachInfo;
|
||
return $result;
|
||
}
|
||
|
||
public function convertNav($row) {
|
||
$map = array( 'id' => 'id',
|
||
'name' => 'name',
|
||
'title' => 'title',
|
||
'url' => 'url',
|
||
'type' => 'provider',
|
||
'navtype' => 'navType',
|
||
'available' => 'available',
|
||
'displayorder' => 'displayOrder',
|
||
'target' => 'linkTarget',
|
||
'highlight' => 'highlight',
|
||
'level' => 'userGroupLevel',
|
||
'subtype' => 'subLayout',
|
||
'subcols' => 'subColNum',
|
||
'subname' => 'subName',
|
||
'suburl' => 'subUrl',
|
||
);
|
||
|
||
foreach($row as $k => $v) {
|
||
if (array_key_exists($k, $map)) {
|
||
if (in_array($k, array('available'))) {
|
||
$v = $v > 0 ? true : false;
|
||
}
|
||
if ($k == 'subtype') {
|
||
if ($v == 1) {
|
||
$v = 'parallel';
|
||
} else {
|
||
$v = 'menu';
|
||
}
|
||
}
|
||
if ($k == 'type') {
|
||
switch($v) {
|
||
case '1':
|
||
$v = 'user';
|
||
break;
|
||
case '0':
|
||
default:
|
||
$v = 'system';
|
||
break;
|
||
}
|
||
}
|
||
if ($k == 'navtype') {
|
||
switch($v) {
|
||
case 1:
|
||
$v = 'footer';
|
||
break;
|
||
case 2:
|
||
$v = 'space';
|
||
break;
|
||
case 3:
|
||
$v = 'my';
|
||
break;
|
||
case 0:
|
||
$v = 'header';
|
||
break;
|
||
}
|
||
}
|
||
$result[$map[$k]] = $v;
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function convertPoll($row) {
|
||
$map = array('polloptionid' => 'id',
|
||
'tid' => null,
|
||
'votes' => 'votes',
|
||
'displayorder' => 'displayOrder',
|
||
'polloption' => 'label',
|
||
'voterids' => 'voterIds',
|
||
);
|
||
$result = array();
|
||
foreach($row as $k => $v) {
|
||
$field = $map[$k];
|
||
if ($field !== null) {
|
||
$result[$field] = $v;
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function getPollInfo($tIds) {
|
||
$result = array();
|
||
foreach(C::t('forum_polloption')->fetch_all_by_tid($tIds) as $row) {
|
||
$result[$row['tid']][$row['polloptionid']] = self::convertPoll($row);
|
||
}
|
||
return $result;
|
||
|
||
}
|
||
|
||
public function getThreadSort($tIds) {
|
||
global $_G;
|
||
|
||
$optionvar = array();
|
||
foreach(C::t('forum_typeoptionvar')->fetch_all_by_tid_optionid($tIds) as $row) {
|
||
if(!isset($_G['cache']['threadsort_option_'.$row['sortid']])) {
|
||
loadcache(array('threadsort_option_'.$row['sortid']));
|
||
}
|
||
$title = $_G['cache']['threadsort_option_'.$row['sortid']][$row['optionid']]['title'];
|
||
$type = $_G['cache']['threadsort_option_'.$row['sortid']][$row['optionid']]['type'];
|
||
if($title && !in_array($type, array('image'))) {
|
||
$optionvar[$row['tid']][$title] = $row['value'];
|
||
}
|
||
}
|
||
return $optionvar;
|
||
}
|
||
|
||
|
||
|
||
public function allowSearchForum() {
|
||
C::t('common_usergroup_field')->update_allowsearch();
|
||
require_once libfile('function/cache');
|
||
updatecache('usergroups');
|
||
}
|
||
|
||
public function myThreadLog($opt, $data) {
|
||
global $_G;
|
||
|
||
$cloudAppService = Cloud::loadClass('Service_App');
|
||
if(!$cloudAppService->getCloudAppStatus('search')) return;
|
||
$data['action'] = $opt;
|
||
$data['dateline'] = time();
|
||
C::t('forum_threadlog')->insert($data, false, true);
|
||
}
|
||
|
||
public function myPostLog($opt, $data) {
|
||
global $_G;
|
||
|
||
$cloudAppService = Cloud::loadClass('Service_App');
|
||
if(!$cloudAppService->getCloudAppStatus('search')) return;
|
||
$data['action'] = $opt;
|
||
$data['dateline'] = time();
|
||
C::t('forum_postlog')->insert($data, false, true);
|
||
}
|
||
|
||
public function getRelatedThreadsTao($keyword, $page, $tpp, $excludeForumIds = '', $cache = false) {
|
||
global $_G;
|
||
|
||
$sId = $_G['setting']['my_siteid'];
|
||
$result = array();
|
||
if($sId) {
|
||
if($cache === true) {
|
||
$kname = 'search_recommend_thread_'.$keyword.'_'.$page.'_'.$excludeForumIds;
|
||
loadcache($kname);
|
||
}
|
||
if(isset($_G['cache'][$kname]['ts']) && (TIMESTAMP - $_G['cache'][$kname]['ts'] <= 21600)) {
|
||
$result = $_G['cache'][$kname]['result'];
|
||
} else {
|
||
|
||
$apiUrl = 'http://api.discuz.qq.com/search/discuz/tao?';
|
||
$params = array(
|
||
'sId' => $sId,
|
||
'q' => $keyword,
|
||
'tpp' => $tpp,
|
||
'excludeForumIds' => $excludeForumIds,
|
||
'page' => $page ? $page : 1,
|
||
'clientIp' => $_G['clientip']
|
||
);
|
||
|
||
$utilService = Cloud::loadClass('Service_Util');
|
||
$response = dfsockopen($apiUrl.$utilService->generateSiteSignUrl($params), 0, '', '', false, $_G['setting']['cloud_api_ip']);
|
||
require_once libfile('class/xml');
|
||
$result = (array) xml2array($response);
|
||
|
||
if($cache === true && isset($result['status']) && $result['status'] == 0) {
|
||
save_syscache($kname, array('ts' => TIMESTAMP, 'result' => $result));
|
||
}
|
||
if($result['status'] != 0) {
|
||
$result = null;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
public function getRelatedThreads($fId, $cache = false) {
|
||
global $_G;
|
||
|
||
$sId = $_G['setting']['my_siteid'];
|
||
$result = array();
|
||
if($sId) {
|
||
if($cache === true) {
|
||
$kname = 'search_recommend_fidthread_'.$fId;
|
||
loadcache($kname);
|
||
}
|
||
if(isset($_G['cache'][$kname]['ts']) && (TIMESTAMP - $_G['cache'][$kname]['ts'] <= 21600)) {
|
||
$result = $_G['cache'][$kname]['result'];
|
||
} else {
|
||
|
||
$apiUrl = 'http://api.discuz.qq.com/search/discuz/forumRelated?';
|
||
$params = array(
|
||
'sId' => $sId,
|
||
'fId' => $fId,
|
||
'clientIp' => $_G['clientip']
|
||
);
|
||
|
||
$utilService = Cloud::loadClass('Service_Util');
|
||
$response = dfsockopen($apiUrl.$utilService->generateSiteSignUrl($params), 0, '', '', false, $_G['setting']['cloud_api_ip']);
|
||
require_once libfile('class/xml');
|
||
$result = (array) xml2array($response);
|
||
|
||
if($cache === true && isset($result['status']) && $result['status'] == 0) {
|
||
save_syscache($kname, array('ts' => TIMESTAMP, 'result' => $result));
|
||
}
|
||
if($result['status'] != 0) {
|
||
$result = null;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
|
||
public function getRecWords($needNum = 14, $format = 'num', $fid = 0) {
|
||
global $_G;
|
||
|
||
$sId = $_G['setting']['my_siteid'];
|
||
$data = array();
|
||
|
||
if($sId) {
|
||
$fid = $fid ? $fid : 0;
|
||
$kname = 'search_recommend_words_' . $fid;
|
||
loadcache($kname);
|
||
|
||
$cacheLife = isset($_G['setting']['my_search_data']['recwords_lifetime']) ? intval($_G['setting']['my_search_data']['recwords_lifetime']) : 21600;
|
||
$cloudSettingTime = isset($_G['setting']['my_search_data']['set_forbidden_recwords_time']) ? intval($_G['setting']['my_search_data']['set_forbidden_recwords_time']) : 0;
|
||
$cacheSettingTime = isset($_G['cache'][$kname]['setting_ts']) ? intval($_G['cache'][$kname]['setting_ts']) : 0;
|
||
|
||
if((!$cloudSettingTime || $cloudSettingTime == $cacheSettingTime) && isset($_G['cache'][$kname]['ts']) && (TIMESTAMP - $_G['cache'][$kname]['ts'] <= $cacheLife)) {
|
||
$data = $_G['cache'][$kname]['result'];
|
||
} else {
|
||
$apiUrl = 'http://api.discuz.qq.com/search/recwords/get';
|
||
$params = array(
|
||
's_id' => $sId,
|
||
'f_id' => $fid,
|
||
'need_random' => false,
|
||
'need_num' => $needNum,
|
||
'version' => $format == 'num' ? 1 : 2, // 1:返回数字下标的结果集、2:返回关联数组形式的结果集
|
||
'close' => 1,
|
||
);
|
||
|
||
$utilService = Cloud::loadClass('Service_Util');
|
||
$response = dfsockopen($apiUrl, 0, $utilService->generateSiteSignUrl($params), '', false, $_G['setting']['cloud_api_ip']);
|
||
$result = (array) unserialize($response);
|
||
|
||
if(isset($result['status']) && $result['status'] === 0) {
|
||
$data = $result['result'];
|
||
|
||
if($cloudSettingTime) {
|
||
save_syscache($kname, array('ts' => TIMESTAMP, 'setting_ts' => $cloudSettingTime, 'result' => $data));
|
||
} else {
|
||
save_syscache($kname, array('ts' => TIMESTAMP, 'result' => $data));
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function makeSearchSignUrl() {
|
||
global $_G;
|
||
|
||
$url = '';
|
||
$params = array();
|
||
$mySearchData = $_G['setting']['my_search_data'];
|
||
$mySiteId = $_G['setting']['my_siteid'];
|
||
$mySiteKey = $_G['setting']['my_sitekey'];
|
||
|
||
$cloudAppService = Cloud::loadClass('Service_App');
|
||
if($mySearchData['status'] && $cloudAppService->getCloudAppStatus('search') && $mySiteId) {
|
||
$myExtGroupIds = array();
|
||
$_extGroupIds = explode("\t", $_G['member']['extgroupids']);
|
||
|
||
foreach($_extGroupIds as $v) {
|
||
if($v) {
|
||
$myExtGroupIds[] = $v;
|
||
}
|
||
}
|
||
|
||
$myExtGroupIdsStr = implode(',', $myExtGroupIds);
|
||
$params = array(
|
||
'sId' => $mySiteId,
|
||
'ts' => time(),
|
||
'cuId' => $_G['uid'],
|
||
'cuName' => $_G['username'],
|
||
'gId' => intval($_G['groupid']),
|
||
'agId' => intval($_G['adminid']),
|
||
'egIds' => $myExtGroupIdsStr,
|
||
'fmSign' => '',
|
||
);
|
||
|
||
$groupIds = array($params['gId']);
|
||
if($params['agId']) {
|
||
$groupIds[] = $params['agId'];
|
||
}
|
||
|
||
if($myExtGroupIds) {
|
||
$groupIds = array_merge($groupIds, $myExtGroupIds);
|
||
}
|
||
|
||
$groupIds = array_unique($groupIds);
|
||
foreach($groupIds as $v) {
|
||
$key = 'ugSign' . $v;
|
||
$params[$key] = '';
|
||
}
|
||
|
||
$extraParams = array();
|
||
if (isset($_G['setting']['verify']['enabled']) && $_G['setting']['verify']['enabled']) {
|
||
$verifyGroups = C::t('common_member_verify')->fetch($_G['uid']);
|
||
$extraParams['ext_vgIds'] = 0;
|
||
foreach ($verifyGroups as $k => $v) {
|
||
if ($k != 'uid') {
|
||
$position = dintval(substr($k, strlen('verify')));
|
||
$extraParams['ext_vgIds'] = setstatus($position, dintval($v), $extraParams['ext_vgIds']);
|
||
}
|
||
}
|
||
}
|
||
|
||
if ($_G['cookie']['ffids' . $_G['uid']]) {
|
||
$ext_ffids = str_replace('D', ',', authcode($_G['cookie']['ffids' . $_G['uid']], 'DECODE'));
|
||
$extraParams['ext_ffids'] = $ext_ffids;
|
||
}
|
||
|
||
if (!empty($extraParams)) {
|
||
ksort($extraParams);
|
||
$params = array_merge($params, $extraParams);
|
||
}
|
||
|
||
$params['sign'] = md5(implode('|', $params) . '|' . $mySiteKey);
|
||
|
||
if ($cloudAppService->getCloudAppStatus('connect') && $_G['member']['conopenid']) {
|
||
$connectService = Cloud::loadClass('Service_Connect');
|
||
$connectService->connectMergeMember();
|
||
$params['openid'] = $_G['member']['conopenid'];
|
||
}
|
||
|
||
$params['charset'] = $_G['charset'];
|
||
if($mySearchData['domain']) {
|
||
$domain = $mySearchData['domain'];
|
||
} else {
|
||
$domain = 'search.discuz.qq.com';
|
||
}
|
||
|
||
$url = 'http://' . $domain . '/f/discuz';
|
||
}
|
||
return !empty($url) ? array('url' => $url, 'params' => $params) : array();
|
||
}
|
||
} |