annotate owners/ad_owners.module @ 2:e5584a19768b ad

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