Index: includes/node_admin.inc ========================================================= --- includes/node_admin.inc (revision 1.1.2.5) +++ includes/node_admin.inc Mon Nov 15 15:30:10 CET 2010 @@ -152,10 +152,23 @@ case 'attend_yes': $attend = 1; + + if (module_exists('rules')) { + foreach ($users as $sid) { + $signup = signup_load_signup($sid); + rules_invoke_event('user_attended', $signup); + } + } break; case 'attend_no': $attend = 0; + if (module_exists('rules')) { + foreach ($users as $sid) { + $signup = signup_load_signup($sid); + rules_invoke_event('user_notattended', $signup); + } + } break; } Index: includes/signup.rules.inc ========================================================= --- includes/signup.rules.inc (revision 0) +++ includes/signup.rules.inc Tue Jun 08 21:20:08 CEST 2010 @@ -0,0 +1,133 @@ + array( + 'label' => t('User signed up to a node'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'signup_update' => array( + 'label' => t('User updated signup to a node'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'signup_cancel' => array( + 'label' => t('User canceled signup to a node'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(TRUE), + ), + 'user_add' => array( + 'label' => t('User was added to a signup'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'user_attended' => array( + 'label' => t('User attended'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'user_notattended' => array( + 'label' => t('User did not attend'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'open_signup' => array( + 'label' => t('Signup for a node was opened'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + 'close_signup' => array( + 'label' => t('Signup for a node was closed'), + 'module' => 'Signup', + 'arguments' => signup_rules_events_signup_arguments(FALSE), + ), + ); +} + +/** + * Default arguments to signup rules events. + */ +function signup_rules_events_signup_arguments($have_node = FALSE) { + return array( + 'signup' => array( + 'type' => 'signup', + 'label' => t('signup object'), + ), + 'node' => array( + 'type' => 'node', + 'label' => t('Node to which the user signed up'), + 'handler' => $have_node ? '' : 'signup_rules_events_argument_signup_node', + ), + 'account' => array( + 'type' => 'user', + 'label' => t('acting user'), + 'handler' => 'signup_rules_events_argument_signup_user', + ), + ); +} + +/** + * Load associated node for a signup object. + */ +function signup_rules_events_argument_signup_node($signup) { + return node_load($signup->nid); +} + +/** + * Load associated user account for a signup object. + */ +function signup_rules_events_argument_signup_user($signup) { + // If signup user is anonymous user get basic info from signup object. + if (!$signup->uid) { + $account = new stdClass(); + $account->uid = 0; + $account->name = ''; + $account->mail = $signup->anon_mail; + $account->roles = array(DRUPAL_ANONYMOUS_RID => 'anonymous user'); + } + else { + $account = user_load($signup->uid); + } + return $account; +} + +/** + * Implementation of hook_rules_data_type_info(). + * @ingroup rules + */ +function signup_rules_data_type_info() { + return array( + 'signup' => array( + 'label' => t('signup'), + 'class' => 'rules_data_type_signup', + 'savable' => FALSE, + 'identifiable' => TRUE, + ), + ); +} + +/** + * Implements the signup data type. + * @ingroup rules + */ +class rules_data_type_signup extends rules_data_type { + function load($sid) { + return signup_load_signup($sid); + } + + function get_identifier() { + $signup = $this->get(); + return $signup->sid; + } +} \ No newline at end of file Index: signup.module ========================================================= --- signup.module (revision 1.205.2.38) +++ signup.module Sun Nov 14 07:05:43 CET 2010 @@ -875,9 +875,47 @@ 'description' => t('Mark signup did not attend'), 'configurable' => FALSE, ), + 'signup_user_signup' => array( + 'type' => 'signup_user', + 'description' => t('Signup user'), + 'configurable' => FALSE, + ), + 'signup_user_cancelsignup' => array( + 'type' => 'signup_user', + 'description' => t('Cancel signup for a user'), + 'configurable' => FALSE, + ), ); } +function signup_user_signup($user) { + if ((arg(0) == 'node') && (is_numeric(arg(1)))) { + $sid = db_result(db_query("SELECT sl.sid FROM {signup_log} sl WHERE sl.nid = %d AND sl.uid=%d", arg(1), $user->uid)); + if ($sid) { + $signup = signup_load_signup($sid); + signup_mark_attended_action($signup); + } + else { + $signup_form['nid'] = arg(1); + $signup_form['uid'] = $user->uid; + $sid = signup_sign_up_user($signup_form, FALSE); + if ($sid) { + $signup = signup_load_signup($sid); + signup_mark_attended_action($signup); + } + } + } +} + +function signup_user_cancelsignup($user) { + if ((arg(0) == 'node') && (is_numeric(arg(1)))) { + $sid = db_result(db_query("SELECT sl.sid FROM {signup_log} sl WHERE sl.nid = %d AND sl.uid=%d", arg(1), $user->uid)); + if ($sid) { + signup_cancel_signup($sid, FALSE); + } + } +} + /** * Action callback to cancel a given signup. * @@ -905,6 +943,12 @@ function signup_mark_attended_action(&$signup) { db_query("UPDATE {signup_log} SET attended = %d WHERE sid = %d", TRUE, $signup->sid); $signup->attended = TRUE; + + // Invoke rules event handler to mark attended. + if (module_exists('rules')) { + rules_invoke_event('user_attended', $signup); + } + watchdog('action', 'Marked signup @signup_id attended.', array('@signup_id' => $signup->sid)); } @@ -921,6 +965,12 @@ function signup_mark_not_attended_action(&$signup) { db_query("UPDATE {signup_log} SET attended = %d WHERE sid = %d", FALSE, $signup->sid); $signup->attended = FALSE; + + // Invoke rules event handler to mark not attended. + if (module_exists('rules')) { + rules_invoke_event('user_nonattended', $signup); + } + watchdog('action', 'Marked signup @signup_id did not attend.', array('@signup_id' => $signup->sid)); } @@ -937,6 +987,12 @@ 'load' => 'signup_load_signup', 'title' => 'label', ), + 'signup_user' => array( + 'type' => 'signup_user', + 'base_table' => 'users', + 'load' => 'user_load', + 'title' => 'name', + ), ); } @@ -1011,6 +1067,11 @@ if (!empty($rval)) { // If we successfully wrote a record, invoke the appropriate hook. module_invoke_all($hook, $signup); + + // Invoke rules event handlers. + if (module_exists('rules')) { + rules_invoke_event($hook, $signup); + } } // Propagate the return value from drupal_write_record(). @@ -1091,6 +1152,11 @@ // Invoke hook_signup_cancel(). module_invoke_all('signup_cancel', $signup, $node); + // Invoke rules event handler to cancel signup. + if (module_exists('rules')) { + rules_invoke_event('signup_cancel', $signup, $node); + } + // Delete the record from the {signup_log} table. db_query('DELETE FROM {signup_log} WHERE sid = %d', $signup->sid); if ($notify_user) { @@ -1131,6 +1197,12 @@ $function = $module .'_signup_close'; $function($node); } + + // Invoke rules event handler to close signup. + if (module_exists('rules')) { + rules_invoke_event('close_signup', null, $node); + } + watchdog('signup', 'Signups closed for %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'. $nid)); } } @@ -1147,6 +1219,12 @@ $function = $module .'_signup_open'; $function($node); } + + // Invoke rules event handler to open signup. + if (module_exists('rules')) { + rules_invoke_event('open_signup', null, $node); + } + watchdog('signup', 'Signups reopened for %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'. $nid)); } } @@ -1265,6 +1343,11 @@ // Invoke hook_signup_data_alter() to let other modules change this. drupal_alter('signup_data', $signup, $signup_form); + // Invoke rules event handler to add users. + if (module_exists('rules')) { + rules_invoke_event('user_add', $signup, $node, $account); + } + // Insert the signup into the {signup_log} table. signup_save_signup($signup);