summaryrefslogtreecommitdiff
path: root/includes/classes/BitBlogPost.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/classes/BitBlogPost.php')
-rw-r--r--includes/classes/BitBlogPost.php1213
1 files changed, 1213 insertions, 0 deletions
diff --git a/includes/classes/BitBlogPost.php b/includes/classes/BitBlogPost.php
new file mode 100644
index 0000000..a79adbc
--- /dev/null
+++ b/includes/classes/BitBlogPost.php
@@ -0,0 +1,1213 @@
+<?php
+/**
+ * $Header$
+ *
+ * @copyright (c) 2004 bitweaver.org
+ * All Rights Reserved. See below for details and a complete list of authors.
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See http://www.gnu.org/copyleft/lesser.html for details
+ *
+ * Virtual base class (as much as one can have such things in PHP) for all
+ * derived tikiwiki classes that require database access.
+ *
+ * @date created 2004/10/20
+ *
+ * @author drewslater <andrew@andrewslater.com>, spiderr <spider@steelsun.com>
+ *
+ * @version $Revision$
+ * @package blogs
+ */
+
+/**
+ * required setup
+ */
+require_once( LIBERTY_PKG_PATH.'LibertyComment.php');
+require_once( LIBERTY_PKG_PATH.'LibertyMime.php');
+require_once( BLOGS_PKG_CLASS_PATH.'BitBlog.php');
+
+define( 'BITBLOGPOST_CONTENT_TYPE_GUID', 'bitblogpost' );
+
+/**
+ * @package blogs
+ */
+class BitBlogPost extends LibertyMime {
+ public $mPostId;
+
+ function __construct( $pPostId=NULL, $pContentId=NULL ) {
+ parent::__construct();
+ $this->registerContentType( BITBLOGPOST_CONTENT_TYPE_GUID, array(
+ 'content_type_guid' => BITBLOGPOST_CONTENT_TYPE_GUID,
+ 'content_name' => 'Blog Post',
+ 'handler_class' => 'BitBlogPost',
+ 'handler_package' => 'blogs',
+ 'handler_file' => 'BitBlogPost.php',
+ 'maintainer_url' => 'http://www.bitweaver.org'
+ ) );
+ $this->mPostId = (int)$pPostId;
+ $this->mContentId = (int)$pContentId;
+ $this->mContentTypeGuid = BITBLOGPOST_CONTENT_TYPE_GUID;
+
+ // Permission setup
+ $this->mViewContentPerm = 'p_blogs_view';
+ $this->mCreateContentPerm = 'p_blogs_post';
+ $this->mUpdateContentPerm = 'p_blogs_update';
+ $this->mAdminContentPerm = 'p_blogs_admin';
+ }
+
+ /**
+ * Load a Blog Post section
+ */
+ function load( $pContentId = NULL, $pPluginParams = NULL ) {
+ if( $this->verifyId( $this->mPostId ) || $this->verifyId( $this->mContentId ) ) {
+ global $gBitSystem, $gBitUser, $gLibertySystem;
+
+ $bindVars = array(); $selectSql = ''; $joinSql = ''; $whereSql = '';
+ $lookupColumn = $this->verifyId( $this->mPostId )? 'post_id' : 'content_id';
+ $lookupId = $this->verifyId( $this->mPostId )? $this->mPostId : $this->mContentId;
+ array_push( $bindVars, $lookupId );
+ $this->getServicesSql( 'content_load_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
+
+ $query = "
+ SELECT bp.*, lc.*, lcds.`data` AS `summary`, lch.`hits`, uu.`login`, uu.`real_name`,
+ lfa.`file_name` as `avatar_file_name`, lfa.`mime_type` AS `avatar_mime_type`, laa.`attachment_id` AS `avatar_attachment_id`,
+ lfp.`file_name` AS `image_file_name`, lfp.`mime_type` AS `image_mime_type`, lap.`attachment_id` AS `image_attachment_id`
+ $selectSql
+ FROM `".BIT_DB_PREFIX."blog_posts` bp
+ INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lc.`content_id` = bp.`content_id`)
+ INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON( uu.`user_id` = lc.`user_id` )
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_data` lcds ON (lc.`content_id` = lcds.`content_id` AND lcds.`data_type`='summary')
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_hits` lch ON( lch.`content_id` = lc.`content_id` )
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` laa ON (uu.`user_id` = laa.`user_id` AND uu.`avatar_attachment_id`=laa.`attachment_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` lfa ON (lfa.`file_id` = laa.`foreign_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` lap ON( lap.`content_id` = lc.`content_id` AND lap.`is_primary` = 'y' )
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` lfp ON( lfp.`file_id` = lap.`foreign_id` )
+ $joinSql
+ WHERE bp.`$lookupColumn`=? $whereSql ";
+
+ if( $this->mInfo = $this->mDb->getRow( $query, $bindVars ) ) {
+ $this->mPostId = $this->mInfo['post_id'];
+ $this->mContentId = $this->mInfo['content_id'];
+ $this->mInfo['blogs'] = $this->getBlogMemberships( $this->mContentId );
+ // this is bad news right here, 'url' is wrong, standard is 'display_url'
+ // we should remove this now that display_url is added
+ $this->mInfo['url'] = BitBlogPost::getDisplayUrlFromHash( $this->mInfo );
+ $this->mInfo['display_url'] = BitBlogPost::getDisplayUrlFromHash( $this->mInfo );
+ foreach( array( 'avatar', 'image' ) as $img ) {
+ if( !empty( $this->mInfo[$img.'_file_name'] ) ) {
+ $this->mInfo[$img] = liberty_fetch_thumbnails( array(
+ 'source_file' => $this->getSourceFile( array( 'user_id'=>$this->getField( 'user_id' ), 'package'=>liberty_mime_get_storage_sub_dir_name( array( 'mime_type' => $this->getField( $img.'_mime_type' ), 'name' => $this->getField( $img.'_file_name' ) ) ), 'file_name' => basename( $this->mInfo[$img.'_file_name'] ), 'sub_dir' => $this->getField( $img.'_attachment_id' ) ) )
+ ));
+ }
+ }
+
+ $this->mInfo['raw'] = $this->mInfo['data'];
+ //for two text field auto split
+ if( $gBitSystem->isFeatureActive( 'blog_posts_autosplit' ) && preg_match( LIBERTY_SPLIT_REGEX, $this->mInfo['raw'] )){
+ $format = $this->mInfo['format_guid'];
+ $linebreak = $gLibertySystem->mPlugins[$format]['linebreak'];
+ if ( preg_match( "/\.{3}split\.{3}(".preg_quote( $linebreak, "/" )."){2}/i", $this->mInfo['raw'] ) ){
+ $parts = preg_split( "/\.{3}split\.{3}(".preg_quote( $linebreak, "/" )."){2}/i", $this->mInfo['raw'] );
+ }else{
+ $parts = preg_split( "/\.{3}split\.{3}/i", $this->mInfo['raw'] );
+ }
+ $this->mInfo['raw'] = isset( $parts[0] )? $parts[0] : $this->mInfo['raw'];
+ $this->mInfo['raw_more'] = isset( $parts[1] )? $parts[1] : NULL ;
+ }
+
+ $this->mInfo['data'] = preg_replace( LIBERTY_SPLIT_REGEX, "", $this->mInfo['data'] );
+ $this->mInfo['use_title'] = $gBitUser->getPreference( 'user_blog_posts_use_title', 'y', $this->mInfo['user_id'] ) ;
+
+ if( isset($pPluginParams['load_comments']) and $pPluginParams['load_comments'] ) {
+ $comment = new LibertyComment();
+ $comment->mRootObj = $this;
+ $this->mInfo['num_comments'] = $comment->getNumComments($this->mInfo['content_id']);
+ // Get the comments associated with this post
+ $this->mInfo['comments'] = $comment->getComments($this->mInfo['content_id'], $gBitSystem->getConfig( 'comments_per_page', 10 ) );
+ }
+
+ if (!$this->mInfo['trackbacks_from'] || $this->mInfo['trackbacks_from']===null)
+ $this->mInfo['trackbacks_from'] = serialize(array());
+
+ if (!$this->mInfo['trackbacks_to'] || $this->mInfo['trackbacks_to']===null)
+ $this->mInfo['trackbacks_to'] = serialize(array());
+
+ $this->mInfo['trackbacks_from_count'] = count(array_keys(unserialize($this->mInfo['trackbacks_from'])));
+ $this->mInfo['trackbacks_from'] = unserialize($this->mInfo['trackbacks_from']);
+ $this->mInfo['trackbacks_to'] = unserialize($this->mInfo['trackbacks_to']);
+ $this->mInfo['trackbacks_to_count'] = count($this->mInfo['trackbacks_to']);
+
+ LibertyMime::load();
+ if( $this->mStorage ) {
+ foreach( array_keys( $this->mStorage ) as $key ) {
+ $this->mStorage[$key]['wiki_plugin_link'] = '{attachment id='.$key.'}';
+ }
+ }
+ } else {
+ $this->mPostId = NULL;
+ $this->mContentId = NULL;
+ }
+ }
+ return( count( $this->mInfo ) );
+ }
+
+ function getTitle( $pHash = NULL, $pDefault = true ) {
+ $ret = NULL;
+ if( $this->isValid() ) {
+ $ret = self::getTitleFromHash( $this->mInfo );
+ }
+ return $ret;
+ }
+
+ public static function getTitleFromHash( &$pHash, $pDefault=TRUE ) {
+ global $gBitSystem;
+ $ret = NULL;
+ if( !empty( $pHash['title'] ) ) {
+ $ret = $pHash['title'];
+ } elseif( !is_null( $pHash ) ) {
+ $date_format = $gBitSystem->get_long_date_format();
+ if( $gBitSystem->get_display_offset() ) {
+ $date_format = preg_replace( "/ ?%Z/", "", $date_format );
+ } else {
+ $date_format = preg_replace( "/%Z/", "UTC", $date_format );
+ }
+ $date_string = $gBitSystem->mServerTimestamp->getDisplayDateFromUTC( !empty($pHash['created']) ? $pHash['created'] : $gBitSystem->getUTCTime());
+ $ret = $gBitSystem->mServerTimestamp->strftime( $date_format, $date_string, true );
+ }
+
+ return $ret;
+ }
+
+ function getBlogMemberships( $pPostContentId ){
+ global $gBitSystem;
+ $ret = NULL;
+ if( @$this->verifyId( $pPostContentId ) ) {
+ $bindVars = array( (int)$pPostContentId );
+ $query = "SELECT b.`content_id` AS hash_key, bpm.*, b.*, lc.*
+ FROM `".BIT_DB_PREFIX."blogs_posts_map` bpm
+ INNER JOIN `".BIT_DB_PREFIX."blogs` b ON b.`content_id` = bpm.`blog_content_id`
+ INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON lc.`content_id` = b.`content_id`
+ WHERE bpm.post_content_id = ?";
+
+ if( $ret = $this->mDb->getAssoc( $query, $bindVars ) ) {
+ foreach( array_keys( $ret ) as $blogContentId ) {
+ $ret[$blogContentId]['blog_url'] = BitBlog::getDisplayUrlFromHash( $ret[$blogContentId] );
+ }
+ }
+ } else {
+ $this->mErrors['post_id'] = "Invalid post id.";
+ }
+ return $ret;
+ }
+
+ /**
+ * Get the URL for any given post image
+ * @param $pParamHash pass in full set of data returned from post query
+ * @return url to image
+ * @access public
+ **/
+ function getImageThumbnails( $pParamHash ) {
+ global $gBitSystem, $gThumbSizes;
+ $ret = NULL;
+ if( !empty( $pParamHash['image_file_name'] )) {
+ $thumbHash = array(
+ 'mime_image' => FALSE,
+ 'source_file' => $pParamHash['image_file_name']
+ );
+ $ret = liberty_fetch_thumbnails( $thumbHash );
+ $ret['original'] = BIT_ROOT_URL.$pParamHash['image_file_name'];
+ }
+ return $ret;
+ }
+
+ /**
+ * Deal with images and text, modify them apprpriately that they can be returned to the form.
+ * @param $previewData data submitted by form - generally $_REQUEST
+ * @return array of data compatible with article form
+ * @access public
+ **/
+ function preparePreview( $pParamHash ) {
+ global $gBitSystem, $gBitUser;
+
+ $data = $pParamHash;
+ // preserve our split data if we are using to text fields cause it gets merged in verify
+ $data['data'] = $data['edit'];
+ $data['raw'] = $data['edit'];
+ $data['raw_more'] = (!empty($data['edit_body'])?$data['edit_body']:'');
+ $this->verify( $data );
+
+ if( empty( $data['user_id'] ) ) {
+ $data['user_id'] = $gBitUser->mUserId;
+ }
+
+ if( empty( $data['hits'] ) ) {
+ $data['hits'] = 0;
+ }
+
+ if( empty( $data['publish_date'] ) ) {
+ $data['publish_date'] = $gBitSystem->getUTCTime();
+ }
+
+ // preserve checked blogs
+ if( !empty($pParamHash['blog_content_id']) ){
+ foreach($pParamHash['blog_content_id'] as $blog_content_id) {
+ $this->mInfo['blogs'][$blog_content_id] = $blog_content_id;
+ }
+ }
+
+ $data['use_title'] = $gBitUser->getPreference( 'user_blog_posts_use_title', 'y', $data['user_id'] );
+ $data['title'] = $this->getTitle($pParamHash);
+
+ if( empty( $data['parsed_data'] ) ) {
+ $data['no_cache'] = TRUE;
+ /* this is already taken care of by calling verify above
+ if (isset($data['edit_body'])){
+ $data['edit'] .= "...split...".$data['edit_body'];
+ }
+ */
+ $data['parsed_data'] = self::parseDataHash( $data );
+ // replace the split syntax with a horizontal rule
+ $data['parsed_data'] = preg_replace( LIBERTY_SPLIT_REGEX, "<hr />", $data['parsed_data'] );
+ }
+
+ return $data;
+ }
+
+
+
+ /**
+ * Make sure the data is safe to store
+ * @param pParamHash be sure to pass by reference in case we need to make modifcations to the hash
+ * This function is responsible for data integrity and validation before any operations are performed with the $pParamHash
+ * NOTE: This is a PRIVATE METHOD!!!! do not call outside this class, under penalty of death!
+ *
+ * @param array pParams reference to hash of values that will be used to store the page, they will be modified where necessary
+ *
+ * @return bool TRUE on success, FALSE if verify failed. If FALSE, $this->mErrors will have reason why
+ *
+ * @access private
+ **/
+ function verify( &$pParamHash ) {
+ global $gBitUser, $gBitSystem, $gLibertySystem;
+
+ // make sure we're all loaded up of we have a mPostId
+ if( $this->verifyId( $this->mPostId ) && empty( $this->mInfo ) ) {
+ $this->load();
+ }
+
+ if( @$this->verifyId( $this->mInfo['content_id'] ) ) {
+ $pParamHash['content_id'] = $this->mInfo['content_id'];
+ }
+
+ // It is possible a derived class set this to something different
+ if( empty( $pParamHash['content_type_guid'] )&& !empty( $this->mContentTypeGuid ) ) {
+ $pParamHash['content_type_guid'] = $this->mContentTypeGuid;
+ }
+
+ if( !empty( $pParamHash['data'] ) ) {
+ $pParamHash['edit'] = $pParamHash['data'];
+ }
+
+ // for two text field auto split
+ if (!empty($pParamHash['edit_body'])){
+ $linebreak = $gLibertySystem->mPlugins[$pParamHash['format_guid']]['linebreak'];
+ // we need two line breaks to simulate a paragraph break
+ $pParamHash['edit'] .= "...split...".$linebreak.$linebreak.$pParamHash['edit_body'];
+ }
+
+ // truncate length if too long
+ if( !empty( $pParamHash['title'] ) ) {
+ $pParamHash['title'] = substr( $pParamHash['title'], 0, 160 );
+ }
+
+ if( !empty( $pParamHash['publish_Month'] ) ) {
+ //$dateString = $pParamHash['publish_Year'].'-'.$pParamHash['publish_Month'].'-'.$pParamHash['publish_Day'].' '.$pParamHash['publish_Hour'].':'.$pParamHash['publish_Minute'];
+
+ //old way
+ //$timestamp = $gBitSystem->mServerTimestamp->getUTCFromDisplayDate( strtotime( $dateString ) );
+ //new way
+ $this->mDate = new BitDate(0);
+ $offset = $this->mDate->get_display_offset();
+
+ $dateString = $this->mDate->gmmktime(
+ $pParamHash['publish_Hour'],
+ $pParamHash['publish_Minute'],
+ isset($pParamHash['publish_Second']) ? $pParamHash['publish_Second'] : 0,
+ $pParamHash['publish_Month'],
+ $pParamHash['publish_Day'],
+ $pParamHash['publish_Year']
+ );
+
+ $timestamp = $this->mDate->getUTCFromDisplayDate( $dateString );
+
+ if( $timestamp !== -1 ) {
+ $pParamHash['publish_date'] = $timestamp;
+ }
+ }
+ if( !empty( $pParamHash['publish_date'] ) ) {
+ $pParamHash['post_store']['publish_date'] = $pParamHash['publish_date'];
+ }else{
+ $pParamHash['post_store']['publish_date'] = $gBitSystem->getUTCTime();
+ }
+
+ if( !empty( $pParamHash['expire_Month'] ) ) {
+ $dateString = $pParamHash['expire_Year'].'-'.$pParamHash['expire_Month'].'-'.$pParamHash['expire_Day'].' '.$pParamHash['expire_Hour'].':'.$pParamHash['expire_Minute'];
+
+ //old way
+ //$timestamp = $gBitSystem->mServerTimestamp->getUTCFromDisplayDate( strtotime( $dateString ) );
+ //new way
+ $this->mDate = new BitDate(0);
+ $offset = $this->mDate->get_display_offset();
+
+ $dateString = $this->mDate->gmmktime(
+ $pParamHash['expire_Hour'],
+ $pParamHash['expire_Minute'],
+ isset($pParamHash['expire_Second']) ? $pParamHash['expire_Second'] : 0,
+ $pParamHash['expire_Month'],
+ $pParamHash['expire_Day'],
+ $pParamHash['expire_Year']
+ );
+
+ $timestamp = $this->mDate->getUTCFromDisplayDate( $dateString );
+
+ if( $timestamp !== -1 ) {
+ $pParamHash['expire_date'] = $timestamp;
+ }
+ }
+ if( !empty( $pParamHash['expire_date'] ) ) {
+ $pParamHash['post_store']['expire_date'] = $pParamHash['expire_date'];
+ }else{
+ $pParamHash['post_store']['expire_date'] = $gBitSystem->getUTCTime();
+ }
+
+ // if we have an error we get them all by checking parent classes for additional errors
+ if( count( $this->mErrors ) > 0 ){
+ parent::verify( $pParamHash );
+ }
+
+ return( count( $this->mErrors )== 0 );
+ }
+
+ /**
+ * Check that the class has a valid blog loaded
+ */
+ function isValid() {
+ return( $this->verifyId( $this->mPostId ) && is_numeric( $this->mPostId ) && $this->mPostId > 0 );
+ }
+
+ /**
+ * Check if the current user is the blog owner
+ */
+ function isBlogOwner( $pUserId=NULL ) {
+ $ret = FALSE;
+ global $gBitUser;
+ if( empty( $pUserId ) && $gBitUser->isValid() ) {
+ $pUserId = $gBitUser->mUserId;
+ }
+ if( $this->isValid() && ($pUserId == $this->mInfo["blog_user_id"]) ) {
+ $ret = 'y';
+ }
+ return $ret;
+ }
+
+
+ /**
+ * Check if the current post can have comments attached to it
+ */
+ function isCommentable(){
+ global $gBitSystem;
+ return $gBitSystem->isFeatureActive( 'blog_posts_comments' );
+ }
+
+ /**
+ * Store a Blog Post
+ * @todo users_watches is a legacy package and needs refactoring
+ */
+ function store( &$pParamHash ) {
+ global $gBitSystem;
+ $this->StartTrans();
+ if( $this->verify( $pParamHash )&& LibertyMime::store( $pParamHash ) ) {
+ $table = BIT_DB_PREFIX."blog_posts";
+
+ // Send trackbacks recovering only successful trackbacks
+ if ( !empty( $pParamHash['trackback'] ) ){
+ $trackbacks = serialize( $this->sendTrackbacks( $pParamHash['trackback'] ) );
+ }
+
+ if( $this->isValid() ) {
+ $locId = array( "content_id" => $this->mContentId );
+ $result = $this->mDb->associateUpdate( $table, $pParamHash['post_store'], $locId );
+ } else {
+ $pParamHash['post_store']['content_id'] = $pParamHash['content_id'];
+ if( @$this->verifyId( $pParamHash['post_id'] ) ) {
+ // if pParamHash['post_id'] is set, someone is requesting a particular post_id. Use with caution!
+ $pParamHash['post_store']['post_id'] = $pParamHash['post_id'];
+ } else {
+ $pParamHash['post_store']['post_id'] = $this->mDb->GenID( 'blog_posts_post_id_seq' );
+ }
+ $this->mPostId = $pParamHash['post_store']['post_id'];
+ //store the new post
+ $result = $this->mDb->associateInsert( $table, $pParamHash['post_store'] );
+ }
+
+ // let's reload to get a full mInfo hash which is needed below
+ $this->load();
+
+ // if blog_content_id, then map the post to the relative blogs
+ if( !empty( $pParamHash['blog_content_id'] )){
+ $this->storePostMap( $this->mInfo, $pParamHash['blog_content_id'], NULL, TRUE );
+ }
+
+ // Update post with trackbacks successfully sent
+ // Can this be moved below into similar function below? -wjames5
+ // this throws an error on site population because post_id is not defined in pParamHash - wjames5
+ $query = "UPDATE `".BIT_DB_PREFIX."blog_posts` SET `trackbacks_from`=?, `trackbacks_to` = ? WHERE `post_id`=?";
+ if( @BitBase::verifyId( $pParamHash['post_id'] )) {
+ $this->mDb->query( $query, array( serialize( array() ), $trackbacks, (int) $pParamHash['post_id'] ));
+ }
+
+ if( $gBitSystem->isFeatureActive( 'users_watches' ) ) {
+ global $gBitUser, $gBitSmarty;
+ if( isset( $this->mInfo['blog_id'] ) && $nots = $gBitUser->getEventWatches( 'blog_post', $this->mInfo['blog_id'] ) ) {
+ foreach ($nots as $not) {
+ $gBitSmarty->assign('mail_site', $_SERVER["SERVER_NAME"]);
+ $gBitSmarty->assign('mail_title', $this->mInfo['title']);
+ $gBitSmarty->assign('mail_blogid', $this->mInfo['blog_id']);
+ $gBitSmarty->assign('mail_postid', $this->mPostId);
+ $gBitSmarty->assign('mail_date', $gBitSystem->getUTCTime());
+ $gBitSmarty->assign('mail_user', $this->mInfo['login']);
+ $gBitSmarty->assign('mail_data', $this->mInfo['data']);
+ $gBitSmarty->assign('mail_hash', $not['hash']);
+ $foo = parse_url($_SERVER["REQUEST_URI"]);
+ $machine = httpPrefix(). $foo["path"];
+ $gBitSmarty->assign('mail_machine', $machine);
+ $parts = explode('/', $foo['path']);
+
+ if (count($parts) > 1)
+ unset ($parts[count($parts) - 1]);
+
+ $gBitSmarty->assign('mail_machine_raw', httpPrefix(). implode('/', $parts));
+ $mail_data = $gBitSmarty->fetch('bitpackage:blogs/user_watch_blog_post.tpl');
+ @mail($not['email'], tra('Blog post'). ' ' . $title, $mail_data, "From: ".$gBitSystem->getPrefence( 'site_sender_email' )."\r\nContent-type: text/plain;charset=utf-8\r\n");
+ }
+ }
+ }
+
+ //is this nearly identical to the above and can they be consolodated? -wjames5
+ // should this be $pParamHash['trackback'] or the above $pParamHash['trackbacks'] ? - xing
+ if( !empty( $pParamHash['trackbacks'] ) ) {
+ $query = "update `".BIT_DB_PREFIX."blog_posts` set `trackbacks_to`=? where `post_id`=?";
+ $result = $this->mDb->query($query,array($trackbacks, $user_id, $post_id));
+ }
+
+ $this->CompleteTrans();
+ $this->load();
+ }
+ return ( count( $this->mErrors ) == 0 );
+ }
+
+
+ function loadPostMap( $pPostContentId, $pBlogContentId){
+ $ret = NULL;
+ if( @BitBase::verifyId( $pPostContentId ) ){
+ $this->StartTrans();
+ $result = $this->mDb->getRow( "SELECT * FROM `".BIT_DB_PREFIX."blogs_posts_map` WHERE `post_content_id`=? AND `blog_content_id`=?", array( $pPostContentId, $pBlogContentId ) );
+ $this->CompleteTrans();
+ if ( !empty( $result ) ){
+ $ret = $result;
+ };
+ }
+ return $ret;
+ }
+
+ /**
+ * Map a Post to a Blog or multiple Blogs
+ * @param pPost a Post hash.
+ * @param pBlogMixed the content_id or and array of ids of the blogs we want the post to show up in.
+ * @param pCrosspostNote text to display with the blog post when viewed in the blog crossposted to.
+ * @param pAutoProcess a bool to distinguish if we are storing from the crosspost interface or from the blog posting interface.
+ */
+ function storePostMap( $pPost, $pBlogMixed, $pCrosspostNote = NULL, $pAutoProcess = FALSE ) {
+ global $gBitSystem, $gBitUser;
+ $postContentId = $pPost['content_id'];
+ if( @$this->verifyId( $postContentId ) ) {
+ $this->StartTrans();
+ //this is to set the time we add a post to a blog.
+ $currTime = $gBitSystem->getUTCTime();
+ $postTime = $pPost['publish_date'];
+ $timeStamp = ( $postTime > $currTime )?$postTime : $currTime;
+ $blogIds = array();
+
+ if( !empty( $pBlogMixed )){
+ if (!is_array( $pBlogMixed ) && !is_numeric( $pBlogMixed ) ){
+ $blogIds = explode( ",", $pBlogMixed );
+ }elseif ( is_array( $pBlogMixed ) ) {
+ $blogIds = $pBlogMixed;
+ }elseif ( is_numeric( $pBlogMixed ) ) {
+ $blogIds = array( $pBlogMixed );
+ }
+ }
+ $currentMappings = array();
+ if( $allMappings = $this->mDb->getCol( "SELECT `blog_content_id` FROM `".BIT_DB_PREFIX."blogs_posts_map` WHERE `post_content_id`=?", array( $postContentId ) ) ) {
+ // whiddle down all mappings to just those we have perm to
+ foreach( $allMappings as $blogContentId ) {
+ if( $this->checkContentPermission( array( 'user_id' => $gBitUser->mUserId, 'perm_name'=>'p_blogs_post', 'content_id'=>$blogContentId ) ) ) {
+ $currentMappings[] = $blogContentId;
+ }
+ }
+ }
+
+ // Add new mappings for this post
+ $newBlogIds = array_diff( $blogIds, $currentMappings );
+ foreach( $newBlogIds as $blogContentId ) {
+ if( $this->verifyId( $blogContentId ) && $this->checkContentPermission( array( 'user_id' => $gBitUser->mUserId, 'perm_name'=>'p_blogs_post', 'content_id'=>$blogContentId ) ) ) {
+ $result = $this->mDb->associateInsert( BIT_DB_PREFIX."blogs_posts_map", array(
+ 'post_content_id' => $postContentId,
+ 'blog_content_id' => (int)$blogContentId,
+ 'date_added' => $timeStamp,
+ 'crosspost_note' => $pCrosspostNote,
+ ));
+ }
+ }
+
+ /* if we are coming form the crossposting form then we
+ * want to update any change to the crosspost note.
+ * we dont want to if we are coming from the blog posting form.
+ */
+ if( !$pAutoProcess ){
+ // Update existing mappings
+ $updateBlogIds = array_intersect( $blogIds, $currentMappings );
+ foreach( $updateBlogIds as $blogContentId ) {
+ if( $this->verifyId( $blogContentId ) && $this->checkContentPermission( array( 'user_id' => $gBitUser->mUserId, 'perm_name'=>'p_blogs_post', 'content_id'=>$blogContentId ) ) ) {
+ $result = $this->mDb->associateUpdate( BIT_DB_PREFIX."blogs_posts_map", array(
+ 'crosspost_note' => $pCrosspostNote,
+ ), array(
+ 'post_content_id' => $postContentId,
+ 'blog_content_id' => (int)$blogContentId,
+ ));
+ }
+ }
+ }
+ $this->CompleteTrans();
+
+ /* if we are coming from the blog posting form we
+ * want to automatically drop any crossposting if
+ * we have unchecked them there. we ignore this when
+ * coming from the crossposting form.
+ */
+ if ( $pAutoProcess ){
+ // Remove mappings for this post
+ $removedBlogIds = array_diff( $currentMappings, $blogIds );
+ $this->expungePostMap( $postContentId, $removedBlogIds );
+ }
+ }
+
+ return ( count( $this->mErrors ) == 0 );
+ }
+
+ function expungePostMap( $pPostContentId, $pBlogContentIds ){
+ $this->StartTrans();
+ if ( !empty($pBlogContentIds) ){
+ foreach( $pBlogContentIds as $blogContentId ) {
+ $this->mDb->query( "DELETE FROM `".BIT_DB_PREFIX."blogs_posts_map` WHERE `blog_content_id`=? AND `post_content_id`=?", array( $blogContentId, $pPostContentId ) );
+ }
+ }
+ $this->CompleteTrans();
+ return ( count( $this->mErrors ) == 0 );
+ }
+
+ /**
+ * Remove complete blog post set and any comments
+ */
+ function expunge() {
+ $ret = FALSE;
+ // let's force a full load to make sure everything is loaded.
+ // lets not -wjames5
+ //$this->load();
+ if( $this->isValid() ) {
+ $this->StartTrans();
+
+ // remove all references in blogs_posts_map where post_content_id = content_id
+ $query_map = "DELETE FROM `".BIT_DB_PREFIX."blogs_posts_map` WHERE `post_content_id` = ?";
+ $result = $this->mDb->query( $query_map, array( $this->mContentId ) );
+
+ $query = "DELETE FROM `".BIT_DB_PREFIX."blog_posts` WHERE `content_id` = ?";
+ $result = $this->mDb->query( $query, array( $this->mContentId ) );
+
+ // Do this last so foreign keys won't complain (not the we have them... yet ;-)
+ if( LibertyMime::expunge() ) {
+ $ret = TRUE;
+ $this->CompleteTrans();
+ } else {
+ $this->RollbackTrans();
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Return a summary for this content base on
+ *
+ * @param object PostId of the item to use
+ * @return object Url String
+ */
+ function getDescription() {
+ if( !($ret = $this->getField( 'summary' )) ) {
+ $ret = $this->getField( 'data' );
+ }
+ return $ret;
+ }
+
+
+ /**
+ * Generate a valid url for the Blog
+ *
+ * @param object PostId of the item to use
+ * @return object Url String
+ */
+ public static function getDisplayUrlFromHash( &$pParamHash ) {
+ global $gBitSystem;
+
+ $ret = NULL;
+ if( @BitBase::verifyId( $pParamHash['content_id'] )) {
+ $rewrite_tag = $gBitSystem->isFeatureActive( 'pretty_urls_extended' ) ? 'view/' : '';
+ if( $gBitSystem->isFeatureActive( 'pretty_urls' ) || $gBitSystem->isFeatureActive( 'pretty_urls_extended' ) ) {
+ if( !empty( $pParamHash['post_id'] ) ) {
+ $ret = BLOGS_PKG_URL.$rewrite_tag.'post/'.$pParamHash['post_id'];
+ } else {
+ $ret = BLOGS_PKG_URL.$rewrite_tag.'content/'.$pParamHash['content_id'];
+ }
+ } else {
+ $ret = BLOGS_PKG_URL.'view_post.php?content_id='.$pParamHash['content_id'];
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Generate a valid display link for the Blog
+ *
+ * @param object PostId of the item to use
+ * @param array Not used
+ * @return object Fully formatted html link for use by Liberty
+ */
+ function getDisplayLink( $pTitle=NULL, $pMixed=NULL, $pAnchor=NULL ) {
+ global $gBitSystem;
+ if( empty( $pTitle ) && !empty( $this ) ) {
+ $pTitle = $this->getField( 'title', $this->getContentTypeName() );
+ }
+
+ if( empty( $pMixed ) && !empty( $this ) ) {
+ $pMixed = $this->mInfo;
+ }
+
+ $ret = $pTitle;
+ if( $gBitSystem->isPackageActive( 'blogs' ) ) {
+ $ret = '<a title="'.htmlspecialchars( BitBlogPost::getTitle( $pMixed ) ).'" href="'.BitBlogPost::getDisplayUrlFromHash( $pMixed ).'">'.htmlspecialchars( BitBlogPost::getTitle( $pMixed ) ).'</a>';
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Returns include file that will
+ * @return the fully specified path to file to be included
+ */
+ function getRenderFile() {
+ return( BLOGS_PKG_INCLUDE_PATH.'display_bitblogpost_inc.php' );
+ }
+
+ function sendTrackbacks( $pTrackbacks ) {
+ $ret = array();
+ if( $this->isValid() && !empty( $pTrackbacks ) ) {
+ // Split to get each URI
+ $tracks = explode(',', $pTrackbacks);
+
+ //Build uri for post
+ $parts = parse_url($_SERVER['REQUEST_URI']);
+ $uri = httpPrefix(). str_replace('post',
+ 'view_post', $parts['path']). '?post_id=' . $this->mPostId . '&amp;blog_id=' . $this->mInfo['blog_id'];
+ include_once ( UTIL_PKG_INC.'Snoopy.class.inc' );
+ $snoopy = new Snoopy;
+
+ foreach ($tracks as $track) {
+ @$fp = fopen($track, 'r');
+
+ if ($fp) {
+ $data = '';
+
+ while (!feof($fp)) {
+ $data .= fread($fp, 32767);
+ }
+
+ fclose ($fp);
+ preg_match("/trackback:ping=(\"|\'|\s*)(.+)(\"|\'\s)/", $data, $reqs);
+
+ if (!isset($reqs[2]))
+ return $ret;
+
+ @$fp = fopen($reqs[2], 'r');
+
+ if ($fp) {
+ fclose ($fp);
+
+ $submit_url = $reqs[2];
+ $submit_vars["url"] = $uri;
+ $submit_vars["blog_name"] = $this->mInfo['blogtitle'];
+ $submit_vars["title"] = $this->mInfo['title'] ? $this->mInfo['title'] : date("d/m/Y [h:i]", $this->mInfo['created']);
+ $submit_vars["title"] .= ' ' . tra('by'). ' ' . BitUser::getDisplayNameFromHash( FALSE, $this->mInfo );
+ $submit_vars["excerpt"] = substr($post_info['data'], 0, 200);
+ $snoopy->submit($submit_url, $submit_vars);
+ $back = $snoopy->results;
+
+ if (!strstr('<error>1</error>', $back)) {
+ $ret[] = $track;
+ }
+ }
+ }
+ }
+ }
+ return $ret;
+ }
+
+ function getList( &$pListHash ) {
+ global $gBitUser, $gBitSystem;
+
+ $this->prepGetList( $pListHash );
+
+ $selectSql = ''; $joinSql = ''; $whereSql = '';
+ $bindVars = array();
+ array_push( $bindVars, $this->mContentTypeGuid );
+
+ $this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars, NULL, $pListHash );
+
+ if( @$this->verifyId( $pListHash['blog_id'] ) ) {
+ $selectSql .= ', bpm.crosspost_note';
+ array_push( $bindVars, (int)$pListHash['blog_id'] );
+ $joinSql .= " LEFT OUTER JOIN `".BIT_DB_PREFIX."blogs_posts_map` bpm ON ( bpm.`post_content_id` = bp.`content_id` ) ";
+ $joinSql .= " LEFT OUTER JOIN `".BIT_DB_PREFIX."blogs` b ON ( bpm.`blog_content_id`=b.`content_id` ) ";
+ // " ON ( b.`content_id` = bpm.`blog_content_id` AND bp.`content_id` = bpm.`post_content_id` )";
+ $whereSql .= ' AND b.`blog_id` = ? ';
+ $pListHash['sort_mode'] = 'publish_date_desc';
+ }
+
+ if( @$this->verifyId( $pListHash['post_id_gt'] ) ) {
+ array_push( $bindVars, (int)$pListHash['post_id_gt'] );
+ $whereSql .= ' AND bp.`post_id` > ? ';
+ }
+
+ if( @$this->verifyId( $pListHash['post_id_lt'] ) ) {
+ array_push( $bindVars, (int)$pListHash['post_id_lt'] );
+ $whereSql .= ' AND bp.`post_id` < ? ';
+ }
+
+ if( @$this->verifyId( $pListHash['user_id'] ) ) {
+ array_push( $bindVars, (int)$pListHash['user_id'] );
+ $whereSql .= ' AND lc.`user_id` = ? ';
+ }
+
+ $this->getServicesSql( 'content_user_collection_function', $selectSql, $joinSql, $whereSql, $bindVars, NULL, $pListHash );
+
+ // map user to login in case we used one instead of the other
+ if( !empty( $pListHash['user'] ) ) {
+ $pListHash['login'] = $pListHash['user'];
+ }
+
+ if( !empty( $pListHash['login'] ) ) {
+ array_push( $bindVars, $pListHash['login'] );
+ $whereSql .= ' AND uu.`login` = ? ';
+ }
+
+ if( $pListHash['find'] ) {
+ $findesc = '%' . strtoupper( $pListHash['find'] ) . '%';
+ $whereSql .= "AND (UPPER(lc.`data`) like ?) ";
+ $bindVars[] =$findesc;
+ }
+
+ if( !empty( $pListHash['date'] ) && is_numeric( $pListHash['date'] ) ) {
+ $whereSql .= " AND lc.`created`<=? ";
+ $bindVars[]= $pListHash['date'];
+ }
+
+ if( !empty( $pListHash['date_start'] ) && is_numeric( $pListHash['date_start'] ) ) {
+ $whereSql .= " AND lc.`created`>=? ";
+ $bindVars[]= $pListHash['date_start'];
+ }
+ if( !empty( $pListHash['date_end'] ) && is_numeric( $pListHash['date_end'] ) ) {
+ $whereSql .= " AND lc.`created`<=? ";
+ $bindVars[]= $pListHash['date_end'];
+ }
+
+ if( !empty( $pListHash['content_perm_name'] ) ) {
+ $this->getContentListPermissionsSql( $pListHash['content_perm_name'], $selectSql, $joinSql, $whereSql, $bindVars );
+ }
+
+ /* Check if the post wants to be viewed before / after respective dates
+ * Note: expiring posts are determined by the expired date being greater than the publish date
+ */
+ static::getDateRestrictions($pListHash, $whereSql, $bindVars);
+
+ /* sort_mode is never empty due to call to prepGetList above
+ * I think this will have to be perminently removed and default
+ * set before passing the list hash in if a different default is
+ * desired from that in prepGetList. -wjames5
+ */
+ /*
+ if( empty( $pListHash['sort_mode'] ) ) {
+ $pListHash['sort_mode'] = 'publish_date_desc';
+ $sortModePrefix = 'bp';
+ //$pListHash['sort_mode'] = 'created_desc';
+ } else {
+ */
+ $sortModePrefix = '';
+ if( !empty( $pListHash['sort_mode'] ) && !strpos( $pListHash['sort_mode'], '.' ) ) {
+ switch( $pListHash['sort_mode'] ) {
+ case 'publish_date_asc':
+ case 'publish_date_desc':
+ case 'post_id_desc':
+ case 'post_id_asc':
+ $sortModePrefix = 'bp.';
+ break;
+ case 'date_added_desc':
+ $sortModePrefix = 'bpm.';
+ break;
+ case 'hits_asc':
+ case 'hits_desc':
+ $sortModePrefix = 'lch.';
+ break;
+ case 'sort_date_asc':
+ case 'sort_date_desc':
+ break;
+ case 'real_name_asc':
+ case 'real_name_desc':
+ $sortModePrefix = 'uu.';
+ break;
+ // these technicall are not correct, however, we do not double join on users_users, so we sort by creator real_name
+ case 'creator_real_name_asc':
+ case 'modifier_real_name_asc':
+ $sortModePrefix = 'uu.';
+ $pListHash['sort_mode'] = 'real_name_asc';
+ break;
+ case 'registration_date_desc':
+ $sortModePrefix = 'uu.';
+ $pListHash['sort_mode'] = 'registration_date_desc';
+ break;
+ case 'creator_real_name_desc':
+ case 'modifier_real_name_desc':
+ $sortModePrefix = 'uu.';
+ $pListHash['sort_mode'] = 'real_name_desc';
+ break;
+ default:
+ $sortModePrefix = 'lc.';
+ break;
+ }
+ }
+
+ $secondarySortMode = ($pListHash['sort_mode'] != 'last_modified_desc') ? ', last_modified DESC': '';
+ $sort_mode = $sortModePrefix . $this->mDb->convertSortmode( $pListHash['sort_mode'] ).$secondarySortMode;
+
+ $query = "
+ SELECT
+ bp.`post_id`, bp.`publish_date`, bp.`expire_date`, bp.`trackbacks_to`, bp.`trackbacks_from`,
+ lc.*, lch.`hits`, lcds.`data` AS `summary`, COALESCE( bp.`publish_date`, lc.`last_modified` ) AS sort_date,
+ uu.`email`, uu.`login`, uu.`real_name`,
+ lfa.`file_name` as `avatar_file_name`, lfa.`mime_type` AS `avatar_mime_type`, laa.`attachment_id` AS `avatar_attachment_id`,
+ lfp.`file_name` AS `image_file_name`, lfp.`mime_type` AS `image_mime_type`, lap.`attachment_id` AS `image_attachment_id`
+ FROM `".BIT_DB_PREFIX."blog_posts` bp
+ INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON lc.`content_id` = bp.`content_id`
+ INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON uu.`user_id` = lc.`user_id`
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_hits` lch ON lc.`content_id` = lch.`content_id`
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_data` lcds ON (lc.`content_id` = lcds.`content_id` AND lcds.`data_type`='summary')
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` laa ON (uu.`user_id` = laa.`user_id` AND laa.`attachment_id` = uu.`avatar_attachment_id`)
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` lfa ON lfa.`file_id` = laa.`foreign_id`
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_attachments` lap ON lap.`content_id` = lc.`content_id` AND lap.`is_primary` = 'y'
+ LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_files` lfp ON lfp.`file_id` = lap.`foreign_id`
+ $joinSql
+ WHERE lc.`content_type_guid` = ? $whereSql
+ ORDER BY $sort_mode";
+
+ # Get count of total number of items available
+ $query_cant = "
+ SELECT COUNT( * )
+ FROM `".BIT_DB_PREFIX."blog_posts` bp
+ INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON lc.`content_id` = bp.`content_id`
+ INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON uu.`user_id` = lc.`user_id`
+ $joinSql
+ WHERE lc.`content_type_guid` = ? $whereSql ";
+ $cant = $this->mDb->getOne($query_cant,$bindVars);
+ $pListHash["cant"] = $cant;
+
+ # Check for offset out of range
+ if ( $pListHash['offset'] < 0 ) {
+ $pListHash['offset'] = 0;
+ } elseif ( $pListHash['offset'] > $pListHash["cant"] ) {
+ $lastPageNumber = ceil ( $pListHash["cant"] / $pListHash['max_records'] ) - 1;
+ $pListHash['offset'] = $pListHash['max_records'] * $lastPageNumber;
+ }
+
+
+ $result = $this->mDb->query($query,$bindVars,$pListHash['max_records'],$pListHash['offset']);
+ $ret = array();
+
+ $comment = new LibertyComment();
+ while ($res = $result->fetchRow()) {
+ $res['no_fatal'] = TRUE;
+ $accessError = $this->invokeServices( 'content_verify_access', $res, FALSE );
+ if( empty( $accessError ) ) {
+ foreach( array( 'avatar', 'image' ) as $img ) {
+ $res[$img] = liberty_fetch_thumbnails( array(
+ 'source_file' => liberty_mime_get_source_file( array( 'user_id'=>$res['user_id'], 'package'=>liberty_mime_get_storage_sub_dir_name( array( 'mime_type' => $res[$img.'_mime_type'], 'name'=>$res[$img.'_file_name'] ) ), 'file_name'=>basename( $res[$img.'_file_name'] ), 'sub_dir'=>$res[$img.'_attachment_id'] ) )
+ ));
+ }
+ $res['thumbnail_url'] = BitBlogPost::getImageThumbnails( $res );
+ $res['num_comments'] = $comment->getNumComments( $res['content_id'] );
+ $res['post_url'] = BitBlogPost::getDisplayUrlFromHash( $res );
+ $res['display_url'] = $res['post_url'];
+ $res['display_link'] = $this->getDisplayLink( $res['title'], $res );
+ $res['blogs'] = $this->getBlogMemberships( $res );
+
+ // trackbacks
+ if($res['trackbacks_from']!=null)
+ $res['trackbacks_from'] = unserialize($res['trackbacks_from']);
+
+ if (!is_array($res['trackbacks_from']))
+ $res['trackbacks_from'] = array();
+
+ $res['trackbacks_from_count'] = count(array_keys($res['trackbacks_from']));
+ if($res['trackbacks_to']!=null)
+ $res['trackbacks_to'] = unserialize($res['trackbacks_to']);
+ if ($res['user_id'] == $gBitUser->mUserId) {
+ $res['ownsblog'] = 'y';
+ } else {
+ $res['ownsblog'] = 'n';
+ }
+ $res['trackbacks_to_count'] = count($res['trackbacks_to']);
+
+ $res['pages'] = $this->getNumberOfPages( $res['data'] );
+
+ // deal with the parsing
+ $parseHash['format_guid'] = $res['format_guid'];
+ $parseHash['content_id'] = $res['content_id'];
+ $parseHash['user_id'] = $res['user_id'];
+ // support for ...split... and auto split
+ if( !empty( $pListHash['full_data'] ) ) {
+ $parseHash['data'] = $res['data'];
+ $res['parsed'] = self::parseDataHash( $parseHash );
+ } else {
+ $parseHash['data'] = $res['data'];
+ $parseHash['no_cache'] = TRUE;
+ $splitArray = $this->parseSplit($parseHash, $gBitSystem->getConfig( 'blog_posts_description_length', 500));
+ $res = array_merge($res, $splitArray);
+ }
+ if( !empty( $this->mInfo['summary'] ) ) {
+ $res['summary'] = $parseHash['data'] = $this->mInfo['summary'];
+ $parseHash['no_cache'] = TRUE;
+ $res['parsed_summary'] = $this->parsedData( $parseHash );
+ }
+ if( !empty( $res['crosspost_note'] ) ){
+ $res['crosspost_note_raw'] = $parseHash['data'] = $res['crosspost_note'];
+ $parseHash['no_cache'] = TRUE;
+ $res['crosspost_note'] = self::parseDataHash( $parseHash );
+ }
+
+ $ret[] = $res;
+
+ } elseif( !empty( $accessError ) ) {
+ if( !empty( $accessError['access_control'] ) ) {
+ $res['post_url'] = BitBlogPost::getDisplayUrlFromHash( $res['content_id'], $res );
+ $res['display_url'] = $res['post_url'];
+ /* this needs to be part of loop that gets all blogs post is in
+ $res['blog_url'] = BitBlog::getDisplayUrlFromHash( $res['blog_content_id'] );
+ */
+ $res["parsed_data"] = $accessError['access_control'];
+ $ret[] = $res;
+ }
+ } else {
+ }
+ }
+ LibertyContent::postGetList( $pListHash );
+
+ return $ret;
+ }
+
+ /**
+ * alters the whereSql and bindVars to limit the posts returned based on the dates
+ * expects the blog_psots table to be aliased as bp
+ */
+ public static function getDateRestrictions( $pListHash, &$whereSql, &$bindVars ) {
+ global $gBitSystem, $gBitUser;
+
+ $now = $gBitSystem->getUTCTime();
+ if( !empty( $pListHash['show_future'] ) && !empty( $pListHash['show_expired'] ) && $gBitUser->hasPermission( 'p_blog_posts_read_future' ) && $gBitUser->hasPermission( 'p_blog_posts_read_expired' ) ) {
+ // this will show all post at once - future, current and expired
+ } elseif( !empty( $pListHash['show_future'] ) && $gBitUser->hasPermission( 'p_blog_posts_read_future' ) ) {
+ // hide expired posts but show future
+ $whereSql .= " AND ( bp.`expire_date` <= bp.`publish_date` OR bp.`expire_date` > ? ) ";
+ $bindVars[] = ( int )$now;
+ } elseif( !empty( $pListHash['show_expired'] ) && $gBitUser->hasPermission( 'p_blog_posts_read_expired' ) ) {
+ // hide future posts but show expired
+ $whereSql .= " AND bp.`publish_date` < ?";
+ $bindVars[] = ( int )$now;
+ } elseif( !empty( $pListHash['get_future'] ) && $gBitUser->hasPermission( 'p_blog_posts_read_future' ) ) {
+ // show only future
+ $whereSql .= " AND bp.`publish_date` > ?";
+ $bindVars[] = ( int )$now;
+ } elseif( !empty( $pListHash['get_expired'] ) && $gBitUser->hasPermission( 'p_blog_posts_read_expired' ) ) {
+ // show only expired posts
+ $whereSql .= " AND bp.`expire_date` < ? AND bp.`expire_date` > bp.`publish_date` ";
+ $bindVars[] = ( int )$now;
+ } else {
+ // hide future and expired posts
+ $whereSql .= " AND ((bp.`publish_date` IS NULL AND bp.`expire_date` IS NULL) OR (bp.`publish_date` <= ? AND ((bp.`expire_date` IS NULL) OR ( bp.`expire_date` <= bp.`publish_date` ) OR ( bp.`expire_date` > ? ))))";
+ $bindVars[] = ( int )$now;
+ $bindVars[] = ( int )$now;
+ }
+ }
+
+ /**
+ * Get a list of posts that are to be published in the future
+ *
+ * @param array $pParamHash contains listing options - same as getList()
+ * @access public
+ * @return array of posts
+ */
+ function getFutureList( &$pParamHash ) {
+ $pParamHash['get_future'] = TRUE;
+ return( $this->getList( $pParamHash ));
+ }
+
+
+ /**
+ * Get list of posts that have expired and are not displayed on the site anymore
+ *
+ * @param array $pParamHash contains listing options - same as getList()
+ * @access public
+ * @return array of posts
+ */
+ function getExpiredList( &$pParamHash ) {
+ $pParamHash['get_expired'] = TRUE;
+ return( $this->getList( $pParamHash ));
+ }
+
+
+ /**
+ *
+ */
+ function addTrackbackFrom( $url, $title = '', $excerpt = '', $blog_name = '') {
+ if( $this->isValid() ) {
+ $tbs = $this->getTrackbacksFrom( $this->mPostId );
+ $aux = array(
+ 'title' => $title,
+ 'excerpt' => $excerpt,
+ 'blog_name' => $blog_name
+ );
+
+ $tbs[$url] = $aux;
+ $st = serialize($tbs);
+ $query = "update `".BIT_DB_PREFIX."blog_posts` set `trackbacks_from`=? where `post_id`=?";
+ $this->mDb->query( $query, array( $st, $this->mPostId ) );
+ return true;
+ }
+ }
+
+ /**
+ *
+ */
+ function getTrackbacksFrom() {
+ if( $this->isValid() ) {
+ $st = $this->mDb->getOne("select `trackbacks_from` from `".BIT_DB_PREFIX."blog_posts` where `post_id`=?",array( $this->mPostId ) );
+ return unserialize($st);
+ }
+ }
+
+ /**
+ *
+ */
+ function getTrackbacksTo() {
+ if( $this->isValid() ) {
+ $st = $this->mDb->getOne("select `trackbacks_to` from `".BIT_DB_PREFIX."blog_posts` where `post_id`=?", array( $this->mPostId ) );
+ return unserialize($st);
+ }
+ }
+
+ /**
+ *
+ */
+ function clearTrackbacksFrom() {
+ if( $this->isValid() ) {
+ $empty = serialize(array());
+ $query = "update `".BIT_DB_PREFIX."blog_posts` set `trackbacks_from` = ? where `post_id`=?";
+ $this->mDb->query( $query, array( $empty, $this->mPostId ) );
+ }
+ }
+
+ /**
+ *
+ */
+ function clearTrackbacksTo() {
+ if( $this->isValid() ) {
+ $empty = serialize(array());
+ $query = "update `".BIT_DB_PREFIX."blog_posts` set `trackbacks_to` = ? where `post_id`=?";
+ $this->mDb->query( $query, array( $empty, $this->mPostId ) );
+ }
+ }
+
+ function getViewTemplate( $pAction ){
+ $ret = null;
+ switch ( $pAction ){
+ case "view":
+ $ret = "bitpackage:liberty/center_".$pAction."_generic.tpl";
+ break;
+ case "list":
+ $ret = "bitpackage:blogs/center_".$pAction."_blog_posts.tpl";
+ break;
+ }
+ return $ret;
+ }
+
+ /**
+ * getContentStatus
+ *
+ * @access public
+ * @return an array of content_status_id, content_status_names the current
+ * user can use on this content.
+ *
+ * NOTE: pUserMinimum and pUserMaximum are currently NOT inclusive in parent funtion, so these are one beyond the limit we desire
+ */
+ function getAvailableContentStatuses( $pUserMinimum=-6, $pUserMaximum=51 ) {
+ global $gBitUser;
+ $ret = LibertyMime::getAvailableContentStatuses( $pUserMinimum, $pUserMaximum );
+ // this is a little ugly as we manually trim the list to just what we need for blog posts for regular users
+ if( !$gBitUser->hasPermission( 'p_liberty_edit_all_status' )) {
+ if ( array_key_exists( -1, $ret ) ){
+ unset( $ret[-1] );
+ }
+ if ( array_key_exists( 50, $ret ) && $ret[50]=="Available" ){
+ $ret[50] = "Public";
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Returns the create/edit url to a blog post
+ * @param number $pContentId a valid content id
+ * @param array $pMixed a hash of params to add to the url
+ */
+ function getEditUrl( $pContentId = NULL, $pMixed = NULL ){
+ if( @BitBase::verifyId( $pContentId ) ) {
+ $ret = BLOGS_PKG_URL.'post.php?content_id='.$pContentId;
+ } elseif( $this->isValid() ) {
+ $ret = BLOGS_PKG_URL.'post.php?content_id='.$this->mContentId;
+ } else {
+ $ret = BLOGS_PKG_URL.'post.php'.(!empty( $pMixed )?"?":"");
+ }
+ foreach( $pMixed as $key => $value ){
+ if( $key != "content_id" || ( $key == "content_id" && @BitBase::verifyId( $value ) ) ) {
+ $ret .= (isset($amp)?"&":"").$key."=".$value;
+ }
+ $amp = TRUE;
+ }
+ return $ret;
+ }
+
+}
+?>