View source
<?php
define('INVITE_SESSION_CODE', 'invite_code');
define('INVITE_SESSION_FAILED', 'invite_failed');
define('INVITE_SESSION_ADMIN', 'invite_admin_filter');
define('INVITE_VALID', 1);
define('INVITE_WITHDRAWN', 2);
define('INVITE_USED', 3);
define('INVITE_EXPIRED', 4);
define('USER_REGISTER_INVITATION_ONLY', 3);
function invite_entity_info() {
$return = array(
'invite' => array(
'label' => t('Invite'),
'entity class' => 'Invite',
'controller class' => 'InviteController',
'base table' => 'invite',
'fieldable' => TRUE,
'entity keys' => array(
'id' => 'iid',
'bundle' => 'type',
),
'bundle keys' => array(
'bundle' => 'type',
),
'bundles' => array(),
'load hook' => 'invite_load',
'view modes' => array(
'full' => array(
'label' => t('Default'),
'custom settings' => FALSE,
),
),
'label callback' => 'entity_class_label',
'uri callback' => 'entity_class_uri',
'module' => 'invite',
'access callback' => 'invite_access',
'metadata controller class' => 'InviteMetadataController',
),
);
$return['invite_type'] = array(
'label' => t('Invite Type'),
'entity class' => 'InviteType',
'controller class' => 'InviteTypeController',
'base table' => 'invite_type',
'fieldable' => FALSE,
'bundle of' => 'invite',
'exportable' => TRUE,
'entity keys' => array(
'id' => 'itid',
'name' => 'type',
'label' => 'label',
),
'module' => 'invite',
'admin ui' => array(
'path' => 'admin/structure/invite-types',
'file' => 'includes/invite.admin.inc',
'controller class' => 'InviteTypeUIController',
),
'access callback' => 'invite_type_access',
);
return $return;
}
function invite_entity_info_alter(&$entity_info) {
foreach (invite_get_types() as $type => $info) {
$entity_info['invite']['bundles'][$type] = array(
'label' => $info->label,
'admin' => array(
'path' => 'admin/structure/invite-types/manage/%invite_type',
'real path' => 'admin/structure/invite-types/manage/' . $type,
'bundle argument' => 4,
),
);
}
}
function invite_block_info() {
$blocks = array();
foreach (invite_get_types() as $type => $info) {
$blocks['invite_add_' . $type] = array(
'info' => t('Create invite @type.', array(
'@type' => $info->label,
)),
);
}
return $blocks;
}
function invite_block_view($delta) {
$type = str_replace('invite_add_', '', $delta);
if (!(user_access('create any invite entities') || user_access('create ' . $type . ' entity'))) {
return NULL;
}
module_load_include('inc', 'invite', 'includes/invite.admin');
$invite_type = invite_get_types($type);
$invite = entity_create('invite', array(
'type' => $type,
));
$block['subject'] = t('Create @name', array(
'@name' => entity_label('invite_type', $invite_type),
));
$block['content'] = drupal_get_form('invite_form', $invite);
return $block;
}
function invite_menu() {
$items = array();
$items['invite/add'] = array(
'title' => 'Add Invite',
'page callback' => 'invite_admin_add_page',
'access arguments' => array(
'create any invite entities',
),
'file' => 'includes/invite.admin.inc',
'type' => MENU_LOCAL_ACTION,
'tab_parent' => 'invite',
'tab_root' => 'invite',
);
$invite_uri = 'invite/%invite';
$invite_uri_argument_position = 1;
$items[$invite_uri] = array(
'title callback' => 'entity_label',
'title arguments' => array(
'invite',
$invite_uri_argument_position,
),
'page callback' => 'invite_view',
'page arguments' => array(
$invite_uri_argument_position,
),
'access callback' => 'entity_access',
'access arguments' => array(
'view',
'invite',
$invite_uri_argument_position,
),
'file' => 'includes/invite.pages.inc',
);
$items[$invite_uri . '/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items[$invite_uri . '/delete'] = array(
'title' => 'Delete invite',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'invite_delete_form',
$invite_uri_argument_position,
),
'access callback' => 'entity_access',
'access arguments' => array(
'edit',
'invite',
$invite_uri_argument_position,
),
'file' => 'includes/invite.admin.inc',
);
$items[$invite_uri . '/edit'] = array(
'title' => 'Edit',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'invite_form',
$invite_uri_argument_position,
),
'access callback' => 'entity_access',
'access arguments' => array(
'edit',
'invite',
$invite_uri_argument_position,
),
'file' => 'includes/invite.admin.inc',
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
);
foreach (invite_get_types() as $type => $info) {
$items['invite/add/' . $type] = array(
'title' => 'Add invite',
'page callback' => 'invite_add',
'page arguments' => array(
2,
),
'access callback' => 'invite_access',
'access arguments' => array(
'create',
$type,
),
'file' => 'includes/invite.admin.inc',
);
}
$items['admin/config/people/invite'] = array(
'title' => 'Invite',
'description' => 'Modify invitation settings.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'invite_settings_form',
),
'access arguments' => array(
'administer invitations',
),
'type' => MENU_NORMAL_ITEM,
'weight' => 10,
'file' => 'includes/invite.admin.inc',
);
$items['admin/config/people/invite/common'] = array(
'title' => 'Invite',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 10,
);
$weight = 20;
foreach (invite_get_types() as $type => $info) {
$items['user/%/invites/' . $type] = array(
'title' => $info->label,
'page callback' => 'invite_add',
'page arguments' => array(
3,
),
'access callback' => 'invite_access',
'access arguments' => array(
'create',
$type,
),
'file' => 'includes/invite.admin.inc',
'type' => MENU_LOCAL_TASK,
'weight' => $weight++,
);
}
$items['invite/accept/%invite_by_code'] = array(
'page callback' => 'invite_accept',
'page arguments' => array(
2,
),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
'file' => 'includes/invite.pages.inc',
);
$items['invite/withdraw/%invite_by_code'] = array(
'page callback' => 'drupal_get_form',
'page arguments' => array(
'invite_withdraw_form',
2,
),
'access callback' => 'invite_withdraw_access',
'access arguments' => array(
2,
),
'type' => MENU_CALLBACK,
'file' => 'includes/invite.pages.inc',
);
$items['invite/resend/%invite_by_code'] = array(
'title' => 'Resend invitation',
'page callback' => 'invite_resend',
'page arguments' => array(
2,
),
'access callback' => 'invite_resend_access',
'access arguments' => array(
2,
),
'type' => MENU_CALLBACK,
'file' => 'includes/invite.pages.inc',
);
if (variable_get('invite_version_updated', TRUE)) {
$items['admin/config/people/invite/migrate'] = array(
'title' => 'Migrate',
'description' => 'Migrate version 2.x invites.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'invite_migrate_form',
),
'access arguments' => array(
'administer invitations',
),
'type' => MENU_LOCAL_TASK,
'weight' => 20,
'file' => 'includes/invite.admin.inc',
);
}
return $items;
}
function invite_form_user_admin_settings_alter(&$form, &$form_state, $form_id) {
$item = menu_get_item('user/register');
if (in_array($item['access_callback'], array(
'user_register_access',
'invite_user_register_access',
))) {
$form['registration_cancellation']['user_register']['#options'][USER_REGISTER_INVITATION_ONLY] = t('Invitees only');
}
$form['#submit'][] = 'menu_rebuild';
}
function invite_menu_alter(&$items) {
if (invite_user_registration_by_invite_only()) {
$items['user/register']['access callback'] = 'invite_user_register_access';
}
}
function invite_user_registration_by_invite_only() {
return variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) == USER_REGISTER_INVITATION_ONLY;
}
function invite_user_register_access() {
$invite = invite_load_from_session();
if ((empty($invite) || invite_validate($invite) != INVITE_VALID) && !user_access('administer users')) {
return FALSE;
}
return user_register_access();
}
function invite_validate($invite) {
if (!$invite || $invite->canceled != 0) {
return INVITE_WITHDRAWN;
}
elseif ($invite->joined != 0) {
return INVITE_USED;
}
elseif ($invite->expiry < REQUEST_TIME) {
return INVITE_EXPIRED;
}
else {
return INVITE_VALID;
}
}
function invite_access($op, $invite = NULL, $account = NULL, $entity_type = NULL) {
global $user;
if (!isset($account)) {
$account = $user;
}
switch ($op) {
case 'create':
$type = isset($invite) && is_object($invite) ? $invite->type : $invite;
return user_access('administer invite entities', $account) || user_access('create any invite entities', $account) || user_access('create ' . $type . ' entity');
case 'view':
return user_access('administer invite entities', $account) || user_access('view any invite entities', $account) || $invite->uid == $account->uid;
case 'edit':
return user_access('administer invite entities') || user_access('edit any invite entities') || isset($invite) && (user_access('edit own invite entities') && $invite->uid == $account->uid);
case 'withdraw':
return user_access('withdraw invitations') || isset($invite) && (user_access('edit own invite entities') && $invite->invitee == $account->uid);
}
return TRUE;
}
function invite_withdraw_access($invite) {
global $user;
if ($invite->status == INVITE_WITHDRAWN) {
drupal_set_message(t('The invitation has already been withdrawn.'), 'error');
return FALSE;
}
if (!$invite->joined) {
$permission = 'withdraw own invitations';
}
else {
$permission = 'withdraw own accepted invitations';
}
if (($invite->uid == $user->uid || $invite->invitee == $user->uid) && user_access($permission) || user_access('administer invitations')) {
return TRUE;
}
else {
return FALSE;
}
}
function invite_resend_access($invite) {
global $user;
$is_valid = $invite->joined == 0 && $invite->canceled == 0;
$access_own = user_access('resend own invitations') && $invite->uid == $user->uid;
$access_any = user_access('resend any invitations');
$is_expired = $invite->expiry < REQUEST_TIME || user_access('resend unexpired invitations');
return $is_valid && $is_expired && ($access_own || $access_any);
}
function invite_type_access($op, $entity = NULL) {
return user_access('administer invite types');
}
function invite_permission() {
$permissions = array(
'administer invitations' => array(
'title' => t('Administer invitations'),
'description' => t('Administer all invitations'),
'restrict access' => TRUE,
),
'administer invite types' => array(
'title' => t('Administer invite types'),
'description' => t('Allows users to configure invite types and their fields.'),
'restrict access' => TRUE,
),
'create any invite entities' => array(
'title' => t('Create any invites'),
'description' => t('Allows users to create invites of any type.'),
'restrict access' => FALSE,
),
'view any invite entities' => array(
'title' => t('View any invites'),
'description' => t('Allows users to view invites.'),
'restrict access' => TRUE,
),
'edit any invite entities' => array(
'title' => t('Edit any invites'),
'description' => t('Allows users to edit any invites.'),
'restrict access' => TRUE,
),
'edit own invite entities' => array(
'title' => t('Edit own invites'),
'description' => t('Allows users to edit own invites.'),
'restrict access' => FALSE,
),
'withdraw own invitations' => array(
'title' => t('Withdraw own invitations'),
'description' => t('Allows users to withdraw own invitations.'),
'restrict access' => FALSE,
),
'withdraw own accepted invitations' => array(
'title' => t('Withdraw own accepted invitations'),
'description' => t('Allows users to edit own invites.'),
'restrict access' => FALSE,
),
'resend own invitations' => array(
'title' => t('Resend own invitations'),
'description' => t('Allows users to resend their invitations that have expired. Add the "resend unexpired invitations" permission to allow them to resend their invitations that have not expired yet.'),
'restrict access' => FALSE,
),
'resend any invitations' => array(
'title' => t('Resend any invitations'),
'description' => t('Allows users to resend any invitation that have expired. Add the "resend unexpired invitations" permission to allow them to resend the invitations that have not expired yet.'),
'restrict access' => FALSE,
),
'resend unexpired invitations' => array(
'title' => t('Resend unexpired invitations'),
'description' => t('Allows users to resend invitations that have not expired yet. This needs to be used in relation with the "resend own invitations" or "resend any invitations" permission.'),
'restrict access' => FALSE,
),
);
foreach (invite_get_types() as $invite_type) {
$permissions['create ' . $invite_type->type . ' entity'] = array(
'title' => t('%name create new invites.', array(
'%name' => $invite_type->label,
)),
'description' => '',
'restrict access' => FALSE,
);
}
return $permissions;
}
function invite_by_code_load($reg_code) {
$invites = invite_load_multiple(FALSE, array(
'reg_code' => $reg_code,
));
return reset($invites);
}
function invite_load_from_session() {
if (isset($_SESSION[INVITE_SESSION_CODE])) {
$invite = invite_by_code_load($_SESSION[INVITE_SESSION_CODE]);
}
elseif (arg(0) == 'user' && arg(1) == 'register' && ($reg_code = arg(2))) {
if ($invite = invite_by_code_load($reg_code)) {
$_SESSION[INVITE_SESSION_CODE] = $invite->reg_code;
}
}
if (!empty($invite)) {
return $invite;
}
else {
return FALSE;
}
}
function invite_load($iid, $reset = FALSE) {
$invites = invite_load_multiple(array(
$iid,
), array(), $reset);
return reset($invites);
}
function invite_load_multiple($iids, $conditions = array(), $reset = FALSE) {
return entity_load('invite', $iids, $conditions, $reset);
}
function invite_save($invite) {
return entity_save('invite', $invite);
}
function invite_delete($invite) {
entity_delete('invite', entity_id('invite', $invite));
}
function invite_delete_multiple($invite_ids) {
entity_delete_multiple('invite', $invite_ids);
}
function invite_invite_insert($entity) {
if ($entity
->sendInvite()) {
if ($entity->sendNotification) {
drupal_set_message(t('Invitation has been sent.'));
}
}
else {
if ($entity->sendNotification) {
drupal_set_message(t('Failed to send a message.'), 'error');
}
}
}
function invite_metadata_entity_get_properties($entity, array $options, $name, $entity_type) {
$invite = entity_metadata_wrapper('invite', $entity);
switch ($name) {
case 'invite_accept_link':
$result = url('invite/accept/' . $invite->reg_code
->value(), array(
'absolute' => TRUE,
));
break;
case 'invite_withdraw_link':
$result = url('invite/withdraw/' . $invite->reg_code
->value(), array(
'absolute' => TRUE,
));
break;
case 'invite_resend_link':
$result = url('invite/resend/' . $invite->reg_code
->value(), array(
'absolute' => TRUE,
));
break;
default:
$result = '';
}
return $result;
}
function invite_type_load($invite_type_name) {
return invite_get_types($invite_type_name);
}
function invite_get_types($type_name = NULL) {
$types = entity_load_multiple_by_name('invite_type', isset($type_name) ? array(
$type_name,
) : FALSE);
return isset($type_name) ? reset($types) : $types;
}
function invite_type_save($invite_type) {
entity_save('invite_type', $invite_type);
}
function invite_type_delete($invite_type) {
entity_delete('invite_type', entity_id('invite_type', $invite_type));
}
function invite_type_delete_multiple($invite_type_ids) {
entity_delete_multiple('invite_type', $invite_type_ids);
}
function invite_views_api() {
return array(
'api' => '3.0',
'path' => drupal_get_path('module', 'invite') . '/views',
);
}
function invite_views_data_alter(&$data) {
$data['invite']['status']['field']['handler'] = 'views_handler_field_invite_status';
$data['invite']['status']['filter']['handler'] = 'views_handler_filter_in_operator';
$data['invite']['status']['filter']['options callback'] = 'invite_get_status_options';
}
function invite_get_status_options() {
return array(
INVITE_VALID => t('Valid'),
INVITE_WITHDRAWN => t('Withdrawn'),
INVITE_USED => t('Joined'),
INVITE_EXPIRED => t('Expired'),
);
}
function invite_user_login($edit, $account) {
$invite = invite_load_from_session();
if ($invite && $invite
->status() == INVITE_VALID) {
$invite->invitee = $account->uid;
$invite->joined = REQUEST_TIME;
$invite->status = INVITE_USED;
entity_save('invite', $invite);
if (isset($_SESSION)) {
unset($_SESSION[INVITE_SESSION_CODE]);
}
}
}
function invite_user_insert(&$edit, $account, $category) {
$invite = invite_load_from_session();
if ($invite && $invite
->status() == INVITE_VALID) {
$invite->invitee = $account->uid;
$invite->joined = REQUEST_TIME;
$invite->status = INVITE_USED;
entity_save('invite', $invite);
if (isset($_SESSION)) {
unset($_SESSION[INVITE_SESSION_CODE]);
}
}
}
function invite_invite_update($invite) {
if (isset($invite->original) && !$invite->original->joined && $invite->joined) {
$account = $invite
->invitee();
module_invoke_all('invite_accept', $invite, $account);
if (module_exists('rules')) {
rules_invoke_event('invite_accept', $invite, $account);
}
}
}
function invite_user_presave(&$edit, $account, $category) {
if ($account->is_new && !empty($account->mail)) {
$invite = invite_load_from_session();
if ($invite) {
$roles = invite_target_roles($invite, $edit);
if ($roles) {
if (!isset($edit['roles']) || !is_array($edit['roles'])) {
$edit['roles'] = array();
}
foreach ($roles as $role) {
$edit['roles'][$role] = $role;
}
}
if (!variable_get('invite_require_approval', FALSE)) {
$edit['status'] = 1;
}
else {
$edit['status'] = 0;
}
}
}
}
function invite_target_roles($invite, $account) {
$targets = array();
$invite = entity_metadata_wrapper('invite', $invite);
$inviter = user_load($invite->inviter->uid
->value());
$roles = array_intersect($inviter->roles, user_roles(TRUE, 'send invitations'));
$roles['default'] = 'default';
foreach ($roles as $rid => $role) {
$target = variable_get('invite_target_role_' . $rid, DRUPAL_AUTHENTICATED_RID);
if ($target != DRUPAL_AUTHENTICATED_RID) {
$targets[$target] = $target;
}
}
drupal_alter('invite_target_roles', $targets, $invite, $account);
return $targets;
}
function invite_cron() {
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'invite')
->propertyCondition('expiry', time(), "<")
->propertyCondition('status', INVITE_VALID, "=");
$results = $query
->execute();
if (!empty($results) && !empty($results['invite'])) {
$invites = entity_load('invite', array_keys($results['invite']));
foreach ($invites as $invite) {
$invite->status = INVITE_EXPIRED;
entity_save('invite', $invite);
}
}
}