aboutsummaryrefslogtreecommitdiff
path: root/lib/models/Banner.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/models/Banner.php')
-rw-r--r--lib/models/Banner.php232
1 files changed, 232 insertions, 0 deletions
diff --git a/lib/models/Banner.php b/lib/models/Banner.php
new file mode 100644
index 0000000..a418760
--- /dev/null
+++ b/lib/models/Banner.php
@@ -0,0 +1,232 @@
+<?php
+/**
+ * banner.php - model class for the banner administration
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * @author Nico Müller <nico.mueller@uni-oldenburg.de>
+ * @copyright 2012 Stud.IP Core-Group
+ * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
+ * @category Stud.IP
+ * @package admin
+ * @since 2.4
+ *
+ * @property string $id alias column for ad_id
+ * @property string $ad_id database column
+ * @property string $banner_path database column
+ * @property string|null $description database column
+ * @property string|null $alttext database column
+ * @property string $target_type database column
+ * @property string $target database column
+ * @property int $startdate database column
+ * @property int $enddate database column
+ * @property int $priority database column
+ * @property int $views database column
+ * @property int $clicks database column
+ * @property int $mkdate database column
+ * @property int $chdate database column
+ * @property SimpleORMapCollection|BannerRoles[] $banner_roles has_many BannerRoles
+ */
+
+class Banner extends SimpleORMap
+{
+ protected static function configure($config = [])
+ {
+ $config['db_table'] = 'banner_ads';
+
+ $config['has_many']['banner_roles'] = [
+ 'class_name' => BannerRoles::class,
+ 'assoc_foreign_key' => 'ad_id',
+ 'on_delete' => 'delete'
+ ];
+
+ parent::configure($config);
+ }
+
+ /**
+ * Returns a random banner
+ */
+ public static function getRandomBanner()
+ {
+ $query = "SELECT ad_id, priority, startdate, enddate
+ FROM banner_ads
+ WHERE priority > 0
+ AND (startdate = 0 OR startdate < UNIX_TIMESTAMP())
+ AND (enddate = 0 OR enddate > UNIX_TIMESTAMP())";
+ $statement = DBManager::get()->query($query);
+
+ // array that contains banner ids and an offset
+ // offsets start with 0 and increase by pow(2, priority)
+ // a random number between 0 and sum(pow(2,priorities)) is
+ // drawn and the banner with the highest offset smaller than
+ // this number is chosen
+
+ $banners = [];
+ $sum = 0;
+ // collect banners to consider, build banners array
+ while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
+ if (BannerRoles::checkUserAccess($row['ad_id'])) {
+ $sum += pow(2, $row['priority']);
+ $banners[] = [
+ 'ad_id' => $row['ad_id'],
+ 'offset' => $sum
+ ];
+ }
+ }
+
+ // draw random number and select banner
+ $x = mt_rand(0, $sum);
+ $ad_id = false;
+ foreach ($banners as $i) {
+ if ($i['offset'] >= $x) {
+ $ad_id = $i['ad_id'];
+ break;
+ }
+ }
+
+ return new Banner($ad_id);
+ }
+
+ /**
+ * Get all banners
+ *
+ * @return array() list of banners
+ */
+ public static function getAllBanners()
+ {
+ $query = "SELECT ad_id FROM banner_ads ORDER BY priority DESC";
+ $statement = DBManager::get()->query($query);
+ $ids = $statement->fetchAll(PDO::FETCH_COLUMN);
+
+ $banners = [];
+ foreach ($ids as $id) {
+ $banners[$id] = new Banner($id);
+ }
+ return $banners;
+ }
+
+ /**
+ * delete entry from database
+ * the object is cleared and turned to new state
+ * @return boolean
+ */
+ public function delete()
+ {
+ if (!$this->isNew()) {
+ // Remove banner file
+ unlink($GLOBALS['DYNAMIC_CONTENT_PATH'] . '/banner/' . $this->banner_path);
+ }
+ return parent::delete();
+ }
+
+ /*
+ * Check the priority for a banner
+ * @param Int $prio priority (1-10)
+ * @return
+ */
+ public function getViewProbability()
+ {
+ static $computed = false, $sum = null;
+
+ if ($this->priority == 0) {
+ return '--';
+ }
+
+ if ($computed === false) {
+ $sum = DBManager::get()->query("SELECT SUM(POW(2, priority)) FROM banner_ads WHERE priority > 0")
+ ->fetchColumn();
+ $computed = true;
+ }
+// return '1/' . (1 / (pow(2, $prio) / $sum));
+ return number_format(100 / (1 / (pow(2, $this->priority) / $sum)), 2, ',', '.') . '%';
+ }
+
+
+ /**
+ * Returns the appropriate link for this banner.
+ *
+ * @return string
+ */
+ public function getLink($internal = false)
+ {
+ if ($this->isNew()) {
+ return '';
+ }
+
+ if ($internal) {
+ return URLHelper::getLink('dispatch.php/banner/click/' . $this->ad_id);
+ }
+
+ if ($this->target_type === 'url') {
+ return $this->target;
+ }
+ if ($this->target_type === 'seminar') {
+ return URLHelper::getLink('dispatch.php/course/details/', ['sem_id' => $this->target]);
+ }
+ if ($this->target_type === 'user') {
+ return URLHelper::getLink('dispatch.php/profile', ['username' => $this->target]);
+ }
+ if ($this->target_type === 'inst') {
+ return URLHelper::getLink(
+ 'dispatch.php/institute/overview',
+ ['auswahl' => $this->target]
+ );
+ }
+
+ return '';
+ }
+
+ /**
+ * Returns the img-tag for this banner
+ *
+ * @return string
+ */
+ public function toImg($attributes = [])
+ {
+ $attr = [
+ 'src' => $GLOBALS['DYNAMIC_CONTENT_URL'] . '/banner/' . $this->banner_path,
+ 'border' => '0',
+ ];
+ if ($this->alttext) {
+ $attr['title'] = $attr['alt'] = $this->alttext;
+ }
+ $attr = array_merge($attr, $attributes);
+
+ $attr_string = '';
+ foreach ($attr as $key => $value) {
+ $attr_string .= sprintf(' %s="%s"', $key, htmlReady($value));
+ }
+
+ return '<img' . $attr_string . '>';
+ }
+
+ /**
+ * Returns the complete html (link + img) for this banner
+ *
+ * @return string
+ */
+ public function toHTML($internal = true)
+ {
+ if ($this->isNew()) {
+ return '';
+ }
+
+ if ($this->target_type === 'url') {
+ $template = '<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>';
+ } elseif ($this->target_type === 'none') {
+ $template = '%2$s';
+ } else {
+ $template = '<a href="%s">%s</a>';
+ }
+
+ $link = sprintf($template, $this->getLink($internal), $this->toImg());
+
+ $this->views += 1;
+ $this->store();
+
+ return sprintf('<div class="studip-banner">%s</div>', $link);
+ }
+}