apply_for_role.module in Apply for role 5
Same filename and directory in other branches
Allows users to apply for roles.
File
apply_for_role.moduleView source
<?php
/**
* @file
* Allows users to apply for roles.
*/
define('APPLY_FOR_ROLE_PENDING', 0);
define('APPLY_FOR_ROLE_APPROVED', 1);
define('APPLY_FOR_ROLE_DENIED', 2);
/**
* Implementation of hook_help().
*/
function apply_for_role_help($section) {
switch ($section) {
case 'admin/build/trigger/apply_for_role':
$explanation = '<p>' . t('Triggers are system events, such as when new content is added or when a user logs in. Trigger module combines these triggers with actions (functional tasks), such as unpublishing content or e-mailing an administrator. The <a href="@url">Actions settings page</a> contains a list of existing actions and provides the ability to create and configure additional actions.', array(
'@url' => url('admin/settings/actions'),
)) . '</p>';
return $explanation . '<p>' . t('Below you can assign actions to run when certain role application related triggers happen. For example, you could email a user when their application is approved.') . '</p>';
case 'admin/help#apply_for_role':
return $explanation = '<p>' . t('The <em>Apply for roles</em> module allows users to apply for roles from their user page and allows administrators to easily view, approve and delete role applications.', array(
'@url' => url('admin/settings/apply_for_role'),
)) . '</p>';
}
}
/**
* Implementation of hook_perm().
*/
function apply_for_role_perm() {
return array(
'administer apply for role',
'approve role applications',
'apply for roles',
);
}
/**
* Implementation of hook_menu().
*/
function apply_for_role_menu($may_cache) {
global $user;
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/apply_for_role',
'title' => t('Apply for role administration'),
'description' => t('Administer which roles users can apply for.'),
'callback' => 'apply_for_role_settings',
'access' => user_access('administer apply for role'),
);
$items[] = array(
'path' => 'admin/user/apply_for_role',
'title' => t('Manage role applications'),
'description' => t('View, approve and delete role applications.'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'apply_for_role_admin_form',
),
'access' => user_access('approve role applications'),
);
$items[] = array(
'path' => 'admin/user/apply_for_role/approve',
'title' => t('Approve role application'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'apply_for_role_approve_form',
),
'access' => user_access('approve role applications'),
'type' => MENU - CALLBACK,
);
$items[] = array(
'path' => 'admin/user/apply_for_role/deny',
'title' => t('Deny role application'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'apply_for_role_deny_form',
),
'access' => user_access('approve role applications'),
'type' => MENU - CALLBACK,
);
$items[] = array(
'path' => 'admin/user/apply_for_role/remove',
'title' => t('Remove role application'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'apply_for_role_remove_form',
),
'access' => user_access('approve role applications'),
'type' => MENU - CALLBACK,
);
}
else {
if ($user->uid && arg(0) == 'user' && is_numeric(arg(1))) {
$items[] = array(
'path' => 'user/' . $user->uid . '/apply_for_role',
'title' => t('Apply for role'),
'callback' => 'apply_for_role_page',
'access' => user_access('apply for roles') && $user->uid == arg(1),
'type' => MENU_LOCAL_TASK,
);
}
}
return $items;
}
function theme_apply_for_role_status($status) {
$statuses = array(
-1 => t('Removed'),
APPLY_FOR_ROLE_PENDING => t('Pending'),
APPLY_FOR_ROLE_APPROVED => t('Approved'),
APPLY_FOR_ROLE_DENIED => t('Denied'),
);
return isset($statuses[$status]) ? $statuses[$status] : t('Unknown status');
}
/**
* Administration
*/
function apply_for_role_settings() {
return drupal_get_form('apply_for_role_settings_form');
}
function apply_for_role_settings_form() {
$selected_roles = variable_get('users_apply_roles', array());
foreach ((array) $selected_roles as $rid => $value) {
if ($rid > 2) {
$selected_rids[] = $rid;
}
}
$form['options'] = array(
'#type' => 'fieldset',
'#title' => t('Apply for role options'),
);
$form['options']['multiple'] = array(
'#type' => 'radios',
'#title' => t('Allow multiple roles per application'),
'#options' => array(
t('No'),
t('Yes'),
),
'#default_value' => variable_get('apply_for_role_multiple', 0),
'#description' => t("Chosing 'no' will limit users to applying for only one role per role application. Choosing 'yes' will allow users to apply for multiple roles per role application."),
'#required' => TRUE,
);
$form['options']['register'] = array(
'#type' => 'radios',
'#title' => t('Apply for role on registration'),
'#options' => array(
t('No'),
t('Optional'),
t('Required'),
),
'#default_value' => variable_get('apply_for_role_register', 0),
'#description' => t("Choosing 'optional' will allow users to apply for roles when creating a new account. Choosing 'required' will require users to apply for roles when creating a new account."),
'#required' => TRUE,
);
$roles = user_roles(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
$form['roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Roles'),
'#default_value' => isset($selected_rids) ? $selected_rids : array(
2,
),
'#options' => $roles,
'#description' => t('Select the roles that users will be able to apply for.'),
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Update'),
);
return $form;
}
function apply_for_role_settings_form_submit($form_id, $form) {
$roles = user_roles(TRUE);
foreach ((array) $form['roles'] as $key => $value) {
if ($value) {
$selected_roles[$value] = $roles[$value];
}
}
variable_set('users_apply_roles', $selected_roles);
variable_set('apply_for_role_multiple', $form['multiple']);
variable_set('apply_for_role_register', $form['register']);
drupal_set_message(t('Apply for role settings have been saved.'));
return 'admin/settings/apply_for_role';
}
/**
* User management
*/
function apply_for_role_admin_form() {
$header = array(
array(
'data' => t('Username'),
'field' => 'u.name',
),
array(
'data' => t('Current Roles'),
),
array(
'data' => t('Applying For'),
'field' => 'rid',
),
array(
'data' => t('Applied'),
'field' => 'apply_date',
'sort' => 'desc',
),
array(
'data' => t('Status'),
'field' => 'approved',
),
array(
'data' => t('Processed'),
'field' => 'approve_date',
),
array(
'data' => t('Operations'),
'colspan' => 2,
),
);
$form['#header'] = $header;
$roles = user_roles(TRUE);
$result = db_query("SELECT * FROM {users_roles_apply} a LEFT JOIN {users} u ON u.uid = a.uid " . tablesort_sql($header));
while ($row = db_fetch_object($result)) {
$user = user_load(array(
'uid' => $row->uid,
));
$form['apps'][$row->uid][$row->rid]['user'] = array(
'#value' => theme('username', $user),
);
$form['apps'][$row->uid][$row->rid]['role'] = array(
'#value' => isset($roles[$row->rid]) ? check_plain($roles[$row->rid]) : t('<em>Invalid Role</em>'),
);
$current_roles = array_slice($user->roles, 1);
$form['apps'][$row->uid][$row->rid]['current_roles'] = array(
'#value' => filter_xss_admin(implode('<br />', $current_roles)),
);
$form['apps'][$row->uid][$row->rid]['apply_date'] = array(
'#value' => format_date($row->apply_date),
);
$form['apps'][$row->uid][$row->rid]['status'] = array(
'#value' => theme('apply_for_role_status', $row->approved),
);
$form['apps'][$row->uid][$row->rid]['approve_date'] = array(
'#value' => empty($row->approve_date) ? '' : format_date($row->approve_date),
);
if (!empty($row->uid) && isset($roles[$row->rid])) {
if ($row->approved != APPLY_FOR_ROLE_APPROVED) {
$form['apps'][$row->uid][$row->rid]['approve'] = array(
'#value' => l(t('Approve'), 'admin/user/apply_for_role/approve/' . $row->uid . '/' . $row->rid, array(
'title' => t('Approve this user'),
)),
);
}
if ($row->approved != APPLY_FOR_ROLE_DENIED) {
$form['apps'][$row->uid][$row->rid]['deny'] = array(
'#value' => l(t('Deny'), 'admin/user/apply_for_role/deny/' . $row->uid . '/' . $row->rid, array(
'title' => t('Deny this user'),
)),
);
}
}
$form['apps'][$row->uid][$row->rid]['delete'] = array(
'#value' => l(t('Delete'), 'admin/user/apply_for_role/remove/' . $row->uid . '/' . $row->rid, array(
'title' => t('Remove application'),
)),
);
}
return $form;
}
function apply_for_role_approve_form($uid, $rid) {
$user = user_load(array(
'uid' => $uid,
));
$form['user'] = array(
'#type' => 'value',
'#value' => $user,
);
$form['rid'] = array(
'#type' => 'value',
'#value' => $rid,
);
$roles = user_roles(TRUE);
return confirm_form($form, t('Do you want to approve the application from user %username for role %role', array(
'%username' => $user->name,
'%role' => $roles[$rid],
)), 'admin/user/apply_for_role', t('The role will be automatically assigned to the user.'), t('Approve'));
}
function apply_for_role_approve_form_submit($form_id, $form_values) {
if (apply_for_role_approve_apply($form_values['user'], $form_values['rid'])) {
drupal_set_message(t('The application was approved and the user was added to the role.'));
}
else {
drupal_set_message(t('Error approving application. Please try again!'), 'error');
}
cache_clear_all($form_values['user']->uid . ':', 'cache_menu', TRUE);
cache_clear_all();
return 'admin/user/apply_for_role';
}
function apply_for_role_deny_form($uid, $rid) {
$user = user_load(array(
'uid' => $uid,
));
$form['user'] = array(
'#type' => 'value',
'#value' => $user,
);
$form['rid'] = array(
'#type' => 'value',
'#value' => $rid,
);
$roles = user_roles(TRUE);
return confirm_form($form, t('Do you want to deny the application from user %username for role %role', array(
'%username' => $user->name,
'%role' => $roles[$rid],
)), 'admin/user/apply_for_role', t('The role will not be assigned to the user and the user will not be able to apply again.'), t('Deny'));
}
function apply_for_role_deny_form_submit($form_id, $form_values) {
if (apply_for_role_deny_apply($form_values['user'], $form_values['rid'])) {
drupal_set_message(t('The application was denied .'));
}
else {
drupal_set_message(t('Error denying application. Please try again!'), 'error');
}
cache_clear_all($form_values['user']->uid . ':', 'cache_menu', TRUE);
cache_clear_all();
return 'admin/user/apply_for_role';
}
function apply_for_role_remove_form($uid, $rid) {
$user = user_load(array(
'uid' => $uid,
));
$form['user'] = array(
'#type' => 'value',
'#value' => $user,
);
$form['rid'] = array(
'#type' => 'value',
'#value' => $rid,
);
$roles = user_roles(TRUE);
return confirm_form($form, t('Do you want to remove the application from user %username for role %role', array(
'%username' => $user->name,
'%role' => isset($roles[$rid]) ? $roles[$rid] : t('Invalid role'),
)), 'admin/user/apply_for_role', t('The role will be automatically deleted from the user and they will be allowed to re-apply for the role.'), t('Delete'));
}
function apply_for_role_remove_form_submit($form_id, $form_values) {
if (apply_for_role_remove_apply($form_values['user'], $form_values['rid'])) {
drupal_set_message(t('The application was deleted.'));
}
else {
drupal_set_message(t('Error deleting application. Please try again!'), 'error');
}
cache_clear_all($form_values['user']->uid . ':', 'cache_menu', TRUE);
cache_clear_all();
return 'admin/user/apply_for_role';
}
function theme_apply_for_role_admin_form($form) {
$rows = array();
foreach (element_children($form['apps']) as $uid) {
foreach (element_children($form['apps'][$uid]) as $rid) {
$rows[] = array(
array(
'data' => drupal_render($form['apps'][$uid][$rid]['user']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['current_roles']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['role']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['apply_date']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['status']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['approve_date']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['approve']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['deny']),
),
array(
'data' => drupal_render($form['apps'][$uid][$rid]['delete']),
),
);
}
}
if (empty($rows)) {
$rows[] = array(
array(
'data' => '<em>' . t('There are currently no applications.') . '</em>',
'colspan' => 9,
),
);
}
return theme('table', $form['#header'], $rows) . drupal_render($form);
}
/**
* User interface
*/
function apply_for_role_page() {
return drupal_get_form('apply_for_role_apply_form');
}
function apply_for_role_apply_form() {
global $user;
$roles = variable_get('users_apply_roles', array());
$multiple = variable_get('apply_for_role_multiple', array());
foreach ($roles as $rid => $role) {
// Check if the user has this role or has applied for this role
if (!$user->roles[$rid] && db_result(db_query("SELECT uid, rid FROM {users_roles_apply} WHERE uid = %d AND rid = %d", $user->uid, $rid)) == 0) {
$filter_roles[$rid] = $role;
}
}
if (is_array($filter_roles)) {
if ($multiple == 1) {
$form['rid'] = array(
'#type' => 'checkboxes',
'#title' => t('Select the role or roles you want to apply for'),
'#options' => $filter_roles,
);
}
else {
$form['rid'] = array(
'#type' => 'select',
'#title' => t('Select the role you want to apply for'),
'#default_value' => '',
'#options' => $filter_roles,
);
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Apply'),
);
}
else {
drupal_set_message(t('No roles are available at this time.'), 'notice');
}
return $form;
}
function apply_for_role_apply_form_submit($form_id, $form_values) {
global $user;
$received = array();
$not_received = array();
if (is_array($form_values['rid'])) {
foreach ($form_values['rid'] as $rid => $value) {
if (!empty($value)) {
if (apply_for_role_add_apply($user->uid, $value)) {
$received[] = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $value));
}
else {
$not_received[] = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $value));
}
}
}
}
else {
if (apply_for_role_add_apply($user->uid, $form_values['rid'])) {
$received[] = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $form_values['rid']));
}
else {
$not_received[] = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $form_values['rid']));
}
}
$count_received = count($received);
$count_not_received = count($not_received);
if (!empty($count_received)) {
drupal_set_message(t('%message %roles', array(
'%message' => format_plural($count_received, t('Your application was received for the following role:'), t('Your applications were received for the following roles:')),
'%roles' => implode(', ', $received),
)));
}
if (!empty($count_not_received)) {
drupal_set_message(t('%message %roles', array(
'%message' => format_plural($count_not_received, t('There was a problem processing your application for the following role:'), t('There was a problem processing your applications for the following roles:')),
'%roles' => implode(', ', $not_received),
)), 'error');
}
return 'user/' . $user->uid;
}
function theme_apply_for_role_apply_form($form) {
$output = drupal_render($form);
return $output;
}
/**
* Callbacks
*/
/**
* Check if a user has a given role.
*
* @param $uid User id
* @param $rid Role id
* @return Boolean
*/
function apply_for_role_user_has_role($uid, $rid) {
if (!empty($uid) && !empty($rid)) {
$user = user_load(array(
'uid' => $uid,
));
return !empty($user->uid) && isset($user->roles[$rid]);
}
return FALSE;
}
/**
* Return an array of the roles that are available for application by a user.
*
* @param $user User object
* @return array keyed by role id with the role names as values.
*/
function apply_for_role_available_roles($user) {
// Get the complete list of roles (other than anonyous)...
$roles = user_roles(TRUE);
// ...the roles that can be applied for...
$enabled = (array) variable_get('users_apply_roles', array());
// ...the roles the user has already applied for...
$applied = array();
$result = db_query("SELECT rid FROM {users_roles_apply} WHERE uid = %d", $user->uid);
while ($row = db_fetch_object($result)) {
$applied[$row->rid] = isset($roles[$row->rid]) ? $roles[$row->rid] : t('Invalid role');
}
// ... now figure out what's left from the enabled roles list once you remove
// those they have and those they've applied for.
$used = $user->roles + $applied;
return array_diff($enabled, $used);
}
/**
* Store a role application in the database.
*
* @param $user User id
* @param $rid Role id
* @return Boolean indicating success
*/
function apply_for_role_add_apply($uid, $rid) {
if (!apply_for_role_user_has_role($uid, $rid)) {
// Check if the user has already applied for this role
if (!db_result(db_query("SELECT COUNT(*) FROM {users_roles_apply} WHERE uid = %d AND rid = %d", $uid, $rid))) {
$apply_date = time();
$apply = (object) array(
'uid' => $uid,
'rid' => $rid,
'approved' => 0,
'apply_date' => $apply_date,
);
db_query('INSERT INTO {users_roles_apply} (uid, rid, approved, apply_date) VALUES (%d, %d, 0, %d)', $uid, $rid, $apply_date);
module_invoke_all('apply_for_role', 'apply', $apply);
return TRUE;
}
}
return FALSE;
}
/**
* Approve a role application and put the user into the role.
*
* @param $user User id
* @param $rid Role id
* @return Boolean indicating success
*/
function apply_for_role_approve_apply($user, $rid) {
$uid = $user->uid;
if ($apply = db_fetch_object(db_query("SELECT * FROM {users_roles_apply} WHERE uid = %d AND rid = %d AND approved <> %d", $uid, $rid, APPLY_FOR_ROLE_APPROVED))) {
apply_for_role_add_role($uid, $rid);
$apply->approve_date = time();
$apply->approved = APPLY_FOR_ROLE_APPROVED;
db_query("UPDATE {users_roles_apply} SET approved = %d, approve_date = %d WHERE uid = %d AND rid = %d", $apply->approved, $apply->approve_date, $uid, $rid);
module_invoke_all('apply_for_role', 'approve', $apply);
return TRUE;
}
return FALSE;
}
/**
* Deny a role application.
*
* @param $uid User id
* @param $rid Role id
* @return Boolean indicating success
*/
function apply_for_role_deny_apply($user, $rid) {
$uid = $user->uid;
if ($apply = db_fetch_object(db_query("SELECT * FROM {users_roles_apply} WHERE uid = %d AND rid = %d AND approved <> %d", $uid, $rid, APPLY_FOR_ROLE_DENIED))) {
apply_for_role_delete_role($uid, $rid);
$apply->approve_date = time();
$apply->approved = APPLY_FOR_ROLE_DENIED;
db_query("UPDATE {users_roles_apply} SET approved = %d, approve_date = %d WHERE uid = %d AND rid = %d", $apply->approved, $apply->approve_date, $uid, $rid);
module_invoke_all('apply_for_role', 'deny', $apply);
return TRUE;
}
return FALSE;
}
/**
* Deletea role application from the database.
*
* @param $user User object
* @param $rid Role id
* @return Boolean indicating success
*/
function apply_for_role_remove_apply($user, $rid) {
$uid = $user->uid;
if ($apply = db_fetch_object(db_query("SELECT * FROM {users_roles_apply} WHERE uid = %d AND rid = %d", $uid, $rid))) {
apply_for_role_delete_role($uid, $rid);
db_query("DELETE FROM {users_roles_apply} WHERE uid = %d AND rid = %d", $uid, $rid);
$apply->approval = -1;
module_invoke_all('apply_for_role', 'remove', $apply);
return TRUE;
}
return FALSE;
}
function apply_for_role_add_role($uid, $rid) {
if (!in_array($rid, array(
DRUPAL_ANONYMOUS_RID,
DRUPAL_AUTHENTICATED_RID,
))) {
$account = user_load(array(
'uid' => $uid,
));
$myroles = $account->roles;
$rolenames = user_roles(TRUE);
$myroles[$rid] = $rolenames[$rid];
user_save($account, array(
'roles' => $myroles,
));
}
}
function apply_for_role_delete_role($uid, $rid) {
if (!in_array($rid, array(
DRUPAL_ANONYMOUS_RID,
DRUPAL_AUTHENTICATED_RID,
))) {
$account = user_load(array(
'uid' => $uid,
));
$myroles = $account->roles;
unset($myroles[$rid]);
user_save($account, array(
'roles' => $myroles,
));
}
}
/**
* Process an application and store it for admin review.
*
* @param $user User object.
* @param $applications Mixed, either a role id or an array keyed by role id.
*/
function apply_for_role_process_applications($uid, $applications) {
$roles = user_roles(TRUE);
// They can hand in either an array keyed by role id or single role id.
// Ensure we've got an array keyed by role id with the name as the value.
if (is_array($applications)) {
// Filter out any thing with empty role names. And use the official role
// name.
$applications = array_intersect_key($roles, array_filter($applications));
}
else {
$applications = array(
$applications => $roles[$applications],
);
}
$received = array();
$not_received = array();
foreach ($applications as $rid => $role) {
if (apply_for_role_add_apply($uid, $rid)) {
$received[] = $role;
}
else {
$not_received[] = $role;
}
}
if (!empty($received)) {
drupal_set_message(t('%message %roles', array(
'%message' => format_plural(count($received), t('Your application was received for the following role:'), t('Your applications were received for the following roles:')),
'%roles' => implode(', ', $received),
)));
}
if (!empty($not_received)) {
drupal_set_message(t('%message %roles', array(
'%message' => format_plural(count($not_received), t('There was a problem processing your application for the following role:'), t('There was a problem processing your applications for the following roles:')),
'%roles' => implode(', ', $not_received),
)), 'error');
}
}
/**
* Implementation of hook_user().
*/
function apply_for_role_user($op, &$edit, &$user, $category = NULL) {
switch ($op) {
case 'register':
// Admin created accounts aren't processed by the module.
if (user_access('administer users')) {
break;
}
if (variable_get('apply_for_role_register', 0)) {
$filter_roles = array();
foreach (variable_get('users_apply_roles', array()) as $rid => $role) {
if ($rid > 2) {
$filter_roles[$rid] = $role;
}
}
if (count($filter_roles)) {
$form['apply_for_role'] = array(
'#type' => 'fieldset',
'#title' => t('Apply for role'),
'#collapsible' => FALSE,
);
if (variable_get('apply_for_role_multiple', 0) == 0 && variable_get('apply_for_role_register', 0) == 1) {
$filter_roles[0] = t('--');
ksort($filter_roles);
}
$form['apply_for_role']['rid'] = array(
'#type' => variable_get('apply_for_role_multiple', 0) ? 'checkboxes' : 'select',
'#title' => variable_get('apply_for_role_multiple', 0) ? t('Select a role or roles') : t('Select a role'),
'#options' => $filter_roles,
'#required' => variable_get('apply_for_role_register', 0) == 2 ? TRUE : FALSE,
);
}
return $form;
}
break;
case 'insert':
if (variable_get('apply_for_role_register', 0) && !empty($edit['rid'])) {
apply_for_role_process_applications($user->uid, $edit['rid']);
}
break;
case 'delete':
db_query("DELETE FROM {users_roles_apply} WHERE uid = %d", $user->uid);
break;
}
}
/**
* Implementation of hook_hook_info().
*
* Let the Drupal know about our hook_apply_for_role($op, $apply) hook so that
* it can be used triggers for actions.
*
* We provide information on these hooks This allows admins to do things
* like send an email after the user applys for a role.
*/
function apply_for_role_hook_info() {
$info = array(
'apply_for_role' => array(
'apply_for_role' => array(
'apply' => array(
'runs when' => t('When a user submits an application for a role'),
),
'approve' => array(
'runs when' => t("When an admin approves a user's application for a role"),
),
'deny' => array(
'runs when' => t("When an admin denies a user's application for a role"),
),
'remove' => array(
'runs when' => t("When an admin deletes a user's application for a role"),
),
),
),
);
return $info;
}
/**
* Implementation of hook_action_info_alter().
*
* None of the built-in actions will be enabled for our hook by default. We
* need to implement hook_action_info_alter() so that we can enable a couple.
*/
function apply_for_role_action_info_alter(&$info) {
$actions = array(
'system_message_action',
'system_send_email_action',
'token_actions_message_action',
'token_actions_send_email_action',
'token_actions_goto_action',
);
$ops = array(
'apply',
'approve',
'deny',
'remove',
);
foreach ($actions as $action) {
if (isset($info[$action])) {
$info[$action]['hooks']['apply_for_role'] = $ops;
}
}
}
/**
* Implementation of hook_apply_for_role().
*
* We implement our own event to fire triggers.
*
* @param $op The operation that just occured: 'apply', 'approve', 'deny', 'remove'.
* @param $apply A role application object.
*/
function apply_for_role_apply_for_role($op, $apply) {
// Keep objects for reuse so that changes actions make to objects can persist.
static $objects;
if (!module_exists('actions')) {
return;
}
$user = user_load(array(
'uid' => $apply->uid,
));
$apply->user = $user;
$aids = _actions_get_hook_aids('apply_for_role', $op);
$context = array(
'hook' => 'apply_for_role',
'op' => $op,
'user' => $user,
'apply_for_role' => $apply,
);
foreach ($aids as $aid => $action_info) {
if ($action_info['type'] != 'user') {
if (!isset($objects[$action_info['type']])) {
$objects[$action_info['type']] = _actions_normalize_user_context($action_info['type'], $user);
}
$context['user'] = $user;
$context['apply'] = $apply;
actions_do($aid, $objects[$action_info['type']], $context);
}
else {
actions_do($aid, $user, $context);
}
}
}
/**
* Implementation of hook_token_values().
*/
function apply_for_role_token_values($type, $object = NULL) {
$values = array();
switch ($type) {
case 'apply_for_role':
// Cast to an object just in case fussy Drupal gave us an array
$apply = (object) $object;
$roles = user_roles();
$user = isset($apply->user) ? $apply->user : user_load(array(
'uid' => $apply->uid,
));
$values['apply_for_role-uid'] = $apply->uid;
$values['apply_for_role-name'] = check_plain($user->name);
$values['apply_for_role-name-raw'] = $user->name;
$values['apply_for_role-mail'] = check_plain($user->mail);
$values['apply_for_role-mail-raw'] = $user->mail;
$values['apply_for_role-rid'] = $apply->rid;
$values['apply_for_role-role'] = check_plain($roles[$apply->rid]);
$values['apply_for_role-status'] = check_plain(theme('apply_for_role_status', $apply->approved));
$values['apply_for_role-apply_date-yyyy'] = date('Y', $apply->apply_date);
$values['apply_for_role-apply_date-yy'] = date('y', $apply->apply_date);
$values['apply_for_role-apply_date-month'] = date('F', $apply->apply_date);
$values['apply_for_role-apply_date-mon'] = date('M', $apply->apply_date);
$values['apply_for_role-apply_date-mm'] = date('m', $apply->apply_date);
$values['apply_for_role-apply_date-m'] = date('n', $apply->apply_date);
$values['apply_for_role-apply_date-ww'] = date('W', $apply->apply_date);
$values['apply_for_role-apply_date-date'] = date('N', $apply->apply_date);
$values['apply_for_role-apply_date-day'] = date('l', $apply->apply_date);
$values['apply_for_role-apply_date-ddd'] = date('D', $apply->apply_date);
$values['apply_for_role-apply_date-dd'] = date('d', $apply->apply_date);
$values['apply_for_role-apply_date-d'] = date('j', $apply->apply_date);
break;
}
return $values;
}
/**
* Implementation of hook_token_list().
*/
function apply_for_role_token_list($type = 'all') {
if ($type == 'apply_for_role' || $type == 'all') {
$tokens['apply_for_role']['apply_for_role-uid'] = t("Applicant's user ID");
$tokens['apply_for_role']['apply_for_role-name'] = t("Applicant's user name");
$tokens['apply_for_role']['apply_for_role-name-raw'] = t("Applicant's user name. WARNING - raw user input.");
$tokens['apply_for_role']['apply_for_role-mail'] = t("Applicant's e-mail.");
$tokens['apply_for_role']['apply_for_role-mail-raw'] = t("Applicant's e-mail. WARNING - raw user input.");
$tokens['apply_for_role']['apply_for_role-rid'] = t('Application role ID');
$tokens['apply_for_role']['apply_for_role-role'] = t('Application role name');
$tokens['apply_for_role']['apply_for_role-status'] = t('Application status');
$tokens['apply_for_role']['apply_for_role-apply_date-yyyy'] = t("Application creation year (four digit)");
$tokens['apply_for_role']['apply_for_role-apply_date-yy'] = t("Application creation year (two digit)");
$tokens['apply_for_role']['apply_for_role-apply_date-month'] = t("Application creation month (full word)");
$tokens['apply_for_role']['apply_for_role-apply_date-mon'] = t("Application creation month (abbreviated)");
$tokens['apply_for_role']['apply_for_role-apply_date-mm'] = t("Application creation month (two digit, zero padded)");
$tokens['apply_for_role']['apply_for_role-apply_date-m'] = t("Application creation month (one or two digit)");
$tokens['apply_for_role']['apply_for_role-apply_date-ww'] = t("Application creation week (two digit)");
$tokens['apply_for_role']['apply_for_role-apply_date-date'] = t("Application creation date (day of month)");
$tokens['apply_for_role']['apply_for_role-apply_date-day'] = t("Application creation day (full word)");
$tokens['apply_for_role']['apply_for_role-apply_date-ddd'] = t("Application creation day (abbreviation)");
$tokens['apply_for_role']['apply_for_role-apply_date-dd'] = t("Application creation day (two digit, zero-padded)");
$tokens['apply_for_role']['apply_for_role-apply_date-d'] = t("Application creation day (one or two digit)");
return $tokens;
}
}
Functions
Constants
Name | Description |
---|---|
APPLY_FOR_ROLE_APPROVED | |
APPLY_FOR_ROLE_DENIED | |
APPLY_FOR_ROLE_PENDING | @file Allows users to apply for roles. |