Вход Регистрация
Файл: admin/applications/core/sources/classes/reportLibrary.php
Строк: 285
<?php
/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.3.3
 * Library for reported content
 * Last Updated: $LastChangedDate: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
 * </pre>
 *
 * @author         $Author: bfarber $
 * @author        Based on original "Report Center" by Luke Scott
 * @copyright    (c) 2001 - 2009 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @subpackage    Core
 * @link        http://www.invisionpower.com
 * @version        $Rev: 10721 $
 */

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

class 
reportLibrary
{
    
/**
     * 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;
    
    
/**
     * Group Ids
     *
     * @var        array
     */    
    
protected $member_group_ids;
    
    
/**
     * Array of plugin objects
     *
     * @var        array
     */    
    
public $plugins;
    
    
/**
     * Status for new reports
     *
     * @var        integer
     */    
    
public $report_is_new        0;
    
    
/**
     * Status for complete reports
     *
     * @var        integer
     */    
    
public $report_is_complete    0;
    
    
/**
     * Cache of status/flag images
     *
     * @var        array
     */    
    
public $flag_cache            = array();
    
    
/**
     * Cache of HTML status dropdown
     *
     * @var        string
     */    
    
public $flag_body            '';

    
/**
     * Constructor
     *
     * @param    object        $registry        Registry object
     * @return    @e void
     */
    
public function __constructipsRegistry $registry )
    {
        
//-----------------------------------------
        // Make object
        //-----------------------------------------
        
        
$this->registry     $registry;
        
$this->DB            $this->registry->DB();
        
$this->settings =& $this->registry->fetchSettings();
        
$this->request  =& $this->registry->fetchRequest();
        
$this->member       $this->registry->member();
        
$this->memberData =& $this->registry->member()->fetchMemberData();
        
$this->cache        $this->registry->cache();
        
$this->caches   =& $this->registry->cache()->fetchCaches();
        
        
$this->member_group_ids    = array( $this->memberData['member_group_id'] );
        
$this->member_group_ids    array_diffarray_merge$this->member_group_idsexplode','$this->memberData['mgroup_others'] ) ), array('') );
    }
    
    
/**
     * Recache report center plugins
     *
     * @return    @e void
     */
    
public function rebuildReportCache()
    {
        
$_classes    = array();
        
        
$this->DB->build( array( 'select' => '*''from' => 'rc_classes''where' => 'onoff=1' ) );
        
$this->DB->execute();
        
        while( 
$r $this->DB->fetch() )
        {
            if( 
IPSLib::appIsInstalled$r['app'] ) )
            {
                
$_classes$r['my_class'] ]    = $r;
            }
        }
        
        
$this->cache->setCache'report_plugins' $_classes, array( 'array' => ) );
    }

    
/**
     * Returns the correct status icon / flag to display for a report row
     *
     * @param    array    Report Row
     * @return    string
     */
    
public function buildStatusIcon$row )
    {
        
$this->buildStatusestrue );
        
        
//-----------------------------------------
        // Pick the right flag.. or else!
        //-----------------------------------------

        
$row['img']        = str_replace'<#IMG_DIR#>'$this->registry->output->skin['set_image_dir'], $this->flag_cache$row['status'] ][ $row['points'] ]['img'] );
        
$row['width']    = $this->flag_cache$row['status'] ][ $row['points'] ]['width'];
        
$row['height']    = $this->flag_cache$row['status'] ][ $row['points'] ]['height'];
        
$row['is_png']    = $this->flag_cache$row['status'] ][ $row['points'] ]['is_png'];

        
//-----------------------------------------
        // Image? PNG? Using 'Is-Evil' machine?
        //-----------------------------------------
        
        
if( $row['img'] != '' )
        {
            return 
$this->registry->getClass('output')->getTemplate('reports')->statusIcon$row['img'], $row['width'], $row['height'] );
        }
        else
        {
            return 
'&nbsp;';
        }
    }

    
/**
     * Rebuild the member cache array if it is outdated
     *
     * @return    integer        New 'total reports' count
     */
    
public function rebuildMemberCacheArray()
    {
        
$this->DB->loadCacheFileIPSLib::getAppDir('core') . '/sql/' ips_DBRegistry::getDriverType() . '_report_queries.php''report_sql_queries' );

        
$class_perm $this->buildQueryPermissions();
        
        
$total $this->DB->buildAndFetch( array(
                                                        
'select'    => 'COUNT(*) as reports',
                                                        
'from'        => array( 'rc_reports_index' => 'rep' ),
                                                        
'where'        => $class_perm " AND stat.is_active=1",
                                                        
'add_join'    => array(
                                                                            array(
                                                                                
'from'    => array( 'rc_classes' => 'rcl' ),
                                                                                
'where'    => 'rcl.com_id=rep.rc_class'
                                                                                
),
                                                                            array(
                                                                                
'from'    => array( 'rc_status' => 'stat' ),
                                                                                
'where'    => 'stat.status=rep.status'
                                                                                
),
                                                                            )
                                                )        );
        
        
