Your IP : 216.73.216.240
<?php
/****************************************************************************************\
** JoomGallery 3 **
** By: JoomGallery::ProjectTeam **
** Copyright (C) 2008 - 2021 JoomGallery::ProjectTeam **
** Based on: JoomGallery 1.0.0 by JoomGallery::ProjectTeam **
** Released under GNU GPL Public License **
** License: http://www.gnu.org/copyleft/gpl.html or have a look **
** at administrator/components/com_joomgallery/LICENSE.TXT **
\****************************************************************************************/
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
/**
* The JoomGallery interface class provides an interface / API
* to other Joomla extensions to use functions of the Gallery,
* e.g. to display thumbnails in a Plugin or Module.
*
* You just need to include this file, create an interface object
* and set some options if you want to adjust the output, before
* using one of the functions.
* If you display any HTML output, you should once call getPageHeader()
* first
*
* @package JoomGallery
* @since 1.0.0
*/
class JoomInterface
{
/**
* Holds the interface configuration
*
* @var array
*/
protected $_config = array();
/**
* JApplication object
*
* @var object
*/
protected $_mainframe;
/**
* JDatabase object
*
* @var object
*/
protected $_db;
/**
* JoomAmbit object
*
* @var object
*/
protected $_ambit;
/**
* Holds the JoomGallery configuration
*
* @var object
*/
protected $_jg_config = null;
/**
* Holds the stored interface configuration
*
* @var array
*/
protected $_storedConfig = array();
/**
* JUser object
*
* @var object
*/
protected $_user;
/**
* Constructor
*
* @return void
* @since 1.5.5
*/
public function __construct()
{
// Load JoomGallery defines
require_once JPATH_ADMINISTRATOR.'/components/com_joomgallery/includes/defines.php';
// Register some classes
JLoader::register('JoomConfig', JPATH_ADMINISTRATOR.'/components/'._JOOM_OPTION.'/helpers/config.php');
JLoader::register('JoomHelper', JPATH_ROOT.'/components/'._JOOM_OPTION.'/helpers/helper.php');
JLoader::register('JoomAmbit', JPATH_ROOT.'/components/'._JOOM_OPTION.'/helpers/ambit.php');
// Add include path for JoomGallery tables
JTable::addIncludePath(JPATH_ADMINISTRATOR.'/components/'._JOOM_OPTION.'/tables');
// Add include path for JoomGallery HTML functions
JHtml::addIncludePath(JPATH_ADMINISTRATOR.'/components/'._JOOM_OPTION.'/helpers/html');
$this->_mainframe = JFactory::getApplication();
$this->_db = JFactory::getDBO();
$this->_ambit = JoomAmbit::getInstance();
$this->_jg_config = JoomConfig::getInstance();
$this->_user = JFactory::getUser();
// Include language for display
$language = JFactory::getLanguage();
$language->load(_JOOM_OPTION);
// Load JoomGallery plugins
JPluginHelper::importPlugin('joomgallery');
// Set some default values for options given in global JG config (may be overridden)
$this->_config['showhits'] = $this->_jg_config->get('jg_showhits');
$this->_config['showdownloads'] = $this->_jg_config->get('jg_showdownloads');
$this->_config['showpicasnew'] = $this->_jg_config->get('jg_showpicasnew');
$this->_config['showtitle'] = $this->_jg_config->get('jg_showtitle');
$this->_config['showauthor'] = $this->_jg_config->get('jg_showauthor');
$this->_config['showrate'] = $this->_jg_config->get('jg_showcatrate');
$this->_config['shownumcomments'] = $this->_jg_config->get('jg_showcatcom');
$this->_config['showdescription'] = $this->_jg_config->get('jg_showcatdescription');
$this->_config['openimage'] = $this->_jg_config->get('jg_detailpic_open');
// Further defaults (not given by JG config)
// - Category path links to category
$this->_config['showcatlink'] = 1;
// - Comma-separated list of categories to filter from (empty: all categories, default)
$this->_config['categoryfilter'] = '';
// - Display last comment (see Module JoomImages) not implemented yet!
$this->_config['showlastcomment'] = 0;
// - Make use of hidden images and images in hidden categories
$this->_config['showhidden'] = 0;
// - Show only introtext of description
$this->_config['showdescriptionintrotext'] = 1;
// Store the config for being able to reset it later on (if useful)
$this->storeConfig();
}
/**
* Passes a whole array of config items, existing (default)
* values are overwritten if a new item with the same key
* is passed.
*
* @param array $config An array of settings
* @return void
* @since 1.0.0
*/
public function setConfig($config)
{
foreach($config as $key => $value)
{
$config[$key] = $this->_db->escape($value);
}
// Merge new array into existing one, overwriting if needed:
$this->_config = array_merge($this->_config, $config);
}
/**
* Sets a single option in the interface settings
* If the key already exists, the setting will be overridden.
*
* @param string $key The key of the new setting
* @param string $value The value of the new setting
* @return void
* @since 1.0.0
*/
public function addConfig($key, $value = '')
{
$this->_config[$key] = $this->_db->escape($value);
}
/**
* Requests string (e.g. modification of a SQL query or true/false)
* associated with config option $key.
* If the according value has not been set with addConfig
* before, a default is returned. Config options are not used
* directly for security.
*
* @param string $key The key of the requested setting
* @return string The requested setting, boolean false, if the key was not found
* @since 1.0.0
*/
public function getConfig($key)
{
if(array_key_exists($key, $this->_config))
{
// Access filtered to special keys (DB query strings)
if($key == 'hidebackend')
{
if( $this->_config['hidebackend'] == 'true'
|| $this->_config['hidebackend'] === true
|| $this->_config['hidebackend'] == 1
)
{
return 'jg.owner != 0';
}
else
{
return '';
}
}
elseif($key == 'categoryfilter')
{
$catids = trim($this->_db->escape($this->_config['categoryfilter']));
if($catids != '')
{
return 'jg.catid IN ('.$catids.')';
}
else
{
return '';
}
}
else
{
// Regular keys
return $this->_config[$key];
}
}
else
{
return false;
}
}
/**
* Stores the config in order to be able to reset it later on
*
* @return void
* @since 1.5.0
*/
public function storeConfig()
{
$this->_storedConfig = $this->_config;
}
/**
* Resets the config in order to get the settings as they were
* at the point of time when 'storeConfig' was called lastly.
*
* @return void
* @since 1.5.0
*/
public function resetConfig()
{
$this->_config = $this->_storedConfig;
}
/**
* Returns config value associated with config option $key
* of the global configuration of JoomGallery.
*
* @param string $key The key of the requested setting
* @return string The requested setting, boolean false, if the key was not found
* @since 1.0.0
*/
public function getJConfig($key)
{
return $this->_jg_config->get($key);
}
/**
* Returns the JoomGallery ambit object
*
* @return object JoomAmbit object
* @since 1.5.5
*/
public function getAmbit()
{
return $this->_ambit;
}
/**
* Returns version string of installed JoomGallery
*
* @return string The version string
* @since 1.5.0
*/
public function getGalleryVersion()
{
return '3.5';
}
/**
* Returns an Itemid associated with the gallery.
*
* At first check out, if an Itemid was set via the interface,
* if not, take the Itemid provided by JoomAmbit.
*
* @param boolean $string True, if a string like '&Itemid=X' should be returned.
* @return int/string The Itemid for use in URLs ('&Itemid=X' or as integer)
* @since 1.0.0
*/
public function getJoomId($string = true)
{
if(isset($this->_config['Itemid']) && $this->_config['Itemid'])
{
$Itemid = intval($this->_config['Itemid']);
return ($string && $Itemid) ? '&Itemid='.$Itemid : $Itemid;
}
else
{
return $this->_ambit->getItemid($string);
}
}
/**
* Corrects a link with the right 'option' and 'Itemid' vars of JoomGallery
*
* @param string $url The link to complete
* @param boolean $xhtml True, if all '&' appearances shall be replaced with '&', defaults to true
* @return string The corrected link
* @since 1.5.5
*/
public function route($url, $xhtml = true)
{
// Get the router
$router = $this->_mainframe->getRouter();
// Get current values of vars 'option' and 'Itemid'
$option = $router->getVar('option');
$Itemid = $router->getVar('Itemid');
// Set vars 'option' and 'Itemid'
$router->setVar('option', _JOOM_OPTION);
$router->setVar('Itemid', $this->getJoomId(false));
$url = JRoute::_($url, $xhtml);
$routervars = $router->getVars();
if(is_null($option))
{
// Delete the var from array
unset($routervars['option']);
}
else
{
$routervars['option'] = $option;
}
if(is_null($Itemid))
{
unset($routervars['Itemid']);
}
else
{
$routervars['Itemid'] = $Itemid;
}
$router->setVars($routervars, false);
return $url;
}
/**
* Simple forwarding of JHTML::_('joomgallery.openimage'):
* Returns the link to the thumb, detail or original image.
*
* @param int/object $img The image ID or the image object to use
* @param string $type The image type ('thumb', 'img', 'orig')
* @return string Link to the image
* @since 1.5.5
*/
public function getImageLink($img, $type = false)
{
// Get the router
$router = $this->_mainframe->getRouter();
// Get current values of vars 'option' and 'Itemid'
$option = $router->getVar('option');
$Itemid = $router->getVar('Itemid');
// Set vars 'option' and 'Itemid'
$router->setVar('option', _JOOM_OPTION);
$router->setVar('Itemid', $this->getJoomId(false));
$link = JHTML::_('joomgallery.openimage', $this->_config['openimage'], $img, $type, $this->getConfig('group'));
if($title = JHtml::_('joomgallery.getTitleforATag', $img, false))
{
$link .= '" title="'.$title;
}
// Reset vars 'option' and 'Itemid'
// if the preserved values are null delete the var formerly setted
// from array of vars
$routervars = $router->getVars();
if(is_null($option))
{
// Delete the var from array
unset($routervars['option']);
}
else
{
$routervars['option'] = $option;
}
if(is_null($Itemid))
{
unset($routervars['Itemid']);
}
else
{
$routervars['Itemid'] = $Itemid;
}
$router->setVars($routervars, false);
return $link;
}
/**
* Adds all elements needed to display JoomGallery images
* properly like CSS. The necessary Javascript is included in
* the JoomGallery JHTML function openImage().
*
* @return void
* @since 1.5.5
*/
public function getPageHeader()
{
$document = JFactory::getDocument();
// Add the CSS file generated from backend settings
$document->addStyleSheet($this->_ambit->getStyleSheet('joom_settings.css'));
// Add the main CSS file
$document->addStyleSheet($this->_ambit->getStyleSheet('joomgallery.css'));
// Add the RTL CSS file if an RTL language is used
if(JFactory::getLanguage()->isRTL())
{
$document->addStyleSheet($this->_ambit->getStyleSheet('joomgallery_rtl.css'));
}
// Add individual CSS file if it exists
if(file_exists(JPATH_ROOT.'/media/joomgallery/css/joom_local.css'))
{
$document->addStyleSheet($this->_ambit->getStyleSheet('joom_local.css'));
}
}
/**
* Creates HTML for linked thumbnail of one image,
* with display options and style just like in JG
*
* @param object $obj DB-row coming from this interface, e.g. getPicsByCategory
* @param boolean $linked If true, we will link the thumbnail, defaults to true
* @param string $class Optional, addional css class name which is assigned to the img tag
* @param string $div Optional css class name which is assigned to a div around the img tag
* @param string $extra Optional, adddional HTML code, which is placed in the img tag
* @param string $type Optional, image type the link shall open (thumb, img, orig)
* @return string HTML displaying thumbnail (linked, like configured in JG if $linked = true)
* @since 1.0.0
*/
public function displayThumb($obj, $linked = true, $class = null, $div = null, $extra = null, $type = false)
{
$output = '';
if($obj->id != '')
{
// Get the router
$router = $this->_mainframe->getRouter();
// Get current values of vars 'option' and 'Itemid'
$option = $router->getVar('option');
$Itemid = $router->getVar('Itemid');
// Set vars 'option' and 'Itemid'
$router->setVar('option', _JOOM_OPTION);
$router->setVar('Itemid', $this->getJoomId(false));
// Load layout
$args = array('linked' => $linked, 'class' => $class, 'div' => $div, 'extra' => $extra, 'type' => $type);
$data = array('interface' => $this, '_config' => $this->_config, 'thumb_url' => $this->_ambit->getImg('thumb_url', $obj), 'group' => $this->getConfig('group'), 'args' => $args, 'obj' => $obj);
$layout = new JLayoutFile('interface.thumb', null, array('component' => 'com_joomgallery', 'client' => 1));
$output .= $layout->render($data);
$routervars = $router->getVars();
if(is_null($option))
{
// Delete the var from array
unset($routervars['option']);
}
else
{
$routervars['option'] = $option;
}
if(is_null($Itemid))
{
unset($routervars['Itemid']);
}
else
{
$routervars['Itemid'] = $Itemid;
}
$router->setVars($routervars, false);
}
else
{
$output .= " \n";
}
$output = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $output);
return $output;
}
/**
* Creates HTML for linked detail image of one picture-$obj,
* with display options & style just like in JG
*
* @param object $obj DB-row coming from this interface, e.g. getPicsByCategory
* @param boolean $linked If true, we will link the thumbnail, defaults to true
* @param string $class Optional, addional css class name which is assigned to the img tag
* @param string $div Optional css class name which is assigned to a div around the img tag
* @param string $extra Optional, addional HTML code, which is placed in the img tag
* @param string $type Optional, image type the link shall open (thumb, img, orig)
* @return string HTML displaying detail image (linked, like configured in JG if $linked = true)
* @since 1.0.0
*/
public function displayDetail($obj, $linked = true, $class = null, $div = null, $extra = null, $type = false)
{
$output = '';
if($obj->id != '')
{
// Get the router
$router = $this->_mainframe->getRouter();
// Get current values of vars 'option' and 'Itemid'
$option = $router->getVar('option');
$Itemid = $router->getVar('Itemid');
// Set vars 'option' and 'Itemid'
$router->setVar('option', _JOOM_OPTION);
$router->setVar('Itemid', $this->getJoomId(false));
// Load layout
$args = array('linked' => $linked, 'class' => $class, 'div' => $div, 'extra' => $extra, 'type' => $type);
$data = array('interface' => $this, '_config' => $this->_config, 'img_url' => $this->_ambit->getImg('img_url', $obj), 'group' => $this->getConfig('group'), 'args' => $args, 'obj' => $obj);
$layout = new JLayoutFile('interface.detail', null, array('component' => 'com_joomgallery', 'client' => 1));
$output .= $layout->render($data);
$routervars = $router->getVars();
if(is_null($option))
{
// Delete the var from array
unset($routervars['option']);
}
else
{
$routervars['option'] = $option;
}
if(is_null($Itemid))
{
unset($routervars['Itemid']);
}
else
{
$routervars['Itemid'] = $Itemid;
}
$router->setVars($routervars, false);
}
else
{
$output .= " \n";
}
$output = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $output);
return $output;
}
/**
* Creates HTML for description of one image,
* with display options and style just like in JG.
* Adjustments are possible via the interface options.
*
* @param object $obj DB-row coming from this interface, e.g. getPicsByCategory
* @return string HTML of thumb description (like configured in JG or in the interface)
* @since 1.0.0
*/
public function displayDesc($obj)
{
if($this->getConfig('disable_infos'))
{
return '';
}
// Get the router
$router = $this->_mainframe->getRouter();
// Get current values of vars 'option' and 'Itemid'
$option = $router->getVar('option');
$Itemid = $router->getVar('Itemid');
// Set vars 'option' and 'Itemid'
$router->setVar('option', _JOOM_OPTION);
$router->setVar('Itemid', $this->getJoomId(false));
// Load layout
$data = array('interface' => $this, '_jg_config' => $this->_jg_config, '_mainframe' => $this->_mainframe, 'obj' => $obj);
$layout = new JLayoutFile('interface.desc', null, array('component' => 'com_joomgallery', 'client' => 1));
$output = $layout->render($data);
$routervars = $router->getVars();
if(is_null($option))
{
// Delete the var from array
unset($routervars['option']);
}
else
{
$routervars['option'] = $option;
}
if(is_null($Itemid))
{
unset($routervars['Itemid']);
}
else
{
$routervars['Itemid'] = $Itemid;
}
$router->setVars($routervars, false);
$output = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $output);
return $output;
}
/**
* Creates HTML for the given thumbnails for displaying them like in category view
*
* @param array $rows An array of database objects for the thumbnails
* @return string The HTML output
* @since 1.5.5
*/
public function displayThumbs($rows)
{
if(empty($rows))
{
return '';
}
// Load layout
$data = array('interface' => $this, '_ambit' => $this->_ambit, 'rows' => $rows);
$layout = new JLayoutFile('interface.thumbs', null, array('component' => 'com_joomgallery', 'client' => 1));
$return = $layout->render($data);
$return = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $return);
return $return;
}
/**
* Adds the WHERE conditions for filtering out disallowed images to a query
*
* @param $query object The query to extend
* @param $access array Access levels to filter for, null to use the ones of the current user
* @return void
* @since 2.0
*/
public function addImageWhere($query, $access = null)
{
$query->where('jgc.published = 1')
->where('jg.approved = 1')
->where('jg.published = 1');
if(!$access)
{
$catids = array_keys($this->_ambit->getCategoryStructure());
$query->where('jg.catid IN ('.implode(',', $catids).')');
$query->where('jg.access IN ('.implode(',', $this->_user->getAuthorisedViewLevels()).')');
$query->where('jgc.access IN ('.implode(',', $this->_user->getAuthorisedViewLevels()).')');
}
else
{
$query->where('jg.access IN ('.implode(',', $access).')');
$query->where('jgc.access IN ('.implode(',', $access).')');
}
if(!$this->getConfig('showhidden'))
{
$query->where('jgc.hidden = 0')
->where('jgc.in_hidden = 0')
->where('jg.hidden = 0');
}
if($categoryfilter = $this->getConfig('categoryfilter'))
{
$query->where($categoryfilter);
}
if($hidebackend = $this->getConfig('hidebackend'))
{
$query->where($hidebackend);
}
return $query;
}
/**
* Returns the number of images of a user
*
* @param int $userId The user ID of the user.
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int Number of images the user has uploaded
* @since 1.0.0
*/
public function getNumPicsOfUser($userId, $access = null)
{
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('COUNT(jg.id)')
->from(_JOOM_TABLE_IMAGES.' AS jg')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jg.owner = '.$userId);
$this->addImageWhere($query, $access);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns the number of pictures a user is tagged in
*
* @param int $userId The ID of the user.
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int Number of images the user is tagged in
* @since 1.0.0
*/
public function getNumPicsUserTagged($userId, $access = null)
{
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('COUNT(jgn.nid)')
->from(_JOOM_TABLE_NAMESHIELDS.' AS jgn')
->leftJoin(_JOOM_TABLE_IMAGES.' AS jg ON jgn.npicid = jg.id')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jgn.nuserid = '.$userId);
$this->addImageWhere($query, $access);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns the number of images a user has favoured
*
* @param int $userId The ID of the user.
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int Number of images the user has favoured
* @since 1.0.0
*/
public function getNumPicsUserFavoured($userId, $access = null)
{
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('piclist')
->from(_JOOM_TABLE_USERS)
->where('uuserid = '.$userId);
$this->_db->setQuery($query);
$piclist = $this->_db->loadResult();
if(!$piclist)
{
return 0;
}
$query = $this->_db->getQuery(true)
->select('COUNT(jg.id)')
->from(_JOOM_TABLE_IMAGES.' AS jg')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jg.id IN ('.$piclist.')');
$this->addImageWhere($query, $access);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns the number of images a user has commented on
*
* @param int $userId The ID of the user.
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int Number of images the user has commented on
* @since 1.0.0
*/
public function getNumCommentsUser($userId, $access = null)
{
return $this->getNumComments($access, $userId);
}
/**
* Returns the total number of comments (published) in the gallery
*
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int The number of comments published in the gallery
* @since 1.0.0
*/
public function getNumComments($access = null, $userId = 0)
{
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('COUNT(cmtid)')
->from(_JOOM_TABLE_COMMENTS.' AS jgco')
->leftJoin(_JOOM_TABLE_IMAGES.' AS jg ON jgco.cmtpic = jg.id')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jgco.published = 1')
->where('jgco.approved = 1');
if($userId)
{
$query->where('jgco.userid = '.$userId);
}
$this->addImageWhere($query, $access);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns a query for counting all comments of a specific image.
* This query has to be used as a sub-query in which context jg.id is defined
*
* @return object A JDatabaseQuery object to be used as a sub-query
* @since 2.0
*/
public function getNumCommentsSubQuery()
{
return $this->_db->getQuery(true)
->select('COUNT(cmtid)')
->from(_JOOM_TABLE_COMMENTS.' AS jgcosub')
->where('cmtpic = jg.id')
->where('jgcosub.published = 1')
->where('jgcosub.approved = 1');
}
/**
* Returns images of a user
*
* @param int $userId Joomla ID of user
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting String for DB sorting
* @param int $numPics Limit number of pictures, leave away to return all
* @param int $limitStart Where to start returning $numPics images
* @return array An array of image objects from the database
* @since 1.0.0
*/
public function getPicsOfUser($userId, $access = null, $sorting = null, $numPics = null, $limitStart = 0)
{
// Validation
$userId = intval($userId);
$query = $this->getImagesQuery($access)
->where('jg.owner = '.$userId);
if($sorting)
{
$query->order($this->_db->escape($sorting));
}
$this->_db->setQuery($query, $limitStart, $numPics);
return $this->_db->loadObjectList();
}
/**
* Returns images a user is tagged in
*
* @param int $userId Joomla ID of user
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting String for DB sorting
* @param int $numPics Limit number of pictures, leave away to return all
* @param int $limitStart Where to start returning $numPics pictures
* @return array An array of image objects from the database
* @since 1.0.0
*/
public function getPicsUserTagged($userId, $access = null, $sorting = null, $numPics = null, $limitStart = 0)
{
// Validation
$userId = intval($userId);
$query = $this->_db->getQuery(true);
if($this->getConfig('shownumcomments'))
{
$query->select('('.$this->getNumCommentsSubQuery().') AS cmtcount');
}
$query->select('jg.id, jg.catid, jg.imgthumbname, jg.imgfilename, jg.owner, jg.imgauthor,
jg.imgdate, jg.imgtitle, jg.imgtext, jg.hits, jg.downloads, jg.imgvotes,
'.JoomHelper::getSQLRatingClause('jg').' AS rating,
jgc.name AS cattitle, jgc.catpath AS catpath')
->from(_JOOM_TABLE_NAMESHIELDS.' AS jgn')
->leftJoin(_JOOM_TABLE_IMAGES. ' AS jg ON jgn.npicid = jg.id')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jgn.nuserid = '.$userId);
if($this->getConfig('showlastcomment'))
{
$query->select('jgco.cmttext, jgco.cmtdate, jgco.userid, jgco.cmtid')
->leftJoin(_JOOM_TABLE_COMMENTS.' AS jgco ON jg.id = jgco.cmtpic')
->leftJoin(_JOOM_TABLE_COMMENTS.' AS jgco2 ON jgco.cmtpic = jgco2.cmtpic AND jgco.cmtdate < jgco2.cmtdate')
->where('jgco2.cmtpic IS NULL');
}
$this->addImageWhere($query, $access);
if($sorting)
{
$query->order($this->_db->escape($sorting));
}
$this->_db->setQuery($query, $limitStart, $numPics);
return $this->_db->loadObjectList();
}
/**
* Returns the images a user has favoured
*
* @param int $userId Joomla ID of user
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting String for DB sorting
* @param int $numPics Limit number of images, leave away to return all
* @param int $limitStart Where to start returning $numPics images
* @return array An array of image objects from the database
* @since 1.0.0
*/
public function getPicsUserFavoured($userId, $access = null, $sorting = null, $numPics = null, $limitStart = 0)
{
// Validation
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('piclist')
->from(_JOOM_TABLE_USERS)
->where('uuserid = '.$userId);
$this->_db->setQuery($query);
$piclist = $this->_db->loadResult();
if(!$piclist)
{
return array();
}
$query = $this->getImagesQuery($access)
->where('jg.id IN ('.$piclist.')');
if($sorting)
{
$query->order($this->_db->escape($sorting));
}
$this->_db->setQuery($query, $limitStart, $numPics);
return $this->_db->loadObjectList();
}
/**
* Returns the comments of a user on images
*
* @param int $userId Joomla ID of user
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting String for DB sorting (default: newest by ID)
* @param int $numComments Limit number of images, leave away to return all
* @param int $limitStart Where to start returning $numComments images
* @return array An array of image objects from the database
* @since 1.0.0
*/
public function getCommentsUser($userId, $access = null, $sorting = 'jgco.cmtid DESC', $numComments = null, $limitStart = 0)
{
return $this->getComments($access, $sorting, $numComments, $limitStart, $userId);
}
/**
* Returns all (or some ;) ) comments in the gallery as DB-rows
*
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting String for DB sorting (default: Newest by ID)
* @param int $numComments Limit number of comments, leave away to return all
* @param int $limitStart Where to start returning $numComments comments
* @param int $userId Joomla ID of user
* @return array An array of comment objects from the database
* @since 1.0.0
*/
public function getComments($access = null, $sorting = "jgco.cmtid DESC", $numComments = null, $limitStart = 0, $userId = 0)
{
$userId = intval($userId);
$query = $this->_db->getQuery(true)
->select('jg.id, jgco.cmttext, jgco.cmtdate, jgco.userid AS cmtuserid')
->select('jg.catid, jg.imgthumbname, jg.imgfilename, jg.owner, jg.imgauthor,
jg.imgdate, jg.imgtitle, jg.imgtext, jg.hits, jg.downloads, jg.imgvotes,
'.JoomHelper::getSQLRatingClause('jg').' AS rating,
jgc.name AS cattitle, jgc.catpath AS catpath')
->from(_JOOM_TABLE_COMMENTS.' AS jgco')
->leftJoin(_JOOM_TABLE_IMAGES.' AS jg ON jgco.cmtpic = jg.id')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jgco.published = 1')
->where('jgco.approved = 1');
if($userId)
{
$query->where('jgco.userid = '.$userId);
}
$this->addImageWhere($query, $access);
$this->_db->setQuery($query, $limitStart, $numComments);
return $this->_db->loadObjectList();
}
/**
* Returns db-row of one image, with optional access verification
*
* @param int $picid ID of images in gallery
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return object The image object from the database
* @since 1.0.0
*/
public function getPicture($picid, $access = null)
{
$picid = intval($picid);
$query = $this->getImagesQuery($access)
->where('jg.id = '.$picid);
$this->_db->setQuery($query);
return $this->_db->loadObject();
}
/**
* Returns a query object containing the general data for requesting images data
*
* @param array $access Array of access levels to filter with
* @return object A JDatabaseQuery object
* @since 2.0
*/
public function getImagesQuery($access = null)
{
$query = $this->_db->getQuery(true);
if($this->getConfig('shownumcomments'))
{
$query->select('('.$this->getNumCommentsSubQuery().') AS cmtcount');
}
$query->select('jg.id, jg.catid, jg.imgthumbname, jg.imgfilename, jg.owner, jg.imgauthor,
jg.imgdate, jg.imgtitle, jg.imgtext, jg.hits, jg.downloads, jg.imgvotes,
'.JoomHelper::getSQLRatingClause('jg').' AS rating,
jgc.name AS cattitle, jgc.catpath AS catpath')
->from(_JOOM_TABLE_IMAGES.' AS jg')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid');
if($this->getConfig('showlastcomment'))
{
$query->select('jgco.cmttext, jgco.cmtdate, jgco.userid, jgco.cmtid')
->leftJoin(_JOOM_TABLE_COMMENTS.' AS jgco ON jg.id = jgco.cmtpic')
->leftJoin(_JOOM_TABLE_COMMENTS.' AS jgco2 ON jgco.cmtpic = jgco2.cmtpic AND jgco.cmtdate < jgco2.cmtdate')
->where('jgco2.cmtpic IS NULL');
}
$this->addImageWhere($query, $access);
return $query;
}
/**
* Returns the db-row of a random image, to which a user with has access to
* (e.g. for a simple 1pic module)
*
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return object An image object from the database
* @since 1.0.0
*/
public function getRandomPicture($access = null)
{
$query = $this->getImagesQuery($access)
->order('RAND()');
$this->_db->setQuery($query);
return $this->_db->loadObject();
}
/**
* Returns the number of images in a category
*
* @param int $catid ID of category
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int The number of images in the category
* @since 1.0.0
*/
public function getNumPicsByCategory($catid, $access = null)
{
$catid = intval($catid);
$query = $this->_db->getQuery(true)
->select('COUNT(jg.id)')
->from(_JOOM_TABLE_IMAGES.' AS jg')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid')
->where('jg.catid = '.$catid);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns image objects of all images in a category
*
* @param int $catid The ID of the category
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting Sorting string
* @param int $numPics Limit number of images, leave away to return all
* @param int $limitStart Where to start returning $numPics images
* @return array An array of comment objects from the database
* @since 1.0.0
*/
public function getPicsByCategory($catid, $access = null, $sorting = null, $numPics = null, $limitStart = 0)
{
// Validation
$catid = intval($catid);
$query = $this->getImagesQuery($access)
->where('jg.catid = '.$catid);
if($sorting)
{
$query->order($this->_db->escape($sorting));
}
$this->_db->setQuery($query, $limitStart, $numPics);
return $this->_db->loadObjectList();
}
/**
* Extends a query by search conditions
*
* @param object $query The query to extend
* @param string $searchstring The string to search for
* @return void
* @since 2.0
*/
public function addSearchTerms($query, $searchstring)
{
$aliases = array('images' => 'jg', 'categories' => 'jgc');
$plugins = JDispatcher::getInstance()->trigger('onJoomSearch', array($searchstring, $aliases, _JOOM_OPTION.'.interface'));
$searchstring = $this->_db->quote('%'.$this->_db->escape(strtolower(trim($searchstring))).'%');
$where = '(jg.imgtitle LIKE '.$searchstring.' OR LOWER(jg.imgtext) LIKE '.$searchstring;
foreach($plugins as $plugin)
{
if(isset($plugin['images.select']))
{
$query->select($plugin['images.select']);
}
if(isset($plugin['images.leftjoin']))
{
$query->leftJoin($plugin['images.leftjoin']);
}
if(isset($plugin['images.where']))
{
$query->where($plugin['images.where']);
}
if(isset($plugin['images.where.or']))
{
$where .= ' OR '.$plugin['images.where.or'];
}
}
$query->where($where);
}
/**
* Returns number of images matching the search string
* (e.g. for pre-filtering, pagination)
*
* @param string $searchstring The string to use for the search
* @param array $access Access levels to filter for, null to use the ones of the current user
* @return int The number of images matching the search string
* @since 1.0.0
*/
public function getNumPicsBySearch($searchstring, $access = null)
{
$query = $this->_db->getQuery(true)
->select('COUNT(jg.id)')
->from(_JOOM_TABLE_IMAGES.' AS jg')
->leftJoin(_JOOM_TABLE_CATEGORIES.' AS jgc ON jgc.cid = jg.catid');
$this->addImageWhere($query);
$this->addSearchTerms($query);
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Returns db-rows of images matching the search string
* E.g. useful for a search mambot
*
* @param string $searchstring The string to use for the search
* @param array $access Access levels to filter for, null to use the ones of the current user
* @param string $sorting Sorting string
* @param int $numPics Limit number of images, leave away to return all
* @param int $limitStart Where to start returning $numPics images
* @return array An array of image objects from the database
* @since 1.0.0
*/
public function getPicsBySearch($searchstring, $access = null, $sorting = null, $numPics = null, $limitStart = 0)
{
$query = $this->getImagesQuery($access);
$this->addSearchTerms($query, $searchstring);
if($sorting)
{
$query->order($this->_db->escape($sorting));
}
$this->_db->setQuery($query, $limitStart, $numPics);
return $this->_db->loadObjectList();
}
/**
* Creates a new category out of the information of the given object
*
* @param object $obj Should hold all the information about the new category
* @param int The ID of the new category, false, if an error occured
* @since 1.5.0
*/
public function createCategory($obj)
{
jimport('joomla.filesystem.file');
JLoader::register('JoomFile', JPATH_ADMINISTRATOR.'/components/'._JOOM_OPTION.'/helpers/file.php');
$row = JTable::getInstance('joomgallerycategories', 'Table');
$row->bind($obj);
if(!$row->name)
{
$this->_mainframe->enqueueMessage(JText::_('No valid category name given'), 'error');
return false;
}
$row->parent_id = (int) $row->parent_id;
if($row->parent_id < 1)
{
$row->parent_id = 1;
}
// Determine location in category tree
if(!isset($obj->ordering) || !$obj->ordering || $obj->ordering == 'first-child')
{
$row->setLocation($row->parent_id, 'first-child');
}
else
{
if($obj->ordering == 'last-child')
{
$row->setLocation($row->parent_id, 'last-child');
}
else
{
$row->setLocation($obj->ordering, 'after');
}
}
// Ensure that the data is valid
if(!$row->check())
{
$this->_mainframe->enqueueMessage($row->getError(), 'error');
return false;
}
// Store the data in the database
if(!$row->store())
{
$this->_mainframe->enqueueMessage($row->getError(), 'error');
return false;
}
// Now we have the ID of the new category
// and the catpath can be built
$row->catpath = JoomFile::fixFilename($row->name).'_'.$row->cid;
if($row->parent_id > 1)
{
$row->catpath = JoomHelper::getCatPath($row->parent_id).$row->catpath;
}
// So store again, but afore let's create the alias
$row->check();
if(!$row->store())
{
$this->_mainframe->enqueueMessage($row->getError(), 'error');
return false;
}
// Create necessary folders and files
$origpath = JPATH_ROOT.'/'.$this->_jg_config->get('jg_pathoriginalimages').$row->catpath;
$imgpath = JPATH_ROOT.'/'.$this->_jg_config->get('jg_pathimages').$row->catpath;
$thumbpath = JPATH_ROOT.'/'.$this->_jg_config->get('jg_paththumbs').$row->catpath;
$result = array();
$result[] = JFolder::create($origpath);
$result[] = JoomFile::copyIndexHtml($origpath);
$result[] = JFolder::create($imgpath);
$result[] = JoomFile::copyIndexHtml($imgpath);
$result[] = JFolder::create($thumbpath);
$result[] = JoomFile::copyIndexHtml($thumbpath);
if(in_array(false, $result))
{
// Delete the just stored database entry
$row->delete();
return false;
}
else
{
// New category successfully created
return $row->cid;
}
}
/**
* Is automatically called when an unknown method is called.
* This will happen if JoomGallery is not uptodate.
*
* @param string $name Name of the unknown method
* @param array $params Array of parameters given to the unknown method
* @return void
* @since 1.5.0
*/
public function __call($name, $params)
{
$this->_mainframe->enqueueMessage('JoomGallery is not uptodate. Function '.$name.' does not exist', 'error');
}
}