Mercurial > defr > drupal > ad
comparison owners/ad_owners.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_owners.module,v 1.1.2.8 2009/02/17 04:34:27 jeremy Exp $ | 2 // $Id: ad_owners.module,v 1.1.2.8.2.6 2009/03/31 04:41:03 jeremy Exp $ |
3 | 3 |
4 /** | 4 /** |
5 * @file | 5 * @file |
6 * Enhances the ad module to support ad owners. | 6 * Enhances the ad module to support ad owners. |
7 * | 7 * |
8 * Copyright (c) 2009. | 8 * Copyright (c) 2008-2009. |
9 * Jeremy Andrews <jeremy@tag1consulting.com>. | 9 * Jeremy Andrews <jeremy@tag1consulting.com>. |
10 */ | 10 */ |
11 | 11 |
12 /** | 12 /** |
13 * Implementation of hook_theme(). | 13 * Implementation of hook_theme(). |
37 'type' => MENU_LOCAL_TASK, | 37 'type' => MENU_LOCAL_TASK, |
38 'weight' => 5, | 38 'weight' => 5, |
39 ); | 39 ); |
40 $items['node/%node/adowners/list'] = array( | 40 $items['node/%node/adowners/list'] = array( |
41 'title' => 'List', | 41 'title' => 'List', |
42 'access callback' => 'ad_adaccess', | 42 'access callback' => 'ad_permission', |
43 'access arguments' => array(1, 'manage owners'), | 43 'access arguments' => array(1, 'manage owners'), |
44 'type' => MENU_DEFAULT_LOCAL_TASK, | 44 'type' => MENU_DEFAULT_LOCAL_TASK, |
45 'weight' => 0, | 45 'weight' => 0, |
46 ); | 46 ); |
47 $items['node/%node/adowners/%user/permissions'] = array( | 47 $items['node/%node/adowners/%user/permissions'] = array( |
48 'title callback' => 'owner_permissions_title', | 48 'title callback' => 'owner_permissions_title', |
49 'title arguments' => array('!owner' => 3), | 49 'title arguments' => array('!owner' => 3), |
50 'page callback' => 'drupal_get_form', | 50 'page callback' => 'drupal_get_form', |
51 'page arguments' => array('ad_owner_permissions_form', 1, 3), | 51 'page arguments' => array('ad_owner_permissions_form', 1, 3), |
52 'access callback' => 'ad_adaccess', | 52 'access callback' => 'ad_permission', |
53 'access arguments' => array(1, 'manage owners'), | 53 'access arguments' => array(1, 'manage owners'), |
54 'type' => MENU_LOCAL_TASK, | 54 'type' => MENU_LOCAL_TASK, |
55 'weight' => 2, | 55 'weight' => 2, |
56 ); | 56 ); |
57 $items['node/%node/adowners/%user/remove'] = array( | 57 $items['node/%node/adowners/%user/remove'] = array( |
58 'title' => 'Remove owner', | 58 'title' => 'Remove owner', |
59 'page callback' => 'drupal_get_form', | 59 'page callback' => 'drupal_get_form', |
60 'page arguments' => array('ad_owner_remove_form', 1, 3), | 60 'page arguments' => array('ad_owner_remove_form', 1, 3), |
61 'access callback' => 'ad_adaccess', | 61 'access callback' => 'ad_permission', |
62 'access arguments' => array(1, 'manage owners'), | 62 'access arguments' => array(1, 'manage owners'), |
63 'type' => MENU_CALLBACK, | 63 'type' => MENU_CALLBACK, |
64 'weight' => 6, | 64 'weight' => 6, |
65 ); | 65 ); |
66 $items['node/%node/adowners/add'] = array( | 66 $items['node/%node/adowners/add'] = array( |
67 'title' => 'Add owner', | 67 'title' => 'Add owner', |
68 'page callback' => 'drupal_get_form', | 68 'page callback' => 'drupal_get_form', |
69 'page arguments' => array('ad_owners_add_form', 1), | 69 'page arguments' => array('ad_owners_add_form', 1), |
70 'access callback' => 'ad_adaccess', | 70 'access callback' => 'ad_permission', |
71 'access arguments' => array(1, 'manage owners'), | 71 'access arguments' => array(1, 'manage owners'), |
72 'type' => MENU_LOCAL_TASK, | 72 'type' => MENU_LOCAL_TASK, |
73 'weight' => 4, | 73 'weight' => 4, |
74 ); | 74 ); |
75 | 75 |
76 return $items; | 76 return $items; |
77 } | 77 } |
78 | 78 |
79 /** | 79 /** |
80 * Implementation of hook_perm(). | |
81 */ | |
82 function ad_owners_perm() { | |
83 return array('grant default per ad type permissions'); | |
84 } | |
85 | |
86 /** | |
80 * Menu item access callback. | 87 * Menu item access callback. |
81 */ | 88 */ |
82 function ad_owners_access($node) { | 89 function ad_owners_access($node) { |
83 return ($node->type == 'ad') && ad_adaccess($node, 'manage owners'); | 90 return ($node->type == 'ad') && ad_permission($node->nid, 'manage owners'); |
84 } | 91 } |
85 | 92 |
86 /** | 93 /** |
87 * Menu item title callback - use the user name | 94 * Menu item title callback - use the user name |
88 */ | 95 */ |
89 function owner_permissions_title($account) { | 96 function owner_permissions_title($account) { |
90 return t('!owner\'s permissions', array('!owner' => $account->name)); | 97 return t('!owner\'s permissions', array('!owner' => $account->name)); |
98 } | |
99 | |
100 /** | |
101 * Return array default permissions. | |
102 */ | |
103 function ad_owners_default_permissions() { | |
104 $permissions = module_invoke_all('adapi', 'permissions', NULL); | |
105 $all = array(); | |
106 $perms = array(); | |
107 foreach ($permissions as $permission => $default) { | |
108 if ($default) { | |
109 $perms[] = $permission; | |
110 } | |
111 $all[] = $permission; | |
112 } | |
113 return array('default' => $perms, 'all' => $all); | |
91 } | 114 } |
92 | 115 |
93 /** | 116 /** |
94 * Implementation of hook_form_alter(). | 117 * Implementation of hook_form_alter(). |
95 */ | 118 */ |
96 function ad_owners_form_alter(&$form, &$form_state, $form_id) { | 119 function ad_owners_form_alter(&$form, &$form_state, $form_id) { |
97 if ($form_id == 'ad_'. arg(4) .'_global_settings' || $form_id == 'ad_no_global_settings') { | 120 if ($form_id == 'ad_'. arg(4) .'_global_settings' || $form_id == 'ad_no_global_settings') { |
98 if (!isset($form['adtype'])) { | 121 if (!isset($form['adtype'])) { |
99 $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); | 122 $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); |
100 } | 123 } |
101 $permissions = module_invoke_all('adapi', 'permissions', NULL); | 124 |
125 $perms = ad_owners_default_permissions(); | |
102 $form['permissions'] = array( | 126 $form['permissions'] = array( |
103 '#type' => 'fieldset', | 127 '#type' => 'fieldset', |
104 '#title' => t('Permissions'), | 128 '#title' => t('Permissions'), |
105 '#collapsible' => TRUE, | 129 '#collapsible' => TRUE, |
106 '#description' => t('Select which permissions will be automatically granted to new owners of <em>!type</em> advertisements.', array('!type' => ad_get_types('name', arg(4)))), | 130 '#description' => t('Select which permissions will be automatically granted to new owners of <em>!type</em> advertisements, per role. If a user is a member of multiple roles, he will get all default permissions defined for each role he is a member of.', array('!type' => ad_get_types('name', arg(4)))), |
107 ); | 131 ); |
108 $form['permissions']['default_permissions'] = array( | 132 |
109 '#type' => 'checkboxes', | 133 $roles = user_roles(TRUE); |
110 '#title' => t('Default permissions for <em>!type</em> owners', array('!type' => ad_get_types('name', arg(4)))), | 134 foreach ($roles as $rid => $role) { |
111 '#options' => drupal_map_assoc($permissions), | 135 $defaults = variable_get("ad_default_permissions_{$rid}_". $form['adtype']['#value'], $perms['default']); |
112 '#default_value' => variable_get('ad_'. arg(4) .'_default_permissions', array('access statistics', 'access click history', 'manage status')), | 136 $form['permissions']["role-$rid"] = array( |
113 ); | 137 '#type' => 'fieldset', |
138 '#title' => $role, | |
139 '#collapsible' => TRUE, | |
140 '#collapsed' => TRUE, | |
141 ); | |
142 $form['permissions']["role-$rid"]["default_permissions_$rid"] = array( | |
143 '#type' => 'checkboxes', | |
144 '#title' => t('Default permissions for users in the <em>!role</em> role', array('!role' => $role)), | |
145 '#options' => drupal_map_assoc($perms['all']), | |
146 '#default_value' => $defaults, | |
147 ); | |
148 } | |
114 if (isset($form['save'])) { | 149 if (isset($form['save'])) { |
115 $form['save']['#weight'] = 10; | 150 $form['save']['#weight'] = 10; |
116 } | 151 } |
117 if (isset($form['#submit']) && is_array($form['#submit'])) { | 152 if (isset($form['#submit']) && is_array($form['#submit'])) { |
118 $form['#submit'] = array('ad_global_settings_submit') + $form['#submit']; | 153 $form['#submit'] = array_merge(array('ad_owners_settings_submit'), $form['#submit']); |
119 } | 154 } |
120 else { | 155 else { |
121 $form['#submit'] = array('ad_global_settings_submit'); | 156 $form['#submit'] = array('ad_owners_settings_submit'); |
122 } | 157 } |
123 } | 158 } |
159 } | |
160 | |
161 /** | |
162 * Submit handler for global settings of all ad types. | |
163 * @see ad_form_alter() | |
164 */ | |
165 function ad_owners_settings_submit($form, $form_state) { | |
166 $roles = user_roles(TRUE); | |
167 foreach ($roles as $rid => $role) { | |
168 variable_set("ad_default_permissions_{$rid}_". $form_state['values']['adtype'], $form_state['values']["default_permissions_$rid"]); | |
169 unset($form_state['values']["default_permissions_$rid"]); | |
170 } | |
171 unset($form_state['values']['adtype']); | |
124 } | 172 } |
125 | 173 |
126 /** | 174 /** |
127 * Implementation of hook_nodeapi(). | 175 * Implementation of hook_nodeapi(). |
128 */ | 176 */ |
133 case 'insert': | 181 case 'insert': |
134 case 'update': | 182 case 'update': |
135 if (isset($node->adtype)) { | 183 if (isset($node->adtype)) { |
136 // Be sure ad owner has at least default ad permissions. | 184 // Be sure ad owner has at least default ad permissions. |
137 ad_owners_add($node, $node->uid); | 185 ad_owners_add($node, $node->uid); |
138 ad_host_id_create($node->uid); | 186 ad_owners_create_hostid($node->uid); |
139 } | 187 } |
140 break; | 188 break; |
141 case 'delete': | 189 case 'delete': |
142 // Clean up ad_permissions and any other per-ad tables. | 190 // Clean up ad_permissions and any other per-ad tables. |
143 $result = db_query('SELECT oid, uid FROM {ad_owners} WHERE aid = %d', $node->nid); | 191 $result = db_query('SELECT oid, uid FROM {ad_owners} WHERE aid = %d', $node->nid); |
156 * Implementation of hook_adapi(). | 204 * Implementation of hook_adapi(). |
157 */ | 205 */ |
158 function ad_owners_adapi($op, $node = NULL) { | 206 function ad_owners_adapi($op, $node = NULL) { |
159 switch ($op) { | 207 switch ($op) { |
160 case 'permissions': | 208 case 'permissions': |
161 return array('manage owners'); | 209 return array('manage owners' => FALSE); |
162 break; | 210 break; |
163 } | 211 } |
164 } | 212 } |
165 | 213 |
166 /** | 214 /** |
305 drupal_set_message(t('The user %username has been added as an owner of this advertisement.', array('%username' => $form_state['values']['username']))); | 353 drupal_set_message(t('The user %username has been added as an owner of this advertisement.', array('%username' => $form_state['values']['username']))); |
306 drupal_goto('node/'. $form_state['values']['aid'] .'/adowners/'. $owner->uid .'/permissions'); | 354 drupal_goto('node/'. $form_state['values']['aid'] .'/adowners/'. $owner->uid .'/permissions'); |
307 } | 355 } |
308 } | 356 } |
309 | 357 |
310 function ad_is_owner($aid, $account = NULL) { | 358 function is_ad_owner($aid, $account = NULL) { |
311 global $user; | 359 global $user; |
312 if (!isset($account)) { | 360 if (!isset($account)) { |
313 $account = $user; | 361 $account = $user; |
314 } | 362 } |
315 if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $account->uid, $aid))) { | 363 if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $account->uid, $aid))) { |
328 $uid = is_numeric($owner) ? $owner : $owner->uid; | 376 $uid = is_numeric($owner) ? $owner : $owner->uid; |
329 if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $node->nid, $uid))) { | 377 if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $node->nid, $uid))) { |
330 db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); | 378 db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); |
331 $rc = db_affected_rows() ? 1 : 0; | 379 $rc = db_affected_rows() ? 1 : 0; |
332 | 380 |
333 if (!$permissions) { | 381 if (empty($permissions)) { |
334 $permissions = variable_get('ad_'. $node->adtype .'_default_permissions', array('access statistics', 'access click history', 'manage status')); | 382 // build permissions array from defaults |
383 $perms = ad_owners_default_permissions(); | |
384 $owner = user_load($uid); | |
385 if (is_array($owner->roles)) { | |
386 foreach ($owner->roles as $rid => $role) { | |
387 $default = variable_get("ad_default_permissions_{$rid}_". $node->adtype, $perms['default']); | |
388 $new = array(); | |
389 foreach ($default as $key => $value) { | |
390 if ($value) { | |
391 $new[] = $value; | |
392 } | |
393 } | |
394 $permissions = $permissions + $new; | |
395 } | |
396 } | |
335 } | 397 } |
336 | 398 |
337 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $uid)); | 399 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $uid)); |
338 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); | 400 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); |
339 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $oid, implode('|,|', $permissions)); | 401 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $oid, implode('|,|', $permissions)); |
343 } | 405 } |
344 | 406 |
345 /** | 407 /** |
346 * Create a unique host id for each ad owner, used when displaying ads remotely. | 408 * Create a unique host id for each ad owner, used when displaying ads remotely. |
347 */ | 409 */ |
348 function ad_host_id_create($uid) { | 410 function ad_owners_create_hostid($uid) { |
349 $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); | 411 $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); |
350 if (!$hostid) { | 412 if (!$hostid) { |
351 $hostid = md5($uid . time()); | 413 $hostid = md5($uid . time()); |
352 db_query("INSERT INTO {ad_hosts} (uid, hostid) VALUES (%d, '%s')", $uid, md5($uid . time())); | 414 db_query("INSERT INTO {ad_hosts} (uid, hostid) VALUES (%d, '%s')", $uid, md5($uid . time())); |
353 } | 415 } |
368 '#value' => $owner->uid, | 430 '#value' => $owner->uid, |
369 ); | 431 ); |
370 | 432 |
371 return confirm_form($form, | 433 return confirm_form($form, |
372 t('Are you sure you want to remove user %name as an owner of this advertisement?', array('%name' => $owner->name)), | 434 t('Are you sure you want to remove user %name as an owner of this advertisement?', array('%name' => $owner->name)), |
373 "node/$aid/adowners", | 435 "node/$node->nid/adowners", |
374 t('This action cannot be undone.'), | 436 t('This action cannot be undone.'), |
375 t('Remove'), | 437 t('Remove'), |
376 t('Cancel') | 438 t('Cancel') |
377 ); | 439 ); |
378 } | 440 } |
415 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $user->uid)); | 477 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $user->uid)); |
416 $granted = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); | 478 $granted = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); |
417 | 479 |
418 $form['header'] = array( | 480 $form['header'] = array( |
419 '#type' => 'value', | 481 '#type' => 'value', |
420 '#value' => array(t('permissions'), t('granted')) | 482 '#value' => array(t('permission'), t('granted')) |
421 ); | 483 ); |
422 | 484 |
423 $rows = array(); | 485 $rows = array(); |
424 | 486 |
425 $permissions = module_invoke_all('adapi', 'permissions', $node); | 487 $permissions = module_invoke_all('adapi', 'permissions', $node); |
426 foreach ($permissions as $permission) { | 488 foreach ($permissions as $permission => $default) { |
427 $form['permission'][$permission] = array( | 489 $form['permission'][$permission] = array( |
428 '#value' => t($permission), | 490 '#value' => t($permission), |
429 ); | 491 ); |
430 $form['grant'][str_replace(' ', '_', $permission)] = array( | 492 $form['grant'][str_replace(' ', '_', $permission)] = array( |
431 '#type' => 'checkbox', | 493 '#type' => 'checkbox', |
477 * Store the ad owner's updated permissions in the ad_permissions table. | 539 * Store the ad owner's updated permissions in the ad_permissions table. |
478 */ | 540 */ |
479 function ad_owner_permissions_form_submit($form, &$form_state) { | 541 function ad_owner_permissions_form_submit($form, &$form_state) { |
480 $permissions = module_invoke_all('adapi', 'permissions', array()); | 542 $permissions = module_invoke_all('adapi', 'permissions', array()); |
481 $perms = array(); | 543 $perms = array(); |
482 foreach ($permissions as $permission) { | 544 foreach ($permissions as $permission => $default) { |
483 $perm = str_replace(' ', '_', $permission); | 545 $perm = str_replace(' ', '_', $permission); |
484 if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { | 546 if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { |
485 $perms[] = $permission; | 547 $perms[] = $permission; |
486 } | 548 } |
487 } | 549 } |
489 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $form_state['values']['oid'], implode('|,|', $perms)); | 551 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $form_state['values']['oid'], implode('|,|', $perms)); |
490 | 552 |
491 drupal_set_message(t('The permissions have been saved.')); | 553 drupal_set_message(t('The permissions have been saved.')); |
492 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; | 554 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; |
493 } | 555 } |
556 | |
557 /** | |
558 * Determine whether the user has a given privilege. | |
559 */ | |
560 function ad_owners_permission($aid, $string, $account) { | |
561 static $permissions = array(); | |
562 | |
563 if (!isset($permissions[$aid][$account->uid])) { | |
564 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); | |
565 if ($oid) { | |
566 $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); | |
567 } | |
568 else { | |
569 $account = user_load($account->uid); | |
570 if (user_access('grant default per ad type permissions')) { | |
571 $perms = ad_owners_default_permissions(); | |
572 $permissions[$aid][$account->uid] = $perms['default']; | |
573 } | |
574 } | |
575 } | |
576 | |
577 return (in_array("$string", $permissions[$aid][$account->uid])); | |
578 } |