primo commit
This commit is contained in:
45
components/com_banners/src/Controller/DisplayController.php
Normal file
45
components/com_banners/src/Controller/DisplayController.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Controller;
|
||||
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Banners Controller
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class DisplayController extends BaseController
|
||||
{
|
||||
/**
|
||||
* Method when a banner is clicked on.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function click()
|
||||
{
|
||||
$id = $this->input->getInt('id', 0);
|
||||
|
||||
if ($id) {
|
||||
/** @var \Joomla\Component\Banners\Site\Model\BannerModel $model */
|
||||
$model = $this->getModel('Banner', 'Site', ['ignore_request' => true]);
|
||||
$model->setState('banner.id', $id);
|
||||
$model->click();
|
||||
$this->setRedirect($model->getUrl());
|
||||
}
|
||||
}
|
||||
}
|
||||
50
components/com_banners/src/Helper/BannerHelper.php
Normal file
50
components/com_banners/src/Helper/BannerHelper.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Helper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Banner Helper Class
|
||||
*
|
||||
* @since 1.6
|
||||
*
|
||||
* @deprecated 5.1 will be removed in 7.0
|
||||
*/
|
||||
abstract class BannerHelper
|
||||
{
|
||||
/**
|
||||
* Checks if a URL is an image
|
||||
*
|
||||
* @param string $url The URL path to the potential image
|
||||
*
|
||||
* @return boolean True if an image of type bmp, gif, jp(e)g, png or webp, false otherwise
|
||||
*
|
||||
* @since 1.6
|
||||
*
|
||||
* @deprecated 5.1 will be removed in 7.0
|
||||
* When testing the image file, use Joomla\CMS\Helper\MediaHelper::isImage($url) for pixel-based image files
|
||||
* in combination with Joomla\CMS\Helper\MediaHelper::getMimeType($url) === 'image/svg+xml' for vector based image files
|
||||
* Be aware that the image url should first be sanitized with the helper function Joomla\CMS\HTML\HTMLHelper::cleanImageURL($imageurl)
|
||||
*/
|
||||
public static function isImage($url)
|
||||
{
|
||||
$urlCheck = explode('?', $url);
|
||||
|
||||
if (preg_match('#\.(?:bmp|gif|jpe?g|png|webp)$#i', $urlCheck[0])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
223
components/com_banners/src/Model/BannerModel.php
Normal file
223
components/com_banners/src/Model/BannerModel.php
Normal file
@ -0,0 +1,223 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Model;
|
||||
|
||||
use Joomla\CMS\Cache\Exception\CacheExceptionInterface;
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
||||
use Joomla\Database\ParameterType;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Banner model for the Joomla Banners component.
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
class BannerModel extends BaseDatabaseModel
|
||||
{
|
||||
/**
|
||||
* Cached item object
|
||||
*
|
||||
* @var object
|
||||
* @since 1.6
|
||||
*/
|
||||
protected $_item;
|
||||
|
||||
/**
|
||||
* Clicks the URL, incrementing the counter
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.5
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function click()
|
||||
{
|
||||
$item = $this->getItem();
|
||||
|
||||
if (empty($item)) {
|
||||
throw new \Exception(Text::_('JERROR_PAGE_NOT_FOUND'), 404);
|
||||
}
|
||||
|
||||
$id = (int) $this->getState('banner.id');
|
||||
|
||||
// Update click count
|
||||
$db = $this->getDatabase();
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
$query->update($db->quoteName('#__banners'))
|
||||
->set($db->quoteName('clicks') . ' = ' . $db->quoteName('clicks') . ' + 1')
|
||||
->where($db->quoteName('id') . ' = :id')
|
||||
->bind(':id', $id, ParameterType::INTEGER);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (\RuntimeException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
|
||||
// Track clicks
|
||||
$trackClicks = $item->track_clicks;
|
||||
|
||||
if ($trackClicks < 0 && $item->cid) {
|
||||
$trackClicks = $item->client_track_clicks;
|
||||
}
|
||||
|
||||
if ($trackClicks < 0) {
|
||||
$config = ComponentHelper::getParams('com_banners');
|
||||
$trackClicks = $config->get('track_clicks');
|
||||
}
|
||||
|
||||
if ($trackClicks > 0) {
|
||||
$trackDate = Factory::getDate()->format('Y-m-d H:00:00');
|
||||
$trackDate = Factory::getDate($trackDate)->toSql();
|
||||
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
$query->select($db->quoteName('count'))
|
||||
->from($db->quoteName('#__banner_tracks'))
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('track_type') . ' = 2',
|
||||
$db->quoteName('banner_id') . ' = :id',
|
||||
$db->quoteName('track_date') . ' = :trackDate',
|
||||
]
|
||||
)
|
||||
->bind(':id', $id, ParameterType::INTEGER)
|
||||
->bind(':trackDate', $trackDate);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (\RuntimeException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
|
||||
$count = $db->loadResult();
|
||||
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
if ($count) {
|
||||
// Update count
|
||||
$query->update($db->quoteName('#__banner_tracks'))
|
||||
->set($db->quoteName('count') . ' = ' . $db->quoteName('count') . ' + 1')
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('track_type') . ' = 2',
|
||||
$db->quoteName('banner_id') . ' = :id',
|
||||
$db->quoteName('track_date') . ' = :trackDate',
|
||||
]
|
||||
)
|
||||
->bind(':id', $id, ParameterType::INTEGER)
|
||||
->bind(':trackDate', $trackDate);
|
||||
} else {
|
||||
// Insert new count
|
||||
$query->insert($db->quoteName('#__banner_tracks'))
|
||||
->columns(
|
||||
[
|
||||
$db->quoteName('count'),
|
||||
$db->quoteName('track_type'),
|
||||
$db->quoteName('banner_id'),
|
||||
$db->quoteName('track_date'),
|
||||
]
|
||||
)
|
||||
->values('1, 2 , :id, :trackDate')
|
||||
->bind(':id', $id, ParameterType::INTEGER)
|
||||
->bind(':trackDate', $trackDate);
|
||||
}
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (\RuntimeException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the data for a banner.
|
||||
*
|
||||
* @return object
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function &getItem()
|
||||
{
|
||||
if (!isset($this->_item)) {
|
||||
/** @var \Joomla\CMS\Cache\Controller\CallbackController $cache */
|
||||
$cache = Factory::getCache('com_banners', 'callback');
|
||||
|
||||
$id = (int) $this->getState('banner.id');
|
||||
|
||||
// For PHP 5.3 compat we can't use $this in the lambda function below, so grab the database driver now to use it
|
||||
$db = $this->getDatabase();
|
||||
|
||||
$loader = function ($id) use ($db) {
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
$query->select(
|
||||
[
|
||||
$db->quoteName('a.clickurl'),
|
||||
$db->quoteName('a.cid'),
|
||||
$db->quoteName('a.track_clicks'),
|
||||
$db->quoteName('cl.track_clicks', 'client_track_clicks'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__banners', 'a'))
|
||||
->join('LEFT', $db->quoteName('#__banner_clients', 'cl'), $db->quoteName('cl.id') . ' = ' . $db->quoteName('a.cid'))
|
||||
->where($db->quoteName('a.id') . ' = :id')
|
||||
->bind(':id', $id, ParameterType::INTEGER);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
return $db->loadObject();
|
||||
};
|
||||
|
||||
try {
|
||||
$this->_item = $cache->get($loader, [$id], md5(__METHOD__ . $id));
|
||||
} catch (CacheExceptionInterface $e) {
|
||||
$this->_item = $loader($id);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->_item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL for a banner
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @since 1.5
|
||||
*/
|
||||
public function getUrl()
|
||||
{
|
||||
$item = $this->getItem();
|
||||
$url = $item->clickurl;
|
||||
|
||||
// Check for links
|
||||
if (!preg_match('#http[s]?://|index[2]?\.php#', $url)) {
|
||||
$url = "http://$url";
|
||||
}
|
||||
|
||||
return $url;
|
||||
}
|
||||
}
|
||||
384
components/com_banners/src/Model/BannersModel.php
Normal file
384
components/com_banners/src/Model/BannersModel.php
Normal file
@ -0,0 +1,384 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Model;
|
||||
|
||||
use Joomla\CMS\Component\ComponentHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\MVC\Model\ListModel;
|
||||
use Joomla\Database\Exception\ExecutionFailureException;
|
||||
use Joomla\Database\ParameterType;
|
||||
use Joomla\Database\QueryInterface;
|
||||
use Joomla\Registry\Registry;
|
||||
use Joomla\Utilities\ArrayHelper;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Banners model for the Joomla Banners component.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class BannersModel extends ListModel
|
||||
{
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a QueryInterface object for retrieving the data set from a database.
|
||||
*
|
||||
* @return QueryInterface An object implementing QueryInterface to retrieve the data set.
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
protected function getListQuery()
|
||||
{
|
||||
$db = $this->getDatabase();
|
||||
$query = $db->getQuery(true);
|
||||
$ordering = $this->getState('filter.ordering');
|
||||
$tagSearch = $this->getState('filter.tag_search');
|
||||
$cid = (int) $this->getState('filter.client_id');
|
||||
$categoryId = $this->getState('filter.category_id');
|
||||
$keywords = $this->getState('filter.keywords');
|
||||
$randomise = ($ordering === 'random');
|
||||
$nowDate = Factory::getDate()->toSql();
|
||||
|
||||
$query->select(
|
||||
[
|
||||
$db->quoteName('a.id'),
|
||||
$db->quoteName('a.type'),
|
||||
$db->quoteName('a.name'),
|
||||
$db->quoteName('a.clickurl'),
|
||||
$db->quoteName('a.sticky'),
|
||||
$db->quoteName('a.cid'),
|
||||
$db->quoteName('a.description'),
|
||||
$db->quoteName('a.params'),
|
||||
$db->quoteName('a.custombannercode'),
|
||||
$db->quoteName('a.track_impressions'),
|
||||
$db->quoteName('cl.track_impressions', 'client_track_impressions'),
|
||||
]
|
||||
)
|
||||
->from($db->quoteName('#__banners', 'a'))
|
||||
->join('LEFT', $db->quoteName('#__banner_clients', 'cl'), $db->quoteName('cl.id') . ' = ' . $db->quoteName('a.cid'))
|
||||
->where($db->quoteName('a.state') . ' = 1')
|
||||
->extendWhere(
|
||||
'AND',
|
||||
[
|
||||
$db->quoteName('a.publish_up') . ' IS NULL',
|
||||
$db->quoteName('a.publish_up') . ' <= :nowDate1',
|
||||
],
|
||||
'OR'
|
||||
)
|
||||
->extendWhere(
|
||||
'AND',
|
||||
[
|
||||
$db->quoteName('a.publish_down') . ' IS NULL',
|
||||
$db->quoteName('a.publish_down') . ' >= :nowDate2',
|
||||
],
|
||||
'OR'
|
||||
)
|
||||
->extendWhere(
|
||||
'AND',
|
||||
[
|
||||
$db->quoteName('a.imptotal') . ' = 0',
|
||||
$db->quoteName('a.impmade') . ' < ' . $db->quoteName('a.imptotal'),
|
||||
],
|
||||
'OR'
|
||||
)
|
||||
->bind([':nowDate1', ':nowDate2'], $nowDate);
|
||||
|
||||
if ($cid) {
|
||||
$query->where(
|
||||
[
|
||||
$db->quoteName('a.cid') . ' = :clientId',
|
||||
$db->quoteName('cl.state') . ' = 1',
|
||||
]
|
||||
)
|
||||
->bind(':clientId', $cid, ParameterType::INTEGER);
|
||||
}
|
||||
|
||||
// Filter by a single or group of categories
|
||||
if (is_numeric($categoryId)) {
|
||||
$categoryId = (int) $categoryId;
|
||||
$type = $this->getState('filter.category_id.include', true) ? ' = ' : ' <> ';
|
||||
|
||||
// Add subcategory check
|
||||
if ($this->getState('filter.subcategories', false)) {
|
||||
$levels = (int) $this->getState('filter.max_category_levels', '1');
|
||||
|
||||
// Create a subquery for the subcategory list
|
||||
$subQuery = $db->getQuery(true);
|
||||
$subQuery->select($db->quoteName('sub.id'))
|
||||
->from($db->quoteName('#__categories', 'sub'))
|
||||
->join(
|
||||
'INNER',
|
||||
$db->quoteName('#__categories', 'this'),
|
||||
$db->quoteName('sub.lft') . ' > ' . $db->quoteName('this.lft')
|
||||
. ' AND ' . $db->quoteName('sub.rgt') . ' < ' . $db->quoteName('this.rgt')
|
||||
)
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('this.id') . ' = :categoryId1',
|
||||
$db->quoteName('sub.level') . ' <= ' . $db->quoteName('this.level') . ' + :levels',
|
||||
]
|
||||
);
|
||||
|
||||
// Add the subquery to the main query
|
||||
$query->extendWhere(
|
||||
'AND',
|
||||
[
|
||||
$db->quoteName('a.catid') . $type . ':categoryId2',
|
||||
$db->quoteName('a.catid') . ' IN (' . $subQuery . ')',
|
||||
],
|
||||
'OR'
|
||||
)
|
||||
->bind([':categoryId1', ':categoryId2'], $categoryId, ParameterType::INTEGER)
|
||||
->bind(':levels', $levels, ParameterType::INTEGER);
|
||||
} else {
|
||||
$query->where($db->quoteName('a.catid') . $type . ':categoryId')
|
||||
->bind(':categoryId', $categoryId, ParameterType::INTEGER);
|
||||
}
|
||||
} elseif (\is_array($categoryId) && (\count($categoryId) > 0)) {
|
||||
$categoryId = ArrayHelper::toInteger($categoryId);
|
||||
|
||||
if ($this->getState('filter.category_id.include', true)) {
|
||||
$query->whereIn($db->quoteName('a.catid'), $categoryId);
|
||||
} else {
|
||||
$query->whereNotIn($db->quoteName('a.catid'), $categoryId);
|
||||
}
|
||||
}
|
||||
|
||||
if ($tagSearch) {
|
||||
if (!$keywords) {
|
||||
// No keywords, select nothing.
|
||||
$query->where('0 != 0');
|
||||
} else {
|
||||
$temp = [];
|
||||
$config = ComponentHelper::getParams('com_banners');
|
||||
$prefix = $config->get('metakey_prefix');
|
||||
|
||||
if ($categoryId) {
|
||||
$query->join('LEFT', $db->quoteName('#__categories', 'cat'), $db->quoteName('a.catid') . ' = ' . $db->quoteName('cat.id'));
|
||||
}
|
||||
|
||||
foreach ($keywords as $key => $keyword) {
|
||||
$regexp = '[[:<:]]' . $keyword . '[[:>:]]';
|
||||
$valuesToBind = [$keyword, $keyword, $regexp];
|
||||
|
||||
if ($cid) {
|
||||
$valuesToBind[] = $regexp;
|
||||
}
|
||||
|
||||
if ($categoryId) {
|
||||
$valuesToBind[] = $regexp;
|
||||
}
|
||||
|
||||
// Because values to $query->bind() are passed by reference, using $query->bindArray() here instead to prevent overwriting.
|
||||
$bounded = $query->bindArray($valuesToBind, ParameterType::STRING);
|
||||
|
||||
$condition1 = $db->quoteName('a.own_prefix') . ' = 1'
|
||||
. ' AND ' . $db->quoteName('a.metakey_prefix')
|
||||
. ' = SUBSTRING(' . $bounded[0] . ',1,LENGTH(' . $db->quoteName('a.metakey_prefix') . '))'
|
||||
. ' OR ' . $db->quoteName('a.own_prefix') . ' = 0'
|
||||
. ' AND ' . $db->quoteName('cl.own_prefix') . ' = 1'
|
||||
. ' AND ' . $db->quoteName('cl.metakey_prefix')
|
||||
. ' = SUBSTRING(' . $bounded[1] . ',1,LENGTH(' . $db->quoteName('cl.metakey_prefix') . '))'
|
||||
. ' OR ' . $db->quoteName('a.own_prefix') . ' = 0'
|
||||
. ' AND ' . $db->quoteName('cl.own_prefix') . ' = 0'
|
||||
. ' AND ' . ($prefix == substr($keyword, 0, \strlen($prefix)) ? '0 = 0' : '0 != 0');
|
||||
|
||||
$condition2 = $db->quoteName('a.metakey') . ' ' . $query->regexp($bounded[2]);
|
||||
|
||||
if ($cid) {
|
||||
$condition2 .= ' OR ' . $db->quoteName('cl.metakey') . ' ' . $query->regexp($bounded[3]) . ' ';
|
||||
}
|
||||
|
||||
if ($categoryId) {
|
||||
$condition2 .= ' OR ' . $db->quoteName('cat.metakey') . ' ' . $query->regexp($bounded[4]) . ' ';
|
||||
}
|
||||
|
||||
$temp[] = "($condition1) AND ($condition2)";
|
||||
}
|
||||
|
||||
$query->where('(' . implode(' OR ', $temp) . ')');
|
||||
}
|
||||
}
|
||||
|
||||
// Filter by language
|
||||
if ($this->getState('filter.language')) {
|
||||
$query->whereIn($db->quoteName('a.language'), [Factory::getLanguage()->getTag(), '*'], ParameterType::STRING);
|
||||
}
|
||||
|
||||
$query->order($db->quoteName('a.sticky') . ' DESC, ' . ($randomise ? $query->rand() : $db->quoteName('a.ordering')));
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of banners.
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
if ($this->getState('filter.tag_search')) {
|
||||
// Filter out empty keywords.
|
||||
$keywords = array_values(array_filter(array_map('trim', $this->getState('filter.keywords')), 'strlen'));
|
||||
|
||||
// Re-set state before running the query.
|
||||
$this->setState('filter.keywords', $keywords);
|
||||
|
||||
// If no keywords are provided, avoid running the query.
|
||||
if (!$keywords) {
|
||||
$this->cache['items'] = [];
|
||||
|
||||
return $this->cache['items'];
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($this->cache['items'])) {
|
||||
$this->cache['items'] = parent::getItems();
|
||||
|
||||
foreach ($this->cache['items'] as &$item) {
|
||||
$item->params = new Registry($item->params);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->cache['items'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes impressions on a list of banners
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 1.6
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function impress()
|
||||
{
|
||||
$trackDate = Factory::getDate()->format('Y-m-d H:00:00');
|
||||
$trackDate = Factory::getDate($trackDate)->toSql();
|
||||
$items = $this->getItems();
|
||||
$db = $this->getDatabase();
|
||||
$bid = [];
|
||||
|
||||
if (!\count($items)) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($items as $item) {
|
||||
$bid[] = (int) $item->id;
|
||||
}
|
||||
|
||||
// Increment impression made
|
||||
$query = $db->getQuery(true);
|
||||
$query->update($db->quoteName('#__banners'))
|
||||
->set($db->quoteName('impmade') . ' = ' . $db->quoteName('impmade') . ' + 1')
|
||||
->whereIn($db->quoteName('id'), $bid);
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (ExecutionFailureException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
|
||||
foreach ($items as $item) {
|
||||
// Track impressions
|
||||
$trackImpressions = $item->track_impressions;
|
||||
|
||||
if ($trackImpressions < 0 && $item->cid) {
|
||||
$trackImpressions = $item->client_track_impressions;
|
||||
}
|
||||
|
||||
if ($trackImpressions < 0) {
|
||||
$config = ComponentHelper::getParams('com_banners');
|
||||
$trackImpressions = $config->get('track_impressions');
|
||||
}
|
||||
|
||||
if ($trackImpressions > 0) {
|
||||
// Is track already created?
|
||||
// Update count
|
||||
$query = $db->getQuery(true);
|
||||
$query->update($db->quoteName('#__banner_tracks'))
|
||||
->set($db->quoteName('count') . ' = ' . $db->quoteName('count') . ' + 1')
|
||||
->where(
|
||||
[
|
||||
$db->quoteName('track_type') . ' = 1',
|
||||
$db->quoteName('banner_id') . ' = :id',
|
||||
$db->quoteName('track_date') . ' = :trackDate',
|
||||
]
|
||||
)
|
||||
->bind(':id', $item->id, ParameterType::INTEGER)
|
||||
->bind(':trackDate', $trackDate);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (ExecutionFailureException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
|
||||
if ($db->getAffectedRows() === 0) {
|
||||
// Insert new count
|
||||
$query = $db->getQuery(true);
|
||||
$query->insert($db->quoteName('#__banner_tracks'))
|
||||
->columns(
|
||||
[
|
||||
$db->quoteName('count'),
|
||||
$db->quoteName('track_type'),
|
||||
$db->quoteName('banner_id'),
|
||||
$db->quoteName('track_date'),
|
||||
]
|
||||
)
|
||||
->values('1, 1, :id, :trackDate')
|
||||
->bind(':id', $item->id, ParameterType::INTEGER)
|
||||
->bind(':trackDate', $trackDate);
|
||||
|
||||
$db->setQuery($query);
|
||||
|
||||
try {
|
||||
$db->execute();
|
||||
} catch (ExecutionFailureException $e) {
|
||||
throw new \Exception($e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
40
components/com_banners/src/Service/Category.php
Normal file
40
components/com_banners/src/Service/Category.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Service;
|
||||
|
||||
use Joomla\CMS\Categories\Categories;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Banners Component Category Tree
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
class Category extends Categories
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array $options Array of options
|
||||
*
|
||||
* @since 1.6
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$options['table'] = '#__banners';
|
||||
$options['extension'] = 'com_banners';
|
||||
|
||||
parent::__construct($options);
|
||||
}
|
||||
}
|
||||
98
components/com_banners/src/Service/Router.php
Normal file
98
components/com_banners/src/Service/Router.php
Normal file
@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Joomla.Site
|
||||
* @subpackage com_banners
|
||||
*
|
||||
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
|
||||
namespace Joomla\Component\Banners\Site\Service;
|
||||
|
||||
use Joomla\CMS\Component\Router\RouterBase;
|
||||
|
||||
// phpcs:disable PSR1.Files.SideEffects
|
||||
\defined('_JEXEC') or die;
|
||||
// phpcs:enable PSR1.Files.SideEffects
|
||||
|
||||
/**
|
||||
* Routing class from com_banners
|
||||
*
|
||||
* @since 3.3
|
||||
*/
|
||||
class Router extends RouterBase
|
||||
{
|
||||
/**
|
||||
* Build the route for the com_banners component
|
||||
*
|
||||
* @param array $query An array of URL arguments
|
||||
*
|
||||
* @return array The URL arguments to use to assemble the subsequent URL.
|
||||
*
|
||||
* @since 3.3
|
||||
*/
|
||||
public function build(&$query)
|
||||
{
|
||||
$segments = [];
|
||||
|
||||
if (isset($query['task'])) {
|
||||
$segments[] = $query['task'];
|
||||
unset($query['task']);
|
||||
}
|
||||
|
||||
if (isset($query['id'])) {
|
||||
$segments[] = $query['id'];
|
||||
unset($query['id']);
|
||||
}
|
||||
|
||||
foreach ($segments as &$segment) {
|
||||
$segment = str_replace(':', '-', $segment);
|
||||
}
|
||||
|
||||
return $segments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the segments of a URL.
|
||||
*
|
||||
* @param array $segments The segments of the URL to parse.
|
||||
*
|
||||
* @return array The URL attributes to be used by the application.
|
||||
*
|
||||
* @since 3.3
|
||||
*/
|
||||
public function parse(&$segments)
|
||||
{
|
||||
$vars = [];
|
||||
|
||||
foreach ($segments as &$segment) {
|
||||
$segment = preg_replace('/-/', ':', $segment, 1);
|
||||
}
|
||||
unset($segment);
|
||||
|
||||
// View is always the first element of the array
|
||||
$count = \count($segments);
|
||||
|
||||
if ($count) {
|
||||
$count--;
|
||||
$segment = array_shift($segments);
|
||||
|
||||
if (is_numeric($segment)) {
|
||||
$vars['id'] = $segment;
|
||||
} else {
|
||||
$vars['task'] = $segment;
|
||||
}
|
||||
}
|
||||
|
||||
if ($count) {
|
||||
$segment = array_shift($segments);
|
||||
|
||||
if (is_numeric($segment)) {
|
||||
$vars['id'] = $segment;
|
||||
}
|
||||
}
|
||||
|
||||
return $vars;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user