--- /dev/null
+++ mailing_list.admin.inc
@@ -0,0 +1,407 @@
+ t('Name'), 'field' => 'name', 'sort' => 'asc'),
+ array('data' => t('Operations'), 'colspan' => '5')
+ );
+
+ $query = "SELECT * FROM {mailing_list}";
+ $result = db_query($query);
+ $rows = array();
+ $destination = drupal_get_destination();
+ while ($list = db_fetch_object($result)) {
+ $row = array(l(check_plain($list->name), "admin/build/mailing-list/$list->mlid"), l(t('list e-mails'), "admin/build/mailing-list/$list->mlid"), l(t('import e-mails'), "admin/build/mailing-list/$list->mlid/import", array('query' => $destination)), l(t('export list'), "admin/build/mailing-list/$list->mlid/export", array('query' => $destination)), l(t('rename list'), "admin/build/mailing-list/$list->mlid/edit", array('query' => $destination)), l(t('delete list'), "admin/build/mailing-list/$list->mlid/delete", array('query' => $destination)));
+ $rows[] = $row;
+ }
+
+ if (empty($rows)) {
+ $empty_message = t('No mailing lists found.');
+ $rows[] = array(array('data' => $empty_message, 'colspan' => 6));
+ }
+
+ $output = theme('table', $header, $rows);
+ $output .= theme('pager', NULL, 50, 0);
+
+ return $output;
+}
+
+/**
+ * Menu callback; displays all e-mails for the specified mailing list in a
+ * table.
+ */
+function mailing_list_emails($list = NULL) {
+ if (empty($list)) {
+ return;
+ }
+ else {
+ drupal_set_title(check_plain($list->name));
+ }
+
+ $sql = 'SELECT * FROM {mailing_list_emails} WHERE mlid = %d';
+
+ $header = array(
+ array('data' => t('E-mail'), 'field' => 'mail', 'sort' => 'asc'),
+ array('data' => t('Name'), 'field' => 'name'),
+ array('data' => t('Operations'), 'colspan' => '2')
+ );
+ $sql .= tablesort_sql($header);
+ $result = pager_query($sql, 50, 0 , NULL, array($list->mlid));
+
+ $rows = array();
+ $destination = drupal_get_destination();
+ while ($data = db_fetch_object($result)) {
+ $row = array(check_plain($data->mail), (!empty($data->name) ? check_plain($data->name) : theme('placeholder', t('none'))), l(t('edit'), "admin/build/mailing-list/$list->mlid/$data->eid", array('query' => $destination)), l(t('delete'), "admin/build/mailing-list/$list->mlid/$data->eid/delete", array('query' => $destination)));
+ $rows[] = $row;
+ }
+
+ if (empty($rows)) {
+ $empty_message = t('No e-mails found.');
+ $rows[] = array(array('data' => $empty_message, 'colspan' => 4));
+ }
+
+ $output = theme('table', $header, $rows);
+ $output .= theme('pager', NULL, 50, 0);
+
+ return $output;
+}
+
+/**
+ * Form for adding / renaming a mailing list.
+ */
+function mailing_list_form(&$form_state, $list = null) {
+ if (empty($list)) {
+ drupal_set_title(t('Add mailing list'));
+ }
+ else {
+ drupal_set_title(t('Edit mailing list'));
+ }
+
+ $form = array();
+ if (isset($form_state['values']['mlid']) || isset($list)) {
+ $form['mlid'] = array(
+ '#type' => 'hidden',
+ '#value' => isset($form_state['values']['mlid']) ? $form_state['values']['mlid'] : isset($list) ? $list->mlid: null,
+ );
+ }
+
+ $form['name'] = array(
+ '#title' => t('List name'),
+ '#type' => 'textfield',
+ '#required' => TRUE,
+ '#default_value'=> isset($form_state['values']['name']) ? $form_state['values']['name']: isset($list)?$list->name : '',
+ );
+ $form['submit'] = array(
+ '#value' => t('Save'),
+ '#type' => 'submit',
+ '#submit' => array('mailing_list_form_submit'),
+ );
+ $form['#redirect'] = 'admin/build/mailing-list';
+
+ return $form;
+}
+
+/**
+ * Submit handler for the add / rename mailing list form.
+ */
+function mailing_list_form_submit($form, &$form_state) {
+ if (isset($form_state['values']['mlid'])) {
+ $query = "UPDATE {mailing_list} SET name = '%s' WHERE mlid = %d";
+ $result = db_query($query, $form_state['values']['name'], $form_state['values']['mlid']);
+ }
+ else {
+ $query = "INSERT INTO {mailing_list} (name) VALUES ('%s')";
+ $result = db_query($query, $form_state['values']['name']);
+ }
+
+ if ($result) {
+ if (isset($form_state['values']['mlid']) ) {
+ drupal_set_message(t('Renamed mailing list %name', array('%name' => $form_state['values']['name'])));
+ watchdog('mailing_list', 'Mailing list: renamed %name.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE, l(t('view'), 'admin/build/mailing-list/'. $form_state['values']['mlid']));
+ }
+ else {
+ drupal_set_message(t('Created mailing list %name', array('%name' => $form_state['values']['name'])));
+ watchdog('mailing_list', 'Mailing list: created %name.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE, l(t('view'), 'admin/build/mailing-list/'. $form_state['values']['mlid']));
+ }
+ }
+ else {
+ if (isset($form_state['values']['mlid'])) {
+ drupal_set_message(t('Failed to update mailing list %name', array('%name' => $form_state['values']['name'])), 'error');
+ }
+ else {
+ drupal_set_message(t('Failed to create mailing list %name', array('%name' => $form_state['values']['name'])), 'error');
+ }
+ }
+}
+
+/**
+ * Form to add / edit an e-mail in a mailing list.
+ */
+function mailing_list_email_form(&$form_state, $list = null, $email = null) {
+ if (empty($list)) {
+ return;
+ }
+
+ if (empty($email)) {
+ drupal_set_title(t('Add e-mail'));
+ }
+ else {
+ drupal_set_title(t('Edit e-mail'));
+ }
+
+ $form = array();
+ if (isset($form_state['values']['mlid']) || isset($list)) {
+ $form['mlid'] = array(
+ '#type' => 'hidden',
+ '#value' => isset($form_state['values']['mlid']) ? $form_state['values']['mlid'] : isset($list) ? $list->mlid: null,
+ );
+ }
+ if (isset($form_state['values']['eid']) || isset($email)) {
+ $form['eid'] = array(
+ '#type' => 'hidden',
+ '#value' => isset($form_state['values']['eid']) ? $form_state['values']['eid'] : isset($email) ? $email->eid: null,
+ );
+ }
+ $form['mail'] = array(
+ '#title' => t('E-mail'),
+ '#type' => 'textfield',
+ '#required' => TRUE,
+ '#default_value'=> isset($form_state['values']['mail']) ? $form_state['values']['mail']: isset($email) ? $email->mail : '',
+ );
+ $form['name'] = array(
+ '#title' => t('Name'),
+ '#type' => 'textfield',
+ '#default_value'=> isset($form_state['values']['name']) ? $form_state['values']['name']: isset($email) ? $email->name : '',
+ );
+ $form['submit'] = array(
+ '#value' => t('Save'),
+ '#type' => 'submit',
+ '#submit' => array('mailing_list_email_form_submit'),
+ );
+ $form['#redirect'] = 'admin/build/mailing-list/'. $list->mlid;
+ return $form;
+}
+
+/**
+ * Submit handler for the add / edit e-mail form.
+ */
+function mailing_list_email_form_submit($form, &$form_state) {
+ if (isset($form_state['values']['eid'])) {
+ $query = "UPDATE {mailing_list_emails} SET name = '%s', mail = '%s' WHERE eid = %d";
+ $result = db_query($query, $form_state['values']['name'], $form_state['values']['mail'], $form_state['values']['eid']);
+ }
+ else {
+ $query = "INSERT INTO {mailing_list_emails} (mlid, name, mail) VALUES (%d, '%s', '%s')";
+ $result = db_query($query, $form_state['values']['mlid'], $form_state['values']['name'], $form_state['values']['mail']);
+ }
+
+ $name = mailing_list_email_get_name($form_state['values']);
+ if ($result) {
+ if (isset($form_state['values']['eid']) ) {
+ drupal_set_message(t('Updated e-mail for %name', array('%name' => $name)));
+ watchdog('mailing_list', 'Mailing list: updated e-mail for %name.', array('%name' => $name), WATCHDOG_NOTICE, l(t('view'), 'admin/build/mailing-list/'. $form_state['values']['mlid'] .'/'. $form_state['values']['eid']));
+ }
+ else {
+ drupal_set_message(t('Added e-mail for %name', array('%name' => $name)));
+ watchdog('mailing_list', 'Mailing list: added e-mail for %name.', array('%name' => $name));
+ }
+ }
+ else {
+ if (isset($form_state['values']['eid'])) {
+ drupal_set_message(t('Failed to update e-mail for %name', array('%name' => $name)), 'error');
+ }
+ else {
+ drupal_set_message(t('Failed to add e-mail for %name', array('%name' => $name)), 'error');
+ }
+ }
+}
+
+/**
+ * Mailing list deletion form.
+ */
+function mailing_list_delete_confirm($form_state, $list) {
+ if (user_access('administer mailing lists')) {
+ $form['mlid'] = array('#type' => 'value', '#value' => $list->mlid);
+ $form['name'] = array('#type' => 'value', '#value' => $list->name);
+ $output = confirm_form($form,
+ t('Are you sure you want to delete mailing list %name? All e-mails in this list will be deleted too.', array('%name' => $list->name)),
+ isset($_GET['destination']) ? $_GET['destination'] : 'admin/build/mailing-list');
+ }
+ return $output;
+}
+
+/**
+ * Submit handler for the mailing list deletion form.
+ */
+function mailing_list_delete_confirm_submit($form, &$form_state) {
+ if ($form_state['values']['confirm']) {
+ mailing_list_delete($form_state['values']['mlid']);
+ drupal_set_message(t('Deleted mailing list %name.', array('%name' => $form_state['values']['name'])));
+ watchdog('mailing list', 'Mailing list: deleted list %name.', array('%name' => $form_state['values']['name']));
+ $form_state['redirect'] = 'admin/build/mailing-list';
+ return;
+ }
+}
+
+/**
+ * E-mail deletion form.
+ */
+function mailing_list_email_delete_confirm($form_state, $list, $email) {
+ if (user_access('administer mailing lists')) {
+ $name = mailing_list_email_get_name($email);
+ $form['mlid'] = array('#type' => 'value', '#value' => $list->mlid);
+ $form['eid'] = array('#type' => 'value', '#value' => $email->eid);
+ $form['name'] = array('#type' => 'value', '#value' => $name);
+ $output = confirm_form($form,
+ t('Are you sure you want to delete the e-mail for %name?', array('%name' => $name)),
+ isset($_GET['destination']) ? $_GET['destination'] : 'admin/build/mailing-list/'. $list->mlid);
+ }
+ return $output;
+}
+
+/**
+ * Submit handler for the e-mail deletion form.
+ */
+function mailing_list_email_delete_confirm_submit($form, &$form_state) {
+ if ($form_state['values']['confirm']) {
+ mailing_list_email_delete($form_state['values']['eid']);
+ drupal_set_message(t('E-mail deleted for %name', array('%name' => $form_state['values']['name'])));
+ $form_state['redirect'] = 'admin/build/mailing-list/'. $form_state['values']['mlid'];
+ watchdog('mailing list', 'Mailing list: deleted e-mail %name.', array('%name' => $form_state['values']['name']));
+ return;
+ }
+}
+
+/**
+ * Deletes a mailing list and all its e-mails.
+ *
+ * @param $mlid
+ * The ID of the mailing list.
+ */
+function mailing_list_delete($mlid) {
+ db_query('DELETE FROM {mailing_list_emails} WHERE mlid = %d', $mlid);
+ db_query('DELETE FROM {mailing_list} WHERE mlid = %d', $mlid);
+}
+
+/**
+ * Deletes an e-mail.
+ *
+ * @param $eid
+ * The ID of the e-mail.
+ */
+function mailing_list_email_delete($eid) {
+ db_query('DELETE FROM {mailing_list_emails} WHERE eid = %d', $eid);
+}
+
+/**
+ * Form for importing a mailing list from a CSV file.
+ */
+function mailing_list_import_form($form_state, $list) {
+ if (empty($list)) {
+ return;
+ }
+
+ drupal_set_title(t('Import e-mails'));
+
+ $form = array();
+ $form['#attributes'] = array('enctype' => "multipart/form-data");
+ if ( isset($form_state['values']['mlid']) || isset($list) ) {
+ $form['mlid'] = array(
+ '#type' => 'hidden',
+ '#value' => isset($form_state['values']['mlid']) ? $form_state['values']['mlid'] : isset($list) ? $list->mlid: null,
+ );
+ }
+ if ( isset($form_state['values']['name']) || isset($list) ) {
+ $form['name'] = array(
+ '#type' => 'hidden',
+ '#value' => isset($form_state['values']['name']) ? $form_state['values']['name'] : isset($list) ? $list->name: null,
+ );
+ }
+ $form['file_upload'] = array(
+ '#title' => t('CSV file'),
+ '#type' => 'file',
+ );
+ $form['submit'] = array(
+ '#value' => t('Import'),
+ '#type' => 'submit',
+ );
+ return $form;
+}
+
+/**
+ * Submit handler for the mailing list import form.
+ */
+function mailing_list_import_form_submit($form, &$form_state) {
+ $num_imported = 0;
+
+ if ($file = file_save_upload('file_upload', array('file_validate_extensions' => array('csv')))) {
+ ini_set('auto_detect_line_endings',TRUE);
+ $handle = @fopen($file->filepath, 'r');
+
+ while (($data = fgetcsv($handle)) !== FALSE) {
+ $num_fields = count($data);
+ $is_existing = db_fetch_object(db_query("SELECT * from {mailing_list_emails} WHERE mlid = %d AND mail = '%s'", $form_state['values']['mlid'], $data[0]));
+ if (!$is_existing && $num_fields == 2) {
+ db_query("INSERT INTO {mailing_list_emails} (mlid, mail, name) VALUES (%d, '%s', '%s')", $form_state['values']['mlid'], $data[0], $data[1]);
+ $num_imported++;
+ }
+ }
+
+ fclose($handle);
+
+ if ($num_imported) {
+ drupal_set_message(t('Import complete: %num-imported added to mailing list %name.', array('%num-imported' => format_plural($num_imported, '1 e-mail', '@count e-mails'), '%name' => $form_state['values']['name'])));
+ }
+ }
+
+ if (!$num_imported) {
+ drupal_set_message(t('No e-mails added to mailing list: invalid or empty file.'), 'error');
+ }
+
+ $form_state['redirect'] = 'admin/build/mailing-list/'. $form_state['values']['mlid'];
+
+ return;
+}
+
+/**
+ * Menu callback; exports a mailing list directly to the user as a CSV file.
+ */
+function mailing_list_export($list) {
+ $path = file_directory_path();
+
+ // create file to hold email list
+ $filename = drupal_strtolower(str_replace(' ', '_', $list->name)). '.csv';
+ $full_path = $path.'/'.$filename;
+
+ $query = "SELECT * FROM {mailing_list_emails} WHERE mlid = '%d'";
+ $result = db_query($query, $list->mlid);
+
+ // create string with all the emails
+ $emails = array();
+ while ($row = db_fetch_object($result)) {
+ $emails[] = '"'. trim($row->mail) .'","'. trim($row->name) .'"';
+ }
+
+ $emails = implode("\n", $emails) ."\n";
+
+ // write resultant string to file
+ file_save_data($emails, $full_path, FILE_EXISTS_REPLACE);
+
+ // set headers for file transfer
+ $headers = array(
+ 'Content-Type: application/octet-stream',
+ 'Content-Disposition: attachment; filename="' . basename($full_path) . '";',
+ 'Content-Length: ' . sprintf('%u', filesize($full_path)),
+ );
+
+ file_transfer($full_path, $headers);
+}
--- mailing_list.install
+++ mailing_list.install
@@ -1,57 +1,165 @@
t('Mailing list id'),
+ 'description' => t('A mailing list consisting of names and e-mails.'),
'fields' => array(
- 'id' => array(
- 'type' => 'serial',
+ 'mlid' => array(
+ 'description' => 'The primary identifier for a mailing list.',
+ 'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
- 'list' => array(
- 'description' => t('The title of this mailing list'),
+ 'name' => array(
+ 'description' => t('The title of this mailing list.'),
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
),
- 'primary key' => array('id'),
+ 'primary key' => array('mlid'),
+ 'indexes' => array(
+ 'name' => array('name'),
+ ),
);
$schema['mailing_list_emails'] = array(
- 'description' => t('Emails subscribed to specific fields'),
+ 'description' => t('An e-mail in a mailing list.'),
'fields' => array(
- 'id' => array(
- 'type' => 'serial',
+ 'eid' => array(
+ 'description' => 'The primary identifier for a mailing list e-mail.',
+ 'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
- 'mailing_list_id' => array(
- 'description' => t('Which mailing list the address is subscribed to.'),
+ 'mlid' => array(
+ 'description' => t('The {mailing_list} this e-mail belongs to.'),
'type' => 'int',
+ 'unsigned' => TRUE,
'not null' => TRUE,
+ 'default' => 0,
),
- 'email' => array(
- 'description' => t('The title of this mailing list'),
+ 'mail' => array(
+ 'description' => t('The e-mail of this subscriber.'),
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
+ 'name' => array(
+ 'description' => t('The name of this subscriber.'),
+ 'type' => 'varchar',
+ 'length' => 255,
+ 'not null' => TRUE,
+ ),
+ ),
+ 'primary key' => array('eid'),
+ 'indexes' => array(
+ 'mlid' => array('mlid'),
+ 'name' => array('name'),
+ ),
+ 'unique keys' => array(
+ 'mail' => array('mail'),
),
- 'primary key' => array('id'),
);
-
-
+
+
return $schema;
}
+
+/**
+ * Update mailing lists to allow subscriber names (not just e-mails), and clean
+ * up field names.
+ */
+function mailing_list_update_6000() {
+ $ret = array();
+
+ db_change_field($ret, 'mailing_list', 'id', 'mlid',
+ array(
+ 'type' => 'serial',
+ 'unsigned' => TRUE,
+ 'not null' => TRUE,
+ )
+ );
+
+ db_change_field($ret, 'mailing_list', 'list', 'name',
+ array(
+ 'type' => 'varchar',
+ 'length' => 255,
+ 'not null' => TRUE,
+ ),
+ array(
+ 'indexes' => array(
+ 'name' => array('name'),
+ ),
+ )
+ );
+
+ db_change_field($ret, 'mailing_list_emails', 'id', 'eid',
+ array(
+ 'type' => 'serial',
+ 'unsigned' => TRUE,
+ 'not null' => TRUE,
+ )
+ );
+
+ db_change_field($ret, 'mailing_list_emails', 'mailing_list_id', 'mlid',
+ array(
+ 'type' => 'int',
+ 'unsigned' => TRUE,
+ 'not null' => TRUE,
+ 'default' => 0,
+ ),
+ array(
+ 'indexes' => array(
+ 'mlid' => array('mlid'),
+ ),
+ )
+ );
+
+ db_change_field($ret, 'mailing_list_emails', 'email', 'mail',
+ array(
+ 'type' => 'varchar',
+ 'length' => 255,
+ 'not null' => TRUE,
+ ),
+ array(
+ 'unique keys' => array(
+ 'mail' => array('mail'),
+ ),
+ )
+ );
+
+ db_add_field($ret, 'mailing_list_emails', 'name', array('type' => 'varchar', 'not null' => TRUE, 'length' => 255), array('indexes' => array('name' => array('name'))));
+
+ $ret[] = update_sql("DELETE FROM {permission} WHERE perm = 'export mailing list'");
+ $result = db_query("SELECT rid, perm FROM {permission} WHERE perm = 'administer mailing list' ORDER BY rid");
+ while ($role = db_fetch_object($result)) {
+ $ret[] = update_sql("UPDATE {permission} SET perm = 'administer mailing lists' WHERE rid = $role->rid");
+ }
+
+ return $ret;
+}
diff --git a/mailing_list.module b/mailing_list.module
index 81fcee0..a145f1d 100644
--- mailing_list.module
+++ mailing_list.module
@@ -1,219 +1,288 @@
t('Mailing List'),
- 'page callback' => 'mailing_list_admin',
- 'access arguments' => array('administer mailing list'),
+
+ $items['admin/build/mailing-list'] = array(
+ 'title' => t('Mailing lists'),
+ 'description' => t('Manage your mailing lists.'),
+ 'page callback' => 'mailing_list_lists',
+ 'access arguments' => array('administer mailing lists'),
+ 'file' => 'mailing_list.admin.inc',
);
- $items['admin/settings/mailing-list/%mailing_list/edit'] = array(
- 'title' => t('Edit Mailing List'),
- 'page callback' => 'drupal_get_form',
- 'page arguments'=> array('mailing_list_form', 3),
- 'access arguments' => array('administer mailing list'),
+ $items['admin/build/mailing-list/list'] = array(
+ 'title' => 'List',
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -10,
);
-
- $items['mailing-list/%mailing_list/export'] = array(
- 'title' => t('Export Mailing List'),
+ $items['admin/build/mailing-list/add'] = array(
+ 'title' => t('Add'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_form'),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list'] = array(
+ 'title' => 'List e-mails',
+ 'type' => MENU_CALLBACK,
+ 'page callback' => 'mailing_list_emails',
+ 'page arguments' => array(3),
+ 'access arguments' => array('administer mailing lists'),
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/list'] = array(
+ 'title' => 'List e-mails',
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -10,
+ );
+ $items['admin/build/mailing-list/%mailing_list/add'] = array(
+ 'title' => t('Add e-mail'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_email_form', 3),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => -5,
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/import'] = array(
+ 'title' => t('Import e-mails'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_import_form', 3),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => -2,
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/export'] = array(
+ 'title' => t('Export list'),
'page callback' => 'mailing_list_export',
- 'page arguments' => array(1),
- 'access arguments' => array('export mailing list'),
+ 'page arguments' => array(3),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 0,
+ 'file' => 'mailing_list.admin.inc',
);
+ $items['admin/build/mailing-list/%mailing_list/edit'] = array(
+ 'title' => t('Rename list'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_form', 3),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 5,
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/delete'] = array(
+ 'title' => 'Delete list',
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_delete_confirm', 3),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 10,
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/%mailing_list_email'] = array(
+ 'title' => 'Edit e-mail',
+ 'type' => MENU_CALLBACK,
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_email_form', 3, 4),
+ 'access arguments' => array('administer mailing lists'),
+ 'file' => 'mailing_list.admin.inc',
+ );
+ $items['admin/build/mailing-list/%mailing_list/%mailing_list_email/delete'] = array(
+ 'title' => 'Delete e-mail',
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('mailing_list_email_delete_confirm', 3, 4),
+ 'access arguments' => array('administer mailing lists'),
+ 'type' => MENU_CALLBACK,
+ 'file' => 'mailing_list.admin.inc',
+ );
return $items;
}
+/**
+ * Implementation of hook_block().
+ */
function mailing_list_block($op = 'list', $delta = 0, $edit = array()) {
$block = array();
switch ($op) {
+ case 'configure':
+ $form['mailing_list_show_name_'. $delta] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Show name field in subscription form'),
+ '#default_value' => variable_get('mailing_list_show_name_'. $delta, 1),
+ '#description' => t('Whether or not to show a text field in the subscription form that this block displays, letting a subscriber enter his or her name. If the name field is shown, it also becomes required.'),
+ );
+ return $form;
+
+ case 'save':
+ variable_set('mailing_list_show_name_'. $delta, $edit['mailing_list_show_name_'. $delta]);
+
case 'list':
$query = "SELECT * FROM {mailing_list}";
$result = db_query($query);
- while ($row = db_fetch_object($result)) {
- $block[$row->id] = array(
- 'info' => $row->list,
+ while ($list = db_fetch_object($result)) {
+ $block[$list->mlid] = array(
+ 'info' => check_plain($list->name),
);
}
- break;
+ break;
+
case 'view':
- $list = mailing_list_load($delta);
+ $list = mailing_list_load($delta);
$block = array(
- 'subject' => $list->list ,
+ 'subject' => check_plain($list->name),
'content' => drupal_get_form('mailing_list_subscription_form', $list),
);
- break;
-
+ break;
}
-
return $block;
}
-function mailing_list_subscription_form(&$form_state, $list ) {
- $form = array();
- $form['id'] = array(
- '#type' => 'hidden',
- '#default_value' => $list->id,
- );
- $form['list'] = array(
- '#type' => 'hidden',
- '#value' => $list->list,
- );
- $form['email'] = array(
- '#title' => t('Email'),
- '#type' => 'textfield',
- '#size' => 20,
- );
- $form['submit'] = array(
- '#value' => t('Subscribe'),
- '#type' => 'submit',
- '#submit' => array('mailing_list_subscription_form_submit'),
- );
- $form['#validate'] = array('mailing_list_subscription_form_validate');
- return $form;
-}
-function mailing_list_subscription_form_validate($form, &$form_state) {
- $message = user_validate_mail($form_state['values']['email']);
- if ($message) {
- form_set_error('email', $message);
- }
-}
-function mailing_list_subscription_form_submit($form, &$form_state) {
- if ($form_state['values']['id'] == null) {
- drupal_set_message('Error occured while saving your subscription. Please contact sie administrators', 'error');
- return ;
- }
- $query = "INSERT INTO {mailing_list_emails} (mailing_list_id, email) VALUES (%d, '%s')";
- if (db_query($query, $form_state['values']['id'], $form_state['values']['email'])) {
- drupal_set_message('Your Subscription to '. $form_state['values']['list'] .' has been saved');
- }
- else {
- drupal_set_message('Failed to subscribe to '. $form_state['values']['list'] .' please contact site administrators', 'error');
- }
-}
-function mailing_list_load($id) {
- $query = "SELECT * FROM {mailing_list} WHERE id = %d";
- $return = db_fetch_object(db_query($query, $id));
+
+/**
+ * Return the mailing list object matching a mailing list ID.
+ *
+ * @param $mlid
+ * The mailing list's ID.
+ *
+ * @return
+ * The mailing list object, if exists, FALSE otherwise.
+ */
+function mailing_list_load($mlid) {
+ $query = "SELECT * FROM {mailing_list} WHERE mlid = %d";
+ $return = db_fetch_object(db_query($query, $mlid));
return $return;
}
-function mailing_list_admin() {
- $output = '';
- $output .= drupal_get_form('mailing_list_form');
- $output .= mailing_list_lists();
- return $output;
-}
-function mailing_list_lists() {
- $query = "SELECT * FROM {mailing_list}";
- $result = db_query($query);
- $rows = array();
- while ($row = db_fetch_object($result)) {
- $rows[] = $row->list . ' ' . l('edit', 'admin/settings/mailing-list/'. $row->id .'/edit') . ' ' . l('export' , 'mailing-list/' . $row->id . '/export');
- }
- return theme('item_list', $rows, "Available Mailing Lists");
+/**
+ * Return the mailing list e-mail object matching an e-mail ID.
+ *
+ * @param $eid
+ * The e-mail's ID.
+ *
+ * @return
+ * The mailing list e-mail object, if exists, FALSE otherwise.
+ */
+function mailing_list_email_load($eid) {
+ $query = "SELECT * FROM {mailing_list_emails} WHERE eid = %d";
+ $return = db_fetch_object(db_query($query, $eid));
+ return $return;
}
-function mailing_list_export($list){
-
- // --- set up file for export ---//
-
- //get file directory
- $path = file_directory_path();
-
- //create file to hold email list
- $filename = $list->list. '.csv';
-
- //full path name
- $full_path = $path.'/'.$filename;
-
- // --- get email addresses from database ---//
-
- //create query for selection of emails
- $query = "SELECT * FROM {mailing_list_emails} WHERE mailing_list_id='%d'";
-
- //run query
- $result = db_query($query, $list->id);
-
- //create string with all the emails
- $emails = array();
- while ($row = db_fetch_object($result)){
- $emails[] = $row->email;
- }
-
- $emails = implode(",\n", $emails);
-
- //write resultant string to file
- file_save_data($emails, $full_path, FILE_EXISTS_REPLACE);
-
- //set headers for file transfer
- $headers = array(
- 'Content-Type: application/octet-stream',
- 'Content-Disposition: attachment; filename="' . basename($full_path) . '";',
- 'Content-Length: ' . sprintf('%u', filesize($full_path)),
- );
-
- file_transfer($full_path, $headers);
-
+/**
+ * Gets the name for a subscriber e-mail if available, otherwise gets the
+ * e-mail address.
+ *
+ * @param $data
+ * Subscriber object.
+ *
+ * @return
+ * Subscriber name or subscriber e-mail.
+ */
+function mailing_list_email_get_name($data) {
+ $data = (object)$data;
+ return !empty($data->name) ? $data->name : $data->mail;
}
-function mailing_list_form(&$form_state, $list = null) {
-
+/**
+ * Display a form letting a user subscribe to a mailing list.
+ */
+function mailing_list_subscription_form(&$form_state, $list) {
$form = array();
- if ( isset($form_state['values']['id']) || isset($list) ) {
- $form['id'] = array(
- '#type' => 'hidden',
- '#value' => isset($form_state['values']['id']) ? $form_state['values']['id'] : isset($list) ? $list->id: null,
+ $form['mlid'] = array(
+ '#type' => 'hidden',
+ '#default_value' => $list->mlid,
+ );
+ $form['ml_name'] = array(
+ '#type' => 'hidden',
+ '#value' => $list->name,
+ );
+ if (variable_get('mailing_list_show_name_'. $list->mlid, 1)) {
+ $form['name'] = array(
+ '#title' => t('Name'),
+ '#type' => 'textfield',
+ '#size' => 20,
+ '#required' => TRUE,
);
}
- $form['form'] = array(
- '#title' => t('Create mailing list'),
- '#type' => 'fieldset',
- '#collapsible' => TRUE,
- '#collapsed' => FALSE,
- );
- $form['form']['list_name'] = array(
- '#title' => t('Mailing List Name'),
- '#type' => 'textfield',
- '#required' => TRUE,
- '#default_value'=> isset($form_state['values']['list_name']) ? $form_state['values']['list_name']: isset($list)?$list->list:'',
+ else {
+ $form['name'] = array(
+ '#type' => 'hidden',
+ '#value' => '',
+ );
+ }
+ $form['mail'] = array(
+ '#title' => t('E-mail'),
+ '#type' => 'textfield',
+ '#size' => 20,
);
- $form['form']['submit'] = array(
- '#value' => t('Save'),
- '#type' => 'submit',
- '#submit' => array('mailing_list_form_submit'),
+ $form['submit'] = array(
+ '#value' => t('Subscribe'),
+ '#type' => 'submit',
+ '#submit' => array('mailing_list_subscription_form_submit'),
);
- $form['#redirect'] = 'admin/settings/mailing-list';
+ $form['#validate'] = array('mailing_list_subscription_form_validate');
return $form;
}
-function mailing_list_form_submit($form, &$form_state) {
- if (isset($form_state['values']['id'])) {
- $query = "UPDATE {mailing_list} SET list = '%s' WHERE id = %d";
- $result = db_query($query, $form_state['values']['list_name'], $form_state['values']['id']);
+/**
+ * Validation handler for the subscription form; checks name and e-mail
+ * entered.
+ */
+function mailing_list_subscription_form_validate($form, &$form_state) {
+ if (variable_get('mailing_list_show_name_'. $form_state['values']['mlid'], 1) && empty($form_state['values']['name'])) {
+ form_set_error('name', t('Name is required.'));
}
- else {
- $query = "INSERT INTO {mailing_list} (list) VALUES ('%s')";
- $result = db_query($query, $form_state['values']['list_name']);
+ $message = user_validate_mail($form_state['values']['mail']);
+ if ($message) {
+ form_set_error('mail', $message);
}
+ elseif (db_fetch_object(db_query("SELECT * FROM {mailing_list_emails} WHERE mlid = %d AND mail = '%s'", $form_state['values']['mlid'], $form_state['values']['mail']))) {
+ form_set_error('mail', t('The e-mail %mail already exists in mailing list %name.', array('%mail' => $form_state['values']['mail'], '%name' => $form_state['values']['ml_name'])));
+ }
+}
- if ($result) {
- if (isset($form_state['values']['id']) ) {
- drupal_set_message('Updated Mailing List: '. check_plain($form_state['values']['list_name']));
- }
- else {
- drupal_set_message('New Mailing List Created: '. check_plain($form_state['values']['list_name']));
- }
+/**
+ * Submit handler for the subscription form; saves a subscription.
+ */
+function mailing_list_subscription_form_submit($form, &$form_state) {
+ if ($form_state['values']['mlid'] == null) {
+ drupal_set_message(t('Unable to save mailing list subscription: no mailing list specified.'), 'error');
+ return;
+ }
+ $query = "INSERT INTO {mailing_list_emails} (mlid, name, mail) VALUES (%d, '%s', '%s')";
+ if (db_query($query, $form_state['values']['mlid'], $form_state['values']['name'], $form_state['values']['mail'])) {
+ drupal_set_message(t('Subscription for %mail saved.', array('%mail' => $form_state['values']['mail'])));
+ watchdog('mailing_list', 'Mailing list: %name added via subscription form.', array('%name' => $form_state['values']['mail']));
}
else {
- if (isset($form_state['values']['id'])) {
- drupal_set_message('Failed to Update Mailing List: '. check_plain($form_state['values']['list_name']), 'error');
- }
- else {
- drupal_set_message('Failed to Create New Mailing List: '. check_plain($form_state['values']['list_name']), 'error');
- }
+ drupal_set_message(t('Failed to subscribe to mailing list %name.', array('%name' => $form_state['values']['ml_name'])), 'error');
}
}