Index: simplenews.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.module,v retrieving revision 1.220.2.30 diff -u -r1.220.2.30 simplenews.module --- simplenews.module 19 May 2010 14:02:24 -0000 1.220.2.30 +++ simplenews.module 13 Jun 2010 07:59:22 -0000 @@ -176,7 +176,7 @@ 'title' => 'Subscriptions', 'type' => MENU_CALLBACK, 'page callback' => 'drupal_get_form', - 'page arguments' => array('simplenews_admin_users_form', 5), + 'page arguments' => array('simplenews_admin_all_subscriptions_form', 5), 'access arguments' => array('administer simplenews subscriptions'), 'file' => 'simplenews.subscription.inc', ); @@ -276,7 +276,7 @@ 'title' => 'Manage newsletter subscriptions', 'type' => MENU_CALLBACK, 'page callback' => 'drupal_get_form', - 'page arguments' => array('simplenews_subscription_manager_form'), + 'page arguments' => array('simplenews_edit_own_subscriptions_form'), 'access arguments' => array('subscribe to newsletters'), 'file' => 'simplenews.subscription.inc', ); @@ -861,7 +861,8 @@ case 'form': if ($category == 'newsletter') { $subscription = simplenews_get_subscription($account); - $form = _simplenews_subscription_manager_form($subscription); + $form = __simplenews_edit_own_subscriptions_form($subscription); + //unset($form['#redirect']); $form['subscriptions']['#title'] = t('Current newsletter subscriptions'); unset($form['update'], $form['subscriptions']['mail']); return $form; @@ -1308,11 +1309,11 @@ } /** - * Build subscription manager form. + * Build edit own subscriptions form. * * @param object $subscription subscription object */ -function _simplenews_subscription_manager_form($subscription) { +function _simplenews_edit_own_subscriptions_form($subscription) { $form = array(); $options = array(); $default_value = array(); @@ -1367,6 +1368,79 @@ '#weight' => 30, ); } + + $form['#validate'][] = 'simplenews_edit_own_subscriptions_form_validate'; + $form['#submit'][] = 'simplenews_edit_own_subscriptions_form_submit'; + $form['#redirect'] = ''; //Return to home page after (un)subscribe + + return $form; +} + +/** + * Build admin all subscriptions form. + * + * @param object $subscription subscription object + */ +function _simplenews_admin_all_subscriptions_form($subscription) { + $form = array(); + $options = array(); + $default_value = array(); + global $language; + + // Get newsletters for subscription form checkboxes. + // Newsletters with opt-in/out method 'hidden' will not be listed. + foreach(simplenews_get_newsletters(variable_get('simplenews_vid', '')) as $newsletter) { + $options[$newsletter->tid] = check_plain($newsletter->name); + $default_value[$newsletter->tid] = FALSE; + } + + $form['subscriptions'] = array( + '#type' => 'fieldset', + '#description' => t('Select the newsletter(s) to which you want to subscribe or unsubscribe.'), + ); + $form['subscriptions']['newsletters'] = array( + '#type' => 'checkboxes', + '#options' => $options, + '#default_value' => array_merge($default_value, (array)$subscription->tids), + ); + + // If current user is logged in, just display email. + // Anonymous users see an email box and will receive confirmations + if ($subscription->mail) { + $form['subscriptions']['#title'] = t('Subscriptions for %mail', array('%mail' => $subscription->mail)); + $form['subscriptions']['mail'] = array('#type' => 'value', '#value' => $subscription->mail); + $form['update'] = array( + '#type' => 'submit', + '#value' => t('Update'), + '#weight' => 20, + ); + } + else { + $form['subscriptions']['#title'] = t('Manage your newsletter subscriptions'); + $form['subscriptions']['mail'] = array( + '#type' => 'textfield', + '#title' => t('email'), + '#size' => 20, + '#maxlength' => 128, + '#weight' => 10, + '#required' => TRUE, + ); + $form['subscribe'] = array( + '#type' => 'submit', + '#value' => t('Subscribe'), + '#weight' => 20, + ); + $form['unsubscribe'] = array( + '#type' => 'submit', + '#value' => t('Unsubscribe'), + '#weight' => 30, + ); + } + + $form['#validate'][] = 'simplenews_admin_all_subscriptions_form_validate'; + $form['#submit'][] = 'simplenews_admin_all_subscriptions_form_submit'; + $form['#redirect'] = 'admin/content/simplenews/users'; + return $form; } Index: simplenews.subscription.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/simplenews/simplenews.subscription.inc,v retrieving revision 1.13.2.3 diff -u -r1.13.2.3 simplenews.subscription.inc --- simplenews.subscription.inc 19 Apr 2010 08:49:34 -0000 1.13.2.3 +++ simplenews.subscription.inc 13 Jun 2010 09:15:26 -0000 @@ -11,10 +11,10 @@ /** * Menu callback: Generates the subscription form for users. * - * @see simplenews_subscription_manager_form_validate() - * @see simplenews_subscription_manager_form_submit() + * @see simplenews_edit_own_subscriptions_form_validate() + * @see simplenews_edit_own_subscriptions_form_submit() */ -function simplenews_subscription_manager_form(&$form_state, $snid = NULL) { +function simplenews_edit_own_subscriptions_form(&$form_state, $snid = NULL) { global $user; if (isset($snid)) { @@ -25,21 +25,24 @@ else { $subscription = simplenews_get_subscription($user); } + + // If admin trying to edit someone else's subscriptions redirect to admin_all_subscriptions page + if (user_access('administer simplenews subscriptions') && $user->uid != $subscription->uid) { + drupal_goto('admin/content/simplenews/users/edit/' . $snid); + return; + } - // If non-admin is trying to edit someone else's subscription, access denied. - if ($user->uid && $user->uid != $subscription->uid && !user_access('administer simplenews subscriptions')) { + // If someone is trying to edit someone else's subscription, access denied. + if ($user->uid && $user->uid != $subscription->uid) { drupal_access_denied(); return; } - $form = _simplenews_subscription_manager_form($subscription); - $form['#validate'][] = 'simplenews_subscription_manager_form_validate'; - $form['#submit'][] = 'simplenews_subscription_manager_form_submit'; - $form['#redirect'] = ''; //Return to home page after (un)subscribe + $form = _simplenews_edit_own_subscriptions_form($subscription); return $form; } -function simplenews_subscription_manager_form_validate($form, &$form_state) { +function simplenews_edit_own_subscriptions_form_validate($form, &$form_state) { $valid_email = valid_email_address($form_state['values']['mail']); if (!$valid_email) { form_set_error('mail', t('The email address you supplied is not valid.')); @@ -52,7 +55,7 @@ } } -function simplenews_subscription_manager_form_submit($form, &$form_state) { +function simplenews_edit_own_subscriptions_form_submit($form, &$form_state) { switch ($form_state['values']['op']) { case t('Update'): // We first subscribe, then unsubscribe. This prevents deletion of subscriptions @@ -214,9 +217,71 @@ /** * Menu callback: handle the edit subscription page and a subscription * page for anonymous users. + * + * @see simplenews_admin_all_subscriptions_form_validate() + * @see simplenews_admin_all_subscriptions_form_submit() */ -function simplenews_admin_users_form(&$form_state, $snid = NULL) { - $form = simplenews_subscription_manager_form($form_state, $snid); - $form['#redirect'] = 'admin/content/simplenews/users'; +function simplenews_admin_all_subscriptions_form(&$form_state, $snid) { + global $user; + + $account = new stdClass(); + $account->snid = $snid; + $subscription = simplenews_get_subscription($account); + + // If non-admin, access denied. + if (!user_access('administer simplenews subscriptions')) { + drupal_access_denied(); + return; + } + + $form = _simplenews_admin_all_subscriptions_form($subscription); return $form; } + +function simplenews_admin_all_subscriptions_form_validate($form, &$form_state) { + $valid_email = valid_email_address($form_state['values']['mail']); + if (!$valid_email) { + form_set_error('mail', t('The email address you supplied is not valid.')); + } + $checked_newsletters = array_filter($form_state['values']['newsletters']); + $account = new stdClass(); + $account->mail = $form_state['values']['mail']; + if (!count($checked_newsletters) && !simplenews_get_subscription($account)) { + form_set_error('newsletters', t('You must select at least one newsletter.')); + } +} + +function simplenews_admin_all_subscriptions_form_submit($form, &$form_state) { + switch ($form_state['values']['op']) { + case t('Update'): + // We first subscribe, then unsubscribe. This prevents deletion of subscriptions + // when unsubscribed from the + arsort($form_state['values']['newsletters'], SORT_NUMERIC); + foreach ($form_state['values']['newsletters'] as $tid => $checked) { + if ($checked) { + simplenews_subscribe_user($form_state['values']['mail'], $tid, FALSE, 'website'); + } + else { + simplenews_unsubscribe_user($form_state['values']['mail'], $tid, FALSE, 'website'); + } + } + drupal_set_message(t('The newsletter subscriptions for %mail have been updated.', array('%mail' => $form_state['values']['mail']))); + break; + case t('Subscribe'): + foreach ($form_state['values']['newsletters'] as $tid => $checked) { + if ($checked) { + simplenews_subscribe_user($form_state['values']['mail'], $tid, TRUE, 'website'); + } + } + drupal_set_message(t('A confirmation email will be sent shortly containing further instructions on how to complete your subscription.')); + break; + case t('Unsubscribe'): + foreach ($form_state['values']['newsletters'] as $tid => $checked) { + if ($checked) { + simplenews_unsubscribe_user($form_state['values']['mail'], $tid, TRUE, 'website'); + } + } + drupal_set_message(t('A confirmation email will be sent shortly containing further instructions on how to cancel your subscription.')); + break; + } +}