View source
<?php
function google_admanager_block($op = 'list', $delta = 0, $edit = array()) {
if ($op == 'list') {
$blocks = array();
if (!variable_get('google_admanager_noblock', FALSE)) {
$ad_slots = _google_admanager_get_ad_slots();
foreach ($ad_slots as $delta => $name) {
$blocks[$delta] = array(
'info' => 'GAM Ad slot: ' . $name,
'cache' => BLOCK_NO_CACHE,
);
}
}
$superslots = variable_get('google_admanager_superslots', array());
foreach ($superslots as $name => $slots) {
$blocks['superslot:' . $name] = array(
'info' => 'GAM Superslot: ' . $name,
'cache' => BLOCK_NO_CACHE,
);
}
return $blocks;
}
else {
if ($op == 'view') {
$ad_slots = _google_admanager_get_ad_slots();
$block = array(
'subject' => '',
'content' => '',
);
if ($id = variable_get('google_admanager_account', '')) {
if (isset($ad_slots[$delta])) {
$block['content'] = theme('google_admanager_block', $id, $ad_slots[$delta]);
}
elseif (substr($delta, 0, 10) == 'superslot:') {
$superslots = variable_get('google_admanager_superslots', array());
if ($superslot = $superslots[substr($delta, 10)]) {
foreach ($superslot as $ad_slot => $php) {
if (eval($php)) {
$block['content'] .= theme('google_admanager_block', $id, $ad_slot);
}
}
}
}
}
return $block;
}
else {
if ($op == 'configure') {
if (!user_access('use PHP for block visibility') && substr($delta, 0, 10) !== 'superslot:') {
return;
}
$superslots = variable_get('google_admanager_superslots', array());
$name = substr($delta, 10);
if (!isset($superslots[$name])) {
return;
}
$form = array();
$form['visibility'] = array(
'#type' => 'fieldset',
'#title' => t('Ad slots visibility'),
'#description' => t('Use PHP code to define ad slot visibility. For example, to display an ad slot only to anonymous user, use <em>return empty($GLOBALS[\'user\']->uid);</em>. Or, to simple enable an ad slot, use <em>return TRUE;</em>'),
);
$ad_slots = array_values(_google_admanager_get_ad_slots());
$ad_slots = array_combine($ad_slots, $ad_slots);
$superslot = $superslots[$name];
$superslot += array(
'fake slot1' => '',
'fake slot2' => '',
'fake slot3' => '',
);
$i = 1;
foreach ($superslot as $ad_slot => $php) {
$form['visibility']['superslot_' . $i . '_adslot'] = array(
'#type' => 'select',
'#title' => t('Ad slot'),
'#default_value' => $ad_slot,
'#options' => $ad_slots,
);
$form['visibility']['superslot_' . $i++ . '_php'] = array(
'#type' => 'textfield',
'#title' => t('PHP code for visibility condition'),
'#default_value' => $php,
);
}
return $form;
}
else {
if ($op = 'save') {
if (!user_access('use PHP for block visibility') && substr($delta, 0, 10) !== 'superslot:') {
return;
}
$superslot = array();
foreach ($edit as $key => $value) {
if (preg_match('/superslot_(\\d+)_adslot/', $key)) {
$php = $edit[str_replace('adslot', 'php', $key)];
drupal_set_message($value . ': ' . $php);
if (!empty($php)) {
$superslot[$value] = $php;
}
}
}
$superslots = variable_get('google_admanager_superslots', array());
$superslots[substr($delta, 10)] = $superslot;
variable_set('google_admanager_superslots', $superslots);
}
}
}
}
}
function google_admanager_perm() {
return array(
'administer google admanager',
);
}
function google_admanager_menu() {
$items = array();
$items['admin/settings/google_admanager'] = array(
'title' => 'Google Admanager',
'description' => 'Configure the settings used to generate the Google Admanager Slot Ad code.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'google_admanager_admin_settings_form',
),
'access arguments' => array(
'administer google admanager',
),
);
$items['admin/settings/google_admanager/account'] = array(
'title' => 'Account',
'access arguments' => array(
'administer google admanager',
),
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['admin/settings/google_admanager/superslot'] = array(
'title' => 'Superslot',
'description' => 'Manage superslot',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'google_admanager_admin_superslot_form',
),
'access arguments' => array(
'administer google admanager',
),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
function google_admanager_init() {
drupal_add_css(drupal_get_path('module', 'google_admanager') . '/google_admanager.css');
if (variable_get('google_admanager_lazy', FALSE)) {
drupal_add_js(drupal_get_path('module', 'google_admanager') . '/google_admanager.js');
}
}
function google_admanager_admin_settings_form() {
$form = array();
$form['google_admanager_account'] = array(
'#type' => 'textfield',
'#title' => t('DFP Property Code'),
'#default_value' => variable_get('google_admanager_account', 'ca-pub-'),
'#size' => 30,
'#maxlength' => 40,
'#required' => TRUE,
'#description' => t('See detailed instruction in README.txt'),
);
$form['google_admanager_ad_slots'] = array(
'#type' => 'textarea',
'#title' => t('Ad slots'),
'#default_value' => variable_get('google_admanager_ad_slots', ''),
'#description' => t('Enter one Ad Slot name per line.'),
);
$form['google_admanager_noblock'] = array(
'#type' => 'checkbox',
'#title' => t('Don\'t create blocks'),
'#default_value' => variable_get('google_admanager_noblock', FALSE),
'#description' => t('This option allow you to use only superslot. Handful when you have dozens of ad slots or more. <strong>Switch on/off this option may reset blocks positions.</strong>'),
);
$form['google_admanager_lazy'] = array(
'#type' => 'checkbox',
'#title' => t('Lazy loading'),
'#default_value' => variable_get('google_admanager_lazy', FALSE),
'#description' => t('(Experimental) Insert DFP code before </body> instead of in header (not work with inline ad). Read more in README.txt'),
);
return system_settings_form($form);
}
function google_admanager_admin_settings_form_validate($form, &$form_state) {
if (!preg_match('/^ca-pub-\\d+$/', $form_state['values']['google_admanager_account'])) {
form_set_error('google_admanager_account', t('A valid DFP Property Code is case sensitive and formatted like ca-pub-nnnnnnnnnnnnnnnn.'));
}
}
function google_admanager_admin_settings_form_submit($form, &$form_state) {
$ad_slots = _google_admanager_get_ad_slots();
$result = db_query("SELECT bid, delta FROM {blocks} WHERE module = 'google_admanager'");
while ($block = db_fetch_object($result)) {
if (!isset($ad_slots[$block->delta]) && substr($block->delta, 0, 10) !== 'superslot:') {
db_query("DELETE FROM {blocks} WHERE bid = %d", $block->bid);
}
}
}
function google_admanager_admin_superslot_form() {
$form = array();
$superslots = variable_get('google_admanager_superslots', array());
$superslot_list = array();
foreach ($superslots as $name => $slots) {
$superslot_list[] = '<li>' . l($name, 'admin/build/block/configure/google_admanager/superslot:' . $name) . '</li>';
}
$form['google_admanager_superslot'] = array(
'#value' => t('A superslot is a block containing many slots, each slot has its own visibility criteria'),
);
$form['google_admanager_superslot_current'] = array(
'#type' => 'fieldset',
'#title' => t('Current superslot(s)'),
);
$form['google_admanager_superslot_current']['list'] = array(
'#value' => '<ul>' . implode('', $superslot_list) . '</ul>',
);
$form['google_admanager_superslot_new'] = array(
'#type' => 'fieldset',
'#title' => t('Create new superslot'),
);
$form['google_admanager_superslot_new']['google_admanager_superslot_name'] = array(
'#type' => 'textfield',
'#title' => t('Superslot name'),
'#description' => t('Enter a unique name (only alphanumeric and underscore, 1-20 characters)'),
'#size' => 30,
);
$form['google_admanager_superslot_new']['google_admanager_superslot_create'] = array(
'#type' => 'submit',
'#value' => t('Create'),
);
return $form;
}
function google_admanager_admin_superslot_form_validate($form, &$form_state) {
$superslots = variable_get('google_admanager_superslots', array());
if (!preg_match('/^[a-zA-Z0-9_]{1,20}$/', $form_state['values']['google_admanager_superslot_name'])) {
form_set_error('google_admanager_superslot_name', t('Superslot name can contain only alphanumeric and underscore, 1-20 characters.'));
}
if (isset($superslots[$form_state['values']['google_admanager_superslot_name']])) {
form_set_error('google_admanager_superslot_name', t('Duplicate superslot name.'));
}
}
function google_admanager_admin_superslot_form_submit($form, &$form_state) {
$superslots = variable_get('google_admanager_superslots', array());
$superslots[$form_state['values']['google_admanager_superslot_name']] = array();
variable_set('google_admanager_superslots', $superslots);
}
function google_admanager_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'google_admanager_admin_settings_form') {
$form['#submit'][] = 'google_admanager_admin_settings_form_submit';
}
}
function google_admanager_theme() {
return array(
'google_admanager_block' => array(
'arguments' => array(
'id' => NULL,
'ad_slot' => NULL,
),
),
);
}
function theme_google_admanager_block($id, $ad_slot, $cache = FALSE) {
$script = '<script type="text/javascript">GA_googleFillSlot("' . $ad_slot . '");</script>';
if ($cache) {
$script = '<script type="text/javascript">GA_googleAddSlot("' . $id . '", "' . $ad_slot . '");</script>' . $script;
}
else {
google_admanager_add_js('GA_googleAddSlot("' . $id . '", "' . $ad_slot . '");');
}
if (variable_get('google_admanager_lazy', FALSE)) {
google_admanager_add_block('<div id="gam-content-' . $ad_slot . '" class="gam-banner">' . $script . '</div>');
$script = '';
}
return '<div id="gam-holder-' . $ad_slot . '" class="gam-holder">' . $script . '</div>';
}
function google_admanager_add_js($js = NULL, $type = 'slot') {
static $ga_js = array();
if (isset($js) && isset($type)) {
$ga_js[$type][] = $js;
if (!isset($ga_js['init'])) {
$external_js = 'http://partner.googleadservices.com/gampad/google_service.js';
google_admanager_add_js('document.write(unescape("%3Cscript src=\'' . $external_js . '\' type=\'text/javascript\'%3E%3C/script%3E"));', 'init');
$id = variable_get('google_admanager_account', '');
google_admanager_add_js('GS_googleAddAdSenseService("' . $id . '");', 'service');
google_admanager_add_js('GS_googleEnableAllServices();', 'service');
google_admanager_add_js('GA_googleFetchAds();', 'close');
}
return;
}
if (!isset($ga_js['init'])) {
return;
}
if (!isset($js)) {
return $ga_js;
}
}
function google_admanager_add_block($text = NULL) {
static $ga_block = array();
if (!$text) {
return $ga_block;
}
$ga_block[] = $text;
}
function google_admanager_get_js($scope = 'header') {
$ga_js = google_admanager_add_js();
if (isset($ga_js)) {
$output_order = array(
'init',
'service',
'slot',
'close',
);
foreach ($output_order as $type) {
$output = '';
foreach ($ga_js[$type] as $js) {
$output .= $js . "\n";
}
drupal_add_js($output, 'inline', $scope);
}
}
}
function google_admanager_preprocess_page(&$vars) {
if (variable_get('google_admanager_lazy', FALSE)) {
return;
}
google_admanager_get_js();
$vars['scripts'] = drupal_get_js();
}
function google_admanager_footer($main) {
if ($lazy = google_admanager_add_block()) {
if ($ga_js = google_admanager_add_js()) {
$output_order = array(
'init',
'service',
'slot',
'close',
);
$gam_script = '';
foreach ($output_order as $type) {
$output = "\n";
foreach ($ga_js[$type] as $js) {
$output .= $js . "\n";
}
$gam_script .= '<script type="text/javascript">' . $output . '</script>';
}
array_unshift($lazy, $gam_script);
}
return implode("\n", $lazy);
}
}
function google_admanager_filter($op, $delta = 0, $format = -1, $text = '') {
switch ($op) {
case 'list':
return array(
0 => t('Google Admanager filter'),
);
case 'description':
return t('Substitutes [google_ad:ad_slot] tags with the Google Admanager script.');
case 'prepare':
return $text;
case 'process':
return _google_admanager_substitute_tags($text);
}
}
function google_admanager_filter_tips($delta, $format, $long = FALSE) {
return t('You may use [google_ad:ad_slot] to display Google Admanager ads within your content.');
}
function _google_admanager_substitute_tags($text) {
if (preg_match_all("/\\[(google_ad):([^=\\]]+)=?([^\\]]*)?\\]/i", $text, $match)) {
$id = variable_get('google_admanager_account', '');
$s = $r = array();
foreach ($match[2] as $key => $ad_slot) {
$s[] = $match[0][$key];
$r[] = theme_google_admanager_block($id, $ad_slot, TRUE);
}
return str_replace($s, $r, $text);
}
return $text;
}
function _google_admanager_get_ad_slots() {
$ad_slots = array();
$list = array_filter(explode("\n", str_replace(array(
"\r",
"\t",
"\0",
"\v",
" ",
), '', variable_get('google_admanager_ad_slots', ''))));
foreach ($list as $ad_slot) {
$ad_slots[md5(trim($ad_slot))] = $ad_slot;
}
return $ad_slots;
}