diff --git includes/simplenews.admin.inc includes/simplenews.admin.inc index 5400390..d00c778 100644 --- includes/simplenews.admin.inc +++ includes/simplenews.admin.inc @@ -738,17 +738,18 @@ function simplenews_subscription_list_add($form, &$form_state) { '#rows' => 5, '#description' => t('Email addresses must be separated by comma, space or newline.'), ); - $lists = array(); - - foreach (simplenews_get_mailing_lists(TRUE) as $list) { - $lists[$list->tid] = check_plain($list->name); - } $form['lists'] = array( - '#type' => 'checkboxes', - '#title' => t('Subscribe to'), - '#options' => $lists, - '#required' => TRUE, + '#type' => 'fieldset', + '#description' => t('Subscribe to'), ); + foreach (simplenews_get_mailing_lists(TRUE) as $list) { + $form['lists'][$list->tid] = array( + '#type' => 'checkbox', + '#title' => check_plain($list->name), + '#description' => $list->description, + '#default_value' => FALSE, + ); + } // Include language selection when the site is multilingual. // Default value is the empty string which will result in receiving emails @@ -785,7 +786,7 @@ function simplenews_subscription_list_add($form, &$form_state) { function simplenews_subscription_list_add_submit($form, &$form_state) { $added = array(); $invalid = array(); - $checked_lists = array_filter($form_state['values']['lists']); + $checked_lists = array_keys(array_filter($form_state['values'],'_simplenews_checked')); $langcode = $form_state['values']['language']; $emails = preg_split("/[\s,]+/", $form_state['values']['emails']); @@ -932,16 +933,18 @@ function simplenews_subscription_list_remove($form, &$form_state) { '#rows' => 5, '#description' => t('Email addresses must be separated by comma, space or newline.'), ); - $lists = array(); - foreach (simplenews_get_mailing_lists(TRUE) as $list) { - $lists[$list->tid] = check_plain($list->name); - } $form['lists'] = array( - '#type' => 'checkboxes', - '#title' => t('Unsubscribe from'), - '#options' => $lists, - '#required' => TRUE, + '#type' => 'fieldset', + '#description' => t('Unsubscribe from'), ); + foreach (simplenews_get_mailing_lists(TRUE) as $list) { + $form['lists'][$list->tid] = array( + '#type' => 'checkbox', + '#title' => check_plain($list->name), + '#description' => $list->description, + '#default_value' => FALSE, + ); + } $form['submit'] = array( '#type' => 'submit', '#value' => t('Unsubscribe'), @@ -952,7 +955,7 @@ function simplenews_subscription_list_remove($form, &$form_state) { function simplenews_subscription_list_remove_submit($form, &$form_state) { $removed = array(); $invalid = array(); - $checked_lists = array_filter($form_state['values']['lists']); + $checked_lists = array_keys(array_filter($form_state['values'],'_simplenews_checked')); $emails = preg_split("/[\s,]+/", $form_state['values']['emails']); foreach ($emails as $email) { diff --git includes/simplenews.subscription.inc includes/simplenews.subscription.inc index c276725..8e01f21 100644 --- includes/simplenews.subscription.inc +++ includes/simplenews.subscription.inc @@ -44,7 +44,7 @@ function simplenews_subscription_manager_form_validate($form, &$form_state) { if (!$valid_email) { form_set_error('mail', t('The email address you supplied is not valid.')); } - $checked_newsletters = array_filter($form_state['values']['newsletters']); + $checked_newsletters = array_filter($form_state['values'],'_simplenews_checked'); $account = new stdClass(); $account->mail = $form_state['values']['mail']; if (!count($checked_newsletters) && !simplenews_get_subscription($account)) { @@ -55,10 +55,11 @@ function simplenews_subscription_manager_form_validate($form, &$form_state) { function simplenews_subscription_manager_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) { + $subscription_checkboxes = array_filter($form_state['values'],'is_int'); + // Sort subscriptions (value=1) first, then unsubscriptions (value=0). + // We first subscribe, then unsubscribe. This prevents deletion of subscribers. + arsort($subscription_checkboxes, SORT_NUMERIC); + foreach ($checked_newsletters as $tid => $checked) { if ($checked) { simplenews_subscribe_user($form_state['values']['mail'], $tid, FALSE, 'website'); } @@ -69,18 +70,14 @@ function simplenews_subscription_manager_form_submit($form, &$form_state) { 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'); - } + foreach (array_keys(array_filter($form_state['values'],'_simplenews_checked')) as $tid) { + simplenews_subscribe_user($form_state['values']['mail'], $tid, TRUE, 'website'); } drupal_set_message(t('You will receive a confirmation email 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'); - } + foreach (array_keys(array_filter($form_state['values'],'_simplenews_checked')) as $tid) { + simplenews_unsubscribe_user($form_state['values']['mail'], $tid, TRUE, 'website'); } drupal_set_message(t('You will receive a confirmation email shortly containing further instructions on how to complete the unsubscription process.')); break; diff --git simplenews.module simplenews.module index e8bf30d..16b05cf 100644 --- simplenews.module +++ simplenews.module @@ -1816,23 +1816,22 @@ function _simplenews_subscription_manager_form($subscription) { $default_value = array(); global $language; + $form['subscriptions'] = array( + '#type' => 'fieldset', + '#description' => t('Select the newsletter(s) to which you want to subscribe or unsubscribe.'), + ); + // Get newsletters for subscription form checkboxes. // Newsletters with opt-in/out method 'hidden' will not be listed. foreach (simplenews_get_mailing_lists() as $newsletter) { - $options[$newsletter->tid] = check_plain($newsletter->name); - $default_value[$newsletter->tid] = FALSE; + $form['subscriptions'][$newsletter->tid] = array( + '#type' => 'checkbox', + '#title' => check_plain($newsletter->name), + '#description' => $newsletter->description, + '#default_value' => in_array($newsletter->tid, $subscription->tids), + ); } - $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) { @@ -3230,3 +3229,11 @@ function theme_simplenews_newsletter_footer($variables) { } return $output; } + +/** + * Helper function to filter checked boxes from form values. + */ + +function _simplenews_checked($value) { + return ($value === 1); +}