Вход Регистрация
Файл: admin/sources/classes/tags/cloud.php
Строк: 263
<?php

/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.3.3
 * Tagging: Cloud class - is it bird? is it a cloud? No it's a.. nope, it's a cloud. Sorry for that.
 * Matt Mecham
 * Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
 * </pre>
 *
 * @author         $Author: bfarber $
 * @copyright    (c) 2001 - 2011 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @link        http://www.invisionpower.com
 * @since        24 Feb 2011
 * @version        $Revision: 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 all the relevant files.";
    exit();
}

class 
classes_tags_cloud
{
    
/**#@+
     * Registry objects
     *
     * @var        object
     */    
    
protected $registry;
    protected 
$DB;
    protected 
$settings;
    protected 
$request;
    protected 
$lang;
    protected 
$member;
    protected 
$memberData;
    protected 
$cache;
    protected 
$caches;
    
/**#@-*/

    /**#@+
     * Internally stored configuration strings
     *
     * @var    mixed
     */
    
protected $app  '';
    protected 
$area '';
    protected 
$errorMsg '';
    protected 
$relId    0;
    protected 
$parentId 0;
    protected 
$skinGroup    'global_other';
    protected 
$skinTemplate 'tagCloud';
    
/**#@-*/

    /**
     * Array of loaded plugin classes
     *
     * @var    array
     */
    
protected $plugins    = array();
    
    
/**
     * Retrieve the error message
     *
     * @return    @e string
     */
    
public function getErrorMsg()
    {
        return 
$this->errorMsg;
    }

    
/**
     * Set the error message
     *
     * @param    string    $errorMsg    Error message
     * @return    @e void
     */
    
public function setErrorMsg$errorMsg )
    {
        
$this->errorMsg $errorMsg;
    }

    
/**
     * Return the app
     *
     * @return    @e string
     */
    
public function getApp()
    {
        return 
$this->app;
    }

    
/**
     * Return the area
     *
     * @return    @e string
     */
    
public function getArea()
    {
        return 
$this->area;
    }

    
/**
     * Set the app
     *
     * @param    string    $app    App key
     * @return    @e void
     */
    
public function setApp$app )
    {
        
$this->app $app;
    }

    
/**
     * Set the area
     *
     * @param    string    $area    Area
     * @return    @e void
     */
    
public function setArea$area )
    {
        
$this->area $area;
    }
    
    
    
/**
     * Return the relational id
     *
     * @return    @e integer
     */
    
public function getRelId()
    {
        return 
$this->relId;
    }

    
/**
     * Set the relational ID
     *
     * @param    integer    $relId    Rel ID
     */
    
public function setRelId$relId )
    {
        
$this->relId intval$relId );
    }

    
/**
     * Return the parent ID
     *
     * @return    @e integer
     */
    
public function getParentId()
    {
        return 
$this->parentId;
    }

    
/**
     * Set the parent ID
     *
     * @param    integer    $parentId    Parent ID
     */
    
public function setParentId$parentId )
    {
        
$this->parentId intval$parentId );
    }

    
/**
     * Return the skin group to use
     *
     * @return    @e string
     */
    
public function getSkinGroup()
    {
        return 
$this->skinGroup;
    }

    
/**
     * Set the skin group to use
     *
     * @param    string    $skinGroup    Skin group
     * @return    @e void
     */
    
public function setSkinGroup$skinGroup )
    {
        
$this->skinGroup $skinGroup;
    }

    
/**
     * Get the skin template to use
     *
     * @return    @e string
     */
    
public function getSkinTemplate()
    {
        return 
$this->skinTemplate;
    }

    
/**
     * Set the skin template to use
     *
     * @param    string    $skinTemplate    Skin template
     * @return    @e void
     */
    
public function setSkinTemplate$skinTemplate )
    {
        
$this->skinTemplate $skinTemplate;
    }

    
/**
     * Is tagging enabled?
     * 
     * @return     boolean
     */
    
protected function _isEnabled()
    {
        return ( 
$this->settings['tags_enabled'] ) ? true false;    
    }
    
    
/**
     * Setup registry classes
     *
     * @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();
        
        
/* Clean member perm array */
        
foreach( $this->member->perm_id_array as $k => $v )
        {
            if ( empty( 
$v ) )
            {
                unset( 
$this->member->perm_id_array$k ] );
            }
        }
        
        if ( ! 
$this->getApp() )
        {
            
/* We set the app in the URL now so don't need to limit cloud by app */
            //$this->setApp( IPS_DEFAULT_APP );
        
}
    }
    
    
/**
     * Render the cloud and return the HTML
     *
     * @param    array    $data    returned from getCloudData
     * @return    @e string
     */
    
public function render( array $data )
    {
        
$group $this->getSkinGroup();
        
$templ $this->getSkinTemplate();
            
        
/* Some basic formatt-ing */
        
foreach( $data['tags'] as $id => $val )
        {
            
$app = ( $val['app'] ) ? $val['app'] : IPS_DEFAULT_APP;
            
            
$data['tags'][ $id ]['className']  = $this->_weightToClassName$val['weight'] );
            
$data['tags'][ $id ]['tagWithUrl'] = $this->registry->output->getTemplate('global_other')->tagEntry$val['tag'], true$app$val['section'] );
        }
        
        return 
$this->registry->output->getTemplate$group )->$templ$data );
    }
    
    
/**
     * Determine the CSS class name to use based on the weight
     *
     * @param    float    $weight    Weight
     * @return    @e string
     */
    
