241 lines
7.0 KiB
PHP
241 lines
7.0 KiB
PHP
<?php
|
|
/*
|
|
Author: Riccardo Di Dato
|
|
Creation Date: 11/mar/2016
|
|
*/
|
|
|
|
class BannerHelper {
|
|
private static $useCategory = null;
|
|
private static $INTERNAL_COUNT = 1;
|
|
|
|
private static $positions = [];
|
|
|
|
public static function setCategory($category) {
|
|
self::$useCategory = $category;
|
|
}
|
|
|
|
private static function getCategory() {
|
|
return is_null((self::$useCategory)) ? BannerModel::GENERAL_CATEGORY : self::$useCategory;
|
|
}
|
|
|
|
public static function printBanner($position = BannerModel::POSITION_HEAD){
|
|
$cur = self::getPlaceholderId();
|
|
|
|
if (!array_key_exists($position, self::$positions)) {
|
|
self::$positions[$position] = [];
|
|
}
|
|
self::$positions[$position][] = $cur;
|
|
?>
|
|
<div id="<?php echo $cur;?>">
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
private static function getPlaceholderId() {
|
|
return 'banPlaceholder_'.(self::$INTERNAL_COUNT++);
|
|
}
|
|
|
|
public static function process() {
|
|
if (sizeof(self::$positions) > 0) {
|
|
echo '<script type="text/javascript">banner('.json_encode(self::getBannerMapWithViews()).')</script>';
|
|
}
|
|
}
|
|
|
|
|
|
private static function getBannerMapWithViews() {
|
|
$bannerMap = self::getActiveBannersMap();
|
|
$stats = self::getBannerImpressions(self::getAllBannerIds($bannerMap));
|
|
|
|
foreach ($bannerMap as &$list) {
|
|
foreach ($list['banners']['prio'] as &$bann ) {
|
|
$id = strval($bann['id']);
|
|
$bann['views'] = array_key_exists($id, $stats) ? $stats[ $id ] : 0;
|
|
}
|
|
foreach ($list['banners']['generic'] as &$bann ) {
|
|
$id = strval($bann['id']);
|
|
$bann['views'] = array_key_exists($id, $stats) ? $stats[ $id ] : 0;
|
|
}
|
|
}
|
|
return $bannerMap;
|
|
}
|
|
|
|
|
|
private static function getBannerImpressions($bannerIds) {
|
|
$time = strtotime("today");
|
|
$stats = GlobalVariables::get("dao")->query(
|
|
BannerStatsModel::class,
|
|
[
|
|
'banner' => [
|
|
'$in' => $bannerIds
|
|
],
|
|
'y' => intval(date('Y', $time)),
|
|
'm' => intval(date('m', $time)),
|
|
'd' => intval(date('d', $time))
|
|
]
|
|
);
|
|
$rval = array_reduce(
|
|
$bannerIds,
|
|
function ($carry, $cur) {
|
|
$carry[$cur] = 0;
|
|
return $carry;
|
|
},
|
|
[]
|
|
);
|
|
foreach ($stats as $stat) {
|
|
$rval[strval($stat->banner)] = intval($stat->views);
|
|
}
|
|
return $rval;
|
|
}
|
|
|
|
|
|
private static function getAllBannerIds($bannerMap) {
|
|
$rval = [];
|
|
foreach ($bannerMap as $type => $list) {
|
|
foreach ($list['banners']['prio'] as $k => $bann ) {
|
|
$rval[$bann['id']] = $bann['id'];
|
|
}
|
|
foreach ($list['banners']['generic'] as $k => $bann ) {
|
|
$rval[$bann['id']] = $bann['id'];
|
|
}
|
|
}
|
|
return array_keys($rval);
|
|
}
|
|
|
|
|
|
private static function getActiveBannersMap() {
|
|
if (sizeof(self::$positions) > 0) {
|
|
return array_reduce(
|
|
array_keys(self::$positions),
|
|
function ($carry, $pos) {
|
|
$cur = self::$positions[$pos];
|
|
|
|
$carry[$pos] = [
|
|
'placeholders' => $cur,
|
|
'banners' => self::getActiveBanners($pos)
|
|
];
|
|
return $carry;
|
|
},
|
|
[]
|
|
);
|
|
}
|
|
else {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
|
|
private static function getActiveBanners(int $position) {
|
|
$categoryMode = self::getCategory() !== BannerModel::GENERAL_CATEGORY;
|
|
$catQuery = [
|
|
BannerModel::GENERAL_CATEGORY
|
|
];
|
|
if ($categoryMode) {
|
|
$catQuery = [
|
|
'$elemMatch' => [
|
|
'$in' => [
|
|
self::getCategory(),
|
|
BannerModel::GENERAL_CATEGORY
|
|
]
|
|
]
|
|
];
|
|
}
|
|
$banners = GlobalVariables::get("dao")->query(
|
|
BannerModel::class,
|
|
[
|
|
'position' => $position,
|
|
'categories' => $catQuery,
|
|
'start' => [
|
|
'$lte' => new MongoDB\BSON\UTCDateTime( strtotime("today") * 1000 )
|
|
],
|
|
'end' => [
|
|
'$gte' => new MongoDB\BSON\UTCDateTime( strtotime("tomorrow") * 1000 )
|
|
]
|
|
],
|
|
[
|
|
'limit' => 20
|
|
]
|
|
);
|
|
$medias = self::fetchBannerMedias($banners);
|
|
if ($categoryMode) {
|
|
return array_reduce(
|
|
$banners,
|
|
function ($carry, $cur) use ($medias) {
|
|
$key = 'generic';
|
|
$info = self::simplifyBannerInfo($cur, $medias);
|
|
if (in_array(self::getCategory(), $cur->categories) ) {
|
|
$key = 'prio';
|
|
}
|
|
if (array_key_exists('media', $info)) {
|
|
$carry[$key][] = $info;
|
|
}
|
|
return $carry;
|
|
},
|
|
[
|
|
'prio' => [],
|
|
'generic' => []
|
|
]
|
|
);
|
|
}
|
|
else {
|
|
return [
|
|
'prio' => [],
|
|
'generic' =>
|
|
array_filter(
|
|
array_map(
|
|
function ($elem) use ($medias) {
|
|
return self::simplifyBannerInfo($elem, $medias);
|
|
},
|
|
$banners
|
|
),
|
|
function ($ele) {
|
|
return array_key_exists('media', $ele);
|
|
}
|
|
)
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param BannerModel[] $banners
|
|
*/
|
|
private static function fetchBannerMedias(array $banners) {
|
|
$medias = GlobalVariables::get("dao")->query(
|
|
MediaModel::class,
|
|
[
|
|
'_id' => [
|
|
'$in' => array_map(
|
|
function($banner) {
|
|
return new \MongoDB\BSON\ObjectID($banner->mainMedia);
|
|
},
|
|
$banners
|
|
)
|
|
],
|
|
]
|
|
);
|
|
return array_reduce(
|
|
$medias,
|
|
function ($carry, $cur) {
|
|
$carry[strval($cur->id)] = $cur;
|
|
return $carry;
|
|
},
|
|
[]
|
|
);
|
|
}
|
|
|
|
|
|
private static function simplifyBannerInfo($banner, $medias) {
|
|
|
|
$rval = [
|
|
'id' => strval($banner->id),
|
|
'link' => $banner->link
|
|
];
|
|
|
|
if (array_key_exists($banner->mainMedia, $medias)) {
|
|
$rval['media'] = $medias[$banner->mainMedia]->asText();
|
|
}
|
|
|
|
return $rval;
|
|
}
|
|
}
|
|
|
|
?>
|