You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

408 lines
14 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
class BannerLib extends TikiLib
{
public function select_banner_id($zone)
{
$map = [0 => 'sun', 1 => 'mon', 2 => 'tue', 3 => 'wed', 4 => 'thu', 5 => 'fri', 6 => 'sat'];
$dw = $map[$this->date_format("%w")];
$hour = $this->date_format("%H") . $this->date_format("%M");
$cookieName = "banner_$zone";
$mid = '';
$views = [];
$bindvars = ['y', $hour, $hour, 'y', (int) $this->now, (int) $this->now, 'n', -1, -1, $zone];
if (isset($_COOKIE[$cookieName])) {
$views = json_decode($_COOKIE[$cookieName]);
$mid = 'and (`bannerId` not in (' . implode(',', array_fill(0, count($views), '?')) . ') or ';
foreach ($views as $bId => $bView) {
$bindvars[] = $bId;
}
foreach ($views as $bId => $bView) {
$mids[] = '(`bannerId` = ? and `maxUserImpressions` > ?)';
$bindvars[] = $bId;
$bindvars[] = $bView;
}
$mid .= implode('or', $mids) . ')';
}
$query = "select `bannerId` from `tiki_banners` where `$dw` = ? and `hourFrom`<=? and `hourTo`>=? and" .
" ( ((`useDates` = ?) and (`fromDate`<=? and `toDate`>=?)) or (`useDates` = ?) ) and" .
" (`impressions`<`maxImpressions` or `maxImpressions`=?) and" .
" (`clicks`<`maxClicks` or `maxClicks`=? or `maxClicks` is NULL)" .
" and `zone`=? $mid and (`exceptInURIs` not like ? or `exceptInURIs` IS NULL)";
$bindvars[] = '%#' . $_SERVER['REQUEST_URI'] . '#%';
$query1 = "$query and `onlyInURIs` like ? order by " . $this->convertSortMode('random');
$result = $this->query($query1, array_merge($bindvars, ['%#' . $_SERVER['REQUEST_URI'] . '#%']), 1, 0);
if (! ($res = $result->fetchRow())) {
$query1 = "$query and (`onlyInURIs` is NULL or `onlyInURIs` =?) order by " . $this->convertSortMode('random');
$bindvars[] = '';
$result = $this->query($query1, $bindvars, 1, 0);
if (! ($res = $result->fetchRow())) {
return false;
}
}
$id = $res["bannerId"];
// Increment banner impressions here
if ($id) {
$query = "update `tiki_banners` set `impressions` = `impressions` + 1 where `bannerId` = ?";
$result = $this->query($query, [$id]);
}
return $id;
}
public function select_banner($zone, $target = '_blank', $id = '')
{
global $prefs, $tikilib;
// Things to check
// UseDates and dates
// Hours
// weekdays
// zone
// maxImpressions and impressions
if (! empty($zone)) {
$id = $this->select_banner_id($zone);
}
if (! $id) {
return '';
}
$res = $this->get_banner($id);
$class = 'banner' . str_replace(' ', '_', $zone);
$raw = '';
switch ($res["which"]) {
case 'useHTML':
$raw = $res["HTMLData"];
break;
case 'useFlash':
if ($prefs['javascript_enabled'] == 'y') {
TikiLib::lib('header')->add_jsfile('vendor_bundled/vendor/bower-asset/swfobject/swfobject/swfobject.js', true);
}
$raw = $tikilib->embed_flash(unserialize($res['HTMLData']));
break;
case 'useImage':
$raw
= "<div class='banner $class'><a target='$target' href='banner_click.php?id=" . $res["bannerId"] . '\'>' .
"<img class='img-fluid' alt='banner' src='banner_image.php?id=" . $res["bannerId"] . "'></a></div>";
break;
case 'useFixedURL':
$raw
= "<div class='banner $class'><a target='$target' href='banner_click.php?id=" . $res["bannerId"] . '\'>'
. '<img src="' . $res["fixedURLData"] . '" alt="banner" /></a></div>';
break;
case 'useText':
$raw = "<a target='$target' class='bannertext $class' href='banner_click.php?id=" . $res["bannerId"] . "'>" . $res["textData"] . "</a>";
break;
}
// Increment banner impressions done in select_banner_id()
// Now to set view limiting cookie for user
$cookieName = "banner_$zone";
$views = [];
if (isset($_COOKIE[$cookieName])) {
$views = json_decode($_COOKIE[$cookieName]);
}
if ($res['maxUserImpressions'] > 0) {
$views[$res['bannerId']] = isset($views[$res['bannerId']]) ? $views[$res['bannerId']] + 1 : 1;
$expire = $res['useDates'] ? $res['toDate'] : $tikilib->now + 60 * 60 * 24 * 90; //90 days
setcookie($cookieName, json_encode($views), $expire);
}
return $raw;
}
public function add_click($bannerId)
{
$query = "update `tiki_banners` set `clicks` = `clicks` + 1 where `bannerId`=?";
$result = $this->query($query, [(int)$bannerId]);
}
public function list_banners($offset, $maxRecords, $sort_mode, $find, $user)
{
if ($user == 'admin') {
$mid = '';
$bindvars = [];
} else {
$mid = "where `client` = ?";
$bindvars = [$user];
}
if ($find) {
$findesc = '%' . $find . '%';
$bindvars[] = $findesc;
if ($mid) {
$mid .= " and `url` like ? ";
} else {
$mid .= " where `url` like ? ";
}
}
$query = "select * from `tiki_banners` $mid order by " . $this->convertSortMode($sort_mode);
$query_cant = "select count(*) from `tiki_banners` $mid";
$result = $this->query($query, $bindvars, $maxRecords, $offset);
$cant = $this->getOne($query_cant, $bindvars);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[] = $res;
}
$retval = [];
$retval["data"] = $ret;
$retval["cant"] = $cant;
return $retval;
}
public function list_zones()
{
$query = "select `zone` from `tiki_zones`";
$query_cant = "select count(*) from `tiki_zones`";
$result = $this->query($query, []);
$cant = $this->getOne($query_cant, []);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[] = $res;
}
$retval = [];
$retval["data"] = $ret;
$retval["cant"] = $cant;
return $retval;
}
public function remove_banner($bannerId)
{
$query = "delete from `tiki_banners` where `bannerId`=?";
$result = $this->query($query, [$bannerId]);
}
public function get_banner($bannerId)
{
$query = "select * from `tiki_banners` where `bannerId`=?";
$result = $this->query($query, [$bannerId]);
if (! $result->numRows()) {
return false;
}
$res = $result->fetchRow();
return $res;
}
public function replace_banner(
$bannerId,
$client,
$url,
$title,
$alt,
$use,
$imageData,
$imageType,
$imageName,
$HTMLData,
$fixedURLData,
$textData,
$fromDate,
$toDate,
$useDates,
$mon,
$tue,
$wed,
$thu,
$fri,
$sat,
$sun,
$hourFrom,
$hourTo,
$maxImpressions,
$maxClicks,
$zone,
$maxUserImpressions = -1,
$onlyInURIs = null,
$exceptInURIs = null
) {
$imageData = urldecode($imageData);
//$imageData = '';
if ($bannerId) {
$query = "update `tiki_banners` set
`client` = ?,
`url` = ?,
`title` = ?,
`alt` = ?,
`which` = ?,
`imageData` = ?,
`imageType` = ?,
`imageName` = ?,
`HTMLData` = ?,
`fixedURLData` = ?,
`textData` = ?,
`fromDate` = ?,
`toDate` = ?,
`useDates` = ?,
`created` = ?,
`zone` = ?,
`hourFrom` = ?,
`hourTo` = ?,
`mon` = ? ,`tue` = ?, `wed` = ?, `thu` = ?, `fri` = ?, `sat` = ?, `sun` = ?,
`maxImpressions` = ?, `maxUserImpressions`=?, `maxClicks` = ?, `onlyInURIs`=?, `exceptInURIs`=? where `bannerId`=?";
$bindvars = [
$client,
$url,
$title,
$alt,
$use,
$imageData,
$imageType,
$imageName,
$HTMLData,
$fixedURLData,
$textData,
$fromDate,
$toDate,
$useDates,
$this->now,
$zone,
$hourFrom,
$hourTo,
$mon,
$tue,
$wed,
$thu,
$fri,
$sat,
$sun,
$maxImpressions,
$maxUserImpressions,
$maxClicks,
$onlyInURIs,
$exceptInURIs,
$bannerId
];
$result = $this->query($query, $bindvars);
/* invalid cache */
global $tikilib, $tikidomain, $prefs;
$bannercachefile = $prefs['tmpDir'];
if ($tikidomain) {
$bannercachefile .= "/$tikidomain";
}
$bannercachefile .= "/banner." . (int)$bannerId;
unlink($bannercachefile);
} else {
$query = "insert into `tiki_banners`(`client`, `url`, `title`, `alt`, `which`, `imageData`, `imageType`, `HTMLData`," .
" `fixedURLData`, `textData`, `fromDate`, `toDate`, `useDates`, `mon`, `tue`, `wed`, `thu`, `fri`, `sat`, `sun`," .
" `hourFrom`, `hourTo`, `maxImpressions`,`maxUserImpressions`,`maxClicks`,`created`,`zone`,`imageName`," .
" `impressions`,`clicks`, `onlyInURIs`, `exceptInURIs`)" .
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$bindvars = [
$client,
$url,
$title,
$alt,
$use,
$imageData,
$imageType,
$HTMLData,
$fixedURLData,
$textData,
$fromDate,
$toDate,
$useDates,
$mon,
$tue,
$wed,
$thu,
$fri,
$sat,
$sun,
$hourFrom,
$hourTo,
$maxImpressions,
$maxUserImpressions,
$maxClicks,
$this->now,
$zone,
$imageName,
0,
0,
$onlyInURIs,
$exceptInURIs
];
$result = $this->query($query, $bindvars);
$query = "select max(`bannerId`) from `tiki_banners` where `created`=?";
$bannerId = $this->getOne($query, [(int)$this->now]);
}
return $bannerId;
}
public function banner_add_zone($zone)
{
$query = "delete from `tiki_zones` where `zone`=?";
$this->query($query, [$zone], -1, -1, false);
$query = "insert into `tiki_zones`(`zone`) values(?)";
$result = $this->query($query, [$zone]);
return true;
}
public function banner_get_zones()
{
$query = "select * from `tiki_zones`";
$result = $this->query($query, []);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[] = $res;
}
return $ret;
}
public function banner_remove_zone($zone)
{
$query = "delete from `tiki_zones` where `zone`=?";
$result = $this->query($query, [$zone]);
return true;
}
}