groups/modules/groups/groups_groups/groups_groups.module

284 lines
10 KiB
Plaintext

<?php
/**
* @file
* Code for the groups Groups feature.
*/
include_once 'groups_groups.features.inc';
/**
* @file
* Groups groups content type related extensions.
*/
/**
* Implements hook_field_default_field_bases_alter
*
* Override field base settings defined in module features.
*/
function groups_groups_field_default_field_bases_alter(&$fields) {
// Override og_group_ref field's Groups Field Settings -> 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;
}