Index: content_access.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/content_access/content_access.module,v retrieving revision 1.6 diff -u -r1.6 content_access.module --- content_access.module 20 Aug 2007 09:39:08 -0000 1.6 +++ content_access.module 12 Jan 2008 01:47:17 -0000 @@ -62,41 +62,79 @@ * Per node settings page */ function content_access_page($nid) { - $roles = content_access_get_roles_and_author(); $node = node_load($nid); drupal_set_title(check_plain($node->title)); + foreach (content_access_get_ops() as $i) { + $defaults[$i] = content_access_per_node_setting($i, $node); + } + + $form = content_access_page_form($defaults, $node); + + $form['node'] = array('#type' => 'value', '#value' => $node); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + '#weight' => 10, + ); + return $form; +} + +/** + * Builds per node setting page form without requiring a node. Used by + * content_access_action_set_node_permissions_form(). + * + * @param $defaults + * Array of defaults for view/update/delete checkboxes. + * @param $node + * Optional node for ACL. + */ +function content_access_page_form($defaults = array(), $node = false) { + + // Make sure defaults array is full + foreach (content_access_get_ops() as $op) { + if (!isset($defaults[$op])) $defaults[$op] = array(); + } + + $roles = content_access_get_roles_and_author(); $form['settings'] = array( '#type' => 'fieldset', '#title' => t('Role access control settings'), '#collapsible' => TRUE, ); + + if (!$node) { + $form['settings']['#description'] = t('Warning: No defaults are set; be sure to fill out all boxes appropriately.'); + } + drupal_add_css(drupal_get_path('module', 'content_access') . '/content_access.css'); $form['settings']['view'] = array('#type' => 'checkboxes', '#prefix' => '
', '#suffix' => '
', '#options' => $roles, '#title' => t('View'), - '#default_value' => content_access_per_node_setting('view', $node), + '#default_value' => $defaults['view'], ); $form['settings']['update'] = array('#type' => 'checkboxes', '#prefix' => '
', '#suffix' => '
', '#options' => $roles, '#title' => t('Edit'), - '#default_value' => content_access_per_node_setting('update', $node), + '#default_value' => $defaults['update'], ); $form['settings']['delete'] = array('#type' => 'checkboxes', '#prefix' => '
', '#suffix' => '
', '#options' => $roles, '#title' => t('Delete'), - '#default_value' => content_access_per_node_setting('delete', $node), + '#default_value' => $defaults['delete'], ); $form['settings']['clearer'] = array( '#value' => '
', ); - if (module_exists('acl')) { + if (module_exists('acl') && $node) { + // This is disabled when there is no node passed; we could probably + // make this compatible in that case too though. $form['acl'] = array( '#type' => 'fieldset', '#title' => t('User access control lists'), @@ -104,7 +142,7 @@ '#collapsible' => TRUE, '#tree' => TRUE, ); - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { $acl_id = acl_get_id_by_name('content_access', $op .'_'. $node->nid); if (!$acl_id) { // create one $acl_id = acl_create_new_acl('content_access', $op .'_'. $node->nid); @@ -114,32 +152,25 @@ $form['acl'][$op]['#collapsed'] = !isset($_POST['acl'][$op]['add_button']) && !isset($_POST['acl'][$op]['delete_button']); } } - - $form['node'] = array('#type' => 'value', '#value' => $node); - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('Submit'), - '#weight' => 10, - ); return $form; } function content_access_page_submit($form_id, $form_values) { $node = $form_values['node']; $settings = array(); - foreach (array('view', 'update', 'delete') as $op) { - //set the settings so that further calls will return this settings - unset($form_values[$op][0]); - $settings[$op] = array_filter($form_values[$op]); - + content_access_parse_settings(content_access_get_ops(), $settings, $form_values); + + // Save ACL settings. + foreach (content_access_get_ops() as $op) { if (module_exists('acl') && isset($form_values['acl'][$op])) { acl_save_form($form_values['acl'][$op]); } } - //save new settings for later.. + + // Save per-node settings. content_access_save_per_node_settings($node, $settings); - //apply new settings + // Apply new settings. node_access_acquire_grants($node); drupal_set_message('Your changes have been saved.'); } @@ -217,17 +248,40 @@ return $form; } -function content_access_admin_settings_submit($form_id, $form_values) { - $per_node_old = content_access_get_settings('per_node', $form_values['type']); - $settings = content_access_get_settings(); - - foreach (content_access_available_settings() as $setting) { +/** + * Parse submitted settings from form into internal format. + * + * @note + * This automatically detects whether or not per-node or node type + * configuration is being set. + * + * @param $setting_set + * Settings to use, usually either content_access_available_settings() or + * content_access_get_ops(). + * @param $settings + * Settings array variable to save values to. + * @param $form_values + * Form values array variable, modified settings are also reflected here. + */ +function content_access_parse_settings($setting_set, &$settings, &$form_values) { + foreach ($setting_set as $setting) { if (is_array($form_values[$setting])) { unset($form_values[$setting][0]); $form_values[$setting] = array_filter($form_values[$setting]); } - $settings[$setting][$form_values['type']] = $form_values[$setting]; + if (isset($form_values['type'])) { + $settings[$setting][$form_values['type']] = $form_values[$setting]; + } else { + $settings[$setting] = $form_values[$setting]; + } } +} + +function content_access_admin_settings_submit($form_id, $form_values) { + $per_node_old = content_access_get_settings('per_node', $form_values['type']); + + $settings = content_access_get_settings(); + content_access_parse_settings(content_access_available_settings(), $settings, $form_values); content_access_set_settings($settings); // mass update all nodes that use default settings @@ -257,7 +311,7 @@ //apply per node settings if necessary if (content_access_get_settings('per_node', $node->type)) { $grants = array(); - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { foreach (content_access_per_node_setting($op, $node) as $rid) { $grants[$rid]['grant_'. $op] = 1; } @@ -330,7 +384,7 @@ /* * Returns the content_access' settings - * @param $return One of the content_access_available_settings(), e.g. 'view' or 'pernode' + * @param $return One of the content_access_available_settings(), e.g. 'view' or 'per_node' * @param $type If not all, return the setting for the specified type */ function content_access_get_settings($return = 'all', $type = NULL) { @@ -366,12 +420,19 @@ } /* - * returns an array containing all available content_access settings + * Return an array containing all available content_access settings */ function content_access_available_settings() { return array('view', 'update', 'delete', 'per_node', 'priority'); } +/** + * Return array of containing valid per node content_access settings. + */ +function content_access_get_ops() { + return array('view', 'update', 'delete'); +} + /* * Defines default values for settings */ @@ -426,7 +487,7 @@ $grants = array(); //apply the defaults $roles = content_access_get_roles_and_author(); - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { foreach (content_access_get_settings($op, $node->type) as $rid) { $grants[$rid]['grant_'. $op] = 1; } @@ -512,11 +573,11 @@ */ function content_access_optimize_grants(&$grants, $node) { //populate $view, $update and $delete with roles, that have access - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { $$op = array(); } foreach ($grants as $key => $grant) { - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { if ($grant['grant_'. $op]) { ${$op}[] = $key; } @@ -542,7 +603,7 @@ } else { foreach ($grants as $key => $grant) { - foreach (array('view', 'update', 'delete') as $op) { + foreach (content_access_get_ops() as $op) { if ($grant['grant_'. $op] && in_array($key, $$op)) { //it's still here, so we can't remove this grant continue 2; @@ -579,3 +640,8 @@ break; } } + +if (module_exists('workflow_ng')) { + include_once dirname(__FILE__) . '/content_access.workflow_ng.inc'; +} +