function MAX_adSelect($what, $campaignid = '', $target = '', $source = '', $withtext = 0, $charset = '', $context = array(), $richmedia = true, $ct0 = '', $loc = '', $referer = '') { $conf = $GLOBALS['_MAX']['CONF']; // For local mode and XML-RPC calls the some parameters are not set in the global scope // So we need to override the empty globals with the values passed into this function. if (empty($GLOBALS['source'])) { $GLOBALS['source'] = $source; } if (empty($GLOBALS['loc'])) { $GLOBALS['loc'] = $loc; } // Store the original zone, campaign or banner IDs for later use if (strpos($what, 'zone:') === 0) { $originalZoneId = intval(substr($what, 5)); } elseif (strpos($what, 'campaignid:') === 0) { $originalCampaignId = intval(substr($what, 11)); } elseif (strpos($what, 'bannerid:') === 0) { $originalBannerId = intval(substr($what, 9)); } $userid = MAX_cookieGetUniqueViewerID(); MAX_cookieSet($conf['var']['viewerId'], $userid, _getTimeYearFromNow()); $outputbuffer = ''; // Set flag $found = false; // Reset followed zone chain $GLOBALS['_MAX']['followedChain'] = array(); $GLOBALS['_MAX']['adChain'] = array(); $first = true; global $g_append, $g_prepend; $g_append = ''; $g_prepend = ''; if (!empty($what)) { while ($first || $what != '' && $found == false) { $first = false; // Get first part, store second part $ix = strpos($what, '|'); if ($ix === false) { $remaining = ''; } else { $remaining = substr($what, $ix + 1); $what = substr($what, 0, $ix); } if (strpos($what, 'zone:') === 0) { $zoneId = intval(substr($what, 5)); $row = _adSelectZone($zoneId, $context, $source, $richmedia); } else { // Expand paths to regular statements if (strpos($what, '/') > 0) { if (strpos($what, '@') > 0) { list($what, $append) = explode('@', $what); } else { $append = ''; } $separate = explode('/', $what); $expanded = ''; $collected = array(); reset($separate); while (list(, $v) = each($separate)) { $expanded .= ($expanded != '' ? ',+' : '') . $v; $collected[] = $expanded . ($append != '' ? ',+' . $append : ''); } $what = strtok(implode('|', array_reverse($collected)), '|'); $remaining = strtok('') . ($remaining != '' ? '|' . $remaining : ''); } $row = _adSelectDirect($what, $campaignid, $context, $source, $richmedia, $remaining == ''); } if (is_array($row) && empty($row['default'])) { // Log the ad request MAX_Delivery_log_logAdRequest($row['bannerid'], $row['zoneid'], $row); if (($row['adserver'] == 'max' || $row['adserver'] == '3rdPartyServers:ox3rdPartyServers:max') && preg_match("#{$conf['webpath']['delivery']}.*zoneid=([0-9]+)#", $row['htmltemplate'], $matches) && !stristr($row['htmltemplate'], $conf['file']['popup'])) { // The ad selected was an OpenX HTML ad on the same server... do internal redirecty stuff $GLOBALS['_MAX']['adChain'][] = $row; $found = false; $what = "zone:{$matches[1]}"; } else { $found = true; } } else { $what = $remaining; } } } // Return the banner information if ($found) { $zoneId = empty($row['zoneid']) ? 0 : $row['zoneid']; // For internal redirected creatives, make sure that any appended code in the adChain is appended if (!empty($GLOBALS['_MAX']['adChain'])) { foreach ($GLOBALS['_MAX']['adChain'] as $index => $ad) { if ($ad['ad_id'] != $row['ad_id'] && !empty($ad['append'])) { $row['append'] .= $ad['append']; } } } $outputbuffer = MAX_adRender($row, $zoneId, $source, $target, $ct0, $withtext, $charset, true, true, $richmedia, $loc, $referer, $context); $output = array('html' => $outputbuffer, 'bannerid' => $row['bannerid'], 'contenttype' => $row['contenttype'], 'alt' => $row['alt'], 'width' => $row['width'], 'height' => $row['height'], 'url' => $row['url'], 'campaignid' => $row['campaignid'], 'clickUrl' => $row['clickUrl'], 'logUrl' => $row['logUrl'], 'aSearch' => $row['aSearch'], 'aReplace' => $row['aReplace'], 'bannerContent' => $row['bannerContent'], 'clickwindow' => $row['clickwindow'], 'aRow' => $row, 'context' => _adSelectBuildContext($row, $context)); // If ad-logging is disabled, the log beacon won't be sent, so set the capping at request if (MAX_Delivery_cookie_cappingOnRequest()) { if ($row['block_ad'] > 0 || $row['cap_ad'] > 0 || $row['session_cap_ad'] > 0) { MAX_Delivery_cookie_setCapping('Ad', $row['bannerid'], $row['block_ad'], $row['cap_ad'], $row['session_cap_ad']); } if ($row['block_campaign'] > 0 || $row['cap_campaign'] > 0 || $row['session_cap_campaign'] > 0) { MAX_Delivery_cookie_setCapping('Campaign', $row['campaign_id'], $row['block_campaign'], $row['cap_campaign'], $row['session_cap_campaign']); } if ($row['block_zone'] > 0 || $row['cap_zone'] > 0 || $row['session_cap_zone'] > 0) { MAX_Delivery_cookie_setCapping('Zone', $row['zoneid'], $row['block_zone'], $row['cap_zone'], $row['session_cap_zone']); } // Store the last view action event om the cookie as well (if required) MAX_Delivery_log_setLastAction(0, array($row['bannerid']), array($zoneId), array($row['viewwindow'])); } return $output; } else { // No banner found if (!empty($row['default'])) { // Return the default banner if (empty($target)) { $target = '_blank'; // Default } $outputbuffer = $g_prepend . '<a href=\'' . $row['default_banner_destination_url'] . '\' target=\'' . $target . '\'><img src=\'' . $row['default_banner_image_url'] . '\' border=\'0\' alt=\'\'></a>' . $g_append; return array('html' => $outputbuffer, 'bannerid' => '', 'default_banner_image_url' => $row['default_banner_image_url']); } else { // No default banner was returned, return no banner $outputbuffer = $g_prepend . $g_append; return array('html' => $outputbuffer, 'bannerid' => ''); } } }
function MAX_adSelect($what, $campaignid = '', $target = '', $source = '', $withtext = 0, $charset = '', $context = array(), $richmedia = true, $ct0 = '', $loc = '', $referer = '') { $conf = $GLOBALS['_MAX']['CONF']; if (empty($GLOBALS['source'])) { $GLOBALS['source'] = $source; } if (empty($GLOBALS['loc'])) { $GLOBALS['loc'] = $loc; } $originalZoneId = null; if (strpos($what, 'zone:') === 0) { $originalZoneId = intval(substr($what, 5)); } elseif (strpos($what, 'campaignid:') === 0) { $originalCampaignId = intval(substr($what, 11)); } elseif (strpos($what, 'bannerid:') === 0) { $originalBannerId = intval(substr($what, 9)); } $userid = MAX_cookieGetUniqueViewerId(); MAX_cookieAdd($conf['var']['viewerId'], $userid, _getTimeYearFromNow()); $outputbuffer = ''; $found = false; $GLOBALS['_MAX']['followedChain'] = array(); $GLOBALS['_MAX']['adChain'] = array(); $GLOBALS['_MAX']['considered_ads'] = array(); $first = true; global $g_append, $g_prepend; $g_append = ''; $g_prepend = ''; if (!empty($what)) { while ($first || $what != '' && $found == false) { $first = false; $ix = strpos($what, '|'); if ($ix === false) { $remaining = ''; } else { $remaining = substr($what, $ix + 1); $what = substr($what, 0, $ix); } if (strpos($what, 'zone:') === 0) { $zoneId = intval(substr($what, 5)); $row = _adSelectZone($zoneId, $context, $source, $richmedia); } else { if (strpos($what, '/') > 0) { if (strpos($what, '@') > 0) { list($what, $append) = explode('@', $what); } else { $append = ''; } $separate = explode('/', $what); $expanded = ''; $collected = array(); reset($separate); while (list(, $v) = each($separate)) { $expanded .= ($expanded != '' ? ',+' : '') . $v; $collected[] = $expanded . ($append != '' ? ',+' . $append : ''); } $what = strtok(implode('|', array_reverse($collected)), '|'); $remaining = strtok('') . ($remaining != '' ? '|' . $remaining : ''); } $row = _adSelectDirect($what, $campaignid, $context, $source, $richmedia, $remaining == ''); } if (is_array($row) && empty($row['default'])) { MAX_Delivery_log_logAdRequest($row['bannerid'], $row['zoneid'], $row); if (($row['adserver'] == 'max' || $row['adserver'] == '3rdPartyServers:ox3rdPartyServers:max') && preg_match("#{$conf['webpath']['delivery']}.*zoneid=([0-9]+)#", $row['htmltemplate'], $matches) && !stristr($row['htmltemplate'], $conf['file']['popup'])) { $GLOBALS['_MAX']['adChain'][] = $row; $found = false; $what = "zone:{$matches[1]}"; } else { $found = true; } } else { MAX_Delivery_log_logAdRequest(null, $originalZoneId, null); $what = $remaining; } } } if ($found) { $zoneId = empty($row['zoneid']) ? 0 : $row['zoneid']; if (!empty($GLOBALS['_MAX']['adChain'])) { foreach ($GLOBALS['_MAX']['adChain'] as $index => $ad) { if ($ad['ad_id'] != $row['ad_id'] && !empty($ad['append'])) { $row['append'] .= $ad['append']; } } } $outputbuffer = MAX_adRender($row, $zoneId, $source, $target, $ct0, $withtext, $charset, true, true, $richmedia, $loc, $referer, $context); $output = array('html' => $outputbuffer, 'bannerid' => $row['bannerid'], 'contenttype' => $row['contenttype'], 'alt' => $row['alt'], 'width' => $row['width'], 'height' => $row['height'], 'url' => $row['url'], 'campaignid' => $row['campaignid'], 'clickUrl' => $row['clickUrl'], 'logUrl' => $row['logUrl'], 'aSearch' => $row['aSearch'], 'aReplace' => $row['aReplace'], 'bannerContent' => $row['bannerContent'], 'clickwindow' => $row['clickwindow'], 'aRow' => $row, 'context' => _adSelectBuildContext($row, $context), 'iframeFriendly' => (bool) $row['iframe_friendly']); $row += array('block_ad' => 0, 'cap_ad' => 0, 'session_cap_ad' => 0, 'block_campaign' => 0, 'cap_campaign' => 0, 'session_cap_campaign' => 0, 'block_zone' => 0, 'cap_zone' => 0, 'session_cap_zone' => 0); if (MAX_Delivery_cookie_cappingOnRequest()) { if ($row['block_ad'] > 0 || $row['cap_ad'] > 0 || $row['session_cap_ad'] > 0) { MAX_Delivery_cookie_setCapping('Ad', $row['bannerid'], $row['block_ad'], $row['cap_ad'], $row['session_cap_ad']); } if ($row['block_campaign'] > 0 || $row['cap_campaign'] > 0 || $row['session_cap_campaign'] > 0) { MAX_Delivery_cookie_setCapping('Campaign', $row['campaign_id'], $row['block_campaign'], $row['cap_campaign'], $row['session_cap_campaign']); } if ($row['block_zone'] > 0 || $row['cap_zone'] > 0 || $row['session_cap_zone'] > 0) { MAX_Delivery_cookie_setCapping('Zone', $row['zoneid'], $row['block_zone'], $row['cap_zone'], $row['session_cap_zone']); } MAX_Delivery_log_setLastAction(0, array($row['bannerid']), array($zoneId), array($row['viewwindow'])); } } else { if (!empty($zoneId)) { $logUrl = _adRenderBuildLogURL(array('ad_id' => 0, 'placement_id' => 0), $zoneId, $source, $loc, $referer, '&'); $g_append = str_replace('{random}', MAX_getRandomNumber(), MAX_adRenderImageBeacon($logUrl)) . $g_append; } if (!empty($row['default'])) { if (empty($target)) { $target = '_blank'; } $outputbuffer = $g_prepend . '<a href=\'' . $row['default_banner_destination_url'] . '\' target=\'' . $target . '\'><img src=\'' . $row['default_banner_image_url'] . '\' border=\'0\' alt=\'\'></a>' . $g_append; $output = array('html' => $outputbuffer, 'bannerid' => '', 'default_banner_image_url' => $row['default_banner_image_url']); } else { if (!empty($conf['defaultBanner']['imageUrl'])) { if (empty($target)) { $target = '_blank'; } $outputbuffer = "{$g_prepend}<img src='{$conf['defaultBanner']['imageUrl']}' border='0' alt=''>{$g_append}"; $output = array('html' => $outputbuffer, 'bannerid' => '', 'default_banner_image_url' => $conf['defaultBanner']['imageUrl']); } else { $outputbuffer = $g_prepend . $g_append; $output = array('html' => $outputbuffer, 'bannerid' => ''); } } } OX_Delivery_Common_hook('postAdSelect', array(&$output)); return $output; }
/** * @todo calls functions that calls database/cache retrieval methods * cannot mock database * need to decide where/how to test this * */ function test_adSelectZone() { $this->sendMessage('test_adSelectZone'); require_once MAX_PATH . '/lib/max/Delivery/common.php'; $zoneId = 0; $context = array(); $source = 'http://www.source.com'; $richMedia = true; $ret = _adSelectZone($zoneId, $context, $source, $richMedia); $this->assertTrue(TRUE); }