diff options
Diffstat (limited to 'includes/classes/BitBoardPost.php')
| -rw-r--r-- | includes/classes/BitBoardPost.php | 468 |
1 files changed, 468 insertions, 0 deletions
diff --git a/includes/classes/BitBoardPost.php b/includes/classes/BitBoardPost.php new file mode 100644 index 0000000..6081b4c --- /dev/null +++ b/includes/classes/BitBoardPost.php @@ -0,0 +1,468 @@ +<?php +/** + * $Header$ + * $Id$ + * + * Messageboards class to illustrate best practices when creating a new bitweaver package that + * builds on core bitweaver functionality, such as the Liberty CMS engine + * + * @author spider <spider@steelsun.com> + * @version $Revision$ + * @package boards + */ + +/** + * required setup + */ +require_once( LIBERTY_PKG_CLASS_PATH.'LibertyMime.php' ); +require_once( BOARDS_PKG_CLASS_PATH.'BitBoardTopic.php' ); + +/** + * @package boards + */ +class BitBoardPost extends LibertyComment { + /** + * During initialisation, be sure to call our base constructors + */ + function __construct($pCommentId = NULL, $pContentId = NULL, $pInfo = NULL) { + parent::__construct($pCommentId,$pContentId,$pInfo); + + // Permission setup + $this->mViewContentPerm = 'p_boards_read'; + $this->mUpdateContentPerm = 'p_boards_post_update'; + $this->mAdminContentPerm = 'p_boards_admin'; + } + + /** + * This function verifies the data for a post + */ + function verify( &$pParamHash ) { + if( isset( $pParamHash['is_approved'] ) ) { + if( !is_numeric( $pParamHash['is_approved'] ) || $pParamHash['is_approved'] > 1 || $pParamHash['is_approved'] < 0 ) { + $this->mErrors[]=("Invalid post approved state"); + } else { + $pParamHash['post_store']['is_approved'] = $pParamHash['is_approved']; + } + } + if( isset( $pParamHash['is_warned'] ) ) { + if( !is_numeric( $pParamHash['warned'] ) || $pParamHash['is_warned'] > 1 || $pParamHash['is_warned'] < 0 ) { + $this->mErrors[]=("Invalid warned state"); + } else { + $pParamHash['post_store']['is_warned'] = $pParamHash['is_warned']; + } + } + if( !empty( $pParamHash['warned_message'] ) ) { + $pParamHash['post_store']['warned_message'] = $pParamHash['warned_message']; + } + if( !empty( $pParamHash['warned_message'] ) ) { + $pParamHash['post_store']['warned_message'] = $pParamHash['warned_message']; + } + if( !empty( $pParamHash['migrate_post_id'] ) ) { + $pParamHash['post_store']['migrate_post_id'] = $pParamHash['migrate_post_id']; + } + + return( count( $this->mErrors ) == 0 && !empty( $pParamHash['post_store'] ) ); + } + + /** + * This function stores a post + */ + function store( &$pParamHash ) { + global $gBitSystem; + $ret = FALSE; + if( $this->mCommentId && $this->verify( $pParamHash ) ) { + //$gBitSystem->verifyPermission('p_boards_update'); + //$pParamHash = (($pParamHash + 1)%2); + $query_sel = "SELECT * FROM `".BIT_DB_PREFIX."boards_posts` WHERE `comment_id` = ?"; + $isStored = $this->mDb->getOne( $query_sel, array( $this->mCommentId ) ); + if( $isStored ) { + $result = $this->mDb->associateUpdate( 'boards_posts', $pParamHash['post_store'], array( 'comment_id' => $this->mCommentId ) ); + } else { + $pParamHash['post_store']['comment_id'] = $this->mCommentId; + $result = $this->mDb->associateInsert( 'boards_posts', $pParamHash['post_store'] ); + } + $ret = TRUE; + } + return $ret; + } + + /** + * This function gets the meta data relating to a post + */ + function loadMetaData() { + if ($this->isValid()) { + if (!isset($this->mInfo['accepted'])) { + $key = array('comment_id' => $this->mCommentId); + $query_sel = "SELECT + post.is_approved, + post.is_warned, + post.warned_message + FROM `".BIT_DB_PREFIX."boards_posts` post WHERE comment_id=?"; + $data = $this->mDb->getRow( $query_sel , array_values($key)); + if ($data) { + if (!empty($data['warned_message'])) { + $data['warned_message'] = str_replace("\n","<br />\n",$data['warned_message']); + } + $this->mInfo=array_merge($this->mInfo,$data); + } + } + } + } + + /** + * This function removes a bitboard entry + **/ + function expunge() { + $ret = FALSE; + if( $this->isValid() ) { + $this->StartTrans(); + // parent actually has deletion of rows in boards for constraint reasons + if( parent::expunge() ) { + $this->CompleteTrans(); + $ret = TRUE; + } else { + $this->mDb->RollbackTrans(); + } + } + return $ret; + } + + /** + * This function gets all the post relating to a topic + */ + function getComments( $pContentId = NULL, $pMaxComments = NULL, $pOffset = NULL, $pSortOrder = NULL, $pDisplayMode = NULL ) { + global $gBitUser, $gBitSystem; + + $joinSql = $selectSql = $whereSql = ''; + + $ret = array(); + $contentId = $this->mCommentId; + + $mid = 'thread_forward_sequence ASC'; + if (!empty($pSortOrder)) { + if ($pSortOrder == 'commentDate_desc') { + $mid = 'created DESC'; + } else if ($pSortOrder == 'commentDate_asc') { + $mid = 'created ASC'; + } elseif ($pSortOrder == 'thread_asc') { + $mid = 'thread_forward_sequence ASC'; + // thread newest first is harder... + } elseif ($pSortOrder == 'thread_desc') { + $mid = 'thread_reverse_sequence ASC'; + } else { + $mid = $this->mDb->convertSortmode( $pSortOrder ); + } + } + $mid = 'order by ' . $mid; + + $bindVars = array(); + if (is_array( $contentId ) ) { + $mid2 = 'in ('.implode(',', array_fill(0, count( $pContentId ), '?')).')'; + $bindVars = $contentId; + $select1 = ', lcp.content_type_guid as parent_content_type_guid, lcp.title as parent_title '; + $join1 = " LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content` lcp ON (lcp.content_id = lcom.parent_id) "; + } elseif ($contentId) { + $mid2 = "lcom.`thread_forward_sequence` LIKE '".sprintf("%09d.",$contentId)."%'"; + $select1 = ''; + $join1 = ''; + } + + if ($gBitSystem->isFeatureActive('boards_posts_anon_moderation') && !($gBitUser->hasPermission('p_boards_update') || $gBitUser->hasPermission('p_boards_post_update'))) { + $whereSql .= " AND ((post.`is_approved` = 1) OR (lc.`user_id` >= 0))"; + } + + $pListHash = array( 'content_id' => $contentId, 'max_records' => $pMaxComments, 'offset'=>$pOffset, 'sort_mode'=> $pSortOrder, 'display_mode' => $pDisplayMode, 'has_comment_view_perm' => TRUE ); + $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars, $this, $pListHash ); + + if ($pContentId) { + $sql = "SELECT lcom.`comment_id`, lcom.`parent_id`, lcom.`root_id`, + lcom.`thread_forward_sequence`, lcom.`thread_reverse_sequence`, lcom.`anon_name`, lc.*, uu.`email`, uu.`real_name`, uu.`login`, + post.is_approved, + post.is_warned, + post.warned_message, + uu.registration_date AS registration_date, + tf_ava.`file_name` AS `avatar_file_name`, tf_ava.`mime_type` AS `avatar_mime_type`, tf_ava.`user_id` AS `avatar_user_id`, ta_ava.`attachment_id` AS `avatar_attachment_id` + $selectSql $select1 + FROM `".BIT_DB_PREFIX."liberty_comments` lcom + INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lcom.`content_id` = lc.`content_id`) + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (lc.`user_id` = uu.`user_id`) + $joinSql $join1 + LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` ta_ava ON ( uu.`avatar_attachment_id`=ta_ava.`attachment_id` ) + LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` tf_ava ON ( tf_ava.`file_id`=ta_ava.`foreign_id` ) + LEFT JOIN `".BIT_DB_PREFIX."boards_posts` post ON (post.`comment_id` = lcom.`comment_id`) + WHERE $mid2 $whereSql $mid"; + + $flat_comments = array(); + + if( $result = $this->mDb->query( $sql, $bindVars, $pMaxComments, $pOffset ) ) { + while( $row = $result->FetchRow() ) { + if (empty($row['anon_name'])) { + $row['anon_name'] = "Anonymous"; + } + if( $row['avatar_file_name'] ) { + $row['user_avatar_url'] = liberty_fetch_thumbnail_url( array( + 'source_file' => liberty_mime_get_source_file( array( 'user_id'=>$row['avatar_user_id'], 'file_name'=>$row['avatar_file_name'], 'mime_type'=>$row['avatar_mime_type'], 'attachment_id'=>$row['avatar_attachment_id'] ) ), + 'size' => 'avatar' + )); + } else { + $row['user_avatar_url'] = FALSE; + } + if (!empty($row['warned_message'])) { + $row['warned_message'] = str_replace("\n","<br />\n",$row['warned_message']); + } + $row['data'] = trim( $row['data'] ); + $row['user_url'] = BitUser::getDisplayUrlFromHash( $row ); + $row['parsed_data'] = self::parseDataHash( $row ); + $row['level'] = substr_count ( $row['thread_forward_sequence'], '.' ) - 1; + $c = new LibertyComment(); + $c->mInfo=$row; + $row['is_editable'] = $c->userCanEdit(); + + if( $gBitSystem->isFeatureActive( 'comments_allow_attachments' ) ){ + // get attachments for each comment + global $gLibertySystem; + $query = "SELECT * FROM `".BIT_DB_PREFIX."liberty_attachments` la WHERE la.`content_id`=? ORDER BY la.`pos` ASC, la.`attachment_id` ASC"; + if( $result2 = $this->mDb->query( $query,array( (int)$row['content_id'] ))) { + while( $row2 = $result2->fetchRow() ) { + if( $func = $gLibertySystem->getPluginFunction( $row2['attachment_plugin_guid'], 'load_function', 'mime' )) { + // we will pass the preferences by reference that the plugin can easily update them + if( empty( $row['storage'][$row2['attachment_id']] )) { + $row['storage'][$row2['attachment_id']] = array(); + } + $row['storage'][$row2['attachment_id']] = $func( $row2, $row['storage'][$row2['attachment_id']] ); + } else { + print "No load_function for ".$row2['attachment_plugin_guid']; + } + } + } + // end get attachements for each comment + } + + $flat_comments[$row['content_id']] = $row; + // vd($row); + } + } + + # now select comments wanted + $ret = $flat_comments; + + } + return $ret; + } + + /** + * This function gets a list of posts + */ + function getList( &$pListHash ) { + global $gBitUser, $gBitSystem; + + $this->prepGetList( $pListHash ); + + $joinSql = $selectSql = $whereSql = ''; + + $ret = array(); + $contentId = $this->mCommentId; + +// $mid = 'ORDER BY `thread_forward_sequence` ASC'; + + $bindVars = array(); + if( !empty( $pListHash['content_id'] ) ) { + if (is_array( $contentId ) ) { + $mid2 = 'in ('.implode(',', array_fill(0, count( $pListHash['content_id'] ), '?')).')'; + $bindVars = $contentId; + $selectSql = ', lcp.content_type_guid as parent_content_type_guid, lcp.title as parent_title '; + $joinSql .= " LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content` lcp ON (lcp.content_id = lcom.parent_id) "; + } elseif( is_numeric( $contentId ) ) { + $whereSql .= " AND `thread_forward_sequence` LIKE '".sprintf("%09d.",$contentId)."%'"; + } + } + + if ($gBitSystem->isFeatureActive('boards_posts_anon_moderation') && !($gBitUser->hasPermission('p_boards_update') || $gBitUser->hasPermission('p_boards_post_update'))) { + $whereSql .= " AND ((post.`is_approved` = 1) OR (lc.`user_id` >= 0))"; + } + + $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars, $this ); + + if( BitBase::verifyIdParameter( $pListHash, 'board_id' ) ) { + $joinSql .= "INNER JOIN `".BIT_DB_PREFIX."boards` b ON (b.`content_id` = bm.`board_content_id`)"; + $whereSql .= ' AND b.`board_id`=? '; + array_push( $bindVars, (int)$pListHash['board_id'] ); + } + + if( BitBase::verifyId( $pListHash['user_id'] ) ) { + $whereSql .= ' AND lc.`user_id`=? '; + array_push( $bindVars, $pListHash['user_id'] ); + } + + if( !empty( $whereSql ) ) { + $whereSql = preg_replace( '/^[\s]*AND\b/i', 'WHERE ', $whereSql ); + } + + $sql = "SELECT lcom.`comment_id`, lcom.`parent_id`, lcom.`root_id`, lcom.`thread_forward_sequence`, lcom.`thread_reverse_sequence`, lcom.`anon_name`, lc.*, uu.`email`, uu.`real_name`, uu.`login`, post.is_approved, post.is_warned, post.warned_message, uu.registration_date AS registration_date, + tf_ava.`file_name` AS `avatar_file_name`, tf_ava.`mime_type` AS `avatar_mime_type`, tf_ava.`user_id` AS `avatar_user_id`, ta_ava.`attachment_id` AS `avatar_attachment_id` + $selectSql + FROM `".BIT_DB_PREFIX."liberty_comments` lcom + INNER JOIN `".BIT_DB_PREFIX."boards_map` bm ON (lcom.`root_id` = bm.`topic_content_id`) + INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lcom.`content_id` = lc.`content_id`) + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (lc.`user_id` = uu.`user_id`) + $joinSql + LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` ta_ava ON ( uu.`avatar_attachment_id`=ta_ava.`attachment_id` ) + LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` tf_ava ON ( tf_ava.`file_id`=ta_ava.`foreign_id` ) + LEFT JOIN `".BIT_DB_PREFIX."boards_posts` post ON (post.`comment_id` = lcom.`comment_id`) + $whereSql ORDER BY ".$this->mDb->convertSortmode( $pListHash['sort_mode'] ); + + $ret = array(); + + if( $result = $this->mDb->query( $sql, $bindVars, $pListHash['max_records'], $pListHash['offset'] ) ) { + while( $row = $result->FetchRow() ) { + if (empty($row['anon_name'])) $row['anon_name'] = "Anonymous"; + if( !empty( $row['avatar_file_name'] )) { + $row['user_avatar_url'] = liberty_fetch_thumbnail_url( array( + 'source_file' => liberty_mime_get_source_file( array( 'user_id'=>$row['avatar_user_id'], 'file_name'=>$row['avatar_file_name'], 'mime_type'=>$row['avatar_mime_type'], 'attachment_id'=>$row['avatar_attachment_id'] ) ), + 'size' => 'avatar' + )); + } else { + $row['user_avatar_url'] = FALSE; + } + unset($row['avatar_file_name']); + if (!empty($row['warned_message'])) { + $row['warned_message'] = str_replace("\n","<br />\n",$row['warned_message']); + } + $row['data'] = trim($row['data']); + $row['user_url']=BitUser::getDisplayUrlFromHash($row); + $row['parsed_data'] = self::parseDataHash( $row ); + $row['level'] = substr_count ( $row['thread_forward_sequence'], '.' ) - 1; + $row['topic_id'] = boards_get_topic_comment( $row['thread_forward_sequence'] ); + $row['display_url'] = static::getDisplayUrlFromHash( $row ); + $c = new LibertyComment(); + $c->mInfo=$row; + $row['is_editable'] = $c->userCanEdit(); + $ret[] = $row; + //va($row); + } + } + + return $ret; + } + + /** + * This function counts the posts relating to a topic + */ + function getNumComments($pContentId = NULL) { + $ret = 0; + + $contentId = $this->mCommentId; + + $bindVars = array(); + + $joinSql = $selectSql = $whereSql = ''; + $paramHash = array( 'include_comments' => TRUE ); + $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars, $this, $paramHash ); + + if ($pContentId) { + $sql = "SELECT COUNT(*) + FROM `".BIT_DB_PREFIX."liberty_comments` lcom + INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lcom.`content_id` = lc.`content_id`) + INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON (lc.`user_id` = uu.`user_id`) $joinSql + LEFT JOIN `".BIT_DB_PREFIX."boards_posts` post ON (post.`comment_id` = lcom.`comment_id`) + WHERE lcom.`thread_forward_sequence` LIKE '".sprintf("%09d.",$contentId)."%' $whereSql + "; + $ret = $this->mDb->getOne( $sql, $bindVars ); + } + return $ret; + } + + /** + * This function generates a valid lookup URL + */ + function getDisplayUrl() { + $ret = NULL; + if( $this->isValid() ) { + $urlHash['comment_id'] = $this->mCommentId; + $urlHash['topic_id'] = $this->getTopicId(); + $ret = static::getDisplayUrlFromHash( $urlHash ); + } + return $ret; + } + + /** + * Generates the URL to the bitboard page + * @return the link to display the page. + */ + public static function getDisplayUrlFromHash( &$pParamHash ) { + global $gBitSystem; + + $ret = NULL; + if( static::verifyId( $pParamHash['comment_id'] ) ) { + if( $gBitSystem->isFeatureActive( 'pretty_urls' ) || $gBitSystem->isFeatureActive( 'pretty_urls_extended' ) ) { + $rewrite_tag = $gBitSystem->isFeatureActive( 'pretty_urls_extended' ) ? 'view/' : ''; + $ret = BOARDS_PKG_URL.$rewrite_tag."topic/".$pParamHash['topic_id']; + } else { + $ret = BOARDS_PKG_URL."index.php?t=".$pParamHash['topic_id']; + } + + if( $pParamHash['comment_id'] != $pParamHash['topic_id'] ) { + $ret .= '#comment_'.$pParamHash['comment_id']; + } + } + return $ret; + } + + function getTopicId() { + return boards_get_topic_comment( $this->getField( 'thread_forward_sequence') ); + } + + function modApprove() { + $data['is_approved'] = 1; + $this->setMetaData($data); + } + + function modReject() { + $this->deleteComment(); + } + + function modWarn($message) { + global $gBitSystem, $gBitUser; + + if (empty($message)) { + $gBitSystem->fatalError("No Warning Message Given. <br />A post cannot be warned without a message"); + } + $data['is_warned']=1; + $data['warned_message']=$message; + $this->setMetaData($data); + + if ($gBitSystem->isPackageActive('messages')) { + require_once(MESSAGES_PKG_PATH.'Messages.php'); + + $u = new BitUser($this->mInfo['user_id']); + $u->load(); + $userInfo = $u->mInfo; + + $pm = new Messages(); + $message = "Your post \"".$this->mInfo['title']."\" [http://".$_SERVER['HTTP_HOST'].$this->getContactUrl()."] has been warned with the following message:\n$message\n"; + $msgHash = array( + 'to_login' => $userInfo['login'], + 'to' => $userInfo['real_name'], + 'subject' => tra( 'Warned Post' ).': '.$this->mInfo['title'], + 'priority' => 4, + ); + $pm->postMessage( $msgHash ); + } + } + + function setMetaData($data) { + if ($this->isValid()) { + $key = array('comment_id' => $this->mCommentId); + $query_sel = "SELECT COUNT(*) FROM `".BIT_DB_PREFIX."boards_posts` WHERE comment_id=?"; + $c = $this->mDb->getOne( $query_sel , array_values($key)); + if ($c == 0) { + $data=array_merge($data,$key); + $this->mDb->associateInsert(BIT_DB_PREFIX."boards_posts",$data); + } else { + + $this->mDb->associateUpdate(BIT_DB_PREFIX."boards_posts",$data,$key); + } + } + } +} +?> |
