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]));
+}