Mercurial > defr > drupal > ad
diff external/ad_external.module @ 0:d8a3998dac8e ad
ajout module ad
author | pierre |
---|---|
date | Fri, 20 Feb 2009 14:04:09 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/external/ad_external.module Fri Feb 20 14:04:09 2009 +0000 @@ -0,0 +1,207 @@ +<?php +// $Id: ad_external.module,v 1.1.2.6.2.7 2009/02/17 18:56:26 jeremy Exp $ + +/** + * @file + * Enhances the ad module to support externally hosted ads, served via IFrames. + * It is recommended that you configure "Administer >> Content management >> + * Ads >> Settings >> Global settings >> Display type" to "Raw". + * If you configure the "Display type" to IFrame, you will be serving IFrames + * within IFrames. + * + * Copyright (c) 2005-2009. + * Jeremy Andrews <jeremy@tag1consulting.com>. + */ + +/** + * Function used to display the selected ad. + */ +function ad_external_display_ad($ad) { + return theme('ad_external_ad', $ad); +} + +/** + * Return a themed ad of type ad_remote. + * + * @param @ad + * The ad object. + * @return + * A string containing the ad markup. + */ +function theme_ad_external_ad($ad) { + global $base_url; + + if (isset($ad->aid)) { + $output = '<div class="external-advertisement" id="ad-'. $ad->aid .'">'; + // For now, we hard code this to only support caching with the file cache. + // As more cache types are introduced, we'll expand this. Ideally it should + // be cache type agnostic, but that seems to be unrealistic. + if (variable_get('ad_cache', 'none') == 'file') { + $adserve = variable_get('adserve', ''); + $display_variables = '&c=file'. module_invoke('ad_cache_file', 'adcacheapi', 'display_variables', array()); + $external = url("$base_url/$adserve?o=external&n=$ad->aid&$display_variables"); + } + else { + $external = db_result(db_query('SELECT url FROM {ad_external} WHERE aid = %d', $ad->aid)); + } + $append = 'frameborder="'. variable_get('ad_iframe_frameborder', 0) .'" '; + $append .= 'scrolling="'. variable_get('ad_iframe_scroll', 'auto') .'" '; + if ($height = variable_get('ad_iframe_height', '')) { + $append .= "height=\"$height\" "; + } + if ($width = variable_get('ad_iframe_width', '')) { + $append .= "width=\"$width\" "; + } + $output .= "<iframe src=\"$external\" $append></iframe>"; + $output .= '</div>'; + return $output; + } +} + +/** + * Implementation of hook_theme(). + */ +function ad_external_theme() { + return array( + 'ad_external_ad' => array( + 'file' => 'ad_external.module', + 'arguments' => array( + 'ad' => NULL, + ), + ), + ); +} + +/** + * Implementation of hook_help(). + */ +function ad_external_help($path, $arg) { + $output = ''; + switch ($path) { + case 'node/add/ad#external': + $output = t('An external advertisement, displayed in an IFrame.'); + break; + } + return $output; +} + +/** + * Implementation of hook_access(). + */ +function ad_external_access($op, $node, $account) { + return ad_access($op, $node, $account); +} + +/** + * Implementation of hook_adapi(). + */ +function ad_external_adapi($op, &$node) { + switch ($op) { + case 'load': + return db_fetch_array(db_query('SELECT * FROM {ad_external} WHERE aid = %d', $node['aid'])); + + case 'insert': + db_query("INSERT INTO {ad_external} (aid, url) VALUES(%d, '%s')", $node->nid, $node->url); + break; + + case 'update': + db_query("UPDATE {ad_external} SET url = '%s' WHERE aid = %d", $node->url, $node->nid); + break; + + case 'delete': + db_query('DELETE FROM {ad_external} WHERE aid = %d', $node->nid); + break; + + case 'form': + return ad_external_node_form($node); + + case 'view': + return ad_external_node_view($node); + + case 'redirect': + // TODO: Would it ever make sense to have redirects for this ad type? + watchdog('ad', 'Unexpected redirect attempt in external ad type.'); + return; + + case 'type': + return array( + 'external' => array( + 'name' => t('External ad'), + 'module' => 'ad_external', + 'description' => t('An external advertisement, displayed in an IFrame.'), + 'help' => t('An external advertisement, displayed in an IFrame.'), + ), + ); + } +} + +/** + * Adapi helper function for displaying a node form. + */ +function ad_external_node_form(&$node) { + $form = array(); + + $form['ad_external'] = array( + '#type' => 'fieldset', + '#title' => t('External'), + '#collapsible' => TRUE, + ); + + $form['ad_external']['preview'] = array( + '#type' => 'markup', + '#value' => ad_external_display_ad($node), + ); + + if ((arg(1) == 'add' || arg(2) == 'edit') && + user_access('create advertisements')) { + $form['ad_external']['url'] = array( + '#type' => 'textfield', + '#title' => t('External Source URL'), + '#required' => TRUE, + '#default_value' => isset($node->url) ? $node->url : '', + '#description' => t('Enter the complete URL where your external ad his hosted. The URL must begin with http:// or https://. For example, %url.', array('%url' => t('http://www.sample.org/external/ad.php'))), + ); + + } + + return $form; +} + +/** + * Adapi helper function for displaying ad itself. + */ +function ad_external_node_view(&$node) { + $node->content['ad'] = array( + '#value' => theme('box', '', stripslashes(ad_external_display_ad($node))), + '#weight' => -1, + ); + $link = t('Links to !url.', array('!url' => $node->url)); + if (variable_get('ad_filter', 0)) { + $link = check_markup($link, $node->format, FALSE); + } + $node->content['ad-link'] = array( + '#value' => "<div class=\"links-to\">$link<div>", + '#weight' => 1, + ); +} + +/** + * Download external pages and store them in the filecache. + */ +function ad_external_ad_build_cache() { + $cache = array(); + $result = db_query('SELECT * FROM {ad_external}'); + while ($external = db_fetch_object($result)) { + $contents = file_get_contents($external->url); + if ($contents === FALSE) { + // Failed to download external url, don't cache the error page. + // TODO: Watchdog log this. + // TODO: Would it be possible to obtain the old version from the cache, + // if we already downloaded this page once? + continue; + } + $cache['ad_external'][$external->aid]['url'] = $external->url; + $cache['ad_external'][$external->aid]['contents'] = $contents; + } + return $cache; +}