Mercurial > defr > drupal > ad
comparison image/ad_image.module @ 1:948362c2a207 ad
update advertisement
author | pierre |
---|---|
date | Thu, 02 Apr 2009 15:28:21 +0000 |
parents | d8a3998dac8e |
children | e5584a19768b |
comparison
equal
deleted
inserted
replaced
0:d8a3998dac8e | 1:948362c2a207 |
---|---|
1 <?php | 1 <?php |
2 // $Id: ad_image.module,v 1.2.2.13.2.40.2.11 2009/02/17 18:56:26 jeremy Exp $ | 2 // $Id: ad_image.module,v 1.2.2.13.2.40.2.11.2.5 2009/03/11 16:12:07 jeremy Exp $ |
3 | 3 |
4 /** | 4 /** |
5 * @file | 5 * @file |
6 * Enhances the ad module to support banner ads. | 6 * Enhances the ad module to support banner ads. |
7 * | 7 * |
23 * The ad object. | 23 * The ad object. |
24 * @return | 24 * @return |
25 * A string containing the ad markup. | 25 * A string containing the ad markup. |
26 */ | 26 */ |
27 function theme_ad_image_ad($ad) { | 27 function theme_ad_image_ad($ad) { |
28 if (isset($ad->aid) && isset($ad->filepath)) { | 28 if (isset($ad->aid) && (isset($ad->filepath) || isset($ad->remote_image))) { |
29 $output = '<div class="image-advertisement" id="ad-'. $ad->aid .'">'; | 29 $output = '<div class="image-advertisement" id="ad-'. $ad->aid .'">'; |
30 if (isset($ad->url) && !empty($ad->url)) { | 30 if (isset($ad->url) && !empty($ad->url)) { |
31 $image = theme('ad_image_image', $ad->filepath, check_plain($ad->tooltip), check_plain($ad->tooltip)); | 31 $image = theme('ad_image_image', !empty($ad->remote_image) ? $ad->remote_image : $ad->filepath, check_plain($ad->tooltip), check_plain($ad->tooltip)); |
32 $output .= l($image, $ad->redirect .'/@HOSTID___', array('attributes' => ad_link_attributes(), 'absolute' => TRUE, 'html' => TRUE)); | 32 $output .= l($image, $ad->redirect .'/@HOSTID___', array('attributes' => ad_link_attributes(), 'absolute' => TRUE, 'html' => TRUE)); |
33 } | 33 } |
34 else { | 34 else { |
35 $output .= theme('ad_image_image', $ad->filepath, check_plain($ad->tooltip), check_plain($ad->tooltip)); | 35 $output .= theme('ad_image_image', !empty($ad->remote_image) ? $ad->remote_image : $ad->filepath, check_plain($ad->tooltip), check_plain($ad->tooltip)); |
36 } | 36 } |
37 $output .= '</div>'; | 37 $output .= '</div>'; |
38 return $output; | 38 return $output; |
39 } | 39 } |
40 } | 40 } |
57 * attributes. | 57 * attributes. |
58 * @return | 58 * @return |
59 * A string containing the image tag. | 59 * A string containing the image tag. |
60 */ | 60 */ |
61 function theme_ad_image_image($path, $alt = '', $tooltip = '', $attributes = NULL, $getsize = TRUE) { | 61 function theme_ad_image_image($path, $alt = '', $tooltip = '', $attributes = NULL, $getsize = TRUE) { |
62 if (!$getsize || (is_file($path) && (list($width, $height, $type, $image_attributes) = @getimagesize($path)))) { | 62 if ($getsize) { |
63 $attributes = drupal_attributes($attributes); | 63 list($width, $height, $type, $image_attributes) = @getimagesize($path); |
64 $url = preg_replace('&'. drupal_get_path('module', 'ad') .'/&', '', file_create_url($path)); | 64 if (isset($width) && isset($height)) { |
65 return '<img src="'. check_url($url) .'" alt="'. check_plain($alt) .'" title="'. check_plain($tooltip) .'" '. $image_attributes . $attributes .' />'; | 65 $attributes = drupal_attributes($attributes); |
66 if (is_file($path)) { | |
67 $url = preg_replace('&'. drupal_get_path('module', 'ad') .'/&', '', file_create_url($path)); | |
68 } | |
69 else { | |
70 $url = $path; | |
71 } | |
72 return '<img src="'. check_url($url) .'" alt="'. check_plain($alt) .'" title="'. check_plain($tooltip) .'" '. $image_attributes . $attributes .' />'; | |
73 } | |
66 } | 74 } |
67 } | 75 } |
68 | 76 |
69 /** | 77 /** |
70 * Implementation of hook_theme(). | 78 * Implementation of hook_theme(). |
114 * Image ad settings form. | 122 * Image ad settings form. |
115 */ | 123 */ |
116 function ad_image_global_settings($edit = array()) { | 124 function ad_image_global_settings($edit = array()) { |
117 $form = array(); | 125 $form = array(); |
118 | 126 |
127 $form['general'] = array( | |
128 '#type' => 'fieldset', | |
129 '#title' => t('General settings'), | |
130 '#collapsible' => TRUE, | |
131 ); | |
132 $form['general']['remote_images'] = array( | |
133 '#type' => 'checkbox', | |
134 '#title' => t('Allow remote hosted images'), | |
135 '#description' => t('Check this box to add a new field when creating image advertisements allowing you to specify a path to a remotely hosted image rather than locally uploading an image. This option is disabled by default as it is a confusing field to someone not using it.'), | |
136 '#default_value' => variable_get('ad_image_remote_images', FALSE), | |
137 ); | |
138 | |
119 $groups = module_invoke('ad', 'groups_list', TRUE); | 139 $groups = module_invoke('ad', 'groups_list', TRUE); |
120 foreach ($groups as $tid => $group) { | 140 foreach ($groups as $tid => $group) { |
121 $form["group-$tid"] = array( | 141 $form["group-$tid"] = array( |
122 '#type' => 'fieldset', | 142 '#type' => 'fieldset', |
123 '#title' => $group->name, | 143 '#title' => $group->name, |
169 $form['save'] = array( | 189 $form['save'] = array( |
170 '#type' => 'submit', | 190 '#type' => 'submit', |
171 '#value' => t('Save'), | 191 '#value' => t('Save'), |
172 ); | 192 ); |
173 | 193 |
194 $form['#submit'] = array('ad_image_global_settings_submit'); | |
195 | |
174 return $form; | 196 return $form; |
175 } | 197 } |
176 | 198 |
177 /** | 199 /** |
178 * Save min and max image width and height values for ad groups. | 200 * Save min and max image width and height values for ad groups. |
179 */ | 201 */ |
180 function ad_image_global_settings_submit($form, &$form_state) { | 202 function ad_image_global_settings_submit($form, &$form_state) { |
203 variable_set('ad_image_remote_images', $form_state['values']['remote_images']); | |
181 $groups = module_invoke('ad', 'groups_list', TRUE); | 204 $groups = module_invoke('ad', 'groups_list', TRUE); |
182 foreach ($groups as $group) { | 205 foreach ($groups as $group) { |
183 // TODO: Update the database schema, convert gid to tid. | 206 // TODO: Update the database schema, convert gid to tid. |
184 $gid = db_result(db_query('SELECT gid FROM {ad_image_format} WHERE gid = %d', $group->tid)); | 207 $gid = db_result(db_query('SELECT gid FROM {ad_image_format} WHERE gid = %d', $group->tid)); |
185 if (is_numeric($gid)) { | 208 if (is_numeric($gid)) { |
199 $output = NULL; | 222 $output = NULL; |
200 switch ($op) { | 223 switch ($op) { |
201 | 224 |
202 case 'load': | 225 case 'load': |
203 $return = db_fetch_array(db_query("SELECT a.*, f.filepath FROM {ad_image} a LEFT JOIN {files} f ON a.fid = f.fid WHERE aid = %d", $node['aid'])); | 226 $return = db_fetch_array(db_query("SELECT a.*, f.filepath FROM {ad_image} a LEFT JOIN {files} f ON a.fid = f.fid WHERE aid = %d", $node['aid'])); |
204 $return['ad'] = '<img src="'. file_create_url($return['filepath']) .'" width="'. $return['width'] .'" height="'. $return['height'] .'" alt="'. check_plain($return['tooltip']) .'" />'; | 227 if (isset($return['remote_image']) && !empty($return['remote_image'])) { |
228 $path = $return['remote_image']; | |
229 } | |
230 else { | |
231 $path = file_create_url($return['filepath']); | |
232 } | |
233 $return['ad'] = '<img src="'. $path .'" width="'. $return['width'] .'" height="'. $return['height'] .'" alt="'. check_plain($return['tooltip']) .'" />'; | |
205 return $return; | 234 return $return; |
206 | 235 |
207 case 'insert': | 236 case 'insert': |
208 case 'update': | 237 case 'update': |
209 $image = ad_image_load_image($node); | 238 $fid = isset($node->files) ? (int)ad_image_active_file($node->files) : 0; |
210 $fid = (int)ad_image_active_file($node->files); | 239 if ($fid) { |
240 $image = ad_image_load_image($node); | |
241 } | |
242 else if (isset($node->remote_image)) { | |
243 list($image->width, $image->height) = getimagesize($node->remote_image); | |
244 } | |
211 // This is ugly, but as "a" comes before "u" we don't seem to be able | 245 // This is ugly, but as "a" comes before "u" we don't seem to be able |
212 // to modify the upload module's form. Instead, we check after the fact | 246 // to modify the upload module's form. Instead, we check after the fact |
213 // if someone is editing images when they're not allowed, and if so we | 247 // if someone is editing images when they're not allowed, and if so we |
214 // prevent the ad from being saved. | 248 // prevent the ad from being saved. |
215 if ($op == 'update' && !ad_adaccess($node, 'manage active ad')) { | 249 if ($op == 'update' && !ad_permission($node->nid, 'manage active image')) { |
216 // See if fid is changing -- it's okay if new images are uploaded, it's | 250 // See if fid is changing -- it's okay if new images are uploaded, it's |
217 // just not okay if the active fid is changed. | 251 // just not okay if the active fid is changed. |
218 if ($fid != $image->fid) { | 252 if ($fid != $image->fid) { |
219 drupal_set_message('You do not have the necessary permissions to change the active advertisement.', 'error'); | 253 drupal_set_message('You do not have the necessary permissions to change the active advertisement.', 'error'); |
220 // This causes upload_save() to simply return without making any | 254 // This causes upload_save() to simply return without making any |
221 // changes to the files attached to this node. | 255 // changes to the files attached to this node. |
222 unset($node->files); | 256 unset($node->files); |
223 } | 257 } |
224 } | 258 } |
225 else { | 259 else { |
226 // Check that all values are valid -- this is a kludge to work around | 260 // Check that all values are valid -- this is a kludge to work around |
227 // bug #146147 until the problem is better understood. | 261 // bug #146147 until the problem is better understood. |
228 $width = isset($image->width) ? $image->width : 0; | 262 $width = isset($image->width) ? $image->width : 0; |
229 $height = isset($image->height) ? $image->height : 0; | 263 $height = isset($image->height) ? $image->height : 0; |
230 $fid = isset($image->fid) ? $image->fid : 0; | 264 $fid = isset($image->fid) ? $image->fid : 0; |
231 if ($image !== FALSE && $width != 0 && $height != 0 && $fid != 0) { | 265 if ($image !== FALSE && $width != 0 && $height != 0 && ($fid != 0 || $node->remote_image)) { |
232 $node->fid = $image->fid; | 266 $node->fid = isset($image->fid) ? $image->fid : 0; |
233 $node->width = $image->width; | 267 $node->width = $image->width; |
234 $node->height = $image->height; | 268 $node->height = $image->height; |
235 } | 269 } |
236 else { | 270 else { |
237 $image = FALSE; | 271 $image = FALSE; |
238 } | 272 } |
239 } | 273 } |
240 if ($op == 'insert') { | 274 if ($op == 'insert') { |
241 db_query("INSERT INTO {ad_image} (aid, fid, url, tooltip, width, height) VALUES(%d, %d, '%s', '%s', %d, %d)", $node->nid, $node->fid, $node->url, $node->tooltip, $node->width, $node->height); | 275 db_query("INSERT INTO {ad_image} (aid, fid, url, tooltip, remote_image, width, height) VALUES(%d, %d, '%s', '%s', '%s', %d, %d)", $node->nid, $node->fid, $node->url, $node->tooltip, $node->remote_image, $node->width, $node->height); |
242 } | 276 } |
243 else { | 277 else { |
244 db_query("UPDATE {ad_image} SET fid = %d, url = '%s', tooltip = '%s', width = %d, height = %d WHERE aid = %d", $fid, $node->url, $node->tooltip, $node->width, $node->height, $node->nid); | 278 db_query("UPDATE {ad_image} SET fid = %d, url = '%s', tooltip = '%s', remote_image = '%s', width = %d, height = %d WHERE aid = %d", $fid, $node->url, $node->tooltip, $node->remote_image, $node->width, $node->height, $node->nid); |
245 } | 279 } |
246 // No valid image has been uploaded, don't allow ad to be 'active'. | 280 if (!isset($node->remote_image) || empty($node->remote_image)) { |
247 if ($image === FALSE || !ad_image_active_file(($node->files))) { | 281 // No valid image has been uploaded, don't allow ad to be 'active'. |
248 db_query("UPDATE {ads} SET adstatus = '%s' WHERE aid = %d AND adstatus = '%s'", t('pending'), $node->nid, t('active')); | 282 if ($image === FALSE || !ad_image_active_file(($node->files))) { |
249 if (db_affected_rows()) { | 283 db_query("UPDATE {ads} SET adstatus = '%s' WHERE aid = %d AND adstatus = '%s'", t('pending'), $node->nid, t('active')); |
250 drupal_set_message(t('Image validation failed, unable to mark ad as %active. Setting ad as %pending. If you do not see any more errors, you should now be able to set your ad as %active.', array('%active' => t('active'), '%pending' => t('pending'))), 'error'); | 284 if (db_affected_rows()) { |
251 } | 285 drupal_set_message(t('Image validation failed, unable to mark ad as %active. Setting ad as %pending.', array('%active' => t('active'), '%pending' => t('pending'))), 'error'); |
252 } | 286 } |
253 else if (!$fid) { | 287 } |
254 db_query("UPDATE {ads} SET adstatus = '%s' WHERE aid = %d AND adstatus = '%s'", t('pending'), $node->nid, t('active')); | 288 else if (!$fid) { |
255 if (db_affected_rows()) { | 289 db_query("UPDATE {ads} SET adstatus = '%s' WHERE aid = %d AND adstatus = '%s'", t('pending'), $node->nid, t('active')); |
256 drupal_set_message(t('Unable to mark ad as <em>active</em> until uploaded image is validated. If you do not see any more errors, you should now be able to set your ad as <em>active</em>.'), 'error'); | 290 if (db_affected_rows()) { |
291 drupal_set_message(t('Unable to mark ad as <em>active</em> until uploaded image is validated. If you do not see any more errors, you should now be able to set your ad as <em>active</em>.'), 'error'); | |
292 } | |
257 } | 293 } |
258 } | 294 } |
259 break; | 295 break; |
260 | 296 |
261 case 'validate': | 297 case 'validate': |
298 if (isset($node->remote_image) && !empty($node->remote_image)) { | |
299 if (variable_get('ad_validate_url', 1) && (!valid_url($node->url, TRUE))) { | |
300 drupal_set_message('You must specify a valid path for your remote advertisement.', 'error'); | |
301 } | |
302 } | |
303 else if (!isset($node->files) || !ad_image_active_file($node->files)) { | |
304 form_set_error('upload', t('It is required that you upload an image for your image advertisement.')); | |
305 } | |
262 if ($node->url && variable_get('ad_validate_url', 1) && (!valid_url($node->url, TRUE))) { | 306 if ($node->url && variable_get('ad_validate_url', 1) && (!valid_url($node->url, TRUE))) { |
263 form_set_error('url', t('You must specify a valid %field.', array('%field' => t('Destination URL')))); | 307 form_set_error('url', t('You must specify a valid %field.', array('%field' => t('Destination URL')))); |
264 } | |
265 if (!isset($node->files) || !ad_image_active_file($node->files)) { | |
266 form_set_error('upload', t('It is required that you upload an image for your image advertisement.')); | |
267 } | 308 } |
268 break; | 309 break; |
269 | 310 |
270 case 'delete': | 311 case 'delete': |
271 db_query('DELETE FROM {ad_image} WHERE aid = %d', $node->nid); | 312 db_query('DELETE FROM {ad_image} WHERE aid = %d', $node->nid); |
289 'help' => t('An image or banner advertisement.'), | 330 'help' => t('An image or banner advertisement.'), |
290 ), | 331 ), |
291 ); | 332 ); |
292 case 'permissions': | 333 case 'permissions': |
293 if (!isset($node->adtype) || $node->adtype == 'image') { | 334 if (!isset($node->adtype) || $node->adtype == 'image') { |
294 return array('manage active ad'); | 335 return array('manage active image' => TRUE); |
295 } | 336 } |
296 | 337 |
297 case 'check_install': | 338 case 'check_install': |
298 if (!module_exists('upload')) { | 339 if (!module_exists('upload')) { |
299 drupal_set_message(t("The required <em>upload module</em> is not enabled, you will not be able to upload image ads. Please %enable the upload module, or %disable the ad_image module.", array('%enable' => l('enable', 'admin/modules'), '%disable' => l('disable', 'admin/modules'))), 'error'); | 340 drupal_set_message(t("The required <em>upload module</em> is not enabled, you will not be able to upload image ads. Please %enable the upload module, or %disable the ad_image module.", array('%enable' => l('enable', 'admin/modules'), '%disable' => l('disable', 'admin/modules'))), 'error'); |
398 | 439 |
399 /** | 440 /** |
400 * Returns image object from given ad node. | 441 * Returns image object from given ad node. |
401 */ | 442 */ |
402 function ad_image_load_image($node) { | 443 function ad_image_load_image($node) { |
403 if (is_array($node->files)) { | 444 if (isset($node->files) && is_array($node->files)) { |
404 foreach ($node->files as $file) { | 445 foreach ($node->files as $file) { |
405 if (is_array($file)) { | 446 if (is_array($file)) { |
406 if ($file['list'] && file_exists($file['filepath'])) { | 447 if ($file['list'] && file_exists($file['filepath'])) { |
407 $image = ad_image_validate_size((object)$file, $node->nid); | 448 $image = ad_image_validate_size((object)$file, $node->nid); |
408 if ($image !== FALSE) { | 449 if ($image !== FALSE) { |
437 '#type' => 'fieldset', | 478 '#type' => 'fieldset', |
438 '#title' => t('Image'), | 479 '#title' => t('Image'), |
439 '#collapsible' => TRUE, | 480 '#collapsible' => TRUE, |
440 ); | 481 ); |
441 | 482 |
442 if (isset($node->files)) { | 483 if (!empty($node->remote_image)) { |
484 list($image->width, $image->height) = getimagesize($node->remote_image); | |
485 $path = '<img src="'. $node->remote_image .'" alt="'. t('image') .'" /> '; | |
486 } | |
487 else if (isset($node->files)) { | |
443 $files = $node->files; | 488 $files = $node->files; |
444 } | 489 } |
445 else { | 490 else { |
446 if (!isset($node->vid)) { | 491 if (!isset($node->vid)) { |
447 $node->vid = ''; | 492 $node->vid = ''; |
448 } | 493 } |
449 $files = module_invoke('upload', 'load', $node); | 494 $files = module_invoke('upload', 'load', $node); |
450 } | 495 } |
451 $num = sizeof($files); | 496 $num = isset($files) ? sizeof($files) : 0; |
452 | 497 |
453 $path = NULL; | |
454 $active = 0; | |
455 if ($num) { | 498 if ($num) { |
499 $path = NULL; | |
500 $active = 0; | |
456 foreach ($files as $file) { | 501 foreach ($files as $file) { |
457 if ($file->list && file_exists($file->filepath)) { | 502 if ($file->list && file_exists($file->filepath)) { |
458 $path .= '<img src="'. file_create_url($file->filepath) .'" alt="'. check_plain($file->filename) .'" /> '; | 503 $path .= '<img src="'. file_create_url($file->filepath) .'" alt="'. check_plain($file->filename) .'" /> '; |
459 $image = ad_image_validate_size($file, $node->nid); | 504 $image = ad_image_validate_size($file, $node->nid); |
460 if ($image === FALSE) { | 505 if ($image === FALSE) { |
471 drupal_set_message(t('Unable to locate image %image.', array('%image' => "$file->filepath"))); | 516 drupal_set_message(t('Unable to locate image %image.', array('%image' => "$file->filepath"))); |
472 $path .= t('Unable to locate the uploaded image.'); | 517 $path .= t('Unable to locate the uploaded image.'); |
473 } | 518 } |
474 } | 519 } |
475 } | 520 } |
476 if ($path == NULL) { | 521 if (!isset($path) || $path == NULL) { |
477 $path = t('No images have been uploaded. Please upload an image via the <em>File attachments</em> form section below.<br />'); | 522 $path = t('No images have been uploaded. Please upload an image via the <em>File attachments</em> form section below.<br />'); |
478 // Only set error if node has been previewed or submitted. | 523 // Only set error if node has been previewed or submitted. |
479 if (isset($_POST['edit'])) { | 524 if (isset($_POST['edit'])) { |
480 form_set_error('upload', t('It is required that you upload an image for your image advertisement.')); | 525 form_set_error('upload', t('It is required that you upload an image for your image advertisement.')); |
481 } | 526 } |
482 } | 527 } |
483 | 528 else if ($num) { |
484 $path .= t('<br />Only the first uploaded image that has <em>List</em> checked in the <em>File attachments</em> form section below will be displayed as an advertisement. The image that will be displayed is marked as <em>active</em> above.'); | 529 $path .= t('<br />Only the first uploaded image that has <em>List</em> checked in the <em>File attachments</em> form section below will be displayed as an advertisement. The image that will be displayed is marked as <em>active</em> above.'); |
530 } | |
485 | 531 |
486 $form['ad_image']['image'] = array( | 532 $form['ad_image']['image'] = array( |
487 '#type' => 'markup', | 533 '#type' => 'markup', |
488 '#value' => $path, | 534 '#value' => $path, |
489 '#prefix' => '<div class="container-inline">', | 535 '#prefix' => '<div class="container-inline">', |
504 '#required' => FALSE, | 550 '#required' => FALSE, |
505 '#default_value' => isset($node->tooltip) ? $node->tooltip : '', | 551 '#default_value' => isset($node->tooltip) ? $node->tooltip : '', |
506 '#description' => t('Optionally enter text to appear when a mouse pointer hovers over the ad image.'), | 552 '#description' => t('Optionally enter text to appear when a mouse pointer hovers over the ad image.'), |
507 ); | 553 ); |
508 | 554 |
555 if (variable_get('ad_image_remote_images', FALSE)) { | |
556 $form['ad_image']['remote_image'] = array( | |
557 '#type' => 'textfield', | |
558 '#title' => t('Remote image path'), | |
559 '#required' => FALSE, | |
560 '#default_value' => isset($node->remote_image) ? $node->remote_image : '', | |
561 '#description' => t('Instead of uploading an image, you may optionally specify a complete URL to a remotely hosted image. For example, %example. If you do not specify a remotely hosted image, you must attach an image to this advertisement in the %attachment section below.', array('%example' => 'http://sample.com/images/ad.png', '%attachment' => t('File attachements'))), | |
562 ); | |
563 } | |
564 | |
509 return $form; | 565 return $form; |
510 } | 566 } |
511 | 567 |
512 /** | 568 /** |
513 * Adapi helper function for displaying ad itself. | 569 * Adapi helper function for displaying ad itself. |