0) { echo ''; } } 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; } } ?>