? node_privacy_byrole.diff
Index: node_privacy_byrole.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_privacy_byrole/node_privacy_byrole.module,v
retrieving revision 1.26
diff -u -F^f -r1.26 node_privacy_byrole.module
--- node_privacy_byrole.module	29 Nov 2005 23:15:11 -0000	1.26
+++ node_privacy_byrole.module	17 Dec 2005 04:13:41 -0000
@@ -153,6 +153,78 @@ function node_privacy_byrole_node_grants
   return array('node_privacy_byrole_role' => array_keys(is_array($user->roles) ? $user->roles : array()), 'node_privacy_byrole_user' => array($user->uid));
 }
 
+function node_privacy_byrole_form_alter($form_id, &$form) {
+  if (isset($form['type']) && $form['type']['#value'] .'_node_settings' == $form_id) {
+    $type = $form['type']['#value'];
+    $roles_array = user_roles();
+    $roleids_array = array_keys($roles_array);
+    
+    $form ['npbr_workflow_settings'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('node privacy by role'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#weight' => 0
+    );
+    
+    $form['npbr_workflow_settings']['npbr_default_view_perms'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Default View Permissions'),
+      '#collapsible' => FALSE,
+      '#collapsed' => FALSE,
+      '#description' => t('Select by role which users can, by default, view nodes of this type.'),
+      '#weight' => 0
+    );
+    
+    $form['npbr_workflow_settings']['npbr_default_edit_perms'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Default Edit Permissions'),
+      '#collapsible' => FALSE,
+      '#collapsed' => FALSE,
+      '#description' => t('Select by role which users can, by default, edit nodes of this type.'),
+      '#weight' => 0
+    );
+      
+    $form['npbr_workflow_settings']['npbr_default_meta_perms'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Permissions For Permissions'),
+      '#collapsible' => FALSE,
+      '#collapsed' => FALSE,
+      '#description' => t('Select, by role, which users can change permissions, on a node-by-node basis, from the default permissions set for this node type.'),
+      '#weight' => 0
+    );
+   
+    // Check for existing settings and prefill those with settings already set. Use 0 for default-default (i.e., 
+    // nodes whose default permissions have never been set).
+
+    foreach ($roleids_array as $roleid) {
+      $form['npbr_workflow_settings']['npbr_default_view_perms']['npbr_forview_'. $type .'_default_'. $roleid] = array(
+        '#type' => 'checkbox',
+        '#title' => t($roles_array[$roleid]),
+        '#return_value' => 1,
+        '#default_value' => variable_get('npbr_forview_'. $type .'_default_'. $roleid, FALSE)
+      );
+      
+      $form['npbr_workflow_settings']['npbr_default_edit_perms']['npbr_foredit_'. $type .'_default_'. $roleid] = array(
+        '#type' => 'checkbox',
+        '#title' => t($roles_array[$roleid]),
+        '#return_value' => 1,
+        '#default_value' => variable_get('npbr_foredit_'. $type .'_default_'. $roleid, FALSE)
+      );
+      
+      $form['npbr_workflow_settings']['npbr_default_meta_perms']['npbr_metaperm_'. $type .'_'. $roleid] = array(
+        '#type' => 'checkbox',
+        '#title' => t($roles_array[$roleid]),
+        '#return_value' => 1,
+        '#default_value' => variable_get('npbr_metaperm_'. $type .'_'. $roleid, FALSE),
+      );
+    }
+  }
+  elseif (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
+    node_privacy_byrole_formitems($form);
+  }
+}
+
 /**
  * Implementation of hook_nodeapi().
  *
@@ -163,7 +235,6 @@ function node_privacy_byrole_nodeapi(&$n
   $permitted_roles = _node_privacy_byrole_meta_permitted_roles($node->type);
     
   $user_has_meta_perm = ($user->uid == 1 || count(array_intersect(_node_privacy_byrole_meta_permitted_roles($node->type), array_keys(is_array($user->roles) ? $user->roles : array()))) ? TRUE : FALSE);
-  
   switch ($op) {
     case 'form admin':
       return '';
@@ -171,11 +242,6 @@ function node_privacy_byrole_nodeapi(&$n
       // When a node is deleted, delete any relevant grants within realms managed by this module.
       db_query('DELETE FROM {node_access} WHERE nid = %d AND (realm = \'node_privacy_byrole_user\' OR realm = \'node_privacy_byrole_role\')', $node->nid);
       break;
-    case 'form pre':
-      if ($user_has_meta_perm) {
-        return node_privacy_byrole_formitems($node);
-      }
-      break;
     case 'validate':
       if (variable_get('node_privacy_byrole_enabled', FALSE)) {
         _node_privacy_byrole_set_defaults($node, !$user_has_meta_perm);
@@ -187,8 +253,6 @@ function node_privacy_byrole_nodeapi(&$n
         }
       }
       break;
-    case 'settings':
-      return array('Node privacy by role' => node_privacy_byrole_workflow_settings($node));
     case 'fields':
       break;
     case 'insert':
@@ -261,43 +325,6 @@ function _node_privacy_byrole_meta_permi
 }
 
 
-
-/**
- * This function returns form items to be displayed on the default workflow page for a node type.
- *
- * @param $node
- *  An object with a 'type' attribute for one of the node types.
- * 
- * @return
- *  A string of HTML form elements used to set default node_privacy_byrole permissions for a node type
- *  and permissions for which roles are allowed to change permissions from the default permissions. 
- */
-function node_privacy_byrole_workflow_settings(&$node) {
-  $formitems_view_default = '';
-  $formitems_edit_default = '';
-  $formitems_update_perms = '';
-  
-  $roles_array = user_roles();
-  $roleids_array = array_keys($roles_array);
-  // Check for existing settings and prefill those with settings already set. Use 0 for default-default (i.e., 
-  // nodes whose default permissions have never been set).
-
-  $formitems_view = '';
-  $formitems_edit = '';
-  $formitems_perm = '';
-  foreach ($roleids_array as $roleid) {
-    $formitems_view .= form_checkbox(t($roles_array[$roleid]), 'npbr_forview_'. $node->type .'_default_'. $roleid, 1, variable_get('npbr_forview_'. $node->type .'_default_'. $roleid, FALSE));
-    $formitems_edit .= form_checkbox(t($roles_array[$roleid]), 'npbr_foredit_'. $node->type .'_default_'. $roleid, 1, variable_get('npbr_foredit_'. $node->type .'_default_'. $roleid, FALSE));
-    $formitems_perm .= form_checkbox(t($roles_array[$roleid]), 'npbr_metaperm_'. $node->type .'_'. $roleid, 1, variable_get('npbr_metaperm_'. $node->type .'_'. $roleid, FALSE));
-  }
-  
-
-  $formgroup_view = form_group('Default View Permissions', $formitems_view, t('Select by role which users can, by default, view nodes of this type.'));
-  $formgroup_edit = form_group('Default Edit Permissions', $formitems_edit, t('Select by role which users can, by default, edit nodes of this type.'));
-  $formgroup_perm = form_group('Permissions for permissions', $formitems_perm, t('Select, by role, which users can change permissions, on a node-by-node basis, from the default permissions set for this node type.'));
-  return ($formgroup_view . $formgroup_edit . $formgroup_perm);
-}
-
 /**
  * Saves node permissions upon node submission.
  *
@@ -348,7 +375,9 @@ function node_privacy_byrole_delete_perm
        db_query('DELETE FROM {node_access} WHERE nid = %d AND (realm = \'node_privacy_byrole_user\' OR realm = \'node_privacy_byrole_role\')', $node->nid);
 }
 
-function node_privacy_byrole_formitems(&$node) {
+
+
+function node_privacy_byrole_formitems(&$form) {
   if (!variable_get('node_privacy_byrole_enabled', FALSE)) {
     if (!user_access('administer site configuration')) {
       return '';
@@ -359,19 +388,26 @@ function node_privacy_byrole_formitems(&
     }
   }
 
+  $type = $form['type']['#value'];
+  
   $op = $_POST['op'];
   $formitems_view = '';
   $formitems_edit = '';
   
-  $rows = array();
-  $header = array(t('Role'), t('View'), t('Edit'));
-  
   $roles_array = user_roles();
   $roleids_array = array_keys($roles_array);
   // if the node already exists, return a form where the permissions already granted are already marked in checkboxes,
   // else, return a form where all the checkboxes are marked.
-  if ($node->nid  && $op != t('Preview')) {
-    $current_perms_results = db_query('SELECT gid, grant_view, grant_update FROM {node_access} WHERE nid = %d AND (grant_view = 1 OR grant_update = 1) AND realm = \'node_privacy_byrole_role\'', $node->nid);
+  $form['node_privacy_byrole'] = array(
+    '#theme' => 'npbr_formitems',
+    '#type' => 'fieldset',
+    '#title' => t('View/Edit Permissions'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE
+  );
+  
+  if ($form['nid']['#value']  && $op != t('Preview')) {
+    $current_perms_results = db_query('SELECT gid, grant_view, grant_update FROM {node_access} WHERE nid = %d AND (grant_view = 1 OR grant_update = 1) AND realm = \'node_privacy_byrole_role\'', $form['nid']['#value']);
     $already_permitted_forview_rids = array();
     $already_permitted_foredit_rids = array();
     while($permitted_role = db_fetch_object($current_perms_results)) {
@@ -380,52 +416,128 @@ function node_privacy_byrole_formitems(&
     }
 
     foreach ($roleids_array as $roleid) {
-      $row = array(
-               t($roles_array[$roleid]),
-               form_checkbox(NULL, 'node_privacy_byrole_forview_'. $roleid, 1, $already_permitted_forview_rids[$roleid]),
-               form_checkbox(NULL, 'node_privacy_byrole_foredit_'. $roleid, 1, $already_permitted_foredit_rids[$roleid])
-             );
-      $rows[] = $row;
+      $role_name = t($roles_array[$roleid]);
+      
+      $form['node_privacy_byrole']['roles'][$role_name] = array();
+
+      $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_forview_'. $roleid] = array(
+        '#type' => 'checkbox',
+        '#title' => NULL,
+        '#return_value' => 1,
+        '#default_value' => $already_permitted_forview_rids[$roleid]
+      );
+      
+      $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_foredit_'. $roleid] = array(
+        '#type' => 'checkbox',
+        '#title' => NULL,
+        '#return_value' => 1,
+        '#default_value' => $already_permitted_foredit_rids[$roleid],
+      );
+    
+      
     }
   }
   else { // the following generates the form based on the assumption that the node is being created or previewed
     if ($op == t('Preview')) { // case where node is being previewed
       $edit = $_POST['edit'];
+      
       foreach ($roleids_array as $roleid) {
-        $rows[] = array(
-                    t($roles_array[$roleid]),
-                    form_checkbox(NULL, 'node_privacy_byrole_forview_'. $roleid, 1, $edit['node_privacy_byrole_forview_'. $roleid]),
-                    form_checkbox(NULL, 'node_privacy_byrole_foredit_'. $roleid, 1, $edit['node_privacy_byrole_foredit_'. $roleid])
-                  );    
+        $role_name = t($roles_array[$roleid]);
+        $form['node_privacy_byrole']['roles'][$role_name] = array();
+        $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_forview_'. $roleid] = array(
+          '#type' => 'checkbox',
+          '#title' => NULL,
+          '#return_value' => 1,
+          '#default_value' => $edit['node_privacy_byrole_forview_'. $roleid],
+        );
+        $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_foredit_'. $roleid] = array(
+          '#type' => 'checkbox',
+          '#title' => NULL,
+          '#return_value' => 1,
+          '#default_value' => $edit['node_privacy_byrole_foredit_'. $roleid],
+        );
       }
     }
     else { // case where node is being created
       foreach ($roleids_array as $roleid) {
-        $rows[] = array(
-                    t($roles_array[$roleid]),
-                    form_checkbox(NULL, 'node_privacy_byrole_forview_'. $roleid, 1, variable_get('npbr_forview_'. $node->type .'_default_'. $roleid, 0)),
-                    form_checkbox(NULL, 'node_privacy_byrole_foredit_'. $roleid, 1, variable_get('npbr_foredit_'. $node->type .'_default_'. $roleid, 0))
-                  );
+        $role_name = t($roles_array[$roleid]);
+
+        $form[$role_name] = array();
+        
+        $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_forview_'. $roleid] = array(
+          '#type' => 'checkbox',
+          '#title' => NULL,
+          '#return_value' => 1,
+          '#default_value' => variable_get('npbr_forview_'. $type .'_default_'. $roleid, 0),
+        );
+        
+        $form['node_privacy_byrole']['roles'][$role_name]['node_privacy_byrole_foredit_'. $roleid] = array(
+          '#type' => 'checkbox',
+          '#title' => NULL,
+          '#return_value' => 1,
+          '#default_value' => variable_get('npbr_foredit_'. $type .'_default_'. $roleid, 0),
+        );
       }
     }
   }
+}
+
+function theme_npbr_formitems($form) {
+  $header = array(t('Role'), t('View'), t('Edit'));
+  $rows = array();
+  foreach (element_children($form['roles']) as $rolename) {
+    $row = array();
+    $row[] = $rolename;
+    /*
+    foreach ($checkboxes as $checkbox) {
+      $row[] = form_render($checkbox);
+    }
+    */
+    foreach (element_children($form['roles'][$rolename]) as $checkboxindex) {
+      $row[] = form_render($form['roles'][$rolename][$checkboxindex]);
+    }
+    $rows[] = $row;
+  }
   
