View source
<?php
function google_admanager_block($op = 'list', $delta = 0, $edit = array()) {
if ($op == 'view') {
$ad_slots = _google_admanager_get_ad_slots();
$block = array(
'subject' => '',
'content' => '',
);
if (isset($ad_slots[$delta])) {
$block['content'] = google_admanager_display_ad($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'] .= google_admanager_display_ad(md5(trim($ad_slot)));
}
}
}
}
return $block;
}
else {
require_once drupal_get_path('module', 'google_admanager') . '/google_admanager.admin.inc';
return _google_admanager_block($op, $delta, $edit);
}
}
function google_admanager_perm() {
return array(
'administer google admanager',
);
}
function google_admanager_menu() {
$items = array();
$base = array(
'access arguments' => array(
'administer google admanager',
),
'file' => 'google_admanager.admin.inc',
);
$items['admin/settings/google_admanager'] = $base + 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',
),
);
$items['admin/settings/google_admanager/account'] = $base + array(
'title' => 'Account',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['admin/settings/google_admanager/superslot'] = $base + array(
'title' => 'Superslot',
'description' => 'Manage superslot',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'google_admanager_admin_superslot_form',
),
'type' => MENU_LOCAL_TASK,
);
$items['admin/settings/google_admanager/superslot/delete'] = $base + array(
'title' => 'Delete superslot',
'page callback' => 'google_admanager_admin_superslot_delete',
'type' => MENU_CALLBACK,
);
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_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if (arg(0) == 'node' && $op == 'view' && $a4) {
if (variable_get('google_admanager_nodetype_attributes', FALSE)) {
google_admanager_set_variable('node_type', $node->type);
}
if (!is_array($node->taxonomy) || count($node->taxonomy) == 0) {
return;
}
$enabled_vocabs = variable_get('google_admanager_vocab_attributes', array());
if (count($enabled_vocabs) == 0) {
return;
}
foreach ($node->taxonomy as $tid => $term) {
if ($enabled_vocabs[$term->vid]) {
google_admanager_add_term_attribute($term);
}
}
}
}
function google_admanager_ctools_render_alter($info, $page, $args, $contexts, $task, $subtask) {
if (isset($task['admin path']) && $task['admin path'] == 'node/%node' && $page) {
google_admanager_nodeapi($contexts['argument_nid_1']->data, 'view', NULL, $page);
}
}
function google_admanager_theme() {
return array(
'google_admanager_ad_slots' => array(
'arguments' => array(
'form' => array(),
),
'file' => 'google_admanager.admin.inc',
),
'google_admanager_custom_variables' => array(
'arguments' => array(
'form' => array(),
),
'file' => 'google_admanager.admin.inc',
),
);
}
function google_admanager_add_js($js = NULL, $type = 'slot', $offset = NULL) {
static $ga_js = array();
if (!isset($ga_js['init'])) {
$ga_js['init'] = array();
ctools_include('plugins');
$name = variable_get('google_admanager_delivery_method', 'gam');
$plugin = ctools_get_plugins('google_admanager', 'ad_providers', $name);
$conf = variable_get('google_admanager_' . $name, $plugin['defaults']);
if (isset($plugin['init']) && function_exists($plugin['init'])) {
$plugin['init']($conf);
}
}
if (isset($js) && isset($type)) {
if (!isset($ga_js[$type])) {
$ga_js[$type] = array();
}
if ($offset === NULL) {
$offset = count($ga_js[$type]);
}
array_splice($ga_js[$type], $offset, 0, $js);
}
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();
$data = array();
if (isset($ga_js)) {
$output_order = array(
'init',
'service',
'attr',
'slot',
'close',
);
foreach ($output_order as $type) {
if (empty($ga_js[$type])) {
continue;
}
$output = '';
foreach ($ga_js[$type] as $js) {
$output .= $js . "\n";
}
if (variable_get('google_admanager_noheader', FALSE)) {
$script = drupal_get_js($scope, array(
'inline' => array(
array(
'code' => trim($output),
'defer' => FALSE,
),
),
));
$data[$type] = $script;
}
else {
drupal_add_js($output, 'inline', $scope);
}
}
}
return $data;
}
function google_admanager_preprocess_page(&$vars) {
$data = google_admanager_get_js();
if (variable_get('google_admanager_noheader', FALSE)) {
$vars['gam'] = implode("\n\n", $data);
}
$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',
'attr',
'slot',
'close',
);
$gam_script = '';
foreach ($output_order as $type) {
if (empty($ga_js[$type])) {
continue;
}
$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_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_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[] = google_admanager_display_ad($ad_slot);
}
return str_replace($s, $r, $text);
}
return $text;
}
function _google_admanager_get_ad_definitions() {
$ad_slots = array();
$list = variable_get('google_admanager_ad_slots', array());
foreach ($list as $ad_slot) {
if (!empty($ad_slot['name'])) {
$ad_slots[md5(trim($ad_slot['name']))] = $ad_slot;
}
}
return $ad_slots;
}
function _google_admanager_get_ad_slots() {
$ad_slots = array();
$list = variable_get('google_admanager_ad_slots', array());
foreach ($list as $ad_slot) {
if (!empty($ad_slot['name'])) {
$ad_slots[md5(trim($ad_slot['name']))] = $ad_slot['name'];
}
}
asort($ad_slots);
return $ad_slots;
}
function google_admanager_add_term_attribute($term) {
static $vocab_cache = array(), $added_terms = array();
if (isset($added_terms[$term->tid])) {
return;
}
if (!isset($vocab_cache[$term->vid])) {
$vocab = taxonomy_vocabulary_load($term->vid);
$orig_key = $key = 'v-' . _google_admanager_clean_string($vocab->name, 8);
$counter = 1;
while ($vid = array_search($key, $vocab_cache) && $vid != $term->vid) {
$key = drupal_substr($orig_key, 0, 9) . $counter++;
}
$vocab_cache[$vocab->vid] = $key;
}
google_admanager_set_variable($vocab_cache[$term->vid], $term->name);
$added_terms[$term->tid] = TRUE;
}
function _google_admanager_clean_string($string, $length = 40) {
return drupal_substr(preg_replace('/[^a-z0-9]+/', '-', drupal_strtolower($string)), 0, $length);
}
function google_admanager_ctools_plugin_directory($module, $type) {
if ($module == 'google_admanager') {
return 'plugins/' . $type;
}
}
function google_admanager_display_ad($delta) {
ctools_include('plugins');
$name = variable_get('google_admanager_delivery_method', 'gam');
$plugin = ctools_get_plugins('google_admanager', 'ad_providers', $name);
$conf = variable_get('google_admanager_' . $name, $plugin['defaults']);
if (isset($plugin['display ad']) && function_exists($plugin['display ad'])) {
$ad_slots = _google_admanager_get_ad_definitions();
return $plugin['display ad']($ad_slots[$delta], $conf);
}
}
function google_admanager_set_variable($variable, $value) {
google_admanager_get_variables($variable, $value);
}
function google_admanager_get_variables($key = NULL, $value = NULL) {
static $variables;
if (!isset($variables)) {
$variables = array();
if ($custom_variables = variable_get('google_admanager_custom_variables', FALSE)) {
foreach ($custom_variables as $variable) {
if (!empty($variable['key'])) {
if (module_exists('token')) {
$output = token_replace_multiple($variable['value'], NULL, '[', ']', array(
'clear' => TRUE,
));
}
else {
$output = $variable['value'];
}
$variables[_google_admanager_clean_string($variable['key'])] = $output;
}
}
}
}
if (!empty($key)) {
$variables[_google_admanager_clean_string($key)] = $value;
}
return $variables;
}