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 + -
显示快捷键?