function do_get_forum_data() { global $vbulletin, $db, $show, $vbphrase; $vbulletin->input->clean_array_gpc('r', array('forumids' => TYPE_STR)); if (!$vbulletin->GPC['forumids'] || strlen($vbulletin->GPC['forumids']) == 0) { return array('forums' => array()); } cache_ordered_forums(1, 1); $forumids = split(',', $vbulletin->GPC['forumids']); $forum_data = array(); foreach ($forumids as $forumid) { $foruminfo = fetch_foruminfo($forumid); $type = 'old'; if (is_array($foruminfo) and !empty($foruminfo['link'])) { // see if it is a redirect $type = 'link'; } else { if ($vbulletin->userinfo['lastvisitdate'] == -1) { $type = 'new'; } else { if ($vbulletin->options['threadmarking'] and $vbulletin->userinfo['userid']) { $userlastvisit = !empty($foruminfo['forumread']) ? $foruminfo['forumread'] : TIMENOW - $vbulletin->options['markinglimit'] * 86400; } else { $forumview = intval(fetch_bbarray_cookie('forum_view', $foruminfo['forumid'])); //use which one produces the highest value, most likely cookie $userlastvisit = $forumview > $vbulletin->userinfo['lastvisit'] ? $forumview : $vbulletin->userinfo['lastvisit']; } if ($foruminfo['lastpost'] and $userlastvisit < $foruminfo['lastpost']) { $type = 'new'; } else { $type = 'old'; } } } // If this forum has a password, check to see if we have // the proper cookie. If so, don't prompt for one $password = false; if ($foruminfo['password']) { $pw_ok = verify_forum_password($foruminfo['forumid'], $foruminfo['password'], false); if (!$pw_ok) { $password = true; } } $out = array('id' => $foruminfo['forumid'], 'new' => $type == 'new' ? true : false, 'name' => prepare_utf8_string(strip_tags($foruminfo['title'])), 'password' => $password); $icon = fr_get_forum_icon($foruminfo['forumid'], $foruminfo == 'new'); if ($icon) { $out['icon'] = $icon; } if ($foruminfo['link'] != '') { $link = fr_fix_url($foruminfo['link']); if (is_int($link)) { $out['id'] = $link; } else { $out['link'] = $link; } $linkicon = fr_get_forum_icon($foruminfo['forumid'], false, true); if ($linkicon) { $out['icon'] = $linkicon; } } if ($foruminfo['description'] != '') { $desc = prepare_utf8_string(strip_tags($foruminfo['description'])); if (strlen($desc) > 0) { $out['desc'] = $desc; } } $forum_data[] = $out; } return array('forums' => $forum_data); }
public function actionGetForumData() { $forumids = $this->_input->filterSingle('forumids', XenForo_Input::STRING); if (empty($forumids)) { return array('forums' => array()); } $visitor = XenForo_Visitor::getInstance(); $forum_model = $this->_getForumModel(); $node_model = $this->_getNodeModel(); $helper = $this->getHelper('ForumThreadPost'); $exclude = XenForo_Application::get('options')->forumrunnerExcludeForums; if (!$exclude) { $exclude = array(); } $forums = split(',', $forumids); $forum_data = array(); foreach ($forums as $forumid) { if (in_array($forumid, $exclude)) { continue; } $node_info = $node_model->getNodeById($forumid); $forum_info = null; if ($node_info['node_type_id'] == 'Forum') { try { $forum_info = $helper->assertForumValidAndViewable($forumid, array('readUserId' => $visitor['user_id'])); } catch (Exception $e) { json_error($e->getControllerResponse()->errorText->render()); } } else { if ($node_info['node_type_id'] == 'Category') { // We need to get the parent node_id info $node_info = $node_model->getNodeById($node_info['parent_node_id']); $tmp_data = $node_model->getNodeDataForListDisplay($node_info, 0); // Now, find our child and our data (mainly hasNew) $forum_info = $tmp_data['nodesGrouped'][$tmp_data['parentNodeId']][$forumid]; } } $hasNew = isset($forum_info['hasNew']) ? $forum_info['hasNew'] : isset($forum_info['forum_read_date']) && $forum_info['forum_read_date'] < $forum_info['last_post_date']; $out = array('id' => $forum_info['node_id'], 'new' => $hasNew, 'name' => prepare_utf8_string(strip_tags($forum_info['title']))); $icon = fr_get_forum_icon($forum_info['node_id'], $hasNew); if ($icon) { $out['icon'] = $icon; } if ($forum_info['description'] != '') { $desc = prepare_utf8_string(strip_tags($forum_info['description'])); if (strlen($desc)) { $out['desc'] = $desc; } } $forum_data[] = $out; } return array('forums' => $forum_data); }
function fr_construct_forum_bit($parentid, $depth = 0, $subsonly = 0) { global $vbulletin, $vbphrase, $show; global $imodcache, $lastpostarray, $counters, $inforum; // Get exclude IDs $exclude_ids = @explode(',', $vbulletin->options['forumrunner_exclude']); if (in_array('-1', $exclude_ids)) { $exclude_ids = array(); } if (in_array($parentid, $exclude_ids)) { return; } // this function takes the constant MAXFORUMDEPTH as its guide for how // deep to recurse down forum lists. if MAXFORUMDEPTH is not defined, // it will assume a depth of 2. // call fetch_last_post_array() first to get last post info for forums if (!is_array($lastpostarray)) { fetch_last_post_array($parentid); } if (empty($vbulletin->iforumcache["{$parentid}"])) { return; } if (!defined('MAXFORUMDEPTH')) { define('MAXFORUMDEPTH', 2); } $forumbits = ''; $depth++; if ($parentid == -1) { $parent_is_category = false; } else { $parentforum = $vbulletin->forumcache[$parentid]; $parent_is_category = !(bool) ($parentforum['options'] & $vbulletin->bf_misc_forumoptions['cancontainthreads']); } foreach ($vbulletin->iforumcache["{$parentid}"] as $forumid) { if (in_array($forumid, $exclude_ids)) { continue; } // grab the appropriate forum from the $vbulletin->forumcache $forum = $vbulletin->forumcache["{$forumid}"]; //$lastpostforum = $vbulletin->forumcache["$lastpostarray[$forumid]"]; $lastpostforum = empty($lastpostarray[$forumid]) ? array() : $vbulletin->forumcache["{$lastpostarray[$forumid]}"]; if (!$forum['displayorder'] or !($forum['options'] & $vbulletin->bf_misc_forumoptions['active'])) { continue; } $forumperms = $vbulletin->userinfo['forumpermissions']["{$forumid}"]; $lastpostforumperms = empty($lastpostarray[$forumid]) ? 0 : $vbulletin->userinfo['forumpermissions']["{$lastpostarray[$forumid]}"]; if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview']) and ($vbulletin->forumcache["{$forumid}"]['showprivate'] == 1 or !$vbulletin->forumcache["{$forumid}"]['showprivate'] and !$vbulletin->options['showprivateforums'])) { // no permission to view current forum continue; } if ($subsonly) { $childforumbits = fr_construct_forum_bit($forum['forumid'], 1, $subsonly); } else { if ($depth < MAXFORUMDEPTH) { $childforumbits = fr_construct_forum_bit($forum['forumid'], $depth, $subsonly); } else { $childforumbits = ''; } } // do stuff if we are not doing subscriptions only, or if we ARE doing subscriptions, // and the forum has a subscribedforumid if (!$subsonly or $subsonly and !empty($forum['subscribeforumid'])) { $GLOBALS['forumshown'] = true; // say that we have shown at least one forum if ($forum['options'] & $vbulletin->bf_misc_forumoptions['cancontainthreads']) { // get appropriate suffix for template name $tempext = '_post'; } else { $tempext = '_nopost'; } if (!$vbulletin->options['showforumdescription']) { // blank forum description if set to not show $forum['description'] = ''; } // dates & thread title $lastpostinfo = empty($lastpostarray["{$forumid}"]) ? array() : $vbulletin->forumcache["{$lastpostarray[$forumid]}"]; // compare last post time for this forum with the last post time specified by // the $lastpostarray, and if it's less, use the last post info from the forum // specified by $lastpostarray if (!empty($lastpostinfo) and $vbulletin->forumcache["{$lastpostarray[$forumid]}"]['lastpost'] > 0) { if (!($lastpostforumperms & $vbulletin->bf_ugp_forumpermissions['canview']) or !($lastpostforumperms & $vbulletin->bf_ugp_forumpermissions['canviewothers']) and $lastpostinfo['lastposter'] != $vbulletin->userinfo['username']) { $forum['lastpostinfo'] = $vbphrase['private']; } else { $lastpostinfo['lastpostdate'] = vbdate($vbulletin->options['dateformat'], $lastpostinfo['lastpost'], 1); $lastpostinfo['lastposttime'] = vbdate($vbulletin->options['timeformat'], $lastpostinfo['lastpost']); $lastpostinfo['trimthread'] = fetch_trimmed_title(fetch_censored_text($lastpostinfo['lastthread'])); if ($lastpostinfo['lastprefixid'] and $vbulletin->options['showprefixlastpost']) { $lastpostinfo['prefix'] = $vbulletin->options['showprefixlastpost'] == 2 ? $vbphrase["prefix_{$lastpostinfo['lastprefixid']}_title_rich"] : htmlspecialchars_uni($vbphrase["prefix_{$lastpostinfo['lastprefixid']}_title_plain"]); } else { $lastpostinfo['prefix'] = ''; } if ($vbulletin->forumcache["{$lastpostforum['forumid']}"]['options'] & $vbulletin->bf_misc_forumoptions['allowicons'] and $icon = fetch_iconinfo($lastpostinfo['lasticonid'])) { $show['icon'] = true; } else { $show['icon'] = false; } $show['lastpostinfo'] = (!$lastpostforum['password'] or verify_forum_password($lastpostforum['forumid'], $lastpostforum['password'], false)); $pageinfo_lastpost = array('p' => $lastpostinfo['lastpostid']); $pageinfo_newpost = array('goto' => 'newpost'); $threadinfo = array('title' => $lastpostinfo['lastthread'], 'threadid' => $lastpostinfo['lastthreadid']); } } else { if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview'])) { $forum['lastpostinfo'] = $vbphrase['private']; } else { $forum['lastpostinfo'] = $vbphrase['never']; } } // do light bulb $forum['statusicon'] = fetch_forum_lightbulb($forumid, $lastpostinfo, $forum); // add lock to lightbulb if necessary // from 3.6.9 & 3.7.0 we now show locks only if a user can not post AT ALL // previously it was just if they could not create new threads if ($vbulletin->options['showlocks'] and !$forum['link'] and (!($forum['options'] & $vbulletin->bf_misc_forumoptions['allowposting']) or !($forumperms & $vbulletin->bf_ugp_forumpermissions['canpostnew']) and !($forumperms & $vbulletin->bf_ugp_forumpermissions['canreplyown']) and !($forumperms & $vbulletin->bf_ugp_forumpermissions['canreplyothers']))) { $forum['statusicon'] .= '_lock'; } // get counters from the counters cache ( prepared by fetch_last_post_array() ) $forum['threadcount'] = $counters["{$forum['forumid']}"]['threadcount']; $forum['replycount'] = $counters["{$forum['forumid']}"]['replycount']; // get moderators ( this is why we needed cache_moderators() ) if ($vbulletin->options['showmoderatorcolumn']) { $showmods = array(); $listexploded = explode(',', $forum['parentlist']); foreach ($listexploded as $parentforumid) { if (!isset($imodcache["{$parentforumid}"]) or $parentforumid == -1) { continue; } foreach ($imodcache["{$parentforumid}"] as $moderator) { if (isset($showmods["{$moderator['userid']}"])) { continue; } ($hook = vBulletinHook::fetch_hook('forumbit_moderator')) ? eval($hook) : false; $showmods["{$moderator['userid']}"] = true; if (!isset($forum['moderators'])) { $forum['moderators'] = ''; } } } if (!isset($forum['moderators'])) { $forum['moderators'] = ''; } } if ($forum['link']) { $forum['replycount'] = '-'; $forum['threadcount'] = '-'; $forum['lastpostinfo'] = '-'; } else { $forum['replycount'] = vb_number_format($forum['replycount']); $forum['threadcount'] = vb_number_format($forum['threadcount']); } if (($subsonly or $depth == MAXFORUMDEPTH) and $vbulletin->options['subforumdepth'] > 0) { //$forum['subforums'] = construct_subforum_bit($forumid, ($forum['options'] & $vbulletin->bf_misc_forumoptions['cancontainthreads'] ) ); $forum['subforums'] = ''; } else { $forum['subforums'] = ''; } $forum['browsers'] = 0; $children = explode(',', $forum['childlist']); foreach ($children as $childid) { $forum['browsers'] += isset($inforum["{$childid}"]) ? $inforum["{$childid}"] : 0; } if ($depth == 1 and $tempext == '_nopost') { global $vbcollapse; $collapseobj_forumid =& $vbcollapse["collapseobj_forumbit_{$forumid}"]; $collapseimg_forumid =& $vbcollapse["collapseimg_forumbit_{$forumid}"]; $show['collapsebutton'] = true; } else { $show['collapsebutton'] = false; } $show['forumsubscription'] = $subsonly ? true : false; $show['forumdescription'] = $forum['description'] != '' ? true : false; $show['subforums'] = $forum['subforums'] != '' ? true : false; $show['browsers'] = ($vbulletin->options['displayloggedin'] and !$forum['link'] and $forum['browsers'] ? true : false); // FRNR Start // If this forum has a password, check to see if we have // the proper cookie. If so, don't prompt for one $password = 0; if ($forum['password']) { $pw_ok = verify_forum_password($forum['forumid'], $forum['password'], false); if (!$pw_ok) { $password = 1; } } $new = array('id' => $forum['forumid'], 'new' => $forum['statusicon'] == 'new' ? true : false, 'name' => prepare_utf8_string(strip_tags($forum['title'])), 'password' => $password); $icon = fr_get_forum_icon($forum['forumid'], $forum['statusicon'] == 'new' ? true : false); if ($icon) { $new['icon'] = $icon; } if ($forum['link'] != '') { $link = fr_fix_url($forum['link']); if (is_int($link)) { $new['id'] = $link; } else { $new['link'] = $link; } $linkicon = fr_get_forum_icon($forum['forumid'], false, true); if ($linkicon) { $new['icon'] = $linkicon; } } if ($forum['description'] != '') { $desc = prepare_utf8_string(strip_tags($forum['description'])); if (strlen($desc) > 0) { $new['desc'] = $desc; } } $out[] = $new; // FRNR End } else { $forumbits .= $childforumbits; } } return $out; }
function fr_get_and_parse_forum($forumid, $foruminfo = false) { $userinfo = vB_Api::instance('user')->fetchUserInfo(); $options = vB::get_datastore()->get_value('options'); if (!$foruminfo) { $foruminfo = vB_Api::instance('node')->getFullContentforNodes(array($forumid)); if (empty($foruminfo)) { return null; } $foruminfo = $foruminfo[0]; } if (!$foruminfo) { return null; } $type = 'old'; if ($options['threadmarking'] and $userinfo['userid']) { $userlastvisit = !empty($foruminfo['readtime']) ? $foruminfo['readtime'] : vB::getRequest()->getTimeNow() - $options['markinglimit'] * 86400; } else { $lastvisit = vB5_Cookie::get('lastvisit', vB5_Cookie::TYPE_UINT); $forumview = fr_fetch_bbarray_cookie('channel_view', $foruminfo['nodeid']); //use which one produces the highest value, most likely cookie $userlastvisit = $forumview > $lastvisit ? $forumview : $lastvisit; } if ($foruminfo['lastcontent'] and $userlastvisit < $foruminfo['lastcontent']) { $type = 'new'; } else { $type = 'old'; } $out = array('id' => $foruminfo['nodeid'], 'new' => $type == 'new' ? true : false, 'name' => html_entity_decode(strip_tags($foruminfo['title'])), 'password' => false); $icon = fr_get_forum_icon($foruminfo['nodeid'], $foruminfo == 'new'); if ($icon) { $out['icon'] = $icon; } if ($foruminfo['description'] != '') { $desc = strip_tags($foruminfo['description']); if (strlen($desc) > 0) { $out['desc'] = $desc; } } return $out; }