304 lines
7.9 KiB
PHP
304 lines
7.9 KiB
PHP
<?php
|
|
/**
|
|
* @package Joomla.Site
|
|
* @subpackage com_banners
|
|
*
|
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables');
|
|
|
|
/**
|
|
* Banners model for the Joomla Banners component.
|
|
*
|
|
* @package Joomla.Site
|
|
* @subpackage com_banners
|
|
* @since 1.6
|
|
*/
|
|
class BannersModelBanners extends JModelList
|
|
{
|
|
/**
|
|
* Method to get a store id based on model configuration state.
|
|
*
|
|
* This is necessary because the model is used by the component and
|
|
* different modules that might need different sets of data or different
|
|
* ordering requirements.
|
|
*
|
|
* @param string $id A prefix for the store id.
|
|
*
|
|
* @return string A store id.
|
|
* @since 1.6
|
|
*/
|
|
protected function getStoreId($id = '')
|
|
{
|
|
// Compile the store id.
|
|
$id .= ':' . $this->getState('filter.search');
|
|
$id .= ':' . $this->getState('filter.tag_search');
|
|
$id .= ':' . $this->getState('filter.client_id');
|
|
$id .= ':' . serialize($this->getState('filter.category_id'));
|
|
$id .= ':' . serialize($this->getState('filter.keywords'));
|
|
|
|
return parent::getStoreId($id);
|
|
}
|
|
|
|
/**
|
|
* Gets a list of banners
|
|
*
|
|
* @return array An array of banner objects.
|
|
* @since 1.6
|
|
*/
|
|
protected function getListQuery()
|
|
{
|
|
$db = $this->getDbo();
|
|
$query = $db->getQuery(true);
|
|
$ordering = $this->getState('filter.ordering');
|
|
$tagSearch = $this->getState('filter.tag_search');
|
|
$cid = $this->getState('filter.client_id');
|
|
$categoryId = $this->getState('filter.category_id');
|
|
$keywords = $this->getState('filter.keywords');
|
|
$randomise = ($ordering == 'random');
|
|
$nullDate = $db->quote($db->getNullDate());
|
|
|
|
$query->select(
|
|
'a.id as id,' .
|
|
'a.type as type,' .
|
|
'a.name as name,' .
|
|
'a.clickurl as clickurl,' .
|
|
'a.cid as cid,' .
|
|
'a.params as params,' .
|
|
'a.custombannercode as custombannercode,' .
|
|
'a.track_impressions as track_impressions,' .
|
|
'cl.track_impressions as client_track_impressions'
|
|
)
|
|
->from('#__banners as a')
|
|
->join('LEFT', '#__banner_clients AS cl ON cl.id = a.cid')
|
|
->where('a.state=1')
|
|
->where('(' . $query->currentTimestamp() . ' >= a.publish_up OR a.publish_up = ' . $nullDate . ')')
|
|
->where('(' . $query->currentTimestamp() . ' <= a.publish_down OR a.publish_down = ' . $nullDate . ')')
|
|
->where('(a.imptotal = 0 OR a.impmade <= a.imptotal)');
|
|
|
|
if ($cid)
|
|
{
|
|
$query->join('LEFT', '#__categories as cat ON a.catid = cat.id')
|
|
->where('a.cid = ' . (int) $cid)
|
|
->where('cl.state = 1');
|
|
}
|
|
|
|
// Filter by a single or group of categories
|
|
if (is_numeric($categoryId))
|
|
{
|
|
$type = $this->getState('filter.category_id.include', true) ? '= ' : '<> ';
|
|
|
|
// Add subcategory check
|
|
$includeSubcategories = $this->getState('filter.subcategories', false);
|
|
$categoryEquals = 'a.catid ' . $type . (int) $categoryId;
|
|
|
|
if ($includeSubcategories)
|
|
{
|
|
$levels = (int) $this->getState('filter.max_category_levels', '1');
|
|
// Create a subquery for the subcategory list
|
|
$subQuery = $db->getQuery(true);
|
|
$subQuery->select('sub.id')
|
|
->from('#__categories as sub')
|
|
->join('INNER', '#__categories as this ON sub.lft > this.lft AND sub.rgt < this.rgt')
|
|
->where('this.id = ' . (int) $categoryId)
|
|
->where('sub.level <= this.level + ' . $levels);
|
|
|
|
// Add the subquery to the main query
|
|
$query->where('(' . $categoryEquals . ' OR a.catid IN (' . $subQuery->__toString() . '))');
|
|
}
|
|
else
|
|
{
|
|
$query->where($categoryEquals);
|
|
}
|
|
}
|
|
elseif ((is_array($categoryId)) && (count($categoryId) > 0))
|
|
{
|
|
JArrayHelper::toInteger($categoryId);
|
|
$categoryId = implode(',', $categoryId);
|
|
if ($categoryId != '0')
|
|
{
|
|
$type = $this->getState('filter.category_id.include', true) ? 'IN' : 'NOT IN';
|
|
$query->where('a.catid ' . $type . ' (' . $categoryId . ')');
|
|
}
|
|
}
|
|
|
|
if ($tagSearch)
|
|
{
|
|
if (count($keywords) == 0)
|
|
{
|
|
$query->where('0');
|
|
}
|
|
else
|
|
{
|
|
$temp = array();
|
|
$config = JComponentHelper::getParams('com_banners');
|
|
$prefix = $config->get('metakey_prefix');
|
|
|
|
foreach ($keywords as $keyword)
|
|
{
|
|
$keyword = trim($keyword);
|
|
$condition1 = "a.own_prefix=1 AND a.metakey_prefix=SUBSTRING(" . $db->quote($keyword) . ",1,LENGTH( a.metakey_prefix)) OR a.own_prefix=0 AND cl.own_prefix=1 AND cl.metakey_prefix=SUBSTRING(" . $db->quote($keyword) . ",1,LENGTH(cl.metakey_prefix)) OR a.own_prefix=0 AND cl.own_prefix=0 AND " . ($prefix == substr($keyword, 0, strlen($prefix)) ? '1' : '0');
|
|
|
|
$condition2 = "a.metakey REGEXP '[[:<:]]" . $db->escape($keyword) . "[[:>:]]'";
|
|
|
|
if ($cid)
|
|
{
|
|
$condition2 .= " OR cl.metakey REGEXP '[[:<:]]" . $db->escape($keyword) . "[[:>:]]'";
|
|
}
|
|
|
|
if ($catid)
|
|
{
|
|
$condition2 .= " OR cat.metakey REGEXP '[[:<:]]" . $db->escape($keyword) . "[[:>:]]'";
|
|
}
|
|
|
|
$temp[] = "($condition1) AND ($condition2)";
|
|
}
|
|
|
|
$query->where('(' . implode(' OR ', $temp) . ')');
|
|
}
|
|
}
|
|
|
|
// Filter by language
|
|
if ($this->getState('filter.language'))
|
|
{
|
|
$query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
|
|
}
|
|
|
|
$query->order('a.sticky DESC,' . ($randomise ? 'RAND()' : 'a.ordering'));
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* Get a list of banners.
|
|
*
|
|
* @return array
|
|
* @since 1.6
|
|
*/
|
|
public function getItems()
|
|
{
|
|
if (!isset($this->cache['items']))
|
|
{
|
|
$this->cache['items'] = parent::getItems();
|
|
|
|
foreach ($this->cache['items'] as &$item)
|
|
{
|
|
$parameters = new JRegistry;
|
|
$parameters->loadString($item->params);
|
|
$item->params = $parameters;
|
|
}
|
|
}
|
|
return $this->cache['items'];
|
|
}
|
|
|
|
/**
|
|
* Makes impressions on a list of banners
|
|
*
|
|
* @return void
|
|
* @since 1.6
|
|
*/
|
|
public function impress()
|
|
{
|
|
$trackDate = JFactory::getDate()->format('Y-m-d H');
|
|
$items = $this->getItems();
|
|
$db = $this->getDbo();
|
|
$query = $db->getQuery(true);
|
|
|
|
foreach ($items as $item)
|
|
{
|
|
// Increment impression made
|
|
$id = $item->id;
|
|
$query->clear()
|
|
->update('#__banners')
|
|
->set('impmade = (impmade + 1)')
|
|
->where('id = ' . (int) $id);
|
|
$db->setQuery($query);
|
|
|
|
try
|
|
{
|
|
$db->execute();
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
JError::raiseError(500, $e->getMessage());
|
|
}
|
|
|
|
// track impressions
|
|
$trackImpressions = $item->track_impressions;
|
|
if ($trackImpressions < 0 && $item->cid)
|
|
{
|
|
$trackImpressions = $item->client_track_impressions;
|
|
}
|
|
|
|
if ($trackImpressions < 0)
|
|
{
|
|
$config = JComponentHelper::getParams('com_banners');
|
|
$trackImpressions = $config->get('track_impressions');
|
|
}
|
|
|
|
if ($trackImpressions > 0)
|
|
{
|
|
// is track already created ?
|
|
$query->clear()
|
|
->select($db->quoteName('count'))
|
|
->from('#__banner_tracks')
|
|
->where('track_type=1')
|
|
->where('banner_id=' . (int) $id)
|
|
->where('track_date=' . $db->quote($trackDate));
|
|
|
|
$db->setQuery($query);
|
|
|
|
try
|
|
{
|
|
$db->execute();
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
JError::raiseError(500, $e->getMessage());
|
|
}
|
|
|
|
$count = $db->loadResult();
|
|
|
|
$query->clear();
|
|
|
|
if ($count)
|
|
{
|
|
// update count
|
|
$query->update('#__banner_tracks')
|
|
->set($db->quoteName('count') . ' = (' . $db->quote('count') . ' + 1)')
|
|
->where('track_type=1')
|
|
->where('banner_id=' . (int) $id)
|
|
->where('track_date=' . $db->quote($trackDate));
|
|
}
|
|
else
|
|
{
|
|
// insert new count
|
|
//sqlsrv change
|
|
$query->insert('#__banner_tracks')
|
|
->columns(
|
|
array(
|
|
$db->quoteName('count'), $db->quoteName('track_type'),
|
|
$db->quoteName('banner_id'), $db->quoteName('track_date')
|
|
)
|
|
)
|
|
->values('1, 1, ' . (int) $id . ', ' . $db->quote($trackDate));
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
|
|
try
|
|
{
|
|
$db->execute();
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
JError::raiseError(500, $e->getMessage());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|