function signup_sign_up_user in Signup 7
Same name and namespace in other branches
- 5.2 signup.module \signup_sign_up_user()
- 5 signup.module \signup_sign_up_user()
- 6.2 signup.module \signup_sign_up_user()
- 6 signup.module \signup_sign_up_user()
Signs up a user to a node.
Caution: This function does not perform any access checking.
NOTE: other modules can call this function. To do so, $signup_form must be as follows:
Parameters
array $signup_form: $signup_form['nid'] : nid of the node to which the user will be signed up $signup_form['uid'] : uid of the user to sign up $signup_form['signup_anon_mail'] : Optional. An email address of an anonymous user to sign up. Only include this if the user is not already registered with the site. $signup_form['uid'] will automatically be set to 0 if this element is passed in. NOTE: It's highly recommended to call the signup_validate_anon_email function in the external module's validation cycle or perform that function's validation logic prior to passing in this element! $signup_form['signup_form_data'] : an array of key/value pairs -- key is the data category, value is the user input
bool $notify_user: When set to TRUE, confirmation messages are displayed via drupal_set_message() and confirmation/forwarding emails are sent if enabled for the current node.
bool $reset_node_load: When set to TRUE, node_load() is called with the optional reset argument as TRUE. This can sometimes be helpful when signups have been opened with signup_open_signup() since that function can cause static caching of the node object, thus leading to the $node->signup_status check here failing when it should not.
Return value
int|false The signup id (SID) if the user was successfully signed up, FALSE if the user is already signed up or signups are not allowed on the given node.
2 calls to signup_sign_up_user()
- signup_form_submit in includes/
signup_form.inc - Submit handler for the user signup form.
- signup_user_insert in ./
signup.module - Implements hook_user_insert().
File
- ./
signup.module, line 1327 - The Signup module (http://drupal.org/project/signup) manages replies to nodes. In particular, it's good for event management. Signup supports sending reminder emails and automatically closing signups for nodes with a start time, via the Event…
Code
function signup_sign_up_user($signup_form, $notify_user = TRUE, $reset_node_load = FALSE) {
if ($reset_node_load) {
$node = node_load($signup_form['nid'], NULL, TRUE);
}
else {
$node = node_load($signup_form['nid']);
}
// Since this is an API call, we need to validate that there are no
// duplicate signups being generated, even though through the usual
// UI, there's no way to reach this function if it's a duplicate.
// How to find duplicates is different for anonymous and
// authenticated signups.
$signup_anon_mail = '';
if (!empty($signup_form['signup_anon_mail'])) {
$signup_anon_mail = $signup_form['signup_anon_mail'];
// Ensure the uid is 0 for anonymous signups, even if it's not duplicate.
$signup_form['uid'] = 0;
// Now, see if this email is already signed-up.
if ((bool) db_query_range("SELECT 1 FROM {signup_log} WHERE anon_mail = :mail AND nid = :nid", 0, 1, array(
':mail' => $signup_anon_mail,
':nid' => $node->nid,
))
->fetchField()) {
drupal_set_message(t('Anonymous user %email is already signed up for %title', array(
'%email' => $signup_anon_mail,
'%title' => $node->title,
), array(
'langcode' => 'error',
)));
return FALSE;
}
}
else {
// This query does the JOIN on {users} so we can avoid a full
// user_load() just so theme('username') can have the data it
// needs for the error message we might print out.
$result = db_query("SELECT sl.uid, u.name FROM {signup_log} sl INNER JOIN {users} u ON sl.uid = u.uid WHERE sl.uid = :uid AND sl.nid = :nid", array(
':uid' => $signup_form['uid'],
':nid' => $signup_form['nid'],
));
$account = $result
->fetchObject();
if (!empty($account)) {
drupal_set_message(t('User !user is already signed up for %title', array(
'!user' => theme('username', array(
'account' => $account,
)),
'%title' => $node->title,
)), 'error');
return FALSE;
}
}
// If we made it this far, we're going to need the full user object.
$account = user_load($signup_form['uid']);
if ($node->signup_status) {
// Grab the current time once, since we need it in a few places.
$current_time = REQUEST_TIME;
// Allow other modules to inject data into the user's signup data.
$extra = module_invoke_all('signup_sign_up', $node, $account);
$signup_info = array();
if (!empty($signup_form['signup_form_data'])) {
$signup_info = $signup_form['signup_form_data'];
}
if (!empty($extra)) {
$signup_info = array_merge($signup_info, $extra);
}
// Figure out if confirmation or reminder emails will be sent and
// inform the user.
$confirmation_email = $node->signup_send_confirmation ? ' ' . t('A confirmation email will be sent shortly containing further information about this %node_type.', array(
'%node_type' => node_type_get_name($node->type),
)) : '';
$reminder_email = $node->signup_send_reminder ? ' ' . t('A reminder email will be sent !number !days before the %node_type.', array(
'!number' => $node->signup_reminder_days_before,
'!days' => format_plural($node->signup_reminder_days_before, 'day', 'days'),
'%node_type' => node_type_get_name($node->type),
)) : '';
// Construct the appropriate $signup object representing this signup.
$signup = new stdClass();
$signup->nid = $node->nid;
// Grab the values from the $account object we care about
foreach (array(
'uid',
'name',
'mail',
) as $field) {
$signup->{$field} = $account->{$field};
}
// Other special signup values.
$signup->form_data = $signup_info;
$signup->signup_time = $current_time;
// By default, signups should count towards the limit.
$signup->count_towards_limit = 1;
if (!empty($signup_anon_mail)) {
$signup->anon_mail = $signup_anon_mail;
}
// Invoke hook_signup_data_alter() to let other modules change this.
drupal_alter('signup_data', $signup, $signup_form);
// Insert the signup into the {signup_log} table.
signup_save_signup($signup);
// See if we should generate any notifications from this signup.
if ($notify_user) {
// Confirmation e-mail to the user who signed up.
if ($node->signup_send_confirmation) {
signup_send_confirmation_mail($signup, $node);
}
// Notification email to an administrator or coordinator.
signup_send_forwarding_mail($signup, $node);
// Message to the screen for the user who signed up.
// First, allow other modules to alter the messages.
$messages = array();
$messages['initial'] = 'Signup to !title confirmed.';
$messages['confirmation_email'] = $confirmation_email;
$messages['reminder_email'] = $reminder_email;
drupal_alter('signup_confirm_messages', $messages, $signup, $node);
drupal_set_message(t($messages['initial'], array(
'!title' => l($node->title, "node/{$node->nid}"),
)) . $messages['confirmation_email'] . $messages['reminder_email']);
}
$node->signup_total++;
if (!empty($signup->count_towards_limit)) {
$node->signup_effective_total += $signup->count_towards_limit;
if ($node->signup_close_signup_limit) {
_signup_check_limit($node, 'total');
}
}
return $signup->sid;
}
else {
drupal_access_denied();
}
}