Mercurial > defr > drupal > ad
diff owners/ad_owners.module @ 1:948362c2a207 ad
update advertisement
author | pierre |
---|---|
date | Thu, 02 Apr 2009 15:28:21 +0000 |
parents | d8a3998dac8e |
children | e5584a19768b |
line wrap: on
line diff
--- a/owners/ad_owners.module Fri Feb 20 14:04:09 2009 +0000 +++ b/owners/ad_owners.module Thu Apr 02 15:28:21 2009 +0000 @@ -1,11 +1,11 @@ <?php -// $Id: ad_owners.module,v 1.1.2.8 2009/02/17 04:34:27 jeremy Exp $ +// $Id: ad_owners.module,v 1.1.2.8.2.6 2009/03/31 04:41:03 jeremy Exp $ /** * @file * Enhances the ad module to support ad owners. * - * Copyright (c) 2009. + * Copyright (c) 2008-2009. * Jeremy Andrews <jeremy@tag1consulting.com>. */ @@ -39,7 +39,7 @@ ); $items['node/%node/adowners/list'] = array( 'title' => 'List', - 'access callback' => 'ad_adaccess', + 'access callback' => 'ad_permission', 'access arguments' => array(1, 'manage owners'), 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => 0, @@ -49,7 +49,7 @@ 'title arguments' => array('!owner' => 3), 'page callback' => 'drupal_get_form', 'page arguments' => array('ad_owner_permissions_form', 1, 3), - 'access callback' => 'ad_adaccess', + 'access callback' => 'ad_permission', 'access arguments' => array(1, 'manage owners'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, @@ -58,7 +58,7 @@ 'title' => 'Remove owner', 'page callback' => 'drupal_get_form', 'page arguments' => array('ad_owner_remove_form', 1, 3), - 'access callback' => 'ad_adaccess', + 'access callback' => 'ad_permission', 'access arguments' => array(1, 'manage owners'), 'type' => MENU_CALLBACK, 'weight' => 6, @@ -67,7 +67,7 @@ 'title' => 'Add owner', 'page callback' => 'drupal_get_form', 'page arguments' => array('ad_owners_add_form', 1), - 'access callback' => 'ad_adaccess', + 'access callback' => 'ad_permission', 'access arguments' => array(1, 'manage owners'), 'type' => MENU_LOCAL_TASK, 'weight' => 4, @@ -77,10 +77,17 @@ } /** + * Implementation of hook_perm(). + */ +function ad_owners_perm() { + return array('grant default per ad type permissions'); +} + +/** * Menu item access callback. */ function ad_owners_access($node) { - return ($node->type == 'ad') && ad_adaccess($node, 'manage owners'); + return ($node->type == 'ad') && ad_permission($node->nid, 'manage owners'); } /** @@ -91,6 +98,22 @@ } /** + * Return array default permissions. + */ +function ad_owners_default_permissions() { + $permissions = module_invoke_all('adapi', 'permissions', NULL); + $all = array(); + $perms = array(); + foreach ($permissions as $permission => $default) { + if ($default) { + $perms[] = $permission; + } + $all[] = $permission; + } + return array('default' => $perms, 'all' => $all); +} + +/** * Implementation of hook_form_alter(). */ function ad_owners_form_alter(&$form, &$form_state, $form_id) { @@ -98,32 +121,57 @@ if (!isset($form['adtype'])) { $form['adtype'] = array('#type' => 'value', '#value' => arg(4)); } - $permissions = module_invoke_all('adapi', 'permissions', NULL); + + $perms = ad_owners_default_permissions(); $form['permissions'] = array( '#type' => 'fieldset', '#title' => t('Permissions'), '#collapsible' => TRUE, - '#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)))), + '#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)))), ); - $form['permissions']['default_permissions'] = array( - '#type' => 'checkboxes', - '#title' => t('Default permissions for <em>!type</em> owners', array('!type' => ad_get_types('name', arg(4)))), - '#options' => drupal_map_assoc($permissions), - '#default_value' => variable_get('ad_'. arg(4) .'_default_permissions', array('access statistics', 'access click history', 'manage status')), - ); + + $roles = user_roles(TRUE); + foreach ($roles as $rid => $role) { + $defaults = variable_get("ad_default_permissions_{$rid}_". $form['adtype']['#value'], $perms['default']); + $form['permissions']["role-$rid"] = array( + '#type' => 'fieldset', + '#title' => $role, + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + $form['permissions']["role-$rid"]["default_permissions_$rid"] = array( + '#type' => 'checkboxes', + '#title' => t('Default permissions for users in the <em>!role</em> role', array('!role' => $role)), + '#options' => drupal_map_assoc($perms['all']), + '#default_value' => $defaults, + ); + } if (isset($form['save'])) { $form['save']['#weight'] = 10; } if (isset($form['#submit']) && is_array($form['#submit'])) { - $form['#submit'] = array('ad_global_settings_submit') + $form['#submit']; + $form['#submit'] = array_merge(array('ad_owners_settings_submit'), $form['#submit']); } else { - $form['#submit'] = array('ad_global_settings_submit'); + $form['#submit'] = array('ad_owners_settings_submit'); } } } /** + * Submit handler for global settings of all ad types. + * @see ad_form_alter() + */ +function ad_owners_settings_submit($form, $form_state) { + $roles = user_roles(TRUE); + foreach ($roles as $rid => $role) { + variable_set("ad_default_permissions_{$rid}_". $form_state['values']['adtype'], $form_state['values']["default_permissions_$rid"]); + unset($form_state['values']["default_permissions_$rid"]); + } + unset($form_state['values']['adtype']); +} + +/** * Implementation of hook_nodeapi(). */ function ad_owners_nodeapi(&$node, $op, $teaser, $page) { @@ -135,7 +183,7 @@ if (isset($node->adtype)) { // Be sure ad owner has at least default ad permissions. ad_owners_add($node, $node->uid); - ad_host_id_create($node->uid); + ad_owners_create_hostid($node->uid); } break; case 'delete': @@ -158,7 +206,7 @@ function ad_owners_adapi($op, $node = NULL) { switch ($op) { case 'permissions': - return array('manage owners'); + return array('manage owners' => FALSE); break; } } @@ -307,7 +355,7 @@ } } -function ad_is_owner($aid, $account = NULL) { +function is_ad_owner($aid, $account = NULL) { global $user; if (!isset($account)) { $account = $user; @@ -330,8 +378,22 @@ db_query('INSERT INTO {ad_owners} (aid, uid) VALUES(%d, %d)', $node->nid, $uid); $rc = db_affected_rows() ? 1 : 0; - if (!$permissions) { - $permissions = variable_get('ad_'. $node->adtype .'_default_permissions', array('access statistics', 'access click history', 'manage status')); + if (empty($permissions)) { + // build permissions array from defaults + $perms = ad_owners_default_permissions(); + $owner = user_load($uid); + if (is_array($owner->roles)) { + foreach ($owner->roles as $rid => $role) { + $default = variable_get("ad_default_permissions_{$rid}_". $node->adtype, $perms['default']); + $new = array(); + foreach ($default as $key => $value) { + if ($value) { + $new[] = $value; + } + } + $permissions = $permissions + $new; + } + } } $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $node->nid, $uid)); @@ -345,7 +407,7 @@ /** * Create a unique host id for each ad owner, used when displaying ads remotely. */ -function ad_host_id_create($uid) { +function ad_owners_create_hostid($uid) { $hostid = db_result(db_query('SELECT hostid FROM {ad_hosts} WHERE uid = %d', $uid)); if (!$hostid) { $hostid = md5($uid . time()); @@ -370,7 +432,7 @@ return confirm_form($form, t('Are you sure you want to remove user %name as an owner of this advertisement?', array('%name' => $owner->name)), - "node/$aid/adowners", + "node/$node->nid/adowners", t('This action cannot be undone.'), t('Remove'), t('Cancel') @@ -417,13 +479,13 @@ $form['header'] = array( '#type' => 'value', - '#value' => array(t('permissions'), t('granted')) + '#value' => array(t('permission'), t('granted')) ); $rows = array(); $permissions = module_invoke_all('adapi', 'permissions', $node); - foreach ($permissions as $permission) { + foreach ($permissions as $permission => $default) { $form['permission'][$permission] = array( '#value' => t($permission), ); @@ -479,7 +541,7 @@ function ad_owner_permissions_form_submit($form, &$form_state) { $permissions = module_invoke_all('adapi', 'permissions', array()); $perms = array(); - foreach ($permissions as $permission) { + foreach ($permissions as $permission => $default) { $perm = str_replace(' ', '_', $permission); if (isset($form_state['values'][$perm]) && $form_state['values'][$perm] > 0) { $perms[] = $permission; @@ -491,3 +553,26 @@ drupal_set_message(t('The permissions have been saved.')); $form_state['redirect'] = 'node/'. $form_state['values']['aid'] .'/adowners'; } + +/** + * Determine whether the user has a given privilege. + */ +function ad_owners_permission($aid, $string, $account) { + static $permissions = array(); + + if (!isset($permissions[$aid][$account->uid])) { + $oid = db_result(db_query("SELECT oid FROM {ad_owners} WHERE aid = %d and uid = %d", $aid, $account->uid)); + if ($oid) { + $permissions[$aid][$account->uid] = explode('|,|', db_result(db_query("SELECT permissions FROM {ad_permissions} WHERE oid = %d", $oid))); + } + else { + $account = user_load($account->uid); + if (user_access('grant default per ad type permissions')) { + $perms = ad_owners_default_permissions(); + $permissions[$aid][$account->uid] = $perms['default']; + } + } + } + + return (in_array("$string", $permissions[$aid][$account->uid])); +}