$reports_by_plugin = array();
        
        
$this->DB->build( array(
                                    
'select'    => 'rep.id, rep.title, rep.num_reports, rep.exdat1, rep.exdat2, rep.exdat3',
                                    
'from'        => array( 'rc_reports_index' => 'rep' ),
                                    
'where'        => $class_perm " AND (stat.is_active=1 OR stat.is_new=1) AND rcl.onoff=1",
                                    
'order'        => 'stat.is_new ASC',
                                    
'add_join'    => array(
                                                        array(
                                                            
'select'    => 'stat.is_active, stat.is_new',
                                                            
'from'        => array( 'rc_status' => 'stat' ),
                                                            
'where'        => 'stat.status=rep.status'
                                                            
),
                                                        array(
                                                            
'select'    => 'rcl.com_id, rcl.com_id, rcl.my_class, rcl.extra_data, rcl.app',
                                                            
'from'        => array( 'rc_classes' => 'rcl' ),
                                                            
'where'        => 'rcl.com_id=rep.rc_class'
                                                            
),

                                                        )
                            )        );
        
$this->DB->execute();

        while( 
$row $this->DB->fetch() )
        {
            if( 
$row['my_class'] != '' )
            {
                
$reports_by_plugin$row['app'] ][ $row['my_class'] ][] = $row;
            }
        }
        
        
$build_member_cache_array['report_temp'] = array();
        
        foreach( 
$reports_by_plugin as $app => $plugins )
        {
            if( 
IPSLib::appIsInstalled$app ) )
            {
                foreach( 
$plugins as $plugin_name => $reports_array )
                {
                    
$this->loadPlugin$plugin_name$app );
                    
$this->plugins$plugin_name ]->updateReportsTimestamp$reports_array$build_member_cache_array );
                }
            }
        }
        
        
$build_member_cache_array['report_last_updated']    = time();
        
$build_member_cache_array['report_num']                = $total['reports'];
        
        if( 
count($build_member_cache_array) > )
        {
            
IPSMember::packMemberCache$this->memberData['member_id'], $build_member_cache_array );
        }
    
        return 
$total['reports'];
    }
    
    
/**
     * Builds permissions for several sql queries for various functions
     *
     * @param    string    based on mods or users
     * @return    string
     */
    
public function buildQueryPermissions$check='mod' )
    {
        
//-----------------------------------------
        // Are we checking user or mod permissions?
        //-----------------------------------------
        
        
if( $check == 'mod' )
        {
            
$col 'mod_group_perm';
        }
        else
        {
            
$col 'group_can_report';
        }

        
//-----------------------------------------
        // Get components we have access to...
        //-----------------------------------------
        
        
foreach( $this->cache->getCache('report_plugins') as $_className => $row )
        {
            if( !
IPSMember::isInGroup$this->memberDataexplode','IPSText::cleanPermString$row$col ] ) ) ) )
            {
                continue;
            }

            
$spec_perm '';

            
$this->loadPlugin$row['my_class'], $row['app'] );
            
            if( !
$this->plugins$row['my_class'] ] )
            {
                continue;
            }
            
            if( 
$row['extra_data'] && $row['extra_data'] != 'N;' )
            {
                
$this->plugins$row['my_class'] ]->_extra unserialize$row['extra_data'] );
            }
            else
            {
                
$this->plugins$row['my_class'] ]->_extra = array();
            }

            if( 
$this->plugins$row['my_class'] ]->getReportPermissions$check$row$this->member_group_ids$spec_perm ) )
            {
                
$cids$row['com_id'] ] = $spec_perm;
            }
        }

        return 
$this->DB->fetchLoadedClass('report_sql_queries')->join_com_permissions( array( 'NOTCACHE' => 1'COMS' => $cids ) );
    }
    
    
/**
     * Check permissions for "can report"
     *
     * @param    string    $className    Report center class name
     * @return    @e bool
     */
    
public function canReport$className )
    {
        if( !
$this->caches['report_plugins'][ $className ]['com_id'] )
        {
            return 
false;
        }
        
        if( 
IPSMember::isInGroup$this->memberDataexplode','IPSText::cleanPermString$this->caches['report_plugins'][ $className ]['group_can_report'] ) ) ) )
        {
            return 
true;
        }
        
        return 
false;
    }
    
    
/**
     * Loads plugins into $this->plugins object for later use
     *
     * @param    string    $plugin_name    plugin name (>name<.php)
     * @param    string    $app            App name
     * @return    @e void
     */
    
public function loadPlugin$plugin_name$app )
    {
        if( ! 
$this->plugins$plugin_name ] )
        {
            if( 
IPSLib::appIsInstalled$app ) AND is_fileIPSLib::getAppDir$app ) . '/extensions/reportPlugins/' $plugin_name '.php' ) )
            {
                
$classToLoad IPSLib::loadLibraryIPSLib::getAppDir$app ) . '/extensions/reportPlugins/' $plugin_name '.php'$plugin_name '_plugin'$app );
                
                
$this->plugins$plugin_name ] = new $classToLoad$this->registry );
            }
        }
    }
    
    
