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