post.php

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

PHP
889
字号
        $text_handler =& xoops_getmodulehandler("text", "newbb");
        $post_text_vars = array("post_text", "post_edit");
        if ($post->isNew()) {
            if (!$topic_id = $post->getVar("topic_id")) {
	            $topic_obj->setVar("topic_title", $post->getVar("subject", "n"));
	            $topic_obj->setVar("topic_poster", $post->getVar("uid"));
	            $topic_obj->setVar("forum_id", $post->getVar("forum_id"));
	            $topic_obj->setVar("topic_time", $post->getVar("post_time"));
	            $topic_obj->setVar("poster_name", $post->getVar("poster_name"), true);
	            $topic_obj->setVar("approved", $post->getVar("approved"), true);
                if (!$topic_id = $topic_handler->insert($topic_obj, $force)) {
                    $post->deleteAttachment();
                    $post->setErrors("insert topic error");
                	xoops_error($topic_obj->getErrors());
                    return false;
                }
                $post->setVar('topic_id', $topic_id);
                
                $pid = 0;
	            $post->setVar("pid", 0);
            }elseif(!$post->getVar("pid")){
	            $pid = $topic_handler->getTopPostId($topic_id);
	            $post->setVar("pid", $pid);
            }

	        $text_obj =& $text_handler->create();
            foreach($post_text_vars as $key){
	            $text_obj->vars[$key] = $post->vars[$key];
            }
            $post->destoryVars($post_text_vars);
            if (!$post_id = parent::insert($post, $force)) {
                return false;
            }
            $text_obj->setVar("post_id", $post_id);
            if (!$text_handler->insert($text_obj, $force)) {
	            $this->delete($post);
                $post->setErrors("post text insert error");
                xoops_error($text_obj->getErrors());
                return false;
            }
            if ($post->getVar("approved")>0) {
	            $this->approve($post, true);
            }
            $post->setVar('post_id', $post_id);
        } else {
            if ($post->isTopic()) {
	            if($post->getVar("subject") != $topic_obj->getVar("topic_title")){
		            $topic_obj->setVar("topic_title", $post->getVar("subject", "n"));
	            }
	            if($post->getVar("approved") != $topic_obj->getVar("approved")){
		            $topic_obj->setVar("approved", $post->getVar("approved"));
	            }
                if (!$result = $topic_handler->insert($topic_obj, $force)) {
                    $post->setErrors("update topic error");
                	xoops_error($topic_obj->getErrors());
                    return false;
                }
            }
	        $text_obj =& $text_handler->get($post->getVar("post_id"));
	        $text_obj->setDirty();
            foreach($post_text_vars as $key){
	            $text_obj->vars[$key] = $post->vars[$key];
            }
            $post->destoryVars($post_text_vars);
            if (!$post_id = parent::insert($post, $force)) {
                xoops_error($post->getErrors());
                return false;
            }
            if (!$text_handler->insert($text_obj, $force)) {
                $post->setErrors("update post text error");
                xoops_error($text_obj->getErrors());
                return false;
            }
        }
        return $post->getVar('post_id');
    }

    function delete(&$post, $isDeleteOne = true, $force = false)
    {
        if(!is_object($post) || $post->getVar('post_id')==0) return false;
        if ($isDeleteOne) {
	        if($post->isTopic()){
		        $criteria = new CriteriaCompo(new Criteria("topic_id", $post->getVar('topic_id')));
		        $criteria->add(new Criteria('approved', 1));
		        $criteria->add(new Criteria('pid', 0, ">"));
		    	if($this->getPostCount($criteria)>0){
			    	return false;
		    	}
	        }
	        return $this->_delete($post, $force);
        }
        else {
	        include_once(XOOPS_ROOT_PATH . "/class/xoopstree.php");
	        $mytree = new XoopsTree($this->db->prefix("bb_posts"), "post_id", "pid");
            $arr = $mytree->getAllChild($post->getVar('post_id'));
            for ($i = 0; $i < count($arr); $i++) {
                $childpost =& $this->create(false);
                $childpost->assignVars($arr[$i]);
                $this->_delete($childpost, $force);
                unset($childpost);
            }
            $this->_delete($post, $force);
        }

        return true;
    }

    function _delete(&$post, $force = false)
    {
	    global $xoopsModule, $xoopsConfig;
	    static $forum_lastpost = array();
	    
        if(!is_object($post) || $post->getVar('post_id')==0) return false;

        $postcount_toupdate = ($post->getVar("approved")>0);
        
        /* Set active post as deleted */
        if($post->getVar("approved")>0 && empty($force)) {
        	$sql = "UPDATE " . $this->db->prefix("bb_posts") . " SET approved = -1 WHERE post_id = ".$post->getVar("post_id");
	        if (!$result = $this->db->queryF($sql)) {
	        }
        /* delete pending post directly */
        }else{
	        $sql = sprintf("DELETE FROM %s WHERE post_id = %u", $this->db->prefix("bb_posts"), $post->getVar('post_id'));
	        if (!$result = $this->db->queryF($sql)) {
		        $post->setErrors("delte post error: ".$sql);
	            return false;
	        }
	        $post->deleteAttachment();
	
	        $sql = sprintf("DELETE FROM %s WHERE post_id = %u", $this->db->prefix("bb_posts_text"), $post->getVar('post_id'));
	        if (!$result = $this->db->queryF($sql)) {
	            $post->setErrors("Could not remove post text: " . $sql);
	            return false;
	        }
        }

        if ($post->isTopic()) {
			$topic_handler =& xoops_getmodulehandler('topic', 'newbb');			
			$topic_obj =& $topic_handler->get($post->getVar('topic_id'));
        	if(is_object($topic_obj) && $topic_obj->getVar("approved")>0 && empty($force)){
        		$topiccount_toupdate = 1;
        		$topic_obj->setVar("approved", -1);
        		$topic_handler->insert($topic_obj);
        		xoops_notification_deletebyitem ($xoopsModule->getVar('mid'), 'thread', $post->getVar('topic_id'));
        	}else{
	        	if(is_object($topic_obj)):
	        	if($topic_obj->getVar("approved")>0){
        			xoops_notification_deletebyitem ($xoopsModule->getVar('mid'), 'thread', $post->getVar('topic_id'));
    			}
	        
				$poll_id = $topic_obj->getVar("poll_id");
				if($poll_id>0){
					if (is_dir(XOOPS_ROOT_PATH."/modules/xoopspoll/")){
						include_once XOOPS_ROOT_PATH."/modules/xoopspoll/class/xoopspoll.php";
						include_once XOOPS_ROOT_PATH."/modules/xoopspoll/class/xoopspolloption.php";
						include_once XOOPS_ROOT_PATH."/modules/xoopspoll/class/xoopspolllog.php";
						include_once XOOPS_ROOT_PATH."/modules/xoopspoll/class/xoopspollrenderer.php";
					
						$poll = new XoopsPoll($poll_id);
						if ( $poll->delete() != false ) {
							XoopsPollOption::deleteByPollId($poll->getVar("poll_id"));
							XoopsPollLog::deleteByPollId($poll->getVar("poll_id"));
							xoops_comment_delete($xoopsModule->getVar('mid'), $poll->getVar('poll_id'));
						}
					}
				}
				endif;
				
	        	$sql = sprintf("DELETE FROM %s WHERE topic_id = %u", $this->db->prefix("bb_topics"), $post->getVar('topic_id'));
	            if (!$result = $this->db->queryF($sql)) {
	                newbb_message("Could not delete topic: ". $sql);
	            }
		        $sql = sprintf("DELETE FROM %s WHERE topic_id = %u", $this->db->prefix("bb_votedata"), $post->getVar('topic_id'));
		        if (!$result = $this->db->queryF($sql)) {
	                newbb_message("Could not delete votedata: " .$sql);
		        }
	        }
        }else{
            $sql = "UPDATE ".$this->db->prefix("bb_topics")." t
            				LEFT JOIN ".$this->db->prefix("bb_posts")." p ON p.topic_id = t.topic_id
            				SET t.topic_last_post_id = p.post_id
            				WHERE t.topic_last_post_id = ".$post->getVar('post_id')."
            						AND p.post_id = (SELECT MAX(post_id) FROM ".$this->db->prefix("bb_posts")." WHERE topic_id=t.topic_id)";
            if (!$result = $this->db->queryF($sql)) {
            }
        }

        if( $postcount_toupdate>0 ){
	        $member_handler = &xoops_gethandler('member');
	        $poster = &$member_handler->getUser($post->getVar('uid'));
	        if (is_object($poster)) {
		        $poster->setVar('posts',$poster->getVar('posts') - 1);
		        $res=$member_handler->insertUser($poster, true);
	            unset($poster);
	        }
	
	        $sql = "UPDATE " . $this->db->prefix("bb_posts") . " SET pid = " . $post->getVar('pid') . " WHERE pid=" . $post->getVar('post_id');
	        if (!$result = $this->db->queryF($sql)) {
	            newbb_message("Could not update post: " . $sql);
	        }
        }

        return true;
    }

    function getPostCount($criteria = null)
    {
	    return parent::getCount($criteria);
    }

    /*
     * TODO: combining viewtopic.php
     */
    function &getPostsByLimit($criteria = null, $limit=1, $start=0, $join = null)
    {
        $ret = array();
        $sql = 'SELECT p.*, t.* '.
        		' FROM ' . $this->db->prefix('bb_posts') . ' AS p'.
        		' LEFT JOIN ' . $this->db->prefix('bb_posts_text') . " AS t ON t.post_id = p.post_id";
		if(!empty($join)){        		
			$sql .= $join;
		}
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " ".$criteria->renderWhere();
            if ($criteria->getSort() != "") {
                $sql .= " ORDER BY ".$criteria->getSort()." ".$criteria->getOrder();
            }
        }
        $result = $this->db->query($sql, intval($limit), intval($start));
        if (!$result) {
            newbb_message( "NewbbPostHandler::getPostsByLimit error:" . $sql);
            return $ret;
        }
        while ($myrow = $this->db->fetchArray($result)) {
            $post =& $this->create(false);
            $post->assignVars($myrow);
            $ret[$myrow['post_id']] = $post;
            unset($post);
        }
        return $ret;
    }
    
    /**
     * clean orphan items from database
     * 
     * @return 	bool	true on success
     */
    function cleanOrphan()
    {
	    parent::cleanOrphan($this->db->prefix("bb_topics"), "topic_id");
	    parent::cleanOrphan($this->db->prefix("bb_posts_text"), "post_id");
	    
    	/* for MySQL 4.1+ */
    	if($this->mysql_major_version() >= 4):
        $sql = "DELETE FROM ".$this->db->prefix("bb_posts_text").
        		" WHERE (post_id NOT IN ( SELECT DISTINCT post_id FROM ".$this->table.") )";
        else:
        // for 4.0+
        /* */
        $sql = 	"DELETE ".$this->db->prefix("bb_posts_text")." FROM ".$this->db->prefix("bb_posts_text").
        		" LEFT JOIN ".$this->table." AS aa ON ".$this->db->prefix("bb_posts_text").".post_id = aa.post_id ".
        		" WHERE (aa.post_id IS NULL)";
        /* */
        // Alternative for 4.1+
        /*
        $sql = 	"DELETE bb FROM ".$this->db->prefix("bb_posts_text")." AS bb".
        		" LEFT JOIN ".$this->table." AS aa ON bb.post_id = aa.post_id ".
        		" WHERE (aa.post_id IS NULL)";
        */
		endif;
        if (!$result = $this->db->queryF($sql)) {
	        newbb_message("cleanOrphan:". $sql);
            return false;
        }
        return true;
    }

    /**
     * clean expired objects from database
     * 
     * @param 	int 	$expire 	time limit for expiration
     * @return 	bool	true on success
     */
    function cleanExpires($expire = 0)
    {
	    $crit_expire =& new CriteriaCompo(new Criteria("approved", 0, "<="));
	    if(!empty($expire)){
	    	$crit_expire->add(new Criteria("post_time", time()-intval($expire), "<"));
    	}
	    return $this->deleteAll($crit_expire, true/*, true*/);
    }
}

?>

⌨️ 快捷键说明

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