/**
     * Process a URL
     *
     * @param    string    URL
     * @param    string    FURL Title
     * @param    string    FURL Template
     * @return    string    Full URL if existing URL was short
     */
    
public function processUrl$url$friendlyTitle=''$friendlyTemplate='' )
    {
        if( 
$url && ! preg_match"/(http|https):///"$url ) )
        {
            
$returnUrl    str_replace'/index.php?'''$url );
            
$returnUrl    $this->registry->output->buildSEOUrl$returnUrl'public'$friendlyTitle$friendlyTemplate );
            
            return 
$returnUrl;
        }
        else
        {
            return 
$url;
        }
    }
    
    
/**
     * Fixes the member's RSS Key if none set
     *
     * @return    @e void
     */
    
public function checkMemberRSSKey()
    {
        if( ! 
$this->memberData['_cache']['rc_rss_key'] )
        {
            
$new_rss_key md5uniqidmicrotime(), true ) );
            
            
$this->DB->build( array( 'select' => '*''from' => 'rc_modpref''where' => "mem_id=" $this->memberData['member_id'] ) );
            
$this->DB->execute();
        
            if( 
$this->DB->getTotalRows() == )
            {
                
$this->DB->update'rc_modpref', array( 'rss_key' => $new_rss_key ), "mem_id=" $this->memberData['member_id'] );
            }
            else
            {
                
$this->DB->insert'rc_modpref', array( 'rss_key' => $new_rss_key'mem_id' => $this->memberData['member_id'], 'rss_cache' => '' ) );
            }
            
            
$memberCache                $this->memberData['_cache'];
            
$memberCache['rc_rss_key']    = $new_rss_key;
            
$this->member->setProperty'_cache'$memberCache );

            
IPSMember::packMemberCache$this->memberData['member_id'], array( 'rc_rss_key' => $new_rss_key ) );
        }
    }
    
    
/**
     * Generates report form HTML
     *
     * @param    string    Title - What is being reported
     * @param    string    URL - what the user can click on (title)
     * @param    array    Extra data passed on to the form for processing
     * @return    string
     */
    
public function showReportForm$name$url$ex_data=array() )
    {
        
$extra_input '';

        if( 
is_array$ex_data ) && count$ex_data ) > )
        {
            foreach( 
$ex_data as $bname => $value )
            {
                
$extra_input .= "<input type='hidden' name='{$bname}' value='{$value}' />";
            }
        }
        
        return 
$this->registry->getClass('output')->getTemplate('reports')->basicReportForm$name$url$extra_input );
    }
    
    
/**
     * Updates global 'cache time' which forces 'mod caches' to re-cache
     *
     * @return    @e void
     */
    
public function updateCacheTime()
    {
        
$cache                    $this->cache->getCache('report_cache');
        
$cache['last_updated']    = time();

        
$this->cache->setCache'report_cache'$cache, array( 'array' => 1'donow' => ) );
    }
    
    
/**
     * Builds the status information (and maybe drop down html)
     *
     * @param    boolean        Do we need the drop down?
     * @return    string         HTML body
     */
    
public function buildStatuses$ignore_html false )
    {
        if( !
$this->flag_cache )
        {
            
$statuses    = array();
            
$stat_set    = array();
            
$this->body    '';
    
            
$this->DB->build( array( 'select'    => 'stat.status, stat.title, stat.is_new, stat.is_complete, stat.rorder',
                                     
'from'        => array( 'rc_status' => 'stat' ),
                                     
#'order'    => 'stat.rorder ASC, star.points ASC', # Temp table + filesort, replaced with PHP code
                                     
'add_join'    => array( array( 'select'    => 'star.img, star.width, star.height, star.points, star.is_png',
                                                                 
'from'        => array( 'rc_status_sev' => 'star' ),
                                                                 
'where'    => 'stat.status=star.status' ) )
                             )        );
            
$this->DB->execute(); 
    
            while( 
$row $this->DB->fetch() )
            {
                
$statuses$row['rorder'] ][ $row['points'] ] = $row;
            }
            
            
ksort$statusesSORT_NUMERIC );
            
            
/* Now that we're in order loop our statuses */
            
foreach( $statuses as $sid => $rows )
            {
                
ksort$rowsSORT_NUMERIC );
                
                foreach( 
$rows as $row )
                {
                    if( empty(
$stat_set$row['status'] ]) )
                    {
                        
$this->body .= "<option value='{$row['status']}'>{$row['title']}</option>";
        
                        if( 
$row['is_new'] == )
                        {
                            
$this->report_is_new $row['status'];
                        }
                        elseif( 
$row['is_complete'] == )
                        {
                            
$this->report_is_complete $row['status'];
                        }
                    }
        
                    
$stat_set$row['status'] ] = 1;
                    
                    
$this->flag_cache$row['status'] ][ $row['points'] ] = array( 'img'    => $row['img'],
                                                                                   
'width'  => $row['width'],
                                                                                   
'height' => $row['height'],
                                                                                   
'is_png' => $row['is_png'],
                                                                                   
'title'  => $row['title'],
                                                                                  );
                }
            }
        }

        return 
$ignore_html '' $this->body;
    }
}
Онлайн: 0
Реклама