Mercurial > defr > drupal > ad
comparison owners/ad_owners.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_owners.module,v 1.1.2.8 2009/02/17 04:34:27 jeremy Exp $ | |
| 3 | |
| 4 /** | |
| 5 * @file | |
| 6 * Enhances the ad module to support ad owners. | |
| 7 * | |
| 8 * Copyright (c) 2009. | |
| 9 * Jeremy Andrews <jeremy@tag1consulting.com>. | |
| 10 */ | |
| 11 | |
| 12 /** | |
| 13 * Implementation of hook_theme(). | |
| 14 */ | |
| 15 function ad_owners_theme() { | |
| 16 return array( | |
| 17 'ad_owner_permissions_form' => array( | |
| 18 'arguments' => array( | |
| 19 'form' => NULL, | |
| 20 ), | |
| 21 ), | |
| 22 ); | |
| 23 }; | |
| 24 | |
| 25 /** | |
| 26 * Implementation of hook_menu(). | |
| 27 */ | |
| 28 function ad_owners_menu() { | |
| 29 $items = array(); | |
| 30 | |
| 31 $items['node/%node/adowners'] = array( | |
| 32 'title' => 'Ad owners', | |
| 33 'page callback' => 'ad_owners_overview', | |
| 34 'page arguments' => array(1), | |
| 35 'access callback' => 'ad_owners_access', | |
| 36 'access arguments' => array(1), | |
| 37 'type' => MENU_LOCAL_TASK, | |
| 38 'weight' => 5, | |
| 39 ); | |
| 40 $items['node/%node/adowners/list'] = array( | |
| 41 'title' => 'List', | |
| 42 'access callback' => 'ad_adaccess', | |
| 43 'access arguments' => array(1, 'manage owners'), | |
| 44 'type' => MENU_DEFAULT_LOCAL_TASK, | |
| 45 'weight' => 0, | |
| 46 ); | |
| 47 $items['node/%node/adowners/%user/permissions'] = array( | |
| 48 'title callback' => 'owner_permissions_title', | |
| 49 'title arguments' => array('!owner' => 3), | |
| 50 'page callback' => 'drupal_get_form', | |
| 51 'page arguments' => array('ad_owner_permissions_form', 1, 3), | |
| 52 'access callback' => 'ad_adaccess', | |
| 53 'access arguments' => array(1, 'manage owners'), | |
| 54 'type' => MENU_LOCAL_TASK, | |
| 55 'weight' => 2, | |
| 56 ); | |
| 57 $items['node/%node/adowners/%user/remove'] = array( | |
| 58 'title' => 'Remove owner', | |
| 59 'page callback' => 'drupal_get_form', | |
| 60 'page arguments' => array('ad_owner_remove_form', 1, 3), | |
| 61 'access callback' => 'ad_adaccess', | |
| 62 'access arguments' => array(1, 'manage owners'), | |
| 63 'type' => MENU_CALLBACK, | |
| 64 'weight' => 6, | |
| 65 ); | |
| 66 $items['node/%node/adowners/add'] = array( | |
| 67 'title' => 'Add owner', | |
| 68 'page callback' => 'drupal_get_form', | |
| 69 'page arguments' => array('ad_owners_add_form', 1), | |
| 70 'access callback' => 'ad_adaccess', | |
| 71 'access arguments' => array(1, 'manage owners'), | |
| 72 'type' => MENU_LOCAL_TASK, | |
| 73 'weight' => 4, | |
| 74 ); | |
| 75 | |
| 76 return $items; | |
| 77 } | |
| 78 | |
| 79 /** | |
| 80 * Menu item access callback. | |
| 81 */ | |
| 82 function ad_owners_access($node) { | |
| 83 return ($node->type == 'ad') && ad_adaccess($node, 'manage owners'); | |
| 84 } | |
| 85 | |
| 86 /** | |
| 87 * Menu item title callback - use the user name | |
| 88 */ | |
| 89 function owner_permissions_title($account) { | |
| 90 return t('!owner\'s permissions', array('!owner' => $account->name)); | |
| 91 } | |
| 92 | |
| 93 /** | |
| 94 * Implementation of hook_form_alter(). | |
| 95 */ | |
| 96 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') { | |
| 98 if (!isset($form['adtype'])) { | |
| 99 $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); | |
| 100 } | |
| 101 $permissions = module_invoke_all('adapi', 'permissions', NULL); | |
| 102 $form['permissions'] = array( | |
| 103 '#type' => 'fieldset', | |
| 104 '#title' => t('Permissions'), | |
| 105 '#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)))), | |
| 107 ); | |
| 108 $form['permissions']['default_permissions'] = array( | |
| 109 '#type' => 'checkboxes', | |
| 110 '#title' => t('Default permissions for <em>!type</em> owners', array('!type' => ad_get_types('name', arg(4)))), | |
| 111 '#options' => drupal_map_assoc($permissions), | |
| 112 '#default_value' => variable_get('ad_'. arg(4) .'_default_permissions', array('access statistics', 'access click history', 'manage status')), | |
| 113 ); | |
| 114 if (isset($form['save'])) { | |
| 115 $form['save']['#weight'] = 10; | |
| 116 } | |
| 117 if (isset($form['#submit']) && is_array($form['#submit'])) { | |
| 118 $form['#submit'] = array('ad_global_settings_submit') + $form['#submit']; | |
| 119 } | |
| 120 else { | |
| 121 $form['#submit'] = array('ad_global_settings_submit'); | |
| 122 } | |
| 123 } | |
| 124 } | |
| 125 | |
| 126 /** | |
| 127 * Implementation of hook_nodeapi(). | |
| 128 */ | |
| 129 function ad_owners_nodeapi(&$node, $op, $teaser, $page) { | |
| 130 global $user; | |
| 131 | |
| 132 switch ($op) { | |
| 133 case 'insert': | |
| 134 case 'update': | |
| 135 if (isset($node->adtype)) { | |
| 136 // Be sure ad owner has at least default ad permissions. | |
| 137 ad_owners_add($node, $node->uid); | |
| 138 ad_host_id_create($node->uid); | |
| 139 } | |
| 140 break; | |
| 141 case 'delete': | |
| 142 // 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); | |
| 144 while ($id = db_fetch_object($result)) { | |
| 145 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $id->oid); | |
| 146 $owner = user_load(array('uid' => $id->uid)); | |
| 147 // Tell plug-in modules to clean up. | |
| 148 module_invoke_all('adowners', 'remove', $id->oid, $owner); | |
| 149 } | |
| 150 db_query('DELETE FROM {ad_owners} WHERE aid = %d', $node->nid); | |
| 151 break; | |
| 152 } | |
| 153 } | |
| 154 | |
| 155 /** | |
| 156 * Implementation of hook_adapi(). | |
| 157 */ | |
| 158 function ad_owners_adapi($op, $node = NULL) { | |
| 159 switch ($op) { | |
| 160 case 'permissions': | |
| 161 return array('manage owners'); | |
| 162 break; | |
| 163 } | |
| 164 } | |
| 165 | |
| 166 /** | |
| 167 * Determine whether the ad owner has a given privilege. | |
| 168 * | |
| 169 * @param $ad | |
| 170 * Node object or aid of advertisement. | |
| 171 * @param $permission | |
| 172 * Special Ad owners permission which should be checked (such as 'manage owners') | |
| 173 * @param $account | |
| 174 * User object, which are accessing the ad or current user by default. | |
| 175 */ | |
| 176 function ad_owners_adaccess($ad, $permission, $account = NULL) { | |
| 177 global $user; | |
| 178 static $permissions = array(); | |
| 179 | |
| 180 if (!isset($account)) { | |
| 181 $account = $user; | |
| 182 } | |
| 183 | |
| 184 $aid = 0; | |
| 185 if (isset($ad)) { | |
| 186 if (is_numeric($ad)) { | |
| 187 $aid = $ad; | |
| 188 } | |
| 189 else if (is_object($ad) && isset($ad->nid)) { | |
| 190 $aid = $ad->nid; | |
| 191 } | |
| 192 } | |
| 193 | |
| 194 if (!isset($permissions[$aid][$account->uid])) { | |
| 195 $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); | |
| 196 $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); | |
| 197 } | |
| 198 $access = ''; | |
| 199 if (is_array($permission)) { | |
| 200 foreach ($permission as $perm) { | |
| 201 $access |= in_array($perm, $permissions[$aid][$account->uid]); | |
| 202 } | |
| 203 } | |
| 204 else { | |
| 205 $access = in_array($permission, $permissions[$aid][$account->uid]); | |
| 206 } | |
| 207 | |
| 208 return $access; | |
| 209 } | |
| 210 | |
| 211 | |
| 212 /** | |
| 213 * TODO: Make this themeable. | |
| 214 * TODO: Group permissions by module. | |
| 215 * TODO: Allow modules to define default value for permission. | |
| 216 */ | |
| 217 function ad_owners_overview($node) { | |
| 218 drupal_set_title(t('Ad owners')); | |
| 219 | |
| 220 // Be sure the node owner is listed as an ad owner | |
| 221 if (!db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $node->uid, $node->nid))) { | |
| 222 ad_owners_add($node, $node->uid); | |
| 223 } | |
| 224 | |
| 225 $header = array( | |
| 226 array('data' => t('Username'), 'field' => 'uid'), | |
| 227 array('data' => t('Options')), | |
| 228 ); | |
| 229 | |
| 230 $sql = "SELECT a.uid, u.name FROM {ad_owners} a INNER JOIN {users} u ON a.uid = u.uid WHERE aid = %d"; | |
| 231 $sql .= tablesort_sql($header); | |
| 232 $result = pager_query($sql, 25, 0, NULL, $node->nid); | |
| 233 | |
| 234 $rows = array(); | |
| 235 while ($owner = db_fetch_object($result)) { | |
| 236 $row = array(); | |
| 237 $row[] = $owner->name; | |
| 238 $options = array(); | |
| 239 // first option is 'permissions', plug-ins come afterwards | |
| 240 $options[] = l(t('permissions'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/permissions'); | |
| 241 $options = array_merge($options, module_invoke_all('adowners', 'overview', $node->nid, $owner->uid)); | |
| 242 // node owner has to remain an ad owner | |
| 243 if ($node->uid != $owner->uid) { | |
| 244 $options[] = l(t('remove'), 'node/'. $node->nid .'/adowners/'. $owner->uid .'/remove'); | |
| 245 } | |
| 246 $options = implode(' | ', $options); | |
| 247 $row[] = $options; | |
| 248 $rows[] = $row; | |
| 249 } | |
| 250 | |
| 251 $output = theme('table', $header, $rows); | |
| 252 $output .= theme('pager', NULL, 25, 0); | |
| 253 | |
| 254 return $output; | |
| 255 } | |
| 256 | |
| 257 /** | |
| 258 * A simple form for adding new users as owners of ads. | |
| 259 */ | |
| 260 function ad_owners_add_form($form_state, $node) { | |
| 261 $form = array(); | |
| 262 drupal_set_title(t('Add owner')); | |
| 263 | |
| 264 $form['aid'] = array( | |
| 265 '#type' => 'value', | |
| 266 '#value' => $node->nid, | |
| 267 ); | |
| 268 $form['username'] = array( | |
| 269 '#autocomplete_path' => 'user/autocomplete', | |
| 270 '#description' => t('Enter the username of the user who should have ownership permissions on this advertisement.'), | |
| 271 '#required' => TRUE, | |
| 272 '#type' => 'textfield', | |
| 273 '#title' => t('Username'), | |
| 274 ); | |
| 275 $form['save'] = array( | |
| 276 '#type' => 'submit', | |
| 277 '#value' => t('Add owner'), | |
| 278 ); | |
| 279 | |
| 280 return $form; | |
| 281 } | |
| 282 | |
| 283 function ad_owners_add_form_validate($form, &$form_state) { | |
| 284 $owner = user_load(array('name' => $form_state['values']['username'])); | |
| 285 if (!is_object($owner)) { | |
| 286 form_set_error('username', t('The specified username %username does not exist.', array('%username' => $form_state['values']['username']))); | |
| 287 } | |
| 288 else if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $owner->uid, $form_state['values']['aid']))) { | |
| 289 form_set_error('username', t('The specified user %username is already an owner of this ad.', array('%username' => $form_state['values']['username']))); | |
| 290 } | |
| 291 else if (!user_access('edit own advertisements', $owner) && | |
| 292 !user_access('administer advertisements', $owner)) { | |
| 293 form_set_error('username', t('The specified user %username does not have <em>edit own advertisements</em> nor <em>administer advertisements</em> permissions. The user must be !assigned to a !role with these privileges before you can add them as an ad owner.', array('%username' => $form_state['values']['username'], '!assigned' => l(t('assigned'), "user/$owner->uid/edit"), '!role' => l(t('role'), 'admin/user/permissions')))); | |
| 294 } | |
| 295 module_invoke_all('adowners', 'validate', $owner, $form_state['values']['aid']); | |
| 296 } | |
| 297 | |
| 298 function ad_owners_add_form_submit($form, &$form_state) { | |
| 299 $owner = user_load(array('name' => $form_state['values']['username'])); | |
| 300 $node = node_load($form_state['values']['aid']); | |
| 301 if (!(ad_owners_add($node, $owner->uid))) { | |
| 302 form_set_error('username', t('The user is already an owner of the ad.')); | |
| 303 } | |
| 304 else { | |
| 305 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'); | |
| 307 } | |
| 308 } | |
| 309 | |
| 310 function ad_is_owner($aid, $account = NULL) { | |
| 311 global $user; | |
| 312 if (!isset($account)) { | |
| 313 $account = $user; | |
| 314 } | |
| 315 if (db_result(db_query('SELECT oid FROM {ad_owners} WHERE uid = %d AND aid = %d', $account->uid, $aid))) { | |
| 316 return 1; | |
| 317 } | |
| 318 else { | |
| 319 return 0; | |
| 320 } | |
| 321 } | |
| 322 | |
| 323 /** | |
| 324 * Add an owner to an ad. | |
| 325 */ | |
| 326 function ad_owners_add($node, $owner, $permissions = array()) { | |
| 327 $rc = 0; | |
| 328 $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))) { | |
| 330 db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); | |
| 331 $rc = db_affected_rows() ? 1 : 0; | |
| 332 | |
| 333 if (!$permissions) { | |
| 334 $permissions = variable_get('ad_'. $node->adtype .'_default_permissions', array('access statistics', 'access click history', 'manage status')); | |
| 335 } | |
| 336 | |
| 337 $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); | |
| 339 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $oid, implode('|,|', $permissions)); | |
| 340 module_invoke_all('adowners', 'add', $node, array('oid' => $oid, 'uid' => $uid, 'aid' => $node->nid)); | |
| 341 } | |
| 342 return $rc; | |
| 343 } | |
| 344 | |
| 345 /** | |
| 346 * Create a unique host id for each ad owner, used when displaying ads remotely. | |
| 347 */ | |
| 348 function ad_host_id_create($uid) { | |
| 349 $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); | |
| 350 if (!$hostid) { | |
| 351 $hostid = md5($uid . time()); | |
| 352 db_query("INSERT INTO {ad_hosts} (uid, hostid) VALUES (%d, '%s')", $uid, md5($uid . time())); | |
| 353 } | |
| 354 | |
| 355 return $hostid; | |
| 356 } | |
| 357 | |
| 358 /** | |
| 359 * Removes ad owner from an ad. | |
| 360 */ | |
| 361 function ad_owner_remove_form($form_state, $node, $owner) { | |
| 362 $form['aid'] = array( | |
| 363 '#type' => 'value', | |
| 364 '#value' => $node->nid, | |
| 365 ); | |
| 366 $form['uid'] = array( | |
| 367 '#type' => 'value', | |
| 368 '#value' => $owner->uid, | |
| 369 ); | |
| 370 | |
| 371 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)), | |
| 373 "node/$aid/adowners", | |
| 374 t('This action cannot be undone.'), | |
| 375 t('Remove'), | |
| 376 t('Cancel') | |
| 377 ); | |
| 378 } | |
| 379 | |
| 380 /** | |
| 381 * Don't allow the removal of the primary owner of the advertisement. | |
| 382 */ | |
| 383 function ad_owner_remove_form_validate($form, &$form_state) { | |
| 384 $node = node_load($form_state['values']['aid']); | |
| 385 if ($node->uid == $form_state['values']['uid']) { | |
| 386 $owner = user_load(array('uid' => $form_state['values']['uid'])); | |
| 387 drupal_set_message(t('%name is the primary owner of this advertisement. You cannot remove the primary owner.', array('%name' => $owner->name)), 'error'); | |
| 388 | |
| 389 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; | |
| 390 } | |
| 391 } | |
| 392 | |
| 393 /** | |
| 394 * Remove the ad owner, and all associated permissions. | |
| 395 */ | |
| 396 function ad_owner_remove_form_submit($form, &$form_state) { | |
| 397 $oid = db_result(db_query('SELECT oid FROM {ad_owners} WHERE aid = %d AND uid = %d', $form_state['values']['aid'], $form_state['values']['uid'])); | |
| 398 db_query('DELETE FROM {ad_owners} WHERE oid = %d', $oid); | |
| 399 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $oid); | |
| 400 $owner = user_load(array('uid' => $form_state['values']['uid'])); | |
| 401 module_invoke_all('adowners', 'remove', $oid, $owner); | |
| 402 drupal_set_message(t('The ad owner %name has been removed.', array('%name' => $owner->name))); | |
| 403 | |
| 404 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; | |
| 405 } | |
| 406 | |
| 407 | |
| 408 /** | |
| 409 * Display a form with all available permissions and their status for the | |
| 410 * selected ad and ad owner. | |
| 411 */ | |
| 412 function ad_owner_permissions_form($form_state, $node, $user) { | |
| 413 drupal_set_title(t('Permissions')); | |
| 414 | |
| 415 $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))); | |
| 417 | |
| 418 $form['header'] = array( | |
| 419 '#type' => 'value', | |
| 420 '#value' => array(t('permissions'), t('granted')) | |
| 421 ); | |
| 422 | |
| 423 $rows = array(); | |
| 424 | |
| 425 $permissions = module_invoke_all('adapi', 'permissions', $node); | |
| 426 foreach ($permissions as $permission) { | |
| 427 $form['permission'][$permission] = array( | |
| 428 '#value' => t($permission), | |
| 429 ); | |
| 430 $form['grant'][str_replace(' ', '_', $permission)] = array( | |
| 431 '#type' => 'checkbox', | |
| 432 '#default_value' => in_array($permission, $granted) ? 1 : 0, | |
| 433 ); | |
| 434 } | |
| 435 | |
| 436 $form['oid'] = array( | |
| 437 '#type' => 'hidden', | |
| 438 '#value' => $oid, | |
| 439 ); | |
| 440 | |
| 441 $form['aid'] = array( | |
| 442 '#type' => 'hidden', | |
| 443 '#value' => $node->nid, | |
| 444 ); | |
| 445 | |
| 446 $form['uid'] = array( | |
| 447 '#type' => 'hidden', | |
| 448 '#value' => $user->uid, | |
| 449 ); | |
| 450 | |
| 451 $form['submit'] = array( | |
| 452 '#type' => 'submit', | |
| 453 '#value' => t('Save'), | |
| 454 ); | |
| 455 | |
| 456 return $form; | |
| 457 } | |
| 458 | |
| 459 /** | |
| 460 * Display ad owner permissions in a simple table. | |
| 461 */ | |
| 462 function theme_ad_owner_permissions_form($form) { | |
| 463 $output = drupal_render($form['options']); | |
| 464 foreach (element_children($form['permission']) as $key) { | |
| 465 $row = array(); | |
| 466 $row[] = drupal_render($form['permission'][$key]); | |
| 467 $row[] = drupal_render($form['grant'][str_replace(' ', '_', $key)]); | |
| 468 $rows[] = $row; | |
| 469 } | |
| 470 | |
| 471 $output = theme('table', $form['header']['#value'], $rows); | |
| 472 $output .= drupal_render($form); | |
| 473 return $output; | |
| 474 } | |
| 475 | |
| 476 /** | |
| 477 * Store the ad owner's updated permissions in the ad_permissions table. | |
| 478 */ | |
| 479 function ad_owner_permissions_form_submit($form, &$form_state) { | |
| 480 $permissions = module_invoke_all('adapi', 'permissions', array()); | |
| 481 $perms = array(); | |
| 482 foreach ($permissions as $permission) { | |
| 483 $perm = str_replace(' ', '_', $permission); | |
| 484 if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { | |
| 485 $perms[] = $permission; | |
| 486 } | |
| 487 } | |
| 488 db_query('DELETE FROM {ad_permissions} WHERE oid = %d', $form_state['values']['oid']); | |
| 489 db_query("INSERT INTO {ad_permissions} VALUES(%d, '%s')", $form_state['values']['oid'], implode('|,|', $perms)); | |
| 490 | |
| 491 drupal_set_message(t('The permissions have been saved.')); | |
| 492 $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; | |
| 493 } |
