forum.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 811 行 · 第 1/3 页

PHP
811
字号
                $criteria_forum = ' AND t.forum_id IN (' . implode(',', array_keys($forum)) . ')';
            }elseif(!empty($forum)){
                $criteria_forum = ' AND t.forum_id ='.intval($forum);
            }else{
                $criteria_forum = '';
            }
        }

        $sql = 'SELECT COUNT(*) as count FROM ' . $this->db->prefix("bb_topics") . ' t '.$leftjoin;
        $sql .= ' WHERE '.$criteria_post . $criteria_forum . $criteria_extra . $criteria_approve;
        if (!$result = $this->db->query($sql)) {
	        return null;
        }
        $myrow = $this->db->fetchArray($result);
        $count = $myrow['count'];
        return $count;
    }

    // get permission
    function getPermission($forum, $type = "access", $checkCategory = true)
    {
        global $xoopsUser, $xoopsModule;
        static $_cachedPerms;
		include_once XOOPS_ROOT_PATH.'/modules/newbb/include/functions.php';

        if($type == "all") return true;
        if (newbb_isAdministrator()) return true;
        if (!is_object($forum)) $forum =& $this->get($forum);
        if ($forum->getVar('forum_type')) return false;// if forum inactive, all has no access except admin

		if(!empty($checkCategory)){
            $category_handler =& xoops_getmodulehandler('category', 'newbb');
            $categoryPerm = $category_handler->getPermission($forum->getVar('cat_id'));
        	if (!$categoryPerm) return false;
    	}

        $type = strtolower($type);
        if ("moderate" == $type) {
            $permission = (newbb_isModerator($forum))?1:0;
        } else {
			$perms = array_map("trim",explode(',', FORUM_PERM_ITEMS));
           	$perm_type = 'forum';
            $perm_item = (in_array($type, $perms))?'forum_' . $type:"forum_access";
			if (!isset($_cachedPerms[$perm_type])) {
				$getpermission =& xoops_getmodulehandler('permission', 'newbb');
				$_cachedPerms[$perm_type] = $getpermission->getPermissions($perm_type);
			}
        	$permission = (isset($_cachedPerms[$perm_type][$forum->getVar('forum_id')][$perm_item])) ? 1 : 0;
        }
        return $permission;
    }
    
    function deletePermission(&$forum)
    {
		$perm_handler =& xoops_getmodulehandler('permission', 'newbb');
		return $perm_handler->deleteByForum($forum->getVar("forum_id"));
	}
    
    function applyPermissionTemplate(&$forum)
    {
		$perm_handler =& xoops_getmodulehandler('permission', 'newbb');
		return $perm_handler->applyTemplate($forum->getVar("forum_id"));
	}
	        
    /**
     * clean orphan items from database
     * 
     * @return 	bool	true on success
     */
    function cleanOrphan()
    {
	    parent::cleanOrphan($this->db->prefix("bb_categories"), "cat_id");
	    
    	if($this->mysql_major_version() >= 4):
    	/*
        $sql = "DELETE FROM ".$this->table.
        		" WHERE (parent_forum >0 AND parent_forum NOT IN ( SELECT DISTINCT forum_id FROM ".$this->table.") )";
        */
        $sql = 	"DELETE ".$this->table." FROM ".$this->table.
        		" LEFT JOIN ".$this->table." AS aa ON ".$this->table.".parent_forum = aa.forum_id ".
        		" WHERE ".$this->table.".parent_forum>0 AND (aa.forum_id IS NULL)";
        if (!$result = $this->db->queryF($sql)):
	        xoops_error("cleanOrphan error:". $sql);
        endif;
        else:
        $this->identifierName = "parent_forum";
        $forum_list = $this->getList(new Criteria("parent_forum", 0, ">"));
        $this->identifierName = "forum_name";
        if($parent_forums = @array_values($forum_list)){
	        $parent_list = $this->getIds(new Criteria("forum_id", "(".implode(", ", $parent_forums).")", "IN"));
	        foreach($forum_list as $forum_id => $parent_forum){
		        if(in_array($parent_forum, $parent_list)) continue;
		        $forum_obj =& $this->get($forum_id);
		        $this->delete($forum_obj);
		        unset($forum_obj);
	        }
        }
		endif;
        
	    return true;
    }
    
    function synchronization($object = null)
    {
	    global $xoopsDB;
	    
	    if(empty($object)) {
	    	/* for MySQL 4.1+ */
	    	if($this->mysql_major_version() >= 4){
	        $sql = "UPDATE ".$this->table.
	        		" SET ".$this->table.".forum_last_post_id = @last_post =(".
	        		"	SELECT MAX(post_id) AS last_post ".
	        		" 	FROM " . $this->db->prefix("bb_posts") . 
	        		" 	WHERE approved=1 AND forum_id = ".$this->table.".forum_id".
	        		" )".
	        		" WHERE ".$this->table.".forum_last_post_id <> @last_post";
			if(!$this->db->queryF($sql)){
				xoops_error("update error: ".$sql);
			}
	        $sql = "UPDATE ".$this->table.
	        		" SET ".$this->table.".forum_posts = @posts =(".
	        		"	SELECT COUNT(*) AS posts ".
	        		" 	FROM " . $this->db->prefix("bb_posts") . 
	        		" 	WHERE approved=1 AND forum_id = ".$this->table.".forum_id".
	        		" )".
	        		" WHERE ".$this->table.".forum_posts <> @posts";
			if(!$this->db->queryF($sql)){
				xoops_error("update error: ".$sql);
			}
	        $sql = "UPDATE ".$this->table.
	        		" SET ".$this->table.".forum_topics = @topics =(".
	        		"	SELECT COUNT(*) AS topics ".
	        		" 	FROM " . $this->db->prefix("bb_topics") . 
	        		" 	WHERE approved=1 AND forum_id = ".$this->table.".forum_id".
	        		" )".
	        		" WHERE ".$this->table.".forum_topics <> @topics";
			if(!$this->db->queryF($sql)){
				xoops_error("update error: ".$sql);
			}
        	}else{
	        // for 4.0+
		    $forums = $this->getIds();
		    foreach($forums as $id){
			    if(!$obj =& $this->get($id)) continue;
			    $this->synchronization($obj);
			    unset($obj);
		    }
        	}
			
			return true;
	    }
	    if(!is_object($object)){
		    $object =& $this->get(intval($object));
	    }	    
	    if(!$object->getVar("forum_id")) return false;
	    
        $sql = "SELECT MAX(post_id) AS last_post, COUNT(*) AS total FROM " . $xoopsDB->prefix("bb_posts") . " AS p LEFT JOIN  " . $xoopsDB->prefix("bb_topics") . " AS t ON p.topic_id=t.topic_id WHERE p.approved=1 AND t.approved=1 AND p.forum_id = ".$object->getVar("forum_id");
        if ( $result = $xoopsDB->query($sql)):
        $last_post = 0;
        $posts = 0;
        if( $row = $xoopsDB->fetchArray($result) ) {
	        $last_post = intval($row['last_post']);
	        $posts = intval($row['total']);
        }
        if($object->getVar("forum_last_post_id") != $last_post){
        	$object->setVar("forum_last_post_id", $last_post);
    	}
        if($object->getVar("forum_posts") != $posts){
        	$object->setVar("forum_posts", $posts);
    	}
        endif;
        $sql = "SELECT COUNT(*) AS total FROM ".$xoopsDB->prefix("bb_topics")." WHERE approved=1 AND forum_id = ".$object->getVar("forum_id");
        if ( $result = $xoopsDB->query($sql) ):
        if ( $row = $xoopsDB->fetchArray($result) ) {
	        if($object->getVar("forum_topics") != $row['total']){
            	$object->setVar("forum_topics", $row['total']);
        	}
        }
        endif;

        return $this->insert($object, true);
    }
    
    function &display(&$forums_obj)
    {
        global $xoopsModule, $xoopsConfig, $xoopsModuleConfig, $forumImage, $myts;
		include_once XOOPS_ROOT_PATH.'/modules/newbb/include/functions.php';
	    
		$posts = array();
		$posts_obj = array();
		foreach (array_keys($forums_obj) as $id) {
			$posts[] = $forums_obj[$id]->getVar("forum_last_post_id");
		}
		if(!empty($posts)){
			$post_handler =& xoops_getmodulehandler('post', 'newbb');
			$posts_obj =& $post_handler->getAll(new Criteria("post_id", "(".implode(", ", $posts).")", "IN"), array("uid", "topic_id", "post_time", "subject", "poster_name", "icon"));
		}
		
		$users = array();
		$reads = array();
		foreach (array_keys($forums_obj) as $id) {
			$forum_obj =& $forums_obj[$id];
			if(!$forum_obj->getVar("forum_last_post_id")) continue;
			if(!$post_obj =& $posts_obj[$forum_obj->getVar("forum_last_post_id")]) {
				$forum_obj->assignVar("forum_last_post_id", 0);
				continue;
			}
			$users[] = $post_obj->getVar("uid");
			if($moderators = $forum_obj->getModerators()){
				$users = array_merge($users, $moderators);
			}
		    // reads
		    if(!empty($xoopsModuleConfig["read_mode"])){
		    	$reads[$id] = ($xoopsModuleConfig["read_mode"] == 1)?$post_obj->getVar('post_time'):$post_obj->getVar('post_id');
			}
		}
		$forum_isread = newbb_isRead("forum", $reads);
		$users_linked = newbb_getUnameFromIds(array_unique($users), !empty($xoopsModuleConfig['show_realname']), true);
		
		$forums_array = array();
		foreach (array_keys($forums_obj) as $id) {
			$forum_obj =& $forums_obj[$id];
			if(!$this->getPermission($forum_obj, "access", false)) continue;
			
			$_forum_data = array();
			$_forum_data["forum_order"]		= $forum_obj->getVar('forum_order');
			$_forum_data["forum_id"] 		= $id;
			$_forum_data["forum_cid"] 		= $forum_obj->getVar('cat_id');
			$_forum_data["forum_name"] 		= $forum_obj->getVar('forum_name');
			$_forum_data["forum_desc"] 		= $forum_obj->getVar('forum_desc');
			$_forum_data["forum_posts"] 	= $forum_obj->getVar("forum_posts");
			$_forum_data["forum_topics"] 	= $forum_obj->getVar("forum_topics");
			$_forum_data["forum_type"] 		= $forum_obj->getVar('forum_type');
			$forum_moderators = array();
			$moderators = $forum_obj->getModerators();
			foreach($moderators as $moderator){
				$forum_moderators[] = @$users_linked[$moderator];
			}
			$_forum_data["forum_moderators"]	= implode(", ", array_filter($forum_moderators));
		        
			if($forum_obj->getVar("forum_last_post_id")):
			$post_obj =& $posts_obj[$forum_obj->getVar("forum_last_post_id")];
			if(!empty($users_linked[$post_obj->getVar("uid")])){
				$_forum_data["forum_lastpost_user"] = $users_linked[$post_obj->getVar("uid")];
			}elseif($post_obj->getVar("poster_name")){
				$_forum_data["forum_lastpost_user"] = $post_obj->getVar("poster_name");
			}else{
				$_forum_data["forum_lastpost_user"] = $myts->htmlSpecialChars($GLOBALS["xoopsConfig"]["anonymous"]);
			}
			
		    $_forum_data['forum_lastpost_time'] = newbb_formatTimestamp($post_obj->getVar('post_time'));
		    $_forum_data['forum_lastpost_icon'] = '<a href="' . XOOPS_URL . '/modules/' . $xoopsModule->getVar("dirname") . '/viewtopic.php?post_id=' . $post_obj->getVar('post_id') . '&amp;topic_id=' . $post_obj->getVar('topic_id') . '#forumpost' . $post_obj->getVar('post_id') . '">'.
		            '<img src="' . XOOPS_URL . '/images/subject/' . ($post_obj->getVar('icon')?$post_obj->getVar('icon'): 'icon1.gif') . '" alt="" />'.
		        	'</a>';
			endif;
			
		    if (empty($forum_isread[$id])) {
		        $forum_folder = ($forum_obj->getVar('forum_type') == 1) ? $forumImage['locked_forum_newposts'] : $forumImage['newposts_forum'];
		    } else {
		        $forum_folder = ($forum_obj->getVar('forum_type') == 1) ? $forumImage['locked_forum'] : $forumImage['folder_forum'];
		    }
		    $_forum_data['forum_folder'] = newbb_displayImage($forum_folder);
			
		    $forums_array[$forum_obj->getVar('parent_forum')][] = $_forum_data;
		}
		return $forums_array;	    
    }
}
?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?