merci-8.x-2.x-dev/modules/merci_permissions/merci_permissions.module
modules/merci_permissions/merci_permissions.module
<?php /** * @file * Provides functions for resetting permissions on the permission page. */ function merci_permissions_menu() { // Administration settings. $items['admin/merci/manage/permissions'] = array( 'title' => 'Permissions', 'page callback' => 'drupal_get_form', 'page arguments' => array('merci_permissions_form'), 'access callback' => 'user_access', 'access arguments' => array('administer site configuration'), 'description' => 'Configure reservation permissions for MERCI.', 'type' => MENU_NORMAL_ITEM, 'weight' => 3, ); return $items; } /** * Implements hook_theme(). */ function merci_permissions_theme() { return array( 'merci_permissions_form' => array( 'render element' => 'form', ), ); } /** * @todo Please document this function. * @see http://drupal.org/node/1354 */ function theme_merci_permissions_form($variables) { $form = $variables['form']; $roles = user_roles(); $rows = array(); foreach (element_children($form['permission']) as $key) { // Don't take form control structures if (is_array($form['permission'][$key])) { // Module name $row = array(); if (is_numeric($key)) { $row[] = array( 'data' => drupal_render($form['permission'][$key]), 'class' => array('module'), 'id' => 'module-' . $form['permission'][$key]['#id'], 'colspan' => count($form['role_names']['#value']) + 1, ); } else { $row[] = array( 'data' => drupal_render($form['permission'][$key]), 'class' => array('permission'), ); foreach (element_children($form['checkboxes']) as $rid) { if (is_array($form['checkboxes'][$rid])) { $form['checkboxes'][$rid][$key]['#title'] = $roles[$rid] . ': ' . $form['permission'][$key]['#markup']; $form['checkboxes'][$rid][$key]['#title_display'] = 'invisible'; $row[] = array( 'data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => array('checkbox'), ); } } } $rows[] = $row; } } $header[] = (t('Permission')); foreach (element_children($form['role_names']) as $rid) { if (is_array($form['role_names'][$rid])) { $header[] = array( 'data' => drupal_render($form['role_names'][$rid]), 'class' => array('checkbox'), ); } } $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'permissions'))); $output .= drupal_render_children($form); return $output; } /** * @todo Please document this function. * @see http://drupal.org/node/1354 */ function merci_permissions_form($form, &$form_state) { $role_names = user_roles(); // Retrieve role names for columns. $role_names = user_roles(); // Fetch permissions for all roles or the one selected role. $role_permissions = user_role_permissions($role_names); $merci_types = merci_permissions_load_merci_type_settings(); if (empty($merci_types)) { drupal_set_message(t("You need to add some reservable content types to make this form usefull.")); return; } $options = array(); $admin = array(); $form['permission'][] = array('#markup' => t("General Permissions")); //$form['permission']['admin all reservations'] = array('#markup' => t('Admin all reservations')); //$options['admin all reservations'] = ''; $merci_perms = merci_permission(); foreach ($merci_perms as $perm => $data) { $options[$perm] = ''; $form['permission'][$perm] = array('#markup' => t("@perm",array('@perm' => $perm))); foreach ($role_names as $rid => $name) { // Builds arrays for checked boxes for each role if (isset($role_permissions[$rid][$perm])) { $status[$rid][] = $perm; } } } $form['permission'][] = array( '#markup' => t('Bucket and Resource Permissions'), ); foreach ($merci_types as $type => $name) { $perm = "reserve $type"; $options[$perm] = ''; $form['permission'][$perm] = array('#markup' => t("@name", array('@name' => $name))); foreach ($role_names as $rid => $name) { // Builds arrays for checked boxes for each role if ( isset($role_permissions[$rid]['delete own ' . $type . ' content']) && isset($role_permissions[$rid]['edit own ' . $type . ' content']) ) { $status[$rid][] = $perm; } if ( isset($role_permissions[$rid]['delete any ' . $type . ' content']) && isset($role_permissions[$rid]['edit any ' . $type . ' content']) ) { if (!strstr($admin[$rid], 'false')) { $admin[$rid] = 'true'; } } else { $admin[$rid] = 'false'; } } } /* foreach ($role_names as $rid => $name) { if (strstr($admin[$rid], 'true')) { $status[$rid][] = 'admin all reservations'; } } */ // Have to build checkboxes here after checkbox arrays are built foreach ($role_names as $rid => $name) { $form['checkboxes'][$rid] = array( '#type' => 'checkboxes', '#options' => $options, '#default_value' => isset($status[$rid]) ? $status[$rid] : array(), ); $form['role_names']['#value'][] = $name; $form['role_names'][$rid] = array( '#markup' => $name, '#tree' => TRUE, ); } $form['buttons']['submit'] = array( '#type' => 'submit', '#value' => t('Save Permissions'), ); $form['#submit'][] = 'merci_permissions_settings_form_submit'; return $form; } /** * @todo Please document this function. * @see http://drupal.org/node/1354 */ function merci_permissions_load_merci_type_settings() { $result = db_query("SELECT nt.type,nt.name FROM {node_type} nt INNER JOIN {merci_node_type} m ON nt.type = m.type WHERE m.merci_type_setting <> :typesetting", array(':typesetting' => 'disabled')); $merci_types = array(); foreach($result as $merci_type) { $merci_types[$merci_type->type] = $merci_type->name; } return $merci_types; } /** * @todo Please document this function. * @see http://drupal.org/node/1354 */ function merci_permissions_settings_form_submit($form, &$form_state) { $result = db_query('SELECT * FROM {role}'); $merci_types = merci_permissions_load_merci_type_settings(); $merci_perms = merci_permission(); foreach($result as $role) { if (isset($form_state['values'][$role->rid])) { $add_perms = array(); $revoke_perms = array(); foreach ($form_state['values'][$role->rid] as $key => $value) { list($cruft, $type) = explode(' ', $key); $perms = array(); if (array_key_exists($type, $merci_types)) { $perms[] = "edit own $type content"; $perms[] = "delete own $type content"; if ($value) { $add_perms = array_merge($perms, $add_perms); } else { $revoke_perms = array_merge($perms, $revoke_perms); } } /* elseif (strstr('admin all reservations', $key)) { foreach ($merci_types as $type => $name) { $perms[] = "edit own $type content"; $perms[] = "delete own $type content"; $perms[] = "delete any $type content"; $perms[] = "edit any $type content"; } if ($value) { $add_perms = array_merge($perms, $add_perms); } else { $revoke_perms = array_merge($perms, $revoke_perms); } } */ elseif (array_key_exists($key, $merci_perms)) { if ($value) { $add_perms[] = $key; } else { $revoke_perms[] = $key; } } } if (!empty($add_perms)) { user_role_grant_permissions($role->rid, $add_perms); } if (!empty($revoke_perms)) { user_role_revoke_permissions($role->rid, $revoke_perms); } } } }