$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(); } }