og_groups); // Don't display as a fieldset unset($form['og_register']['#type']); $form['account'] = array( '#type' => 'value', '#value' => $account, ); if (!empty($form['og_register']['og_register']['#options'])) { $form['buttons'] = array('#tree' => FALSE); $form['buttons']['submit'] = array( '#type' => 'submit', '#value' => t('Save'), ); } else { $form['messages'] = array( '#type' => 'item', '#value' => t('No groups found.'), ); } return $form; } /** * Submit handler for OG user groups form. */ function spaces_og_user_groups_form_submit($form, &$form_state) { if (is_array($form_state['values']['og_register']) && !empty($form_state['values']['account'])) { $og_register = $form_state['values']['og_register']; $account = $form_state['values']['account']; $dsm = FALSE; $active_groups = array_keys(array_filter($og_register)); // Subscribe users to any selected groups. foreach (array_diff($active_groups, array_keys($account->og_groups)) as $gid) { $return = og_subscribe_user($gid, $account); if (!empty($return['message'])) { $dsm = TRUE; drupal_set_message($return['message']); } } // Remove users from any unselected groups. foreach (array_diff(array_keys($og_register), $active_groups) as $gid) { og_delete_subscription($gid, $account->uid); } if (!$dsm) { drupal_set_message(t('Your group membership settings were saved successfully.')); } } } /** * Spaces OG wrapper */ function spaces_og_ucreate($node) { drupal_set_title(t('Add new account')); if (module_exists('ucreate')) { $form = drupal_get_form('ucreate_user_form'); return $form; } return ''; } /** * Group node form_alter(). * @TODO: repair default values on node previews. */ function _spaces_og_form_alter_group(&$form, $form_state) { _spaces_og_make_hidden($form['og_selective']); _spaces_og_make_hidden($form['og_register']); _spaces_og_make_hidden($form['og_private']); _spaces_og_make_hidden($form['og_directory']); // Add purl form. $form['purl'] = purl_form('spaces_og', isset($form['#node']->nid) ? $form['#node']->nid : NULL, isset($form_state['node_preview']) ? $form['#node']->purl['value'] : $form['#node']->purl); // Add preset form. // @TODO: Test with node preview. module_load_include('inc', 'spaces', 'spaces.admin'); $nid = isset($form['#node']->nid) ? $form['#node']->nid : NULL; if ($space = spaces_load('og', $nid)) { $space->activate(); } $presets = spaces_preset_load(NULL, 'og'); if (count($presets) > 1) { $form['spaces_preset'] = spaces_preset_form($presets, 'og'); } // Pass existing space through. if ($nid) { $form['space'] = array('#type' => 'value', '#value' => $space); } // Add additional submit handler that redirects to group homepage. if (!empty($form['buttons']['submit']['#submit'])) { $form['buttons']['submit']['#submit'][] = 'spaces_og_form_group_submit'; } } /** * Custom submit handler for group delete confirmation. */ function _spaces_og_node_delete_confirm_submit($form, &$form_state) { purl_disable(TRUE); } /** * Group-enabled node form_alter() */ function _spaces_og_form_alter_node(&$form, $form_state) { global $user; $space = spaces_get_space(); if ($group_types = og_get_types('group')) { $typename = node_get_types('name', array_shift($group_types)); } // Retrieve the content type label /* if (!empty($form['og_nodeapi']['visible']['og_groups'])) { $form['og_groups'] = $form['og_nodeapi']['visible']['og_groups']; $form['og_groups']['#title'] = t('Select a !typename', array('!typename' => $typename)); $form['og_groups']['#type'] = 'select'; $form['og_groups']['#multiple'] = FALSE; unset($form['og_nodeapi']['visible']['og_groups']); } */ // Recurse into og_options hiding all of them. _spaces_og_make_hidden($form['og_nodeapi']); // If this node is not associated with a group, we are not in a space and // og_audience is required, we do not meet a legal condition. If the user has // administer node permissions give her a list of groups to fix the situation. // Otherwise issue an error. $groups = !empty($form['#node']->og_groups) ? array_filter($form['#node']->og_groups) : array(); if (variable_get('og_audience_required', FALSE) && empty($groups)) { if (user_access('administer nodes')) { $form['spaces_og_audience'] = array( '#type' => 'select', '#title' => t('Group'), '#description' => t('This node is supposted to be posted within a group but it is not. Select a group to fix the issue.'), '#required' => TRUE, '#options' => array(t('Select a group')) + og_all_groups_options(), ); } else { drupal_set_message(t('This content type is supposed to be posted within a group but it is not. You will not be able to save this node. Please contact a site administrator to fix the issue.'), 'error'); } } // We can only determine the privacy of this node if currently in // a group space. Otherwise, it will be determined by the feature // setting of the group targeted by the selector above. if (isset($space->type) && $space->type == 'og') { $form['spaces'] = array( '#title' => t('Privacy'), '#type' => 'fieldset', '#weight' => 100, ); switch ($form['#node']->og_public) { case OG_VISIBLE_GROUPONLY: $form['spaces']['#description'] = t('A post of this type is private. Only members of this !typename will be able to see it.', array('!typename' => strtolower($typename))); break; case OG_VISIBLE_BOTH: $form['spaces']['#description'] = t('A post of this type is public. All visitors will be able to see it.'); break; } } } /** * Element validator for group targeting selector. */ function spaces_og_nodeform_validate($element, &$form_state) { if ($element['#value'] == 0) { if ($group_types = og_get_types('group')) { $typename = node_get_types('name', array_shift($group_types)); } form_error($element, t('Please choose a !typename to post to.', array('!typename' => strtolower($typename)))); } } /** * Set all elements in a given form to 'value'. Using value preserves the tree and prevents * The element from being rendered. */ function _spaces_og_make_hidden(&$form) { if (isset($form['#type'])) { $form['#type'] = 'value'; $form['#required'] = FALSE; } if (is_array($form)) { foreach ($form as $key => $value) { if (is_array($value) && strpos($key, '#') !== 0) { _spaces_og_make_hidden($form[$key]); } } } } /** * Implementation of hook_form_alter() for spaces_preset_editor(). */ function _spaces_og_form_spaces_preset_editor_alter(&$form, $form_state) { $preset = $form_state['item']; if ($preset->space_type === 'og') { // Retrieve OG group settings form from OG & OG access. $keys = array_flip(array('og_selective', 'og_register', 'og_directory', 'og_private')); $group_form = og_group_form(array(), $form_state); if (module_exists('og_access')) { drupal_add_js(drupal_get_path('module', 'og_access'). '/og_access.js'); og_access_alter_group_form($group_form, array()); } $group_form = array_intersect_key($group_form, $keys); // Overwrite default values using preset values. foreach (array_keys($keys) as $key) { $group_form[$key]['#default_value'] = isset($preset->value['variable']["spaces_{$key}"]) ? $preset->value['variable']["spaces_{$key}"] : $group_form[$key]['#default_value']; } // Add to preset form. $form['spaces_og'] = $group_form + array( '#title' => t('OG settings'), '#type' => 'fieldset', '#tree' => FALSE, '#description' => t('The following settings will be used for any groups saved using this preset.'), ); // Add submit handler - we'll need to do our own saving of these values. $form['#submit'][] = '_spaces_og_spaces_preset_editor_submit'; } } /** * Additional submit handler for preset editor form. */ function _spaces_og_spaces_preset_editor_submit(&$form, &$form_state) { $preset = $form_state['item']; $keys = array('og_selective', 'og_register', 'og_directory', 'og_private'); foreach ($keys as $key) { if (isset($form_state['values'][$key])) { $preset->value['variable']["spaces_{$key}"] = $form_state['values'][$key]; } } }