Drupal: Programmatically manage members of sub groups

This CodeLet let you Programmatically manage members of sub groups. also you can add sub group.
you can inviter/remove peoples of sub groups. Invitation will be sent by email.
after installation of this CodeLet you must have to pass the group gid on query string,
Ex. yourdomain/subgroups/$gid.

CodeLet Dependencies:
1-Organic groups ( og )
2-Subgroups for Organic groups ( og_subgroups )
3-OG Invite People ( og_invite_people ).

.info file

name = "custom"
description = "Customization of OG Feature"
dependencies[] = og
dependencies[] = og_subgroups
dependencies[] = og_invite_people
core = 7.x
package = Custom

CodeLet: 

<?php

/**
* Implementation of hook_menu
*/
function custom_menu() {
$items = array();

$items['subgroups/%'] = array(
'title' => 'Sub Groups',
'type' => MENU_CALLBACK,
'access callback' => TRUE,
'page callback' => '_custom_sub_group_list',
'page arguments' => array(1),
);
return $items;
}

function _custom_sub_group_list($gid = NULL) {
global $user;
if($gid == NULL) return '';

$qry = "SELECT node_og_membership.nid AS node_og_membership_nid, node_og_membership.title AS node_og_membership_title
FROM
{og_membership} og_membership
LEFT JOIN {node} node_og_membership
ON og_membership.gid = node_og_membership.nid AND og_membership.group_type = 'node'
LEFT JOIN {og_users_roles} og_users_roles_og_membership
ON og_membership.etid = og_users_roles_og_membership.uid
INNER JOIN {og_role} og_users_roles_og_membership__og_role
ON og_users_roles_og_membership.rid = og_users_roles_og_membership__og_role.rid

WHERE node_og_membership.nid IN(SELECT etid
FROM `og_membership`
WHERE entity_type = 'node'
AND gid = $gid) AND (( (og_membership.gid = og_users_roles_og_membership.gid)
AND (og_membership.group_type = og_users_roles_og_membership.group_type)
AND (og_membership.etid = '" . $user->uid . "' ) )AND(( (og_membership.state IN ('1'))
AND (node_og_membership.status = '1')
AND (og_membership.entity_type LIKE 'user') AND (node_og_membership.type = 'subgroup')
AND (og_users_roles_og_membership__og_role.name IN ('administrator member', 'member')) )))
ORDER BY node_og_membership_title ASC";

$records = db_query($qry);
$output = '';
$row = array();
$header = array(t('Name'), t('Invite'), t('Remove'));

while ($result = $records->fetchAssoc()) {
$row[] = array($result['node_og_membership_title'],
_custom_gcm_invite($result['node_og_membership_nid']),
_custom_gcm_remove_group_member($result['node_og_membership_nid']));
}
$sub_groupform = _custom_sub_group_save_form();
return $sub_groupform . theme('table', array('header' => $header, 'rows' => $row));
}
/**
* _custom_gcm_invite
* render invite peopel form.
*/
function _custom_gcm_invite($sn__nid){
global $user;
if($user->uid != 0)
return drupal_render(drupal_get_form('_custom_invite_form_' . $sn__nid, $sn__nid));
else return '';
}

/**
* Implements hook_forms();
*/
function custom_forms($form_id, $args) {
if (FALSE !== strpos($form_id, '_custom_invite_form')) {

if ($form_id == '_custom_invite_form_' . $args[0]) {
$forms[$form_id] = array('callback' => '_custom_invite_form');
return $forms;
}
}

if (FALSE !== strpos($form_id, '_custom_remove_group_member_form')) {

if ($form_id == '_custom_remove_group_member_form_' . $args[0]) {
$forms[$form_id] = array('callback' => '_custom_remove_group_member_form');
return $forms;
}
}
}

/**
* _custom_invite_form
* invite people form
*/
function _custom_invite_form($form, &$form_state, $gid, $group_type = 'node') {

$form['email'] = array(
'#title' => 'email',
'#description' => 'enter a valid email address',
'#type' => 'textfield',
'#size' => 25,
'#required' => TRUE,
);

$form['state'] = array('#type' => 'value', '#value' => 1);

$form['group_type'] = array('#type' => 'value', '#value' => $group_type);
$form['gid'] = array('#type' => 'value', '#value' => $gid);

$field_names = og_get_group_audience_fields('user', 'user', $group_type);
$field_name = !empty($form_state['values']['field_name']) ? $form_state['values']['field_name'] : key($field_names);

// There is only a single field name, so just pass it as a value.
$form['field_name'] = array(
'#type' => 'value',
'#value' => $field_name,
);

$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Invite'),
);