protected function _weightToClassName$weight )
    {
        
$className 'ipsTagWeight_1';
        
        if ( 
$weight 0.9 )
        {
            
$className 'ipsTagWeight_2';
        }
        
        if ( 
$weight 0.8 )
        {
            
$className 'ipsTagWeight_3';
        }
        
        if ( 
$weight 0.7 )
        {
            
$className 'ipsTagWeight_4';
        }
    
        if ( 
$weight 0.6 )
        {
            
$className 'ipsTagWeight_5';
        }
    
        if ( 
$weight 0.5 )
        {
            
$className 'ipsTagWeight_6';
        }
    
        if ( 
$weight 0.4 )
        {
            
$className 'ipsTagWeight_7';
        }
    
        if ( 
$weight 0.3 )
        {
            
$className 'ipsTagWeight_8';
        }
        
        return 
$className;
    }
    
    
/**
     * getCloudData
     * 
     * Filters:
     * limit        Limit the number of tags returned
     * visible        The number of visible tags
     * noCache        Bypass any caching and always fetch fresh
     * 
     * @param    array    Filters (limit, visible)
     * @return    @e array
     */
    
public function getCloudData$filters=array() )
    {
        
/* INIT */
        
$where = array();
        
$data  = array();
        
$raw   = array();
        
$nums  = array( 'min' => 0'max' => 0'count' => );
        
$final = array( 'tags' => array(), 'nums' => array() );
        
        
/* Clean up filters */
        
$filters['limit']   = intval$filters['limit'] );
        
$filters['offset']  = intval$filters['offset'] );
        
        
$filters['visible'] = ( ! isset( $filters['visible'] ) ) ? intval$filters['visible'] );
        
        if ( 
$this->getApp() && $this->getArea() && $this->getRelId() )
        {
            
$where[] = "t.tag_aai_lookup='" $this->_getKey( array( 'meta_id' => $this->getRelId() ) ) . "'";
        }
        else if ( 
$this->getApp() && $this->getArea() && $this->getParentId() )
        {
            
$where[] = "t.tag_aap_lookup='" $this->_getKey( array( 'meta_parent_id' => $this->getParentId() ) ) . "'";
        }
        
        if ( 
$this->getApp() )
        {
            
$where[] = "t.tag_meta_app='" $this->DB->addSlashes$this->getApp() ) . "'";
        }
        
        if ( 
$this->getArea() )
        {
            
$where[] = "t.tag_meta_area='" $this->DB->addSlashes$this->getArea() ) . "'";
        }

        
/* Test against cache class */
        
if ( empty( $filters['noCache'] ) )
        {
            
$cacheKey 'tagCloud-' md5implode'&'$where ) );
            
$cached   $this->registry->getClass('cacheSimple')->get$cacheKey );
            
            if ( 
$cached !== null && is_array$cached['data'] ) )
            {
                
$cached['data']['cached'] = $cached['time'];
                
                return 
$cached['data'];
            }
        }
                
        
/* Still here? Fetch from the database */
        
$this->DB->allow_sub_select true;
        
$this->DB->loadCacheFileIPSLib::getAppDir('core') . '/sql/' ips_DBRegistry::getDriverType() . '_tag_queries.php''public_tag_sql_queries' );
        
$this->DB->buildFromCache'getCloudData', array( 'where' => $where'limit' => array( $filters['offset'], $filters['limit'] ) ), 'public_tag_sql_queries' );        
        
$o $this->DB->execute();
        
        while( 
$tag $this->DB->fetch() )
        {
            
$raw$tag['times'] . '.' md5$tag['tag_text'] ) ] = $tag;
            
            if ( empty( 
$nums['min'] ) OR $nums['min'] > $tag['times'] )
            {
                
$nums['min'] = $tag['times'];
            }
            
            if ( 
$nums['max'] < $tag['times'] )
            {
                
$nums['max'] = $tag['times'];
            }
            
            
$nums['count'] += $tag['times'];
        }
        
        
/* Sort it */
        
krsort$raw );
        
        require_once( 
IPS_ROOT_PATH 'sources/classes/tags/bootstrap.php' );/*noLibHook*/

        /* Now give out some useful data */
        
foreach( $raw as $key => $data )
        {
            
/* Get plugin class to work out 'section' */
            
if( !isset($this->plugins$data['tag_meta_area'] ]) )
            {
                
$this->plugins$data['tag_meta_area'] ]    = classes_tags_bootstrap::run$data['tag_meta_app'], $data['tag_meta_area'] );
            }

            
/* Section */
            
$section    $this->plugins$data['tag_meta_area'] ]->getSearchSection();

            
/* Work out a percentage */
            
$percent sprintf'%.2F'$data['times'] / $nums['max'] * 100 );
            
            
$final['tags'][] = array( 'tag'     => $data['tag_text'],
                                        
'count'   => $data['times'],
                                        
'app'        => $data['tag_meta_app'],
                                        
'section'    => $section,
                                          
'percent' => $percent,
                                      
'weight'  => sprintf'%.2F'$percent 100 ) );
        }
        
        
$final['nums'] = $nums;
        
        
/* Cache */
        
$this->registry->getClass('cacheSimple')->set$cacheKey$final );
        
        return 
$final;
    }
    
    
/**
     * Build a key
     *
     * @param    array    $where    Params
     * @return    @e string
     */
    
private function _getKey$where )
    {        
        if ( isset( 
$where['meta_id'] ) )
        {
            return 
md5$this->getApp() . ';' $this->getArea() . ';' intval$where['meta_id'] ) );
        }
        else if ( isset( 
$where['meta_parent_id'] ) )
        {
            return 
md5$this->getApp() . ':' $this->getArea() . ':' intval$where['meta_parent_id'] ) );
        }
    }    
}
Онлайн: 1
Реклама