pierre@0
|
1 <?php |
pierre@1
|
2 // $Id: ad_text.module,v 1.2.2.7.2.24.2.13.2.3 2009/03/31 04:41:03 jeremy Exp $ |
pierre@0
|
3 |
pierre@0
|
4 /** |
pierre@0
|
5 * @file |
pierre@0
|
6 * Enhances the ad module to support static text ads. |
pierre@0
|
7 * |
pierre@0
|
8 * Copyright (c) 2005-2009. |
pierre@0
|
9 * Jeremy Andrews <jeremy@tag1consulting.com>. |
pierre@0
|
10 */ |
pierre@0
|
11 |
pierre@0
|
12 /** |
pierre@0
|
13 * Function used to display the selected ad. |
pierre@0
|
14 */ |
pierre@0
|
15 function ad_text_display_ad($ad) { |
pierre@0
|
16 return theme('ad_text_ad', $ad); |
pierre@0
|
17 } |
pierre@0
|
18 |
pierre@0
|
19 /** |
pierre@0
|
20 * Return a themed ad of type ad_text. |
pierre@0
|
21 * |
pierre@0
|
22 * @param @ad |
pierre@0
|
23 * The ad object. |
pierre@0
|
24 * @return |
pierre@0
|
25 * A string containing the ad markup. |
pierre@0
|
26 */ |
pierre@0
|
27 function theme_ad_text_ad($ad) { |
pierre@0
|
28 if (isset($ad->aid)) { |
pierre@1
|
29 if (!isset($ad->adheader)) { |
pierre@1
|
30 $ad = node_load($ad->aid); |
pierre@1
|
31 } |
pierre@0
|
32 $output = '<div class="text-advertisement" id="ad-'. $ad->aid .'">'; |
pierre@0
|
33 if (isset($ad->url) && !empty($ad->url)) { |
pierre@0
|
34 $output .= theme('ad_text_text', ad_text_display_prepare($ad->adheader, $ad->format), ad_text_display_prepare($ad->adbody, $ad->format), $ad->redirect .'/@HOSTID___'); |
pierre@0
|
35 } |
pierre@0
|
36 else { |
pierre@0
|
37 $output .= theme('ad_text_text', ad_text_display_prepare($ad->adheader, $ad->format), ad_text_display_prepare($ad->adbody, $ad->format)); |
pierre@0
|
38 } |
pierre@0
|
39 $output .= '</div>'; |
pierre@0
|
40 return $output; |
pierre@0
|
41 } |
pierre@0
|
42 } |
pierre@0
|
43 |
pierre@0
|
44 /** |
pierre@0
|
45 * Return a themed text ad. |
pierre@0
|
46 * |
pierre@0
|
47 * @param $header |
pierre@0
|
48 * The header of the text ad. |
pierre@0
|
49 * @param $body |
pierre@0
|
50 * The body of the text ad. |
pierre@0
|
51 * @param $link |
pierre@0
|
52 * Optional link URL for header. |
pierre@0
|
53 * @return |
pierre@0
|
54 * A string containing the text ad. |
pierre@0
|
55 */ |
pierre@0
|
56 function theme_ad_text_text($header, $body, $link = NULL) { |
pierre@0
|
57 $output = '<div class="ad-header">'; |
pierre@0
|
58 if (isset($link) && !empty($link)) { |
pierre@0
|
59 $output .= l($header, $link, array('attributes' => ad_link_attributes(), 'html' => TRUE)); |
pierre@0
|
60 } |
pierre@0
|
61 else { |
pierre@0
|
62 $output .= $header; |
pierre@0
|
63 } |
pierre@0
|
64 $output .= '</div>'; |
pierre@0
|
65 $output .= '<div class="ad-body">'. $body .'</div>'; |
pierre@0
|
66 return $output; |
pierre@0
|
67 } |
pierre@0
|
68 |
pierre@0
|
69 /** |
pierre@0
|
70 * Strip illegal characters, apply input filters, then encode the rest UTF-8. |
pierre@0
|
71 */ |
pierre@0
|
72 function ad_text_display_prepare($string, $format) { |
pierre@0
|
73 $string = preg_replace("/[\b\f\n\r\t]/", ' ', $string); |
pierre@0
|
74 $string = check_markup($string, $format, FALSE); |
pierre@0
|
75 return $string; |
pierre@0
|
76 } |
pierre@0
|
77 |
pierre@0
|
78 /** |
pierre@0
|
79 * Implementation of hook_theme(). |
pierre@0
|
80 */ |
pierre@0
|
81 function ad_text_theme() { |
pierre@0
|
82 return array( |
pierre@0
|
83 'ad_text_ad' => array( |
pierre@0
|
84 'file' => 'ad_text.module', |
pierre@0
|
85 'arguments' => array( |
pierre@0
|
86 'ad' => NULL, |
pierre@0
|
87 ), |
pierre@0
|
88 ), |
pierre@0
|
89 'ad_text_text' => array( |
pierre@0
|
90 'file' => 'ad_text.module', |
pierre@0
|
91 'arguments' => array( |
pierre@0
|
92 'header' => NULL, |
pierre@0
|
93 'body' => NULL, |
pierre@0
|
94 'link' => NULL, |
pierre@0
|
95 ), |
pierre@0
|
96 ), |
pierre@0
|
97 ); |
pierre@0
|
98 } |
pierre@0
|
99 |
pierre@0
|
100 /** |
pierre@0
|
101 * Implementation of hook_help(). |
pierre@0
|
102 */ |
pierre@0
|
103 function ad_text_help($path, $arg) { |
pierre@0
|
104 $output = ''; |
pierre@0
|
105 switch ($path) { |
pierre@0
|
106 case 'node/add/ad#text': |
pierre@0
|
107 $output = t('A text advertisement.'); |
pierre@0
|
108 break; |
pierre@0
|
109 } |
pierre@0
|
110 return $output; |
pierre@0
|
111 } |
pierre@0
|
112 |
pierre@0
|
113 /** |
pierre@0
|
114 * Implementation of hook_access(). |
pierre@0
|
115 */ |
pierre@0
|
116 function ad_text_access($op, $node, $account) { |
pierre@0
|
117 return ad_access($op, $node, $account); |
pierre@0
|
118 } |
pierre@0
|
119 |
pierre@0
|
120 /** |
pierre@0
|
121 * Text ad settings form. |
pierre@0
|
122 */ |
pierre@0
|
123 function ad_text_global_settings($form_state) { |
pierre@0
|
124 $form = array(); |
pierre@0
|
125 |
pierre@0
|
126 $form['header_min'] = array( |
pierre@0
|
127 '#type' => 'textfield', |
pierre@0
|
128 '#title' => t('Header minimum length'), |
pierre@0
|
129 '#size' => 3, |
pierre@0
|
130 '#maxlength' => 3, |
pierre@0
|
131 '#default_value' => variable_get('header_min', 0), |
pierre@0
|
132 '#description' => t('Optionally specify the minimum number of characters allowed in the header of a text ad. Set to <em>0</em> to specify no minimum length.'), |
pierre@0
|
133 ); |
pierre@0
|
134 $form['header_max'] = array( |
pierre@0
|
135 '#type' => 'textfield', |
pierre@0
|
136 '#title' => t('Header maximum length'), |
pierre@0
|
137 '#size' => 3, |
pierre@0
|
138 '#maxlength' => 3, |
pierre@0
|
139 '#default_value' => variable_get('header_max', 0), |
pierre@0
|
140 '#description' => t('Optionally specify the maximum number of characters allowed in the header of a text ad. Set to <em>0</em> to specify no maximum length.'), |
pierre@0
|
141 ); |
pierre@0
|
142 $form['body_min'] = array( |
pierre@0
|
143 '#type' => 'textfield', |
pierre@0
|
144 '#title' => t('Body minimum length'), |
pierre@0
|
145 '#size' => 10, |
pierre@0
|
146 '#maxlength' => 10, |
pierre@0
|
147 '#default_value' => variable_get('body_min', 0), |
pierre@0
|
148 '#description' => t('Optionally specify the minimum number of characters allowed in the body of a text ad. Set to <em>0</em> to specify no minimum length.'), |
pierre@0
|
149 ); |
pierre@0
|
150 $form['body_max'] = array( |
pierre@0
|
151 '#type' => 'textfield', |
pierre@0
|
152 '#title' => t('Body maximum length'), |
pierre@0
|
153 '#size' => 10, |
pierre@0
|
154 '#maxlength' => 10, |
pierre@0
|
155 '#default_value' => variable_get('body_max', 0), |
pierre@0
|
156 '#description' => t('Optionally specify the maximum number of characters allowed in the body of a text ad. Set to <em>0</em> to specify no maximum length.'), |
pierre@0
|
157 ); |
pierre@0
|
158 |
pierre@0
|
159 |
pierre@0
|
160 $form['save'] = array( |
pierre@0
|
161 '#type' => 'submit', |
pierre@0
|
162 '#value' => t('Save'), |
pierre@0
|
163 ); |
pierre@0
|
164 |
pierre@0
|
165 return $form; |
pierre@0
|
166 } |
pierre@0
|
167 |
pierre@0
|
168 /** |
pierre@0
|
169 * Settings form validation handler. |
pierre@0
|
170 */ |
pierre@0
|
171 function ad_text_global_settings_validate($form, &$form_state) { |
pierre@0
|
172 if ((int)$form_state['values']['header_min'] > (int)$form_state['values']['header_max']) { |
pierre@0
|
173 form_set_error('header_min', t('The header minimum length can not be greater than the header maximum length.')); |
pierre@0
|
174 } |
pierre@0
|
175 if ((int)$form_state['values']['body_min'] > (int)$form_state['values']['body_max']) { |
pierre@0
|
176 form_set_error('body_min', t('The body minimum length can not be greater than the body maximum length.')); |
pierre@0
|
177 } |
pierre@0
|
178 } |
pierre@0
|
179 |
pierre@0
|
180 /** |
pierre@0
|
181 * Settings form submit handler. |
pierre@0
|
182 */ |
pierre@0
|
183 function ad_text_global_settings_submit($form, &$form_state) { |
pierre@0
|
184 variable_set('header_min', $form_state['values']['header_min']); |
pierre@0
|
185 variable_set('header_max', $form_state['values']['header_max']); |
pierre@0
|
186 variable_set('body_min', $form_state['values']['body_min']); |
pierre@0
|
187 variable_set('body_max', $form_state['values']['body_max']); |
pierre@0
|
188 } |
pierre@0
|
189 |
pierre@0
|
190 /** |
pierre@0
|
191 * Implementation of hook_adapi(). |
pierre@0
|
192 */ |
pierre@0
|
193 function ad_text_adapi($op, &$node) { |
pierre@0
|
194 switch ($op) { |
pierre@0
|
195 case 'load': |
pierre@0
|
196 $return = db_fetch_array(db_query('SELECT aid, url, adheader, adbody FROM {ad_text} WHERE aid = %d', $node['aid'])); |
pierre@0
|
197 $return['ad'] = ad_text_display_prepare($return['adheader'], $node['format']) .'<br />'. ad_text_display_prepare($return['adbody'], $node['format']); |
pierre@0
|
198 return $return; |
pierre@0
|
199 |
pierre@0
|
200 case 'insert': |
pierre@0
|
201 db_query("INSERT INTO {ad_text} (aid, url, adheader, adbody) VALUES(%d, '%s', '%s', '%s')", $node->nid, $node->url, $node->adheader, $node->adbody); |
pierre@0
|
202 break; |
pierre@0
|
203 |
pierre@0
|
204 case 'update': |
pierre@1
|
205 if (ad_permission($node->nid, 'manage ad text')) { |
pierre@0
|
206 db_query("UPDATE {ad_text} SET url = '%s', adheader = '%s', adbody = '%s' WHERE aid = %d", $node->url, $node->adheader, $node->adbody, $node->nid); |
pierre@0
|
207 } |
pierre@0
|
208 break; |
pierre@0
|
209 |
pierre@0
|
210 case 'delete': |
pierre@0
|
211 db_query('DELETE FROM {ad_text} WHERE aid = %d', $node->nid); |
pierre@0
|
212 break; |
pierre@0
|
213 |
pierre@0
|
214 case 'form': |
pierre@0
|
215 return ad_text_node_form($node); |
pierre@0
|
216 |
pierre@0
|
217 case 'view': |
pierre@0
|
218 return ad_text_node_view($node); |
pierre@0
|
219 |
pierre@0
|
220 case 'redirect': |
pierre@0
|
221 return db_result(db_query('SELECT url FROM {ad_text} WHERE aid = %d', $node->nid)); |
pierre@0
|
222 |
pierre@0
|
223 case 'validate': |
pierre@0
|
224 $todo = array(); |
pierre@0
|
225 return ad_text_node_validate($node, $todo); |
pierre@0
|
226 |
pierre@0
|
227 case 'type': |
pierre@0
|
228 return array( |
pierre@0
|
229 'text' => array( |
pierre@0
|
230 'name' => t('Text ad'), |
pierre@0
|
231 'module' => 'ad_text', |
pierre@0
|
232 'description' => t('A text advertisement.'), |
pierre@0
|
233 'help' => t('A text advertisement.'), |
pierre@0
|
234 ), |
pierre@0
|
235 ); |
pierre@0
|
236 |
pierre@0
|
237 case 'permissions': |
pierre@0
|
238 if (!isset($node->adtype) || $node->adtype == 'text') { |
pierre@1
|
239 return array('manage ad text' => TRUE); |
pierre@0
|
240 } |
pierre@0
|
241 } |
pierre@0
|
242 } |
pierre@0
|
243 |
pierre@0
|
244 /** |
pierre@0
|
245 * Adapi helper function for displaying a node form. |
pierre@0
|
246 */ |
pierre@0
|
247 function ad_text_node_form(&$node) { |
pierre@0
|
248 $form = array(); |
pierre@0
|
249 |
pierre@0
|
250 $form['ad_text'] = array( |
pierre@0
|
251 '#type' => 'fieldset', |
pierre@0
|
252 '#title' => t('Text'), |
pierre@0
|
253 '#collapsible' => TRUE, |
pierre@0
|
254 ); |
pierre@0
|
255 |
pierre@1
|
256 if (arg(1) == 'add' && user_access('create advertisements') || ad_permission($node->nid, 'manage ad text')) { |
pierre@0
|
257 $access = TRUE; |
pierre@0
|
258 } |
pierre@0
|
259 else { |
pierre@0
|
260 $access = FALSE; |
pierre@0
|
261 $form['ad_text']['notice'] = array( |
pierre@0
|
262 '#type' => 'markup', |
pierre@0
|
263 '#value' => '<p>'. t('You do not have permission to edit this advertisement.') .'</p>', |
pierre@0
|
264 ); |
pierre@0
|
265 } |
pierre@0
|
266 |
pierre@0
|
267 $form['ad_text']['text'] = array( |
pierre@0
|
268 '#type' => 'markup', |
pierre@0
|
269 '#value' => ad_text_display_ad($node), |
pierre@0
|
270 ); |
pierre@0
|
271 |
pierre@0
|
272 $form['ad_text']['url'] = array( |
pierre@0
|
273 '#type' => 'textfield', |
pierre@0
|
274 '#title' => t('Destination URL'), |
pierre@0
|
275 '#maxlength' => 255, |
pierre@0
|
276 '#default_value' => isset($node->url) ? $node->url : '', |
pierre@0
|
277 '#description' => t('Enter the complete URL where you want people to be redirected when they click on this advertisement. The URL must be valid and begin with http:// or https://, for example %url, unless you !disable. If you do not enter a URL, the advertisement will not be clickable.', array('%url' => t('http://www.sample.org/'), '!disable' => l(t('disable URL validation'), 'admin/content/ad/configure', array('fragment' => 'edit-ad-validate-url-wrapper')))), |
pierre@0
|
278 '#disabled' => !$access, |
pierre@0
|
279 ); |
pierre@0
|
280 |
pierre@0
|
281 $form['ad_text']['adheader'] = array( |
pierre@0
|
282 '#type' => 'textfield', |
pierre@0
|
283 '#title' => t('Ad header'), |
pierre@0
|
284 '#required' => $access, |
pierre@0
|
285 '#default_value' => isset($node->adheader) ? $node->adheader : '', |
pierre@0
|
286 '#description' => t('This is the first line of the ad which will be linked to the URL entered above.'), |
pierre@0
|
287 '#disabled' => !$access, |
pierre@0
|
288 ); |
pierre@0
|
289 $form['ad_text']['adbody'] = array( |
pierre@0
|
290 '#type' => 'textarea', |
pierre@0
|
291 '#title' => t('Ad body'), |
pierre@0
|
292 '#required' => $access, |
pierre@0
|
293 '#default_value' => isset($node->adbody) ? $node->adbody : '', |
pierre@0
|
294 '#description' => t('This is the rest of the ad.'), |
pierre@0
|
295 '#disabled' => !$access, |
pierre@0
|
296 ); |
pierre@0
|
297 |
pierre@0
|
298 return $form; |
pierre@0
|
299 } |
pierre@0
|
300 |
pierre@0
|
301 /** |
pierre@0
|
302 * Adapi helper function for displaying ad itself. |
pierre@0
|
303 */ |
pierre@0
|
304 function ad_text_node_view(&$node) { |
pierre@0
|
305 $node->content['ad'] = array( |
pierre@0
|
306 '#value' => theme('box', '', preg_replace('&@HOSTID___&', '0', (ad_text_display_ad($node)))), |
pierre@0
|
307 '#weight' => -1, |
pierre@0
|
308 ); |
pierre@0
|
309 if (!empty($node->url)) { |
pierre@0
|
310 $link = t('Links to !url.', array('!url' => $node->url)); |
pierre@0
|
311 $link = check_plain($link, $node->format, FALSE); |
pierre@0
|
312 $node->content['ad-link'] = array( |
pierre@0
|
313 '#value' => "<div class=\"links-to\">$link</div>", |
pierre@0
|
314 '#weight' => 1, |
pierre@0
|
315 ); |
pierre@0
|
316 } |
pierre@0
|
317 } |
pierre@0
|
318 |
pierre@0
|
319 /** |
pierre@0
|
320 * Text ads node validator. |
pierre@0
|
321 */ |
pierre@0
|
322 function ad_text_node_validate($node, &$form_state) { |
pierre@0
|
323 // Enforce minimum and maximum lengths. |
pierre@0
|
324 $header_len = isset($node->adheader) ? strlen($node->adheader) : 0; |
pierre@0
|
325 $header_min = variable_get('header_min', 0); |
pierre@0
|
326 $header_max = variable_get('header_max', 0); |
pierre@0
|
327 if ($header_min && ($header_len < $header_min)) { |
pierre@0
|
328 form_set_error('adheader', t('Your text ad header is only %cur characters but must be at least %min characters.', array('%cur' => $header_len, '%min' => $header_min))); |
pierre@0
|
329 } |
pierre@0
|
330 else if ($header_max && ($header_len > $header_max)) { |
pierre@0
|
331 form_set_error('adheader', t('Your text ad header is %cur characters but can not be more than %max characters.', array('%cur' => $header_len, '%max' => $header_max))); |
pierre@0
|
332 } |
pierre@0
|
333 $body_len = strlen($node->adbody); |
pierre@0
|
334 $body_min = variable_get('body_min', 0); |
pierre@0
|
335 $body_max = variable_get('body_max', 0); |
pierre@0
|
336 if ($body_min && ($body_len < $body_min)) { |
pierre@0
|
337 form_set_error('adbody', t('Your text ad body is only %cur characters but must be at least %min characters.', array('%cur' => $body_len, '%min' => $body_min))); |
pierre@0
|
338 } |
pierre@0
|
339 else if ($body_max && ($body_len > $body_max)) { |
pierre@0
|
340 form_set_error('adbody', t('Your text ad body is %cur characters but can not be more than %max characters.', array('%cur' => $body_len, '%max' => $body_max))); |
pierre@0
|
341 } |
pierre@0
|
342 |
pierre@0
|
343 if ($node->url && variable_get('ad_validate_url', 1) && (!valid_url($node->url, TRUE))) { |
pierre@0
|
344 form_set_error('url', t('You must specify a valid %field.', array('%field' => t('Destination URL')))); |
pierre@0
|
345 } |
pierre@0
|
346 } |