array( 'node' => array('type' => 'node', 'label' => t('Content')), 'user' => array('type' => 'user', 'label' => t('User')), 'type' => array( 'type' => 'text', 'label' => t('Subscription type'), 'optional' => TRUE, 'options list' => 'subscriptions_rules_type_list', 'default value' => 'node', ), ), 'group' => t('Subscriptions'), 'access callback' => 'subscriptions_add_user_content_access', ); // Action subsribe a user to a content $items['subscriptions_add_user_content'] = $base + array( 'label' => t('Subscribe user to content'), 'base' => 'subscriptions_add_user_content_callback', ); // Action unsubsribe a user to a content $items['subscriptions_remove_user_content'] = $base + array( 'label' => t('Unsubscribe user to content'), 'base' => 'subscriptions_remove_user_content_callback', ); return $items; } /** * Rule subscriptions_add_user_content callback */ function subscriptions_add_user_content_callback($node, $user, $type = 'node') { // Get existed $sid = subscriptions_get_subscription($user->uid, 'node', 'nid', $node->nid); $args = array ( 0 => 'node', 1 => 'nid', 2 => $node->nid, 3 => -1, // DEBUG $node->uid, 4 => $user->uid, 5 => _subscriptions_get_setting('send_interval', $user), 6 => $type == 'node', 7 => $type == 'comment', ); if ($sid) { // Add more value to existed subscription_content row $update = db_update('subscriptions') ->condition('module', $args[0]) ->condition('field', $args[1]) ->condition('value', $args[2]) ->condition('author_uid', $args[3]) ->condition('recipient_uid', $args[4]); if ($args[6]) { $update->fields(array( 'send_updates' => 1, )); } if ($args[7]) { $update->fields(array( 'send_comments' => 1, )); } $ret = $update->execute(); } else { $ret = call_user_func_array('subscriptions_write_subscription', $args); } return $ret; } /** * Rule subscriptions_remove_user_content callback */ function subscriptions_remove_user_content_callback($node, $user, $type = 'node') { $args = array ( 0 => 'node', 1 => 'nid', 2 => $node->nid, 3 => -1, // DEBUG $node->uid, 4 => $user->uid, 5 => _subscriptions_get_setting('send_interval', $user), 6 => $type == 'node', 7 => $type == 'comment', ); // Delete single rows $delete = db_delete('subscriptions') ->condition('module', $args[0]) ->condition('field', $args[1]) ->condition('value', $args[2]) ->condition('author_uid', $args[3]) ->condition('recipient_uid', $args[4]); // Update row that has both comments and update $update = db_update('subscriptions') ->condition('module', $args[0]) ->condition('field', $args[1]) ->condition('value', $args[2]) ->condition('author_uid', $args[3]) ->condition('recipient_uid', $args[4]); // Remove node rows if ($args[6]) { $delete->condition('send_updates', 1); $delete->condition('send_comments', 0); $update->fields(array( 'send_updates' => 0 )); } // Remove comments rows if ($args[7]) { $delete->condition('send_updates', 0); $delete->condition('send_comments', 1); $update->fields(array( 'send_comments' => 0, )); } $ret = $delete->execute() || $update->execute(); return $ret; } /** * TODO: user_access */ function subscriptions_add_user_content_access() { return TRUE; } /** * Options list callback for the operation parameter of condition user has role. */ function subscriptions_rules_type_list() { return array( 'node' => t('Node'), 'comment' => t('Comment'), ); }