$form_state['field_name'] = $field_name;
return $form;
}

/**
* _custom_invite_form - Validation handler
*/
function _custom_invite_form_validate($form, &$form_state) {
$group_type = $form_state['values']['group_type'];
$gid = $form_state['values']['gid'];
$email = $form_state['values']['email'];

if (!valid_email_address($email)) {
form_set_error('email', t('Invalid email.'));
}

$form_state['email'] = $email;
}
/**
* _custom_invite_form - Submit handler
*/

function _custom_invite_form_submit($form, &$form_state) {

$group_type = $form_state['values']['group_type'];
$gid = $form_state['values']['gid'];
$email = $form_state['email'];
$state = $form_state['values']['state'];
$field_name = $form_state['field_name'];

// Add group membership form.
$values = array();

// Add group membership form. We still don't have the user or state.
$og_membership = og_membership_create($group_type, $gid, 'user', 0, $field_name, $values);
$had_account = FALSE;
if ($account = user_load_by_mail($email)) {
$had_account = TRUE;
$message = '%user is already known and has been added to the group.';
}
else{
// Create a user and return $account object.
$account = _og_invite_people_create_user($email);
$message = '%user has been created and an email has been sent inviting them to the group.';
}

if($had_account && og_is_member($group_type, $gid, 'user', $account)) {
drupal_set_message(t('%user is already member of this group', array('%user' => format_username($account))));
}
else{
// Add user to group.
$og_membership->etid = $account->uid;
$og_membership->state = $state;
$og_membership->save();

// Offer invitee user account object in form_state.
$form_state['account'][] = $account;

// Invoke hook_og_invite_people_invited() - after a user is created and added to group.
module_invoke_all('og_invite_people_invited', $account, $og_membership);

drupal_set_message(t($message, array('%user' => format_username($account))));
}
}

/**
* _custom_gcm_remove_group_member
*/
function _custom_gcm_remove_group_member($sn__nid){
if(_custom_check_user_isadmin_ismanager($sn__nid))
return drupal_render(drupal_get_form('_custom_remove_group_member_form_' . $sn__nid, $sn__nid));
else return '';
}

/**
* _custom_remove_group_member_form
*/
function _custom_remove_group_member_form($form, &$form_state, $gid, $group_type = 'node') {

$form['uid'] = array(
'#title' => 'user',
'#type' => 'select',
'#options' => _custom_get_group_members($gid),
'#required' => TRUE,
);

$form['state'] = array('#type' => 'value', '#value' => 1);

$form['group_type'] = array('#type' => 'value', '#value' => $group_type);

$form['gid'] = array('#type' => 'value', '#value' => $gid);

$field_names = og_get_group_audience_fields('user', 'user', $group_type);

$field_name = !empty($form_state['values']['field_name']) ? $form_state['values']['field_name'] : key($field_names);

// There is only a single field name, so just pass it as a value.
$form['field_name'] = array(
'#type' => 'value',
'#value' => $field_name,
);

$form['entity_type'] = array(
'#type' => 'value',
'#value' => 'user',
);

$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Remove'),
);

$form_state['field_name'] = $field_name;

return $form;
}

/**
* _custom_remove_group_member_form - Validation handler
*/
function _custom_remove_group_member_form_validate($form, &$form_state) {
$group_type = $form_state['values']['group_type'];
$gid = $form_state['values']['gid'];
$user = $form_state['values']['uid'];

if ($user == '') {
form_set_error('uid', t('Select user.'));
}

$form_state['uid'] = $user;
}

