Files
fdn2/app/private/lib/BannerHelper.php
T
2022-09-19 21:08:49 +02:00

244 lines
7.1 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){
$category = BannerModel::GENERAL_CATEGORY;
$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) {
$stats = GlobalVariables::get("dao")->query(
BannerStatsModel::class,
[
'_id' => [
'$in' => array_map(
function($banner) {
return new \MongoDB\BSON\ObjectID($banner);
},
$bannerIds
)
],
]
);
$rval = array_reduce(
$bannerIds,
function ($carry, $cur) {
$carry[$cur] = 0;
return $carry;
},
[]
);
foreach ($stats as $stat) {
$rval[strval($stat->id)] = 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;
}
}
?>