diff --git a/og_context/includes/views/handlers/og_context_plugin_access_og_perm.inc b/og_context/includes/views/handlers/og_context_plugin_access_og_perm.inc index 5ace9a1..e1e95d4 100644 --- a/og_context/includes/views/handlers/og_context_plugin_access_og_perm.inc +++ b/og_context/includes/views/handlers/og_context_plugin_access_og_perm.inc @@ -10,35 +10,6 @@ * current group. */ class og_context_plugin_access_og_perm extends views_plugin_access { - /** - * Determine if the current user has access or not. - */ - function access($account) { - // Attempt to get the group from the current context and determine if the - // user has the appropriate permission within the group - if ($group = og_context($this->options['group_type'])) { - return og_user_access($group['group_type'], $group['gid'], $this->options['perm'], $account); - } - return FALSE; - } - - /** - * Determine the access callback and arguments. - */ - function get_access_callback() { - if ($group = og_context($this->options['group_type'])) { - return array('og_user_access', array($group['group_type'], $group['gid'], $this->options['perm'])); - } - return FALSE; - } - - /** - * Return a string to display as the clickable title for the - * access control. - */ - function summary_title() { - return $this->options['perm']; - } /** * Retrieve the options when this is a new access @@ -48,6 +19,7 @@ class og_context_plugin_access_og_perm extends views_plugin_access { $options = parent::option_definition(); $options['perm'] = array('default' => 'edit group'); $options['group_type'] = array('default' => 'node'); + $options['group_id_arg'] = array('default' => FALSE); return $options; } @@ -78,5 +50,54 @@ class og_context_plugin_access_og_perm extends views_plugin_access { '#default_value' => $this->options['group_type'], '#description' => t('Determine what entity type that group should be of.') ); + + $current_display = $this->view->current_display; + if ($this->view->display[$current_display]->display_plugin == 'page') { + // Show the group ID argument position only for "Page" displays. + $form['group_id_arg'] = array( + '#type' => 'select', + '#title' => t('Argument position for group ID'), + '#default_value' => $this->options['group_id_arg'], + '#options' => array(FALSE => t('None')) + range(0, 9), + '#description' => t('Group ID argument position with arg() function. e.g. if your dynamic path is "node/%/group/%/overview" and you are using the second "%" for group IDs you have to choose "3" like "arg(3)".'), + ); + } + } + + /** + * Return a string to display as the clickable title for the + * access control. + */ + function summary_title() { + $current_display = $this->view->current_display; + if ($this->options['group_id_arg'] === FALSE || $this->view->display[$current_display]->display_plugin != 'page') { + return $this->options['perm']; + } + + $params = array( + '@perm' => $this->options['perm'], + '@arg' => $this->options['group_id_arg'], + ); + + return t('@perm, getting the group ID from argument position @arg', $params); + } + + /** + * Determine if the current user has access or not. + */ + function access($account) { + // Attempt to get the group from the current context and determine if the + // user has the appropriate permission within the group + if ($group = og_context($this->options['group_type'])) { + return og_user_access($group['group_type'], $group['gid'], $this->options['perm'], $account); + } + return FALSE; + } + + /** + * Determine the access callback and arguments. + */ + function get_access_callback() { + return array('_og_context_views_page_access', array($this->options['group_type'], $this->options['perm'], $this->options['group_id_arg'])); } } diff --git a/og_context/og_context.module b/og_context/og_context.module index d212b9c..fac47a1 100644 --- a/og_context/og_context.module +++ b/og_context/og_context.module @@ -518,3 +518,29 @@ function _group_context_handler_entity($entity_type = 'node', $entity = NULL, $p return $contexts; } + +/** + * Helper function to handle views page access. + * + * @param $group_type + * The group type. + * @param $perm + * The group permission to search for. + * @param $group_id_arg + * Optional; The position in arg() where the group ID can be found. + * + * @return + * TRUE if user is allowed access to the page. + */ +function _og_context_views_page_access($group_type, $perm, $group_id_arg = FALSE) { + if ($group_id_arg !== FALSE) { + $gid = arg($group_id_arg); + if (is_numeric($gid)) { + return og_user_access($group_type, $gid, $perm); + } + } + elseif ($group = og_context($group_type)) { + // Try to get context. + return og_user_access($group_type, $group['gid'], $perm); + } +}