comparison external/ad_external.module @ 0:d8a3998dac8e ad

ajout module ad
author pierre
date Fri, 20 Feb 2009 14:04:09 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d8a3998dac8e
1 <?php
2 // $Id: ad_external.module,v 1.1.2.6.2.7 2009/02/17 18:56:26 jeremy Exp $
3
4 /**
5 * @file
6 * Enhances the ad module to support externally hosted ads, served via IFrames.
7 * It is recommended that you configure "Administer >> Content management >>
8 * Ads >> Settings >> Global settings >> Display type" to "Raw".
9 * If you configure the "Display type" to IFrame, you will be serving IFrames
10 * within IFrames.
11 *
12 * Copyright (c) 2005-2009.
13 * Jeremy Andrews <jeremy@tag1consulting.com>.
14 */
15
16 /**
17 * Function used to display the selected ad.
18 */
19 function ad_external_display_ad($ad) {
20 return theme('ad_external_ad', $ad);
21 }
22
23 /**
24 * Return a themed ad of type ad_remote.
25 *
26 * @param @ad
27 * The ad object.
28 * @return
29 * A string containing the ad markup.
30 */
31 function theme_ad_external_ad($ad) {
32 global $base_url;
33
34 if (isset($ad->aid)) {
35 $output = '<div class="external-advertisement" id="ad-'. $ad->aid .'">';
36 // For now, we hard code this to only support caching with the file cache.
37 // As more cache types are introduced, we'll expand this. Ideally it should
38 // be cache type agnostic, but that seems to be unrealistic.
39 if (variable_get('ad_cache', 'none') == 'file') {
40 $adserve = variable_get('adserve', '');
41 $display_variables = '&amp;c=file'. module_invoke('ad_cache_file', 'adcacheapi', 'display_variables', array());
42 $external = url("$base_url/$adserve?o=external&amp;n=$ad->aid&amp;$display_variables");
43 }
44 else {
45 $external = db_result(db_query('SELECT url FROM {ad_external} WHERE aid = %d', $ad->aid));
46 }
47 $append = 'frameborder="'. variable_get('ad_iframe_frameborder', 0) .'" ';
48 $append .= 'scrolling="'. variable_get('ad_iframe_scroll', 'auto') .'" ';
49 if ($height = variable_get('ad_iframe_height', '')) {
50 $append .= "height=\"$height\" ";
51 }
52 if ($width = variable_get('ad_iframe_width', '')) {
53 $append .= "width=\"$width\" ";
54 }
55 $output .= "<iframe src=\"$external\" $append></iframe>";
56 $output .= '</div>';
57 return $output;
58 }
59 }
60
61 /**
62 * Implementation of hook_theme().
63 */
64 function ad_external_theme() {
65 return array(
66 'ad_external_ad' => array(
67 'file' => 'ad_external.module',
68 'arguments' => array(
69 'ad' => NULL,
70 ),
71 ),
72 );
73 }
74
75 /**
76 * Implementation of hook_help().
77 */
78 function ad_external_help($path, $arg) {
79 $output = '';
80 switch ($path) {
81 case 'node/add/ad#external':
82 $output = t('An external advertisement, displayed in an IFrame.');
83 break;
84 }
85 return $output;
86 }
87
88 /**
89 * Implementation of hook_access().
90 */
91 function ad_external_access($op, $node, $account) {
92 return ad_access($op, $node, $account);
93 }
94
95 /**
96 * Implementation of hook_adapi().
97 */
98 function ad_external_adapi($op, &$node) {
99 switch ($op) {
100 case 'load':
101 return db_fetch_array(db_query('SELECT * FROM {ad_external} WHERE aid = %d', $node['aid']));
102
103 case 'insert':
104 db_query("INSERT INTO {ad_external} (aid, url) VALUES(%d, '%s')", $node->nid, $node->url);
105 break;
106
107 case 'update':
108 db_query("UPDATE {ad_external} SET url = '%s' WHERE aid = %d", $node->url, $node->nid);
109 break;
110
111 case 'delete':
112 db_query('DELETE FROM {ad_external} WHERE aid = %d', $node->nid);
113 break;
114
115 case 'form':
116 return ad_external_node_form($node);
117
118 case 'view':
119 return ad_external_node_view($node);
120
121 case 'redirect':
122 // TODO: Would it ever make sense to have redirects for this ad type?
123 watchdog('ad', 'Unexpected redirect attempt in external ad type.');
124 return;
125
126 case 'type':
127 return array(
128 'external' => array(
129 'name' => t('External ad'),
130 'module' => 'ad_external',
131 'description' => t('An external advertisement, displayed in an IFrame.'),
132 'help' => t('An external advertisement, displayed in an IFrame.'),
133 ),
134 );
135 }
136 }
137
138 /**
139 * Adapi helper function for displaying a node form.
140 */
141 function ad_external_node_form(&$node) {
142 $form = array();
143
144 $form['ad_external'] = array(
145 '#type' => 'fieldset',
146 '#title' => t('External'),
147 '#collapsible' => TRUE,
148 );
149
150 $form['ad_external']['preview'] = array(
151 '#type' => 'markup',
152 '#value' => ad_external_display_ad($node),
153 );
154
155 if ((arg(1) == 'add' || arg(2) == 'edit') &&
156 user_access('create advertisements')) {
157 $form['ad_external']['url'] = array(
158 '#type' => 'textfield',
159 '#title' => t('External Source URL'),
160 '#required' => TRUE,
161 '#default_value' => isset($node->url) ? $node->url : '',
162 '#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'))),
163 );
164
165 }
166
167 return $form;
168 }
169
170 /**
171 * Adapi helper function for displaying ad itself.
172 */
173 function ad_external_node_view(&$node) {
174 $node->content['ad'] = array(
175 '#value' => theme('box', '', stripslashes(ad_external_display_ad($node))),
176 '#weight' => -1,
177 );
178 $link = t('Links to !url.', array('!url' => $node->url));
179 if (variable_get('ad_filter', 0)) {
180 $link = check_markup($link, $node->format, FALSE);
181 }
182 $node->content['ad-link'] = array(
183 '#value' => "<div class=\"links-to\">$link<div>",
184 '#weight' => 1,
185 );
186 }
187
188 /**
189 * Download external pages and store them in the filecache.
190 */
191 function ad_external_ad_build_cache() {
192 $cache = array();
193 $result = db_query('SELECT * FROM {ad_external}');
194 while ($external = db_fetch_object($result)) {
195 $contents = file_get_contents($external->url);
196 if ($contents === FALSE) {
197 // Failed to download external url, don't cache the error page.
198 // TODO: Watchdog log this.
199 // TODO: Would it be possible to obtain the old version from the cache,
200 // if we already downloaded this page once?
201 continue;
202 }
203 $cache['ad_external'][$external->aid]['url'] = $external->url;
204 $cache['ad_external'][$external->aid]['contents'] = $contents;
205 }
206 return $cache;
207 }