/**
* _custom_remove_group_member_form - Submit handler
*/
function _custom_remove_group_member_form_submit($form, &$form_state) {

$group_type = $form_state['values']['group_type'];
$gid = $form_state['values']['gid'];
$field_name = $form_state['values']['field_name'];

$og_membership = new OgMembership($form_state['values'], $group_type);

$og_membership->etid = $form_state['values']['uid'];
// get membership id
$sn__mid = db_query("SELECT id FROM {og_membership} WHERE gid = $gid AND entity_type = 'user' AND etid = ". $og_membership->etid ." AND group_type = '$group_type'")->fetchField();
if(!empty($sn__mid))
$og_membership->id = $sn__mid;
// Don't process the group manager, if exists.
$group = entity_load_single($group_type, $gid);

if (!empty($group->uid) && $group->uid == $og_membership->etid && $og_membership->entity_type == 'user') {
return;
}

$og_membership->delete();
}

/**
* _custom_get_group_members
* @param int $sn__gid
* @return multitype:string An
*/
function _custom_get_group_members($sn__gid) {
$record = db_query("SELECT users.name AS user_name, users.uid AS uid
FROM {users} users
LEFT JOIN {og_membership} og_membership_users ON users.uid = og_membership_users.etid AND og_membership_users.entity_type = 'user'
WHERE (( (og_membership_users.gid = '$sn__gid' ) )AND(( (users.status <> '0') AND (users.uid <> 1) AND (og_membership_users.state IN ('1')) )))
");
$arr_options = array('' => ' -Select user-');
while($result = $record->fetchAssoc()) {
$arr_options[$result['uid']] = $result['user_name'];
}
return $arr_options;
}

/**
*
* @param unknown_type $gid
* @return boolean
*/
function _custom_check_user_isadmin_ismanager($gid = NULL) {

global $user;

$record = db_query("SELECT users.name AS user_name, users.uid AS uid
FROM {users} users
LEFT JOIN {og_membership} og_membership_users ON users.uid = og_membership_users.etid AND og_membership_users.entity_type = 'user'
WHERE (( (og_membership_users.gid = '$gid' ) )AND(( (users.status <> '0') AND (og_membership_users.state IN ('1')) )))
");

$record = db_query("SELECT users.name AS user_name, users.uid AS uid
FROM {users} users
LEFT JOIN {og_membership} og_membership_users ON users.uid = og_membership_users.etid AND og_membership_users.entity_type = 'user'
WHERE (( (og_membership_users.gid = '$gid' ) )AND(( (users.status <> '0') AND (og_membership_users.state IN ('1')) )))
");

if($gid == NULL || $user->uid == 0) return FALSE;

return TRUE;
}

/**
* _custom_gcm_invite
*/
function _custom_sub_group_save_form() {

return drupal_render(drupal_get_form('_custom_create_sub_group_form'));
}

/**
*
* @return multitype:string Ambigous
*/
function _custom_create_sub_group_form() {
$form['custom'] = array(
'#type' => 'fieldset',
'#title' => t('SUB GROUP'),
'#collapsible' => TRUE,
'#group' => 'additional_settings',
'#description' => t(''),
);
$form['gid'] = array(
'#type' => 'hidden',
'#default_value' => arg(1)
);
$form['custom']['title'] = array(
'#title' => 'New Sub Group',
'#type' => 'textfield',
'#size' => 25,
'#required' => TRUE,
);
$form['custom']['submit'] = array(
'#type' => 'submit',
'#value' => t('Add'),
);

return $form;
}

/**
* submit handler
*/
function _custom_create_sub_group_form_submit($form, &$form_state) {

global $user;
//Create node
$gid = $form_state['values']['gid'];
$node = new StdClass();
$node->type = 'subgroup';
$node->uid = $user->uid;
$node->title = $form_state['values']['title'];
$node->status = 1;
$node->language = 'und';
$node->is_new = TRUE;

if($node = node_submit($node)) {
$nid = node_save($node);
}

if(isset($node->nid)) {
//Get the full node that needs to be subscribed to the group
$node = node_load($node->nid);

//Set the values
$values = array(
'entity_type' => 'node',
'entity' => $node,
'state' => OG_STATE_ACTIVE,
);

//Add this node to the group
$result = og_group('node', $gid, $values);
drupal_set_message(t('@node has been created', array('@node' => $node->title)));
}else {
drupal_set_message('DB:Error ', 'error');
}
}
?>

By saru1683 on Tue, 25/02/2014 - 10:53am

Add comment

Log in or register to post comments
Feedback