Entity Selection // Organic Group's default filter enlist the groups where the user is // a group owner. if (isset($fields['og_group_ref'])) { $fields['og_group_ref']['settings']['handler'] = 'og'; } } /** * Implements hook_field_default_field_instances_alter * * Override field instance settings defined in commons_groups module. */ function groups_groups_field_default_field_instances_alter(&$fields) { $commons_groups_entity_types = commons_groups_get_group_content_entity_types(); if (!empty($commons_groups_entity_types)) { foreach ($commons_groups_entity_types as $entity_type => $bundles) { foreach(array_keys($bundles) as $bundle) { // Set Entity reference widget type to Check boxes on commons // entity types including an og_group_ref field. if (isset($fields["$entity_type-$bundle-og_group_ref"])) { $widget = &$fields["$entity_type-$bundle-og_group_ref"]['settings']['behaviors']['og_widget']; $widget['admin']['widget_type'] = 'options_buttons'; $widget['default']['widget_type'] = 'options_buttons'; } } } } } /** * Implement hook_node_prepare * * Add a default not published status to group content type, * so group will be placed at review queue. */ function groups_groups_node_prepare($node) { if (($node->type == 'group') && (empty($node->nid))) { $node->status = NODE_NOT_PUBLISHED; } } /** * Lookup latitude and longitude coordinates by location and country * using Google's geocode API. * * @param string $location Location (eg. Los Angeles, CA) * @param string $country Country of the location * @return array lat, lng coordinates */ function _groups_groups_lookup_lat_lng($location, $country) { $query = array( 'components' => 'country:'.$country, 'sensor' => 'false', ); if (isset($location)) { $query['address'] = $location; } watchdog('Groups groups', 'Lookup geolocation data [query=@query]', array('@query' => print_r($query, TRUE)), WATCHDOG_DEBUG); $url = 'http://maps.googleapis.com/maps/api/geocode/json?' . drupal_http_build_query($query); $response = drupal_http_request($url); if (empty($response->error)) { $data = json_decode($response->data); if ($data->status == 'OK') { foreach ($data->results as $result) { if (!empty($result->formatted_address)) { watchdog('Groups groups', 'Lookup geolocation data result @lat;@lng [query=@query]', array('@query' => print_r($query, TRUE), '@lat' => $result->geometry->location->lat, '@lng' => $result->geometry->location->lng), WATCHDOG_DEBUG); return array($result->geometry->location->lat, $result->geometry->location->lng); } } } } throw new Exception(t('Failed to lookup geolocation data [query=@query].', array('@query' => print_r($query, TRUE)))); } /** * Implements hook node presave * * Update geofield from group location values. Override lat / long values * when field_geofield is empty. */ function groups_groups_node_presave($node) { if (($node->type == 'group') && (empty($node->field_geofield[LANGUAGE_NONE]))) { try { geophp_load(); list($lat, $lng) = _groups_groups_lookup_lat_lng( $node->field_group_location['und'][0]['location'], $node->field_group_location['und'][0]['country']); $geom = new Point($lng, $lat); $geofield = geofield_get_values_from_geometry($geom); $geofield['geom'] = 'POINT (' . $lng . ' ' . $lat . ')'; $node->field_geofield = array('und'=>array($geofield)); } catch (Exception $e) { watchdog('Groups groups', 'Node presave failed: @err', array('@err' => $e->getMessage()), WATCHDOG_ERROR); } } } /** * Implements hook_theme() * * Define theme template for group node form. */ function groups_groups_theme() { $path = drupal_get_path('module', 'groups_groups').'/templates'; return array( 'groups_groups_group_node_form' => array( 'arguments' => array('form' => NULL), 'template' => 'groups-groups--group-node-form', 'render element' => 'form', 'path' => $path, ), ); } /** * Implements hook_text_format_alter. * * Set default text format to markdown for the group/body field. */ function groups_groups_text_format_alter(&$element) { $bundles = array('group', 'post'); if ((isset($element['#bundle'])) && (isset($element['#field_name']))) { if ((in_array($element['#bundle'], $bundles)) && ($element['#field_name'] == 'body')) { // set default value to markdown $element['format']['format']['#default_value'] = 'markdown'; // hide text format filter $element['format']['#access'] = FALSE; } } } /** * Implements hook_form_alter(). * * Override group node form and alter content forms. */ function groups_groups_form_alter(&$form, &$form_state, $form_id) { global $user; // ensure group is selected for non-administrator users and // make the og_group_ref field mandatory. $commons_entity_integrations = commons_entity_integration_info(); if (!empty($commons_entity_integrations['node'])) { foreach ($commons_entity_integrations['node'] as $bundle => $options) { if ($form_id == $bundle.'_node_form') { $is_administrator = in_array('administrator', array_values($user->roles)); if ($is_administrator == false) { $form['og_group_ref'][LANGUAGE_NONE][0]['#required'] = true; } } } } if ($form_id == 'group_node_form') { $node = $form_state['node']; $is_administrator = in_array('administrator', array_values($user->roles)); $is_community_mgr = in_array('community_manager', array_values($user->roles)); $is_group_admin = og_user_access('node', $node->nid, 'administer group'); // hide group status field $form['field_group_status']['#access'] = $is_administrator; // hide location geofield $form['field_geofield']['#access'] = $is_administrator; // hide privacy settings field $form['field_og_subscribe_settings']['#access'] = $is_administrator; // hide meetup members field $form['field_meetup_members']['#access'] = $is_administrator; // hide group logo $form['field_group_logo']['#access'] = false; // allow ambassador assignment for admin or community managers $form['field_ambassadors']['#access'] = $is_community_mgr || $is_administrator; // allow group admins to modify timezone field $form['field_timezone']['#access'] = $is_community_mgr || $is_group_admin || $is_administrator; // allow group admins to manage group membership field $form['field_group_members']['#access'] = $is_community_mgr || $is_group_admin || $is_administrator; $form['field_group_members_source']['#access'] = $is_community_mgr || $is_group_admin || $is_administrator; $form['field_group_location']['und'][0]['location']['#title'] = 'City (optional)'; // reorder resource links, group location $form['field_resource_links']['#weight'] = 21; $form['revision_information']['#access'] = $is_administrator; $form['topics_wrapper']['#access'] = $is_administrator; $form['actions']['preview']['#access'] = false; if (!isset($node->nid) || isset($node->is_new)) { $form['#theme'] = 'groups_groups_group_node_form'; $form['actions']['submit']['#value'] = t('Register user group'); $form['field_resource_links']['#access'] = false; $form['accept_terms'] = array( '#type' => 'checkbox', '#title' => t('I have read and agree the !termsurl and !eventurl', array( '!termsurl' => l(t('Code of Conduct'), 'http://www.openstack.org/legal/community-code-of-conduct/'), '!eventurl' => l(t('OpenStack Event Policy'), 'http://www.openstack.org/brand/event-policy/'), )), '#weight' => 22, ); $form['field_group_location']['und'][0]['#title'] = ''; $form['title_field']['und'][0]['#title'] = 'Name of the User Group'; $form['body']['und'][0]['#title'] = 'Tell a few words about your User Group'; } $form['#validate'][] = 'groups_groups_group_node_form_validate'; } } /** * Group node form validate callback. * * Validate the Terms and Conditions checkbox status. */ function groups_groups_group_node_form_validate($form, &$form_state) { if ((isset($form_state['values']['accept_terms'])) && ($form_state['values']['accept_terms'] != 1)) { form_set_error('accept_terms', t('You must accept the Terms and Conditions.')); } } /** * Implements hook_og_user_access_alter(). * * Revert the commons_groups_og_user_access_alter() hook, and disable content * creation for non-group members on publicly visible groups. * * @see commons_groups_og_user_access_alter() */ function groups_groups_og_user_access_alter(&$perm, $context) { $account = $context['account']; $group_type = $context['group_type']; $group = $context['group']; if ($group_type != 'node') { return; } if (og_is_member($group_type, $group->nid, 'user', $account, array(OG_STATE_ACTIVE, OG_STATE_PENDING, OG_STATE_BLOCKED))) { // The user is a group member, so comply to the OG permissions. return; } $commons_groups_entity_types = commons_groups_get_group_content_entity_types(); foreach (array_keys($commons_groups_entity_types['node']) as $type) { $perm["create $type content"] = FALSE; } } /** * Implements hook_node_access() * * Allows to view unpublished group nodes for users with * ambassador or community manager role. */ function groups_node_access($node, $op, $account) { if (is_string($node)) { return NODE_ACCESS_IGNORE; } if ((in_array('ambassador', $account->roles)) || (in_array('community_manager', $account->roles))) { if (($node->type == 'group') && ($node->status == 0)) { return NODE_ACCESS_ALLOW; } } return NODE_ACCESS_IGNORE; }