diff --git a/includes/views/handlers/og_handler_field_og_membership_link_edit.inc b/includes/views/handlers/og_handler_field_og_membership_link_edit.inc new file mode 100644 index 0000000..8961a05 --- /dev/null +++ b/includes/views/handlers/og_handler_field_og_membership_link_edit.inc @@ -0,0 +1,75 @@ + '', 'translatable' => TRUE); + $options['destination'] = array('default' => FALSE, 'bool' => TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + $form['destination'] = array( + '#type' => 'checkbox', + '#title' => t('Use destination'), + '#description' => t('Add destination to the link'), + '#default_value' => $this->options['destination'], + '#fieldset' => 'more', + ); + parent::options_form($form, $form_state); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $value = $this->get_value($values, 'id'); + return $this->render_link($this->sanitize_value($value), $values); + } + + function render_link($data, $values) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['html'] = TRUE; + + // ensure user has access to edit this membership. + $og_membership = $this->get_value($values); + $group_type = $og_membership->group_type; + $gid = $og_membership->gid; + if (!og_ui_user_access_group('manage members', $group_type, $gid)) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('edit'); + unset($this->options['alter']['fragment']); + + if (!empty($this->options['destination'])) { + $this->options['alter']['query'] = drupal_get_destination(); + } + + $this->options['alter']['path'] = "group/" . $group_type . "/" . $gid . "/admin/people/edit-membership/" . $og_membership->id; + + return $text; + } +} diff --git a/includes/views/og.views.inc b/includes/views/og.views.inc index f876eb0..1ef3e2c 100644 --- a/includes/views/og.views.inc +++ b/includes/views/og.views.inc @@ -56,6 +56,15 @@ class OgMembershipViewsController extends EntityDefaultViewsController { ), ); + // link to edit membership + $data['og_membership']['edit_membership'] = array( + 'field' => array( + 'title' => t('Edit link'), + 'help' => t('Provide a simple link to edit the membership.'), + 'handler' => 'og_handler_field_og_membership_link_edit', + ), + ); + return $data; } } diff --git a/og.info b/og.info index 2c6b3ac..d5fabb5 100644 --- a/og.info +++ b/og.info @@ -29,6 +29,7 @@ files[] = includes/views/handlers/og_handler_field_group_audience_state.inc files[] = includes/views/handlers/og_handler_field_prerender_list.inc files[] = includes/views/handlers/og_handler_field_user_roles.inc files[] = includes/views/handlers/og_handler_field_group_permissions.inc +files[] = includes/views/handlers/og_handler_field_og_membership_link_edit.inc ; Views filters files[] = includes/views/handlers/og_handler_filter_group_audience_state.inc diff --git a/og_ui/includes/views/og_ui.views_default.inc b/og_ui/includes/views/og_ui.views_default.inc index bb6cc3a..294e5b2 100644 --- a/og_ui/includes/views/og_ui.views_default.inc +++ b/og_ui/includes/views/og_ui.views_default.inc @@ -209,6 +209,13 @@ function og_ui_views_default_views() { $handler->display->display_options['fields']['og_membership_request']['table'] = 'field_data_og_membership_request'; $handler->display->display_options['fields']['og_membership_request']['field'] = 'og_membership_request'; $handler->display->display_options['fields']['og_membership_request']['relationship'] = 'og_membership_rel'; + /* Field: OG membership: Edit link */ + $handler->display->display_options['fields']['edit_membership']['id'] = 'edit_membership'; + $handler->display->display_options['fields']['edit_membership']['table'] = 'og_membership'; + $handler->display->display_options['fields']['edit_membership']['field'] = 'edit_membership'; + $handler->display->display_options['fields']['edit_membership']['relationship'] = 'og_membership_rel'; + $handler->display->display_options['fields']['edit_membership']['label'] = ''; + $handler->display->display_options['fields']['edit_membership']['element_label_colon'] = FALSE; /* Sort criterion: User: Name */ $handler->display->display_options['sorts']['name']['id'] = 'name'; $handler->display->display_options['sorts']['name']['table'] = 'users'; diff --git a/og_ui/og_ui.admin.inc b/og_ui/og_ui.admin.inc index 12e01b4..491039d 100644 --- a/og_ui/og_ui.admin.inc +++ b/og_ui/og_ui.admin.inc @@ -274,6 +274,143 @@ function og_ui_add_users_submit($form, &$form_state) { } /** + * Add Edit membership form. + */ +function og_ui_edit_membership($form, &$form_state, $group_type, $gid, $og_membership) { + og_set_breadcrumb($group_type, $gid, array(l(t('Group'), "$group_type/$gid/group"))); + $group = entity_load_single($group_type, $gid); + $label = entity_label($group_type, $group); + $account = user_load($og_membership->etid); + list(,, $bundle) = entity_extract_ids($group_type, $group); + $og_roles = og_roles($group_type, $bundle, $gid, FALSE, FALSE); + + $form['group_type'] = array('#type' => 'value', '#value' => $group_type); + $form['gid'] = array('#type' => 'value', '#value' => $gid); + $form['id'] = array('#type' => 'value', '#value' => $og_membership->id); + + $form['og_user'] = array( + '#type' => 'fieldset', + '#title' => t('Edit a group membership in %group', array('%group' => $label)), + ); + $form['og_user']['name'] = array( + '#type' => 'textfield', + '#title' => t('User name'), + '#autocomplete_path' => 'user/autocomplete', + '#required' => TRUE, + '#default_value' => $account->name, + ); + if (count($og_roles)) { + $form['og_user']['roles'] = array( + '#type' => 'checkboxes', + '#options' => $og_roles, + '#title' => t('Roles'), + '#default_value' => array_keys(og_get_user_roles($group_type, $gid, $account->uid)), + ); + } + + $field_names = og_get_group_audience_fields(); + $field_name = !empty($form_state['values']['field_name']) ? $form_state['values']['field_name'] : key($field_names); + + if (count($field_names) > 1) { + $form['og_user']['field_name'] = array( + '#type' => 'select', + '#title' => t('Field name'), + '#options' => $field_names, + '#default_value' => $field_name, + '#description' => t('Select the field name, the group membership should be registered in.'), + '#ajax' => array( + 'callback' => 'og_ui_admin_add_user_ajax_callback', + 'wrapper' => 'og-ui-field-name', + ), + ); + } + else { + // There is only a single field name, so just pass it as a value. + $form['og_user']['field_name'] = array( + '#type' => 'value', + '#value' => $field_name, + ); + } + + // Add group membership form. + $values = array(); + + // Add group membership form. We still don't have the user or state. + $form_state['og_membership'] = $og_membership; + + $form['membership_fields'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#tree' => TRUE, + '#parents' => array('membership_fields'), + ); + field_attach_form('og_membership', $og_membership, $form['membership_fields'], $form_state); + + $form['actions'] = array('#type' => 'actions'); + $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Update membership')); + + return $form; +} + +/** + * Validate handler; Edit membership in group. + */ +function og_ui_edit_membership_validate($form, &$form_state) { + $account = user_load_by_name($form_state['values']['name']); + $group_type = $form_state['values']['group_type']; + $gid = $form_state['values']['gid']; + $field_name = $form_state['values']['field_name']; + $params = array('%name' => format_username($account)); + if (!$account) { + form_set_error('name', t('You have entered an invalid user name.')); + return; + } + elseif ($membership = og_get_membership($group_type, $gid, 'user', $account->uid)) { + if ($membership->id != $form_state['values']['id']) { + form_set_error('name', t('User %name is already subscribed to group.', $params)); + } + } + // Check field cardinality. + elseif (!og_check_field_cardinality('user', $account, $field_name)) { + $instance = field_info_instance('user', $field_name, 'user'); + $params['%field'] = $instance['label']; + form_set_error('field_name', t('%name has reached maximum values in field %field.', $params)); + } + else { + $og_membership = $form_state['og_membership']; + field_attach_form_validate('og_membership', $og_membership, $form['membership_fields'], $form_state); + } +} + +/** + * Submit handler; Edit membership in group. + */ +function og_ui_edit_membership_submit($form, &$form_state) { + $group_type = $form_state['values']['group_type']; + $gid = $form_state['values']['gid']; + $og_membership = $form_state['og_membership']; + field_attach_submit('og_membership', $og_membership, $form['membership_fields'], $form_state); + $account = user_load_by_name($form_state['values']['name']); + $og_membership->etid = $account->uid; + $og_membership->save(); + // Assign roles. + $og_roles = og_get_user_roles($group_type, $gid, $account->uid); + foreach (array_keys($og_roles) as $rid) { + if (!in_array($rid, $form_state['values']['roles'])) { + og_role_revoke($group_type, $gid, $account->uid, $rid); + } + } + if (count($form_state['values']['roles'])) { + foreach ($form_state['values']['roles'] as $rid) { + og_role_grant($group_type, $gid, $og_membership->etid, $rid); + } + } + drupal_set_message(t('The membership has been updated.')); +} + + + +/** * Form builder; OG user administration page. */ function og_ui_admin_account($group_type, $gid) { diff --git a/og_ui/og_ui.module b/og_ui/og_ui.module index 98cf98a..f0c6dd5 100644 --- a/og_ui/og_ui.module +++ b/og_ui/og_ui.module @@ -58,6 +58,18 @@ function og_ui_menu() { 'file' => 'og_ui.admin.inc', ); + // User listing pages. + $items['group/%/%/admin/people/edit-membership/%og_membership'] = array( + 'title callback' => 'og_ui_menu_title_callback', + 'title arguments' => array('Edit membership in group @group', 1, 2), + 'type' => MENU_CALLBACK, + 'page callback' => 'drupal_get_form', + 'page arguments' => array('og_ui_edit_membership', 1, 2, 6), + 'access callback' => 'og_ui_user_access_group', + 'access arguments' => array('manage members', 1, 2), + 'file' => 'og_ui.admin.inc', + ); + // Permission administration pages. $items['group/%/%/admin/roles'] = array( 'title callback' => 'og_ui_menu_title_callback',