Вход Регистрация
Файл: admin/applications/forums/extensions/like/topics.php
Строк: 268
<?php
/**
 * @file        topics.php     Topics like class (forums application)
 *~TERABYTE_DOC_READY~
 * $Copyright: (c) 2001 - 2011 Invision Power Services, Inc.$
 * $License: http://www.invisionpower.com/company/standards.php#license$
 * $Author: mmecham $
 * $LastChangedDate: 2012-05-29 04:58:00 -0400 (Tue, 29 May 2012) $
 * @version        v3.3.3
 * $Revision: 10803 $
 */

if ( ! defined'IN_IPB' ) )
{
    print 
"<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
    exit();
}

/**
 *
 * @class        like_forums_topics_composite
 * @brief        Topics like class (forums application)
 */
class like_forums_topics_composite extends classes_like_composite
{
    
/**
     * Registry Object Shortcuts
     *
     * @var        $registry
     * @var        $DB
     * @var        $settings
     * @var        $request
     * @var        $lang
     * @var        $member
     * @var        $memberData
     * @var        $cache
     * @var        $caches
     */
    
protected $registry;
    protected 
$DB;
    protected 
$settings;
    protected 
$request;
    protected 
$lang;
    protected 
$member;
    protected 
$memberData;
    protected 
$cache;
    protected 
$caches;

    
/**
     * Constructor
     *
     * @return    @e void
     */
    
public function __construct()
    {
        
/* Make registry objects */
        
$this->registry   =  ipsRegistry::instance();
        
$this->DB         =  $this->registry->DB();
        
$this->settings   =& $this->registry->fetchSettings();
        
$this->request    =& $this->registry->fetchRequest();
        
$this->lang       =  $this->registry->getClass('class_localization');
        
$this->member     =  $this->registry->member();
        
$this->memberData =& $this->registry->member()->fetchMemberData();
        
$this->cache      =  $this->registry->cache();
        
$this->caches     =& $this->registry->cache()->fetchCaches();
        
        if ( ! 
$this->registry->isClassLoaded('class_forums') )
        {
            
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir('forums') . '/sources/classes/forums/class_forums.php''class_forums''forums' );
            
$this->registry->setClass'class_forums', new $classToLoad$this->registry ) );
            
$this->registry->getClass('class_forums')->forumsInit();
        }
        
        
/* Init */
        
if ( ! $this->registry->isClassLoaded('topics') )
        {
            
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir'forums' ) . "/sources/classes/topics.php"'app_forums_classes_topics''forums' );
            
$this->registry->setClass'topics', new $classToLoad$this->registry ) );
        }
        
        
$this->lang->loadLanguageFile( array( 'public_forums''public_topic' ), 'forums' );
    }
    
    
/**
     * Fetch the template group
     * 
     * @return    @e string
     */
    
public function skin()
    {
         return 
'topic';
    }    
    
    
/**
     * Return an array of acceptable frequencies
     * Possible: immediate, offline, daily, weekly
     * 
     * @return    @e array
     */
    
public function allowedFrequencies()
    {
        return array( 
'immediate''offline''daily''weekly' );
    }
    
    
/**
     * Return types of notification available for this item
     * 
     * @return    @e array    array( key, human readable )
     */
    
public function getNotifyType()
    {
        return array( 
'topics'$this->lang->words['follow_notify_topics'] );
    }
    
    
/**
     * Gets the vernacular (like or follow)
     *
     * @return    @e string
     */
    
public function getVernacular()
    {
        return 
'follow_t';
    }
    
    
/**
     * Check notifications that are to be sent to make sure they're valid and that
     * 
     * @param    array        $metaData        like_ DB data and like owner member data
     * @return    @e boolean
     */
    
public function notificationCanSend$metaData )
    {
        
/* Digests are checked in buildNotificationData */
        
$topic $this->registry->getClass('topics')->getTopicById$metaData['like_rel_id'] );
        
$forum $this->registry->getClass('class_forums')->getForumById$topic['forum_id'] );
        
        
/* Set member */
        
$this->registry->getClass('class_forums')->setMemberData$metaData );
        
        
$result $this->registry->getClass('class_forums')->forumsCheckAccess$forum['id'], 0'forum'$topictrue );
        
        
/* reset */
        
$this->registry->getClass('class_forums')->setMemberData$this->memberData );
        
        if ( ! 
$result )
        {
            return 
false;
        }
        
        return 
true;
    }
    
    
/**
     * Function to let plugins determine if a notification should not be sent.  Return false to send notification, or true to skip sending it.
     * 
     * @param    array    Notification data
     * @return    @e bool
     */
     
public function excludeNotification$row )
     {
         if ( 
$row['like_notify_freq'] == 'offline' AND $row['last_activity'] < $row['like_notify_sent'] )
         {
             return 
true;
         }
         
         return 
false;
     }
    
    
/**
     * Builds the notification data via the app class
     * 
     * @param    array        $data        like_ DB data and like owner member data
     * @param    string        $type        Types of notifications to send
     * @return    @e array    array( notification_key, notification_url, email_template, email_subject, build_message_array )
     * @see        allowedFrequencies()
     */
    
public function buildNotificationData$data$type )
    {
        
$topic     $data;
        
$forum     $this->registry->getClass('class_forums')->getForumById$topic['forum_id'] );
        
$flag      $this->registry->class_forums->fetchHiddenTopicType$topic );
        
$tFurl     $this->registry->getClass('output')->buildSEOUrl'showtopic=' $topic['tid'], 'publicNoSession'$topic['title_seo'], 'showtopic' );
        
$group     $this->caches['group_cache'][ $data['member_group_id'] ];
        
        
/* Topic has been posted in since last digest? */
        
if ( $topic['last_post'] <= $data['like_notify_sent'] )
        {
            return 
false;
        }
        
        
/* Unapproved or deleted */
        
if ( $flag != 'visible' )
        {
            return 
false;
        }
        
        
/* Set member */
        
$this->registry->getClass('class_forums')->setMemberData$data );
        
        
$result $this->registry->getClass('class_forums')->forumsCheckAccess$forum['id'], 0'forum'$topictrue );
        
        
/* reset */
        
$this->registry->getClass('class_forums')->setMemberData$this->memberData );
        
        if ( ! 
$result )
        {
            return 
false;
        }
            
        
/* build email unless cached */
        
if ( empty( $this->_cache['bnd'][ $topic['tid'] ] ) )
        {
            
$othersPosted false;
            
$posts        $this->registry->getClass('topics')->getPosts( array( 'topicId'       => $topic['tid'],
                                                                                  
'postType'      => 'visible',
                                                                                  
'dateIsGreater' => $data['like_notify_sent'],
                                                                                  
'sortField'     => 'pid',
                                                                                  
'limit'           => 50,
                                                                                  
'sortOrder'       => 'asc' ) );
            
            foreach( 
$posts as $pid => $post )
            {
                
/* Don't send if it's just us... */
                
if ( $data['like_member_id'] != $post['author_id'] )
                {
                    
$othersPosted true;
                }
                
                
$post_output .= "<br />-------------------------------------------<br />"
                             
.  $post['author_name'] . " -- " ipsRegistry::getClass'class_localization')->getDate$post['post_date'], 'SHORT' ) . "<br />" $post['post'] . "<br /><br />";
            }
            
            
/* ensure we have something to send */
            
if ( ! $post_output )
            {
                return 
false;
            }
                                
            
/* Process it */
            
$main_output .= $this->lang->words['topic_langbit'] . ": " $topic['title'] . " (" $this->lang->words['forum_langbit'] . ":" $forum['name'] . ")<br />"
                         
.  $tFurl "<br />"
                         
.  "=====================================<br />"
                         
.  $post_output
                         
.  "<br />=====================================<br />";
            
            
$this->_cache['bnd'][ $topic['tid'] ] = $main_output;
        }
        else
        {
            
$othersPosted true;
            
$main_output  $this->_cache['bnd'][ $topic['tid'] ];
        }
        
        if ( 
$othersPosted )
        {
            
/* Return array */        
            
return array( 'notification_key'        => 'followed_topics_digest',
                          
'notification_url'        => $tFurl,
                          
'email_template'            => ( $data['like_notify_freq'] == 'daily' ) ? 'digest_topic_daily' 'digest_topic_weekly',
                          
'email_subject'            => ( $data['like_notify_freq'] == 'daily' ) ? $this->lang->words['subject__digest_topic_daily'] : $this->lang->words['subject__digest_topic_weekly'],
                          
'build_message_array'        => array( 'URL'          => $tFurl,
                                                              
'TITLE'        => $topic['title'],
                                                              
'NAME'        => '-member:members_display_name-',
                                                              
'CONTENT'        => $main_output ) );
        }
        
    }
    
    
/**
     * Fetches joins for fetching data
     * 
     * @param    string        $field        DB field name (defaults to 'l.like_rel_id')
     * @return    @e array
     */
    
public function getDataJoins$field='l.like_rel_id' )
    {
        return array( array( 
'select' => 't.*, t.last_post as topic_last_post''from' => array( 'topics' => 't' ), 'where' => 't.tid=' $field'type' => 'left' ) );
    }
    
    
/**
     * Returns the type of item
     * 
     * @param    mixed        $relId            Relationship ID or array of IDs
     * @param    array        $selectType        Array of meta to select (title, url, type, parentTitle, parentUrl, parentType) null fetches all
     * @return    @e array    Meta data
     */
    
public function getMeta$relId$selectType=null )
    {
        
$return    = array();
        
$isNumeric false;
        
        if ( 
is_numeric$relId ) )
        {
            
$relId     = array( intval($relId) );
            
$isNumeric true;
        }

        
$this->DB->build( array( 'select' => 't.*',
                                 
'from'   => array( 'topics' => 't' ),
                                 
'where'  => 't.tid IN (' implode','$relId ) . ')',
                                 
'add_join' => array( array( 'select' => 'id as parent_fid, p.name as parent_name, p.name_seo as parent_name_seo',
                                                             
'from'   => array( 'forums' => 'p' ),
                                                             
'where'  => 'p.id=t.forum_id',
                                                             
'type'   => 'left'  ) ) ) );
        
        
$this->DB->execute();
        
        while( 
$row $this->DB->fetch() )
        {
            
/* Title */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'title'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.title'] = $row['title'];
            } 
            
            
/* URL */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'url'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.url'] = $this->registry->output->buildSEOUrl"showtopic=" $row['tid'], "public"$row['title_seo'], "showtopic" );
            }
            
            
/* Type */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'type'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.type'] = $this->lang->words['follow_topic'];
            } 
            
            
/* Parent title */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'parentTitle'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.parentTitle'] = ( ! empty( $row['parent_name'] ) ) ? $row['parent_name'] : null;
            } 
            
            
/* Parent url */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'parentTitle'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.parentUrl'] = ( ! empty( $row['parent_name'] ) ) ? $this->registry->output->buildSEOUrl"showforum=" $row['parent_fid'], "public"$row['parent_name_seo'], "showforum" ) : null;
            } 
            
            
/* Parent Type */
            
if ( $selectType === null OR ( is_array$selectType ) AND in_array'parentType'$selectType ) ) )
            {
                
$return$row['tid'] ]['like.parentType'] = $this->lang->words['follow_forum'];
            } 
        }
        
        return ( 
$isNumeric === true ) ? array_pop$return ) : $return;
    }
    
    
/**
     * Returns the join table for sorting when using 'view content I follow'
     * core_like has the alias "l".
     */
    
public function getSearchJoinAndSortBy()
    {
        return array( 
'from'  => array( 'topics' => 't' ),
                      
'where' => 'l.like_rel_id=t.tid',
                      
'order' => 't.last_post',
                      
'extraWhere' => $this->DB->buildWherePermission$this->registry->class_forums->fetchSearchableForumIds$this->memberData['member_id'] ), 't.forum_id'FALSE ) );
    }
}
Онлайн: 1
Реклама