-  return form_item(t('View/Edit Permissions'), theme('table', $header, $rows), t('Select which users can view/edit your post based on their role.'));
+  //return theme('table', $header, $rows, array(), t('Select which users can view/edit your post based on their role.'));
+  return theme('form_element', t('View/Edit Permissions'), theme('table', $header, $rows), t('Select which users can view/edit your post based on their role.'));
 }
 
 function node_privacy_byrole_settings() {
-  if (variable_get('node_privacy_byrole_settings_changed', FALSE)) {
-    cache_clear_all();
-    _node_privacy_byrole_update_db();
+  if (isset($_POST['edit'])) {
+    $edit = $_POST['edit'];
+    // For some reason, it does not work when we try ($edit['node_privacy_byrole_enabled'] != $edit['node_privacy_byrole_enabled_previous')
+    // for the below if-condition
+    //if ($edit['node_privacy_byrole_enabled'] != $edit['node_privacy_byrole_enabled_previous']) {
+    if ((!$edit['node_privacy_byrole_enabled'] && $edit['node_privacy_byrole_enabled_previous']) ||
+        ($edit['node_privacy_byrole_enabled'] && !$edit['node_privacy_byrole_enabled_previous'])) {
+      cache_clear_all();
+      _node_privacy_byrole_update_db();
+    }
   }
-
-  $formitems = '';
-  $node_privacy_byrole_enabled = variable_get('node_privacy_byrole_enabled', FALSE);
-  $formitems .= form_hidden('node_privacy_byrole_settings_changed', 1);
-  $formitems .= form_radio(t('Enable the node_privacy_byrole module.'), 'node_privacy_byrole_enabled', 1,variable_get('node_privacy_byrole_enabled', FALSE) );
-  $formitems .= form_radio(t('Disable the node_privacy_byrole module.'), 'node_privacy_byrole_enabled', 0, !variable_get('node_privacy_byrole_enabled', FALSE) );
   
-  return $formitems; 
+  $form = array();
+  
+  if (isset($edit['node_privacy_byrole_enabled'])) {
+    $default = $edit['node_privacy_byrole_enabled'] ? 1 : 0;
+  }
+  else {
+    $default = variable_get('node_privacy_byrole_enabled', FALSE) ? 1 : 0;
+  }
+  
+  $form['node_privacy_byrole_enabled_previous'] = array(
+    '#type' => 'hidden',
+    '#value' => $default,
+  );
+  
+  $form['node_privacy_byrole_enabled'] = array(
+    '#type' => 'radios', 
+    '#default_value' => $default,
+    '#options' => array(1 => t('Enable the node_privacy_byrole module.'), 0 => t('Disable the node_privacy_byrole module.'))
+  );
+  
+  return $form;   
+  
 }
 
 /**
@@ -449,9 +561,8 @@ function node_privacy_byrole_settings() 
  * (0, 0, 'all', 1, 0, 0)
  */
 function _node_privacy_byrole_update_db() {
-  variable_set('node_privacy_byrole_settings_changed', FALSE);
-  
-  if (!variable_get('node_privacy_byrole_enabled', FALSE)) {
+  $edit = $_POST['edit'];
+  if (isset($edit['node_privacy_byrole_enabled']) && !$edit['node_privacy_byrole_enabled']) {
     // We use the delete statement to avoid inserting a duplicate entry into the database.
     // Without the DELETE query, this can happen when a site admin has already enabled the modules
     // from the settings page and goes back to it and resaves the enabled setting.
