nid)) {
$nids[] = $newsletter->nid;
}
if (!empty($nids)) {
db_query("UPDATE {simplenews_newsletters} SET s_status = '%s' WHERE nid IN ('%s')", SIMPLENEWS_STATUS_SEND_READY, implode("','", array_values($nids)));
}
}
$vid = variable_get('simplenews_vid', '');
$form = array();
$form['simplenews_issue_filter'] = array(
'#type' => 'fieldset',
'#title' => t('Show issues from'),
'#collapsible' => FALSE,
'#prefix' => '
',
'#suffix' => '
',
);
$header = array(t('Title'), t('Newsletter'), t('Date created'), t('Published'), t('Sent'), t('Edit'));
list($names, $queries) = array_values(simplenews_get_filter('simplenews_newsletters_filter'));
$filter = isset($_SESSION['simplenews_newsletters_filter']) ? $_SESSION['simplenews_newsletters_filter'] : '';
if ($action == 'notsent') {
$form['simplenews_issue_filter']['filter'] = array(
'#type' => 'select',
'#options' => $names,
'#default_value' => $filter,
);
$query = "SELECT DISTINCT n.*, s.s_status FROM {node} n INNER JOIN {simplenews_newsletters} s ON n.nid = s.nid WHERE s.s_status = %d". $queries[$filter] ." ORDER BY n.created DESC";
$count_query = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {simplenews_newsletters} s ON n.nid = s.nid WHERE s.s_status = %d". $queries[$filter];
}
else {
$form['simplenews_issue_filter']['filter'] = array(
'#type' => 'select',
'#options' => $names,
'#default_value' => $filter,
);
$query = "SELECT n.*, s.s_status FROM {node} n INNER JOIN {simplenews_newsletters} s ON n.nid = s.nid WHERE s.s_status > %d". $queries[$filter] ." ORDER BY n.created DESC";
$count_query = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {simplenews_newsletters} s ON n.nid = s.nid WHERE s.s_status > %d". $queries[$filter];
}
$result = pager_query(db_rewrite_sql($query, 'n', 'nid', array(SIMPLENEWS_STATUS_SEND_NOT)), 10, 0, db_rewrite_sql($count_query, 'n', 'nid', array(SIMPLENEWS_STATUS_SEND_NOT)), 0);
$rows = array();
while ($node = db_fetch_object($result)) {
$terms = array_keys(taxonomy_node_get_terms_by_vocabulary($node, $vid, 'name'));
$rows[] = array(l($node->title, 'node/'. $node->nid),
isset($terms[0]) ? $terms[0] : t('n/a'),
format_date($node->created, 'small'),
theme('simplenews_status', $node->status, 'published'),
theme('simplenews_status', $node->s_status, 'sent'),
l(t('edit'), 'node/'. $node->nid .'/edit', array(), drupal_get_destination()));
}
if ($pager = theme('pager', NULL, 10, 0)) {
$rows[] = array(array('data' => $pager, 'colspan' => '6'));
}
if (!$rows) {
$rows[] = array(array('data' => t('No newsletters available.'), 'colspan' => '6'));
}
$form['simplenews_issue_filter']['submit'] = array(
'#type' => 'submit',
'#value' => t('Filter'),
);
$table = theme('table', $header, $rows);
$form['table'] = array('#value' => $table);
return $form;
}
function simplenews_admin_news_submit($form, &$form_state) {
_simplenews_set_filter('simplenews_newsletters_filter', $form_state['values']);
}
/**
* Store filter values in session var
*
* @param $type identification string
* @param $form_values array of values to be stored
*/
function _simplenews_set_filter($type, $values) {
if (empty($_SESSION[$type])) {
$_SESSION[$type] = 'all';
}
$op = $values['op'];
if ($op == t('Filter') && isset($values['filter'])) {
$_SESSION[$type] = $values['filter'];
}
}
/**
* Menu callback: newsletter admin form with list of available newsletter series.
*/
function simplenews_types_overview() {
$rows = array();
$header = array(t('Newsletter name'), t('Operations'));
foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $term) {
$rows[] = array($term->name, l(t('edit newsletter'), 'admin/content/newsletters/types/edit/'. $term->tid));
}
if (count($rows) == 0) {
$rows[] = array(array('data' => t('There are currently no newsletter series.'), 'colspan' => 2));
}
return theme('table', $header, $rows);
}
/**
* Menu callback: newsletter admin form for newsletter add/edit.
*
* @see simplenews_admin_types_form_validate()
* @see simplenews_admin_types_form_submit()
*/
//TODO rework this form to be able to set newsletter options when creating the newsletter.
function simplenews_admin_types_form(&$form_state, $tid = NULL) {
if (isset($tid)) {
$term = taxonomy_get_term($tid);
// If the given term is not a newsletter, don't allow editing.
if (variable_get('simplenews_vid', '') != $term->vid) {
drupal_not_found();
return;
}
// Redirect on a delete operation for posterity's sake.
if (isset($form_state['post']['op']) && $form_state['post']['op'] == t('Delete')) {
drupal_goto('admin/content/newsletters/types/delete/'. $term->tid);
}
}
else {
// Add form so choose simplenews vocabulary.
$term = (object)array('vid' => variable_get('simplenews_vid', ''));
}
//TODO: move info text to hook_help. Add help for newsletter settings after submitting the newsletter.
$form['info'] = array('#value' => t('You can create different newsletters (or subjects) to categorize your news (e.g. Cats news, Dogs news, ...).'));
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Newsletter name'),
'#size' => 50,
'#maxlength' => 128,
'#description' => t('This name is used to identify the newsletter.'),
'#required' => TRUE,
'#default_value' => isset($term->name) ? $term->name : '',
);
$form['description'] = array(
'#type' => 'textarea',
'#title' => t('Description'),
'#cols' => 60,
'#rows' => 5,
'#description' => t('The description can be used to provide more information.'),
'#default_value' => isset($term->description) ? $term->description : '',
);
$form['weight'] = array(
'#type' => 'weight',
'#title' => t('Weight'),
'#delta' => 10,
'#description' => t('In listings, the heavier (with a higher weight value) terms will sink and the lighter terms will be positioned nearer the top.'),
'#default_value' => isset($term->weight) ? $term->weight : 0,
);
if (isset($term->tid)) {
//TODO: enable below form at creation of newsletter
// Store the term ID to indicate a newsletter specific form.
$form['simplenews_newsletter'] = array(
'#type' => 'hidden',
'#value' => $term->tid,
);
$form['simplenews_sender_information'] = array(
'#type' => 'fieldset',
'#title' => t('Sender information'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['simplenews_sender_information']['simplenews_from_name_'. $term->tid] = array(
'#type' => 'textfield',
'#title' => t('From name'),
'#size' => 60,
'#maxlength' => 128,
'#default_value' => variable_get('simplenews_from_name_'. $term->tid, variable_get('site_name', 'Drupal')),
);
$form['simplenews_sender_information']['simplenews_from_address_'. $term->tid] = array(
'#type' => 'textfield',
'#title' => t('From e-mail address'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
'#default_value' => variable_get('simplenews_from_address_'. $term->tid, variable_get('site_mail', ini_get('sendmail_from'))),
);
$form['simplenews_hyperlinks'] = array(
'#type' => 'fieldset',
'#title' => t('HTML to text conversion'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('When your newsletter is sent as plain text, these options will determine how the conversion to text is performed.'),
);
/*
Support for inline links removed. Restoring this function will depend on user requests.
$form['simplenews_hyperlinks']['simplenews_hyperlinks_'. $term->tid] = array(
'#type' => 'radios',
'#title' => t('Hyperlink conversion'),
'#options' => array(t('Append hyperlinks as a numbered reference list'), t('Display hyperlinks inline with the text')),
'#default_value' => variable_get('simplenews_hyperlinks_'. $term->tid, 1),
);
*/
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
'#weight' => 25,
);
$form['vid'] = array(
'#type' => 'hidden',
'#value' => isset($term->vid) ? $term->vid : variable_get('simplenews_vid', ''),
);
// If we are editing a newsletter term, show delete option. When the submit
// passes the $form_state['values']['tid'] to taxonomy_save_term() it will delete the
// term for some reason.
if (isset($term->tid)) {
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#weight' => 30,
);
$form['tid'] = array(
'#type' => 'value',
'#value' => $term->tid,
);
}
// Return to Newsletter list page after submit
$form['#redirect'] = 'admin/content/newsletters/types';
return $form;
}
function simplenews_admin_types_form_validate($form, &$form_state) {
if (isset($form_state['values']['simplenews_newsletter'])) {
$tid = $form_state['values']['simplenews_newsletter'];
$field_name = 'simplenews_from_address_'. $tid;
if (!valid_email_address($form_state['values'][$field_name])) {
form_set_error($field_name, t("The sender's e-mail address you supplied is not valid."));
}
}
}
function simplenews_admin_types_form_submit($form, &$form_state) {
// Redirect on a delete operation for posterity's sake.
if (isset($form_state['post']['op']) && $form_state['post']['op'] == t('Delete')) {
drupal_goto('admin/content/newsletters/types/delete/'. $term->tid);
}
switch (taxonomy_save_term($form_state['values'])) {
case SAVED_NEW:
drupal_set_message(t('Created new term %name.', array('%name' => $form_state['values']['name'])));
break;
case SAVED_UPDATED:
drupal_set_message(t('Updated term %name.', array('%name' => $form_state['values']['name'])));
break;
}
// Store newsletter specific settings when editing an existing newsletter
if (isset($form_state['values']['simplenews_newsletter'])) {
$tid = $form_state['values']['simplenews_newsletter'];
variable_set('simplenews_from_name_'. $tid, $form_state['values']['simplenews_from_name_'. $tid]);
variable_set('simplenews_from_address_'. $tid, $form_state['values']['simplenews_from_address_'. $tid]);
//variable_set('simplenews_hyperlinks_'. $tid, $form_state['values']['simplenews_hyperlinks_'. $tid]);
}
}
/**
* Menu callback: Delete newsletter series.
*
* @see simplenews_admin_types_delete_submit()
*/
function simplenews_admin_types_delete(&$form_state, $tid = NULL) {
if (!isset($tid)) {
drupal_not_found();
return;
}
$term = taxonomy_get_term($tid);
$form = array();
$form['tid'] = array(
'#type' => 'value',
'#value' => $tid,
);
$form['notice'] = array(
'#value' => ''. t('Note: All subscriptions associated with this newsletter will be lost.') .'
',
);
$form['#redirect'] = 'admin/content/newsletters/types';
return confirm_form($form,
t('Are you sure you want to delete %title?', array('%title' => $term->name)),
'admin/content/newsletters/types',
t('This action cannot be undone.'),
t('Delete'),
t('Cancel')
);
}
function simplenews_admin_types_delete_submit($form, &$form_state) {
if ($form_state['values']['confirm']) {
$term = taxonomy_get_term($form_state['values']['tid']);
taxonomy_del_term($form_state['values']['tid']);
drupal_set_message(t('Newsletter %title has been deleted.', array('%title' => $term->name)));
}
}
/**
* Menu callback: Delete multiple subscriptions.
*
* @see simplenews_subscription_multiple_delete_confirm_submit()
*/
function simplenews_subscription_multiple_delete_confirm() {
// Subscriptions to be deleted are passed via session var.
$snids = $_SESSION['simplenews_subscriptions_delete'];
$form['snids'] = array('#prefix' => '', '#tree' => TRUE);
// array_filter returns only elements with TRUE values
foreach (array_filter($snids) as $snid => $value) {
$mail = db_result(db_query('SELECT mail FROM {simplenews_subscriptions} WHERE snid = %d', $snid));
$form['snids'][$snid] = array(
'#type' => 'hidden',
'#value' => $snid,
'#prefix' => '',
'#suffix' => check_plain($mail) ."\n"
);
}
$form['operation'] = array(
'#type' => 'hidden',
'#value' => 'delete',
);
$form['#submit'][] = 'simplenews_subscription_multiple_delete_confirm_submit';
return confirm_form($form,
t('Are you sure you want to delete these subscriptions?'),
'admin/content/newsletters/users',
t('This action cannot be undone.'),
t('Delete all'),
t('Cancel')
);
}
function simplenews_subscription_multiple_delete_confirm_submit($form, &$form_state) {
if ($form_state['values']['confirm']) {
foreach ($form_state['values']['snids'] as $snid => $value) {
simplenews_delete_subscription($snid);
}
drupal_set_message(t('The subscriptions have been deleted.'));
}
return '';
}
/**
* Menu callback: Add newsletter series.
*
* @see simplenews_subscription_list_add_validate()
* @see simplenews_subscription_list_add_submit()
*/
function simplenews_subscription_list_add() {
$form['emails'] = array(
'#type' => 'textarea',
'#title' => t('E-mail addresses'),
'#cols' => 60,
'#rows' => 5,
'#description' => t('Supply a comma separated list of e-mail addresses to be added to the list. Spaces between commas and addresses are allowed.'),
);
$newsletters = array();
foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $newsletter) {
$newsletters[$newsletter->tid] = $newsletter->name;
}
$form['newsletters'] = array(
'#type' => 'fieldset',
'#title' => t('Subscribe imported addresses to the following newsletter(s)'),
'#collapsible' => FALSE,
);
$form['newsletters']['newsletters'] = array(
'#type' => 'checkboxes',
'#options' => $newsletters,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Import'),
);
return $form;
}
function simplenews_subscription_list_add_validate($form, &$form_state) {
$checked_newsletters = array_filter($form_state['values']['newsletters']);
if (!$checked_newsletters) {
form_set_error('newsletters', t('You must select at least one newsletter.'));
}
}
function simplenews_subscription_list_add_submit($form, &$form_state) {
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
$added = array();
$invalid = array();
$checked_newsletters = array_filter($form_state['values']['newsletters']);
$emails = explode(",", $form_state['values']['emails']);
foreach ($emails as $email) {
$email = trim($email);
if (valid_email_address($email)) {
foreach ($checked_newsletters as $tid) {
$newsletter = taxonomy_get_term($tid);
simplenews_subscribe_user($email, $newsletter->tid, FALSE);
$added[] = $email;
}
}
else {
$invalid[] = $email;
}
}
if ($added) {
$added = implode(", ", $added);
drupal_set_message(t('The following addresses were added or updated: %added.', array('%added' => $added)));
$newsletter_names = array();
foreach ($checked_newsletters as $tid) {
$newsletter = taxonomy_get_term($tid);
$newsletter_names[] = $newsletter->name;
}
drupal_set_message(t('The addresses were subscribed to the following newsletters: %newsletters.', array('%newsletters' => implode(', ', $newsletter_names))));
}
else {
drupal_set_message(t('No addresses were added.'));
}
if ($invalid) {
$invalid = implode(", ", $invalid);
drupal_set_message(t('The following addresses were invalid: %invalid.', array('%invalid' => $invalid)), 'error');
}
}
/**
* Menu callback: Export email address of subscriptions.
*
* @see simplenews_admin_export_after_build()
*/
function simplenews_subscription_list_export() {
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
$form['simplenews_status'] = array(
'#type' => 'fieldset',
'#title' => t('Status'),
'#description' => t('Select at least 1 status'),
'#collapsible' => FALSE,
);
$form['simplenews_status']['active'] = array(
'#type' => 'checkbox',
'#title' => t('Active users'),
);
$form['simplenews_status']['inactive'] = array(
'#type' => 'checkbox',
'#title' => t('Inactive users'),
);
if ($tree) {
$form['simplenews_newsletter'] = array(
'#type' => 'fieldset',
'#title' => t('Subscribed to'),
'#description' => t('Select at least 1 newsletter'),
'#collapsible' => FALSE,
);
foreach ($tree as $newsletter) {
$form['simplenews_newsletter']['tid_'. $newsletter->tid] = array(
'#type' => 'checkbox',
'#title' => $newsletter->name,
);
}
}
$form['emails'] = array(
'#type' => 'textarea',
'#title' => t('E-mail addresses'),
'#cols' => 60,
'#rows' => 5,
'#default_value' => t('No search performed'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Export'),
);
$form['#after_build'] = array('simplenews_admin_export_after_build');
$form['#redirect'] = FALSE;
return $form;
}
function simplenews_admin_export_after_build($form, $form_element) {
if (isset($form_element['values']['op']) && $form_element['values']['op'] == t('Export')) {
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
if (isset($form_element['values']['active']) && $form_element['values']['active'] == 1) {
$where[] = 's.activated = 1';
}
if ($form_element['values']['inactive'] == 1) {
$where[] = 's.activated = 0';
}
$where = isset($where) ? implode(' OR ', $where) : NULL;
if ($tree) {
foreach ($tree as $newsletter) {
if ($form_element['values']['tid_'. $newsletter->tid]) {
$where_tid[] = 't.tid = '. $newsletter->tid;
}
}
}
$where_tid = isset($where_tid) ? implode(' OR ', $where_tid) : NULL;
if ($where && $where_tid) {
$query = 'SELECT DISTINCT s.mail FROM {simplenews_subscriptions} s INNER JOIN {simplenews_snid_tid} t ON s.snid = t.snid WHERE ('. $where .') AND ('. $where_tid .')';
$result = db_query($query);
while ($mail = db_fetch_object($result)) {
$mails[] = $mail->mail;
}
}
if (isset($mails)) {
$exported_mails = implode(", ", $mails);
}
else {
$exported_mails = t('No addresses were found.');
}
$form['emails']['#value'] = $exported_mails;
}
return $form;
}
/**
* Menu callback: subscription administration.
*/
function simplenews_subscription_admin($form_state) {
// Delete subscriptions requires delete confirmation. This is handled with a different form
if (isset($form_state['post']['operation']) && $form_state['post']['operation'] == 'delete' && isset($form_state['post']['snids'])) {
$destination = drupal_get_destination();
$_SESSION['simplenews_subscriptions_delete'] = $form_state['post']['snids'];
// Note: we redirect from admin/content/newsletters/users to admin/content/newsletters/subscriptions/delete to make the tabs disappear.
drupal_goto("admin/content/newsletters/subscriptions/delete", $destination);
}
$form = simplenews_subscription_filter_form();
$form['admin'] = simplenews_subscription_list_form();
return $form;
}
/**
* Build the form for admin subscription.
*
* Form consists of a filter fieldset, an operation fieldset and a list of
* subscriptions maching the filter criteria.
*
* @see simplenews_subscription_list_form_validate()
* @see simplenews_subscription_list_form_submit()
*/
function simplenews_subscription_list_form() {
// Table header. Used as tablesort default
$header = array(
array('data' => t('E-mail'), 'field' => 'ss.mail', 'sort' => 'asc'),
array('data' => t('Username'), 'field' => 'u.name'),
array('data' => t('Status'), 'field' => 'ss.activated'),
t('Operations')
);
// Data collection with filter and sorting applied
$filter = simplenews_build_subscription_filter_query();
$query = 'SELECT DISTINCT ss.*, u.name FROM {simplenews_subscriptions} ss INNER JOIN {users} u ON ss.uid = u.uid INNER JOIN {simplenews_snid_tid} s ON ss.snid = s.snid'. $filter['where'];
// $count_query used to count distinct records only
$count_query = preg_replace('/SELECT.*FROM /', 'SELECT COUNT(DISTINCT ss.mail) FROM ', $query);
$query .= tablesort_sql($header);
$result = pager_query($query, 30, 0, $count_query);
// Update options
$form['options'] = array(
'#type' => 'fieldset',
'#title' => t('Update options'),
'#prefix' => '',
'#suffix' => '
',
);
$form['options']['operation'] = array(
'#type' => 'select',
'#options' => array(
'activate' => t('Activate'),
'inactivate' => t('Inactivate'),
'delete' => t('Delete'),
),
'#default_value' => 'activate');
$form['options']['submit'] = array(
'#type' => 'submit',
'#value' => t('Update'),
'#submit' => array('simplenews_subscription_list_form_submit'),
'#validate' => array('simplenews_subscription_list_form_validate'),
);
$snids = array();
// Subscription table and table pager
while ($subscription = db_fetch_object($result)) {
$snids[$subscription->snid] = '';
$form['mail'][$subscription->snid] = array('#value' => $subscription->mail);
$form['name'][$subscription->snid] = array('#value' => isset($subscription->uid) ? l($subscription->name, 'user/'. $subscription->uid) : $subscription->name);
$form['status'][$subscription->snid] = array('#value' => theme('simplenews_status', $subscription->activated, 'activated'));
$form['operations'][$subscription->snid] = array('#value' => l(t('edit'), 'admin/content/newsletters/users/edit/'. $subscription->snid, array(), drupal_get_destination()));
}
$form['snids'] = array('#type' => 'checkboxes', '#options' => $snids);
$form['pager'] = array('#value' => theme('pager', NULL, 30, 0));
$form['#theme'] = 'simplenews_subscription_list';
return $form;
}
function simplenews_subscription_list_form_validate($form, &$form_state) {
if (isset($form_state['values']['operation'])) {
$snids = array_filter($form_state['values']['snids']);
if (empty($snids)) {
form_set_error('', t('No items selected.'));
}
}
}
function simplenews_subscription_list_form_submit($form, &$form_state) {
if (isset($form_state['values']['operation'])) {
$snids = array_filter($form_state['values']['snids']);
$args = array($snids);
switch ($form_state['values']['operation']) {
case 'activate':
call_user_func_array('simplenews_activate_subscription', $args);
drupal_set_message(t('The update has been performed.'));
break;
case 'inactivate':
call_user_func_array('simplenews_inactivate_subscription', $args);
drupal_set_message(t('The update has been performed.'));
break;
}
}
}
/**
* Menu callback: Admin newsletter settings.
*/
function simplenews_admin_settings(&$form_state) {
$vid = variable_get('simplenews_vid', '');
$address_default = variable_get('site_mail', ini_get('sendmail_from'));
$form = array();
$form['simplenews_general_settings'] = array(
'#type' => 'fieldset',
'#title' => t('General settings'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['simplenews_general_settings']['simplenews_content_types'] = array(
'#type' => 'checkboxes',
'#title' => t('Newsletter content types'),
'#required' => TRUE,
'#options' => array_map('check_plain', node_get_types('names')),
'#default_value' => variable_get('simplenews_content_types', array('simplenews')),
'#description' => t('Select content type(s) to be used as newsletter.'),
);
$vocabulary_options = array();
if ($vocabularies = taxonomy_get_vocabularies()) {
foreach ($vocabularies as $key => $object) {
$vocabulary_options[$key] = $object->name;
}
}
$form['simplenews_general_settings']['simplenews_vid'] = array(
'#type' => 'select',
'#title' => t('Newsletter taxonomy'),
'#options' => $vocabulary_options,
'#required' => TRUE,
'#description' => t('Select the taxonomy used to identify newsletter series. Note that changing the newsletter taxonomy will affect existing newsletter issues.'),
'#default_value' => variable_get('simplenews_vid', ''),
);
$form['simplenews_default_options'] = array(
'#type' => 'fieldset',
'#title' => t('Default newsletter options'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#description' => t('These options will be the defaults for new newsletters, but can be overridden in the newsletter editing form.'),
);
$description = t('Select the default newsletter sending format.');
if (!module_exists('mimemail')) {
$description .= t(' Mime Mail module is required to send newsletters in HTML format.');
}
$form['simplenews_default_options']['simplenews_format'] = array(
'#type' => 'select',
'#title' => t('Format'),
'#options' => _simplenews_format_options(),
'#description' => $description,
'#default_value' => variable_get('simplenews_format', 'plain'),
);
$form['simplenews_default_options']['simplenews_priority'] = array(
'#type' => 'select',
'#title' => t('Priority'),
'#options' => array(0 => t('none'), 1 => t('highest'), 2 => t('high'), 3 => t('normal'), 4 => t('low'), 5 => t('lowest')),
'#description' => t('Note that e-mail priority is ignored by a lot of e-mail programs.'),
'#default_value' => variable_get('simplenews_priority', 0),
);
$form['simplenews_default_options']['simplenews_receipt'] = array(
'#type' => 'checkbox',
'#title' => t('Request receipt'),
'#default_value' => variable_get('simplenews_receipt', 0),
'#description' => t('Request a Read Receipt from your newsletters. A lot of e-mail programs ignore these so it is not a definitive indication of how many people have read your newsletter.'),
);
$form['simplenews_default_options']['simplenews_send'] = array(
'#type' => 'radios',
'#title' => t('Default selection for sending newsletters'),
'#options' => array(0 => t("Don't send now"), 2 => t('Send one test newsletter to the test address'), 1 => t('Send newsletter')),
'#default_value' => variable_get('simplenews_send', 0),
);
$form['simplenews_test_address'] = array(
'#type' => 'fieldset',
'#title' => t('Test addresses options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Supply a comma-separated list of e-mail addresses to be used as test addresses. The override function allows to override these addresses upon newsletter creation.'),
);
$form['simplenews_test_address']['simplenews_test_address'] = array(
'#type' => 'textfield',
'#title' => t('Test e-mail address'),
'#size' => 60,
'#maxlength' => 128,
'#default_value' => variable_get('simplenews_test_address', $address_default),
);
$form['simplenews_test_address']['simplenews_test_address_override'] = array(
'#type' => 'checkbox',
'#title' => t('Allow test address override'),
'#default_value' => variable_get('simplenews_test_address_override', 0),
);
$form['simplenews_sender_info'] = array(
'#type' => 'fieldset',
'#title' => t('Sender information'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Default sender address that will only be used for confirmation e-mails. You can specify sender information for each newsletter separately on the newsletter\'s settings page.'),
);
$form['simplenews_sender_info']['simplenews_from_name'] = array(
'#type' => 'textfield',
'#title' => t('From name'),
'#size' => 60,
'#maxlength' => 128,
'#default_value' => variable_get('simplenews_from_name', variable_get('site_name', 'Drupal')),
);
$form['simplenews_sender_info']['simplenews_from_address'] = array(
'#type' => 'textfield',
'#title' => t('From e-mail address'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
'#default_value' => variable_get('simplenews_from_address', $address_default),
);
$form['simplenews_mail_backend'] = array(
'#type' => 'fieldset',
'#title' => t('Mail backend options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t(''),
);
$max_time = array(0, 1, 2, 3, 4);
for ($i = 5; $i < ini_get('max_execution_time'); $i=$i+5) {
$max_time[] = $i;
}
$form['simplenews_mail_backend']['simplenews_use_cron'] = array(
'#type' => 'checkbox',
'#title' => t('Use cron to send newsletters'),
'#default_value' => variable_get('simplenews_use_cron', TRUE),
'#description' => t('When checked cron will be used to send newsletters (recommended). Test newsletters and confirmation emails will be send immediately. Leave unchecked for testing purposes.'),
);
$throttle = drupal_map_assoc(array(1, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000));
$throttle[999999] = t('Unlimited');
$form['simplenews_mail_backend']['simplenews_throttle'] = array(
'#type' => 'select',
'#title' => t('Cron throttle'),
'#options' => $throttle,
'#default_value' => variable_get('simplenews_throttle', 20),
'#description' => t('Sets the numbers of newsletters sent per cron run. Failure to send will also be counted.'),
);
$form['simplenews_mail_backend']['simplenews_spool_expire'] = array(
'#type' => 'select',
'#title' => t('Mail spool expiration'),
'#options' => array(0 => t('Immediate'), 1 => t('1 day'), 7 => t('1 week'), 14 => t('2 weeks')),
'#default_value' => variable_get('simplenews_spool_expire', 0),
'#description' => t('Newsletter mails are spooled. How long must messages be retained in the spool after successfull sending. Keeping the message in the spool allows mail statistics (which is not yet implemented). If cron is not used, immediate expiration is advised.'),
);
$form['simplenews_mail_backend']['simplenews_debug'] = array(
'#type' => 'checkbox',
'#title' => t('Log emails'),
'#default_value' => variable_get('simplenews_debug', FALSE),
'#description' => t('When checked all outgoing simplenews emails are logged in the system log. A logged email does not guarantee that it is send or will be delivered. It only indicates that a message is send to the PHP mail() function. No status information is available of delivery by the PHP mail() function.'),
);
$form['simplenews_subscription'] = array(
'#type' => 'fieldset',
'#title' => t('Subscription options'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['simplenews_subscription']['simplenews_sync_account'] = array(
'#type' => 'checkbox',
'#title' => t('Synchronize with account'),
'#default_value' => variable_get('simplenews_sync_account', TRUE),
'#description' => t('When checked subscriptions will be synchronized with site accounts. When accounts are deteted, subscriptions with the same email address will be removed. When site accounts are blocked/unblocked, subscriptions will be deactivated/activated. When not checked subscriptions will be unchanged when associated accounts are deleted or blocked.'),
);
// These email tokens are shared for all settings, so just define
// the list once to help ensure they stay in sync.
$email_token_help = t('Available variables are:') .' !site, !uri, !uri_brief, !mailto, !date, !newsletter, !confirmation_url.';
$form['simplenews_subscription']['subscription_mail'] = array(
'#type' => 'fieldset',
'#title' => t('Subscription confirmation emails'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Customize the confimation email which is sent to (un)subscribing visitors.') .' '. $email_token_help,
);
$form['simplenews_subscription']['subscription_mail']['simplenews_confirm_subscribe_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => _simplenews_subscription_confirmation_text('subscribe_subject'),
'#maxlength' => 180,
);
$form['simplenews_subscription']['subscription_mail']['simplenews_confirm_subscribe_unsubscribed'] = array(
'#type' => 'textarea',
'#title' => t('Body text of subscribe email'),
'#default_value' => _simplenews_subscription_confirmation_text('subscribe_unsubscribed'),
'#rows' => 5,
);
$form['simplenews_subscription']['subscription_mail']['simplenews_confirm_subscribe_subscribed'] = array(
'#type' => 'textarea',
'#title' => t('Body text for already subscribed visitor'),
'#default_value' => _simplenews_subscription_confirmation_text('subscribe_subscribed'),
'#rows' => 5,
);
$form['simplenews_subscription']['subscription_mail']['simplenews_confirm_unsubscribe_subscribed'] = array(
'#type' => 'textarea',
'#title' => t('Body text of unsubscribe email'),
'#default_value' => _simplenews_subscription_confirmation_text('unsubscribe_subscribed'),
'#rows' => 5,
);
$form['simplenews_subscription']['subscription_mail']['simplenews_confirm_unsubscribe_unsubscribed'] = array(
'#type' => 'textarea',
'#title' => t('Body text for not yet subscribed visitor'),
'#default_value' => _simplenews_subscription_confirmation_text('unsubscribe_unsubscribed'),
'#rows' => 5,
);
// Node type settings require pre-processing.
// simplenews_admin_settings_submit() is called before system_settings_form_submit().
$form['#submit'][] = 'simplenews_admin_settings_submit';
return system_settings_form($form);
}
function simplenews_admin_settings_validate($form, &$form_state) {
if (!valid_email_address($form_state['values']['simplenews_from_address'])) {
form_set_error($field_name, t("The sender's e-mail address you supplied is not valid."));
}
}
function simplenews_admin_settings_submit($form, &$form_state) {
// Newsletter vocabulary is updated using node type settings.
$vocabulary = (array)taxonomy_vocabulary_load($form_state['values']['simplenews_vid']);
$form_state['values']['simplenews_content_types'] = array_filter($form_state['values']['simplenews_content_types']);
$vocabulary['nodes'] = array_merge($vocabulary['nodes'], $form_state['values']['simplenews_content_types']);
taxonomy_save_vocabulary($vocabulary);
drupal_set_message(t('Updated vocabulary %name.', array('%name' => $vocabulary['name'])));
watchdog('simplenews', 'Updated vocabulary %name.', array('%name' => $vocabulary['name']), WATCHDOG_NOTICE, l(t('edit'), 'admin/content/taxonomy/edit/vocabulary/'. $form_state['values']['vid']));
}
/**
* Callback function to activate the specified subscriptions.
*
* @param $snid array of snid's
*/
function simplenews_activate_subscription($snid) {
db_query('UPDATE {simplenews_subscriptions} SET activated = %d WHERE snid IN(%s)', 1, implode(',', $snid));
}
/**
* Callback function to inactivate the specified subscriptions.
*
* @param $snid array of snid's
*/
function simplenews_inactivate_subscription($snid) {
db_query('UPDATE {simplenews_subscriptions} SET activated = %d WHERE snid IN(%s)', 0, implode(',', $snid));
}
/**
* Built filter selection box options and filter query where clause
*
* @param $type identification string
* @param $na TRUE for orphaned newsletters
*
* @return array of filter selection box options and related query where clause
*/
function simplenews_get_filter($type, $na = TRUE) {
//Default data
$names['all'] = t('all newsletters');
$queries['all'] = '';
if ($na) {
$names['na'] = t('orphaned newsletters');
$queries['na'] = ' AND s.tid = 0';
}
// Data for each newsletter
foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $newsletter) {
$names[$newsletter->tid] = $newsletter->name;
$queries[$newsletter->tid] = ' AND s.tid = '. $newsletter->tid;
}
return array($names, $queries);
}
/**
* Generate subscription filters
*/
function simplenews_subscription_filters() {
// Newsletter filter
$filters['newsletter'] = array(
'title' => t('Subscribed to'),
'options' => array(
'all' => t('All newsletters'),
),
);
foreach (taxonomy_get_tree(variable_get('simplenews_vid', '')) as $newsletter) {
$filters['newsletter']['options']['tid-'. $newsletter->tid] = $newsletter->name;
}
// E-mail filter
$filters['email'] = array(
'title' => t('E-mail address'),
);
return $filters;
}
/**
* Return form for subscription filters.
*
* @see simplenews_subscription_filter_form_submit()
*/
function simplenews_subscription_filter_form() {
// Current filter selections in $session var; stored at form submission
// Example: array('newsletter' => 'all', 'email' => 'hotmail')
$session = $_SESSION['simplenews_subscriptions_filter'];
$session = is_array($session) ? $session : _simplenews_subscription_filter_default();
$filters = simplenews_subscription_filters();
$form['filters'] = array(
'#type' => 'fieldset',
'#title' => t('Subscription filters'),
'#collapsible' => FALSE,
'#prefix' => '',
'#suffix' => '
',
);
// Filter values are default
$form['filters']['newsletter'] = array(
'#type' => 'select',
'#title' => $filters['newsletter']['title'],
'#options' => $filters['newsletter']['options'],
'#default_value' => $session['newsletter'],
);
$form['filters']['email'] = array(
'#type' => 'textfield',
'#title' => $filters['email']['title'],
'#default_value' => $session['email'],
);
$form['filters']['submit'] = array(
'#type' => 'submit',
'#value' => t('Filter'),
'#prefix' => '',
);
// Add Reset button if filter is in use
if ($session != _simplenews_subscription_filter_default()) {
$form['filters']['reset'] = array(
'#type' => 'submit',
'#value' => t('Reset')
);
}
$form['#submit'][] = 'simplenews_subscription_filter_form_submit';
return $form;
}
/**
* Helper function: returns subscription filter default settings
*/
function _simplenews_subscription_filter_default() {
return array('newsletter' => 'all', 'email' => '');
}
function simplenews_subscription_filter_form_submit($form, &$form_state) {
switch ($form_state['values']['op']) {
case t('Filter'):
$_SESSION['simplenews_subscriptions_filter'] = array(
'newsletter' => $form_state['values']['newsletter'],
'email' => $form_state['values']['email'],
);
break;
case t('Reset'):
$_SESSION['simplenews_subscriptions_filter'] = _simplenews_subscription_filter_default();
break;
}
}
/**
* Build query for subscription filters based on session var content.
*
* @return array of SQL query parts
* array('where' => $where, 'join' => $join, 'args' => $args)
*/
function simplenews_build_subscription_filter_query() {
// Variables $args and $join are currently not used but left in for future extensions
$where = $args = array();
$join = '';
// Build query
if (isset($_SESSION['simplenews_subscriptions_filter'])) {
foreach ($_SESSION['simplenews_subscriptions_filter'] as $key => $value) {
switch ($key) {
case 'newsletter':
if ($value != 'all') {
list($key, $value) = explode('-', $value, 2);
$where[] = 's.'. $key .' = '. $value;
}
break;
case 'email':
if (!empty($value)) {
$where[] = 'ss.mail LIKE "%%'. db_escape_string($value) .'%%"';
}
break;
}
$args[] = $value;
}
}
// All conditions are combined with AND
$where = empty($where) ? '' : ' AND '. implode(' AND ', $where);
return array('where' => $where, 'join' => $join, 'args' => $args);
}
/**
* Theme subscription administration overview.
*/
function theme_simplenews_subscription_list($form) {
// Subscription table header
$header = array(
theme('table_select_header_cell'),
array('data' => t('E-mail'), 'field' => 'ss.mail', 'sort' => 'asc'),
array('data' => t('Username'), 'field' => 'u.name'),
array('data' => t('Status'), 'field' => 'ss.activated'),
t('Operations')
);
// Subscription table
$output = drupal_render($form['options']);
if (isset($form['mail']) && is_array($form['mail'])) {
foreach (element_children($form['mail']) as $key) {
$row = array();
$row[] = drupal_render($form['snids'][$key]);
$row[] = drupal_render($form['mail'][$key]);
$row[] = drupal_render($form['name'][$key]);
$row[] = drupal_render($form['status'][$key]);
$row[] = drupal_render($form['operations'][$key]);
$rows[] = $row;
}
}
else {
$rows[] = array(array('data' => t('No subscriptions available.'), 'colspan' => '4'));
}
// Render table header, pager and form
$output .= theme('table', $header, $rows);
if ($form['pager']['#value']) {
$output .= drupal_render($form['pager']);
}
$output .= drupal_render($form);
return $output;
}
/**
* Process variables to format the simplenews status indication.
*
* $variables contains:
* - $source
* - $status
*
* @see simplenews-status.tpl.php
* @see theme_simplenews_status()
*/
function template_preprocess_simplenews_status(&$variables) {
switch ($variables['source']) {
case 'published':
$images = array(0 => 'sn-saved.png', 1 => 'sn-sent.png');
$title = array(0 => t('Not published'), 1 => t('Published'));
break;
case 'activated':
$images = array(0 => 'sn-saved.png', 1 => 'sn-sent.png');
$title = array(0 => t('Inactive: no newsletters will be sent'), 1 => t('Active: user will receive newsletters'));
break;
case 'sent':
$images = array(
SIMPLENEWS_STATUS_SEND_NOT => 'sn-saved.png',
SIMPLENEWS_STATUS_SEND_PENDING => 'sn-cron.png',
SIMPLENEWS_STATUS_SEND_READY => 'sn-sent.png'
);
$title = array(
SIMPLENEWS_STATUS_SEND_NOT => t('Not sent'),
SIMPLENEWS_STATUS_SEND_PENDING => t('Currently sending by cron'),
SIMPLENEWS_STATUS_SEND_READY => t('Sent')
);
break;
}
// Build the variables
$variables['image'] = base_path() . drupal_get_path('module', 'simplenews') .'/'. $images[$variables['status']];
$variables['alt'] = $variables['title'] = $title[$variables['status']];
}