contact.module 13.2 KB
Newer Older
Dries's avatar
 
Dries committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<?php
// $Id$

/**
 * @file
 * Enables the use of personal contact forms.
 */

// Users are not allowed to send more than x mails/hour:
define('CONTACT_HOURLY_THRESHOLD', 3);

/**
 * Implementation of hook_help().
 */
function contact_help($section) {
  switch ($section) {
    case 'admin/modules#description':
18 19 20
      return t('Enables the use of both personal and site-wide contact forms.');
    case 'admin/contact':
      return t('This page lets you setup <a href="%form">your site-wide contact form</a>.  To do so, add one or more subjects.  You can associate different recipients with each subject to route e-mails to different people.  For example, you can route website feedback to the webmaster and direct product information requests to the sales department.  On the <a href="%settings">settings page</a> you can customize the information shown above the contact form.  This can be useful to provide additional contact information such as your postal address and telephone number.', array('%settings' => url('admin/settings/contact'), '%form' => url('contact', NULL, NULL, TRUE)));
Dries's avatar
 
Dries committed
21 22 23 24 25 26 27 28 29 30
  }
}

/**
 * Implementation of hook_menu().
 */
function contact_menu($may_cache) {
  global $user;
  $items = array();

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
  if ($may_cache) {
    $items[] = array('path' => 'contact', 'title' => t('contact us'),
      'callback' => 'contact_mail_page', 'access' => user_access('access content'),
      'type' => MENU_SUGGESTED_ITEM);
    $items[] = array('path' => 'admin/contact', 'title' => t('contact form'),
      'callback' => 'contact_admin', 'access' => user_access('administer site configuration'));
    $items[] = array('path' => 'admin/contact/list', 'title' => t('list'),
      'callback' => 'contact_admin', 'access' => user_access('administer site configuration'),
      'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
    $items[] = array('path' => 'admin/contact/edit', 'title' => t('add subject'),
      'callback' => 'contact_admin_edit', 'access' => user_access('administer site configuration'),
      'type' => MENU_LOCAL_TASK);
    $items[] = array('path' => 'admin/contact/delete', 'title' => t('delete contact'),
      'callback' => 'contact_admin_delete', 'access' => user_access('administer site configuration'),
      'type' => MENU_CALLBACK);
  }
  else {
Dries's avatar
 
Dries committed
48 49 50 51 52 53 54 55 56
    if (arg(0) == 'user' && is_numeric(arg(1))) {
      $items[] = array('path' => "user/". arg(1) ."/contact", 'title' => t('contact'),
        'callback' => 'contact_mail_user', 'type' => MENU_LOCAL_TASK, 'weight' => 2);
    }
  }

  return $items;
}

57 58 59 60
/**
 * Implementation of hook_settings().
 */
function contact_settings() {
61
  $output = form_textarea(t('Additional information'), 'contact_form_information', variable_get('contact_form_information', t('You can leave us a message using the contact form below.')), 60, 5, t('Information to show on the <a href="%form">contact page</a>.  Can be anything from submission guidelines to your postal address or telephone number.', array('%form' => url('contact'))));
62 63 64
  return $output;
}

Dries's avatar
 
Dries committed
65 66 67 68 69 70 71
/**
 * Implementation of hook_user().
 *
 * Provides signature customization for the user's comments.
 */
function contact_user($type, $edit, &$user, $category = NULL) {
  if ($type == 'form' && $category == 'account') {
72
    return array(array('title' => t('Contact settings'), 'data' => form_checkbox(t('Personal contact form'), 'contact', 1, $edit['contact'], t('Allow other users to contact you by e-mail via <a href="%url">your personal contact form</a>. Note that your e-mail address is not made public and that privileged users such as site administrators are able to contact you even if you choose not to enable this feature.', array('%url' => "user/$user->uid/contact"))), 'weight' => 2));
Dries's avatar
 
Dries committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  }
  if ($type == 'validate') {
    return array('contact' => $edit['contact']);
  }
}

function contact_mail_user() {
  global $user;

  if ($account = user_load(array('uid' => arg(1), 'status' => 1))) {
    if (!$account->contact && !user_access('administer users')) {
      $output = t('%name is not accepting e-mails.', array('%name' => $account->name));
    }
    else if (!$user->uid) {
      $output = t('Please <a href="%login">login</a> or <a href="%register">register</a> to send %name a message.', array('%login' => url('user/login'), '%register' => url('user/register'), '%name' => $account->name));
    }
    else if (!valid_email_address($user->mail)) {
90
      $output = t('You need to provide a valid e-mail address to contact other users. Please edit your <a href="%url">user information</a>.', array('%url' => url("user/$user->uid/edit")));
Dries's avatar
 
Dries committed
91 92
    }
    else if (!flood_is_allowed('contact', CONTACT_HOURLY_THRESHOLD)) {
93
      $output = t("You can't contact more than %number users per hour. Please try again later.", array('%number' => CONTACT_HOURLY_THRESHOLD));
Dries's avatar
 
Dries committed
94 95 96 97 98 99 100
    }
    else {
      $edit = $_POST['edit'];

      if ($edit) {
        // Validate the message:
        if (!$edit['message']) {
101
          form_set_error('message', t('You must enter a message.'));
Dries's avatar
 
Dries committed
102
        }
Dries's avatar
Dries committed
103 104 105
        if (!$edit['subject']) {
          form_set_error('subject', t('You must enter a subject.'));
        }
Dries's avatar
 
Dries committed
106 107 108 109 110 111 112 113 114 115 116

        if (!form_get_errors()) {
          // Compose the body:
          $message[] = "$account->name,";
          $message[] = t("%name (%name-url) has sent you a message via your contact form (%form-url) at %site.", array('%name' => $user->name, '%name-url' => url("user/$user->uid", NULL, NULL, TRUE), '%form-url' => url($_GET['q'], NULL, NULL, TRUE), '%site' => variable_get('site_name', 'drupal')));
          $message[] = t("If you don't want to receive such e-mails, you can change your settings at %url.", array('%url' => url("user/$account->uid", NULL, NULL, TRUE)));
          $message[] = t('Message:');
          $message[] = $edit['message'];

          // Tidy up the body:
          foreach ($message as $key => $value) {
117
            $message[$key] = wordwrap($value);
Dries's avatar
 
Dries committed
118 119 120 121 122
          }

          // Prepare all fields:
          $to = $account->mail;
          $from = $user->mail;
123

Dries's avatar
Dries committed
124
          // Format the subject:
125 126 127
          $subject = '['. variable_get('site_name', 'drupal') .'] '. $edit['subject'];

          // Prepare the body:
Dries's avatar
Dries committed
128
          $body = implode("\n\n", $message);
Dries's avatar
 
Dries committed
129 130 131 132 133 134

          // Send the e-mail:
          user_mail($to, $subject, $body, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");

          // Log the operation:
          flood_register_event('contact');
135
          watchdog('mail', t('%name-from sent %name-to an e-mail.', array('%name-from' => theme('placeholder', $user->name), '%name-to' => theme('placeholder', $account->name))));
Dries's avatar
 
Dries committed
136 137

          // Set a status message:
138
          drupal_set_message(t('The message has been sent.'));
Dries's avatar
 
Dries committed
139 140 141 142 143 144 145 146 147 148 149

          // Jump to the user's profile page:
          drupal_goto("user/$account->uid");
        }
      }
      else {
        $edit['mail'] = $user->mail;
      }

      $output  = form_item(t('From'), $user->name .' &lt;'. $user->mail .'&gt;');
      $output .= form_item(t('To'), $account->name);
150 151
      $output .= form_textfield(t('Subject'), 'subject', $edit['subject'], 60, 50, NULL, NULL, TRUE);
      $output .= form_textarea(t('Message'), 'message', $edit['message'], 60, 15, NULL, NULL, TRUE);
Dries's avatar
 
Dries committed
152 153 154 155
      $output .= form_submit(t('Send e-mail'));
      $output  = form($output);
    }

Dries's avatar
 
Dries committed
156 157
    drupal_set_title($account->name);
    return $output;
Dries's avatar
 
Dries committed
158 159 160 161 162 163
  }
  else {
    drupal_not_found();
  }
}

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
function contact_admin_edit($subject = NULL) {
  if (isset($_POST['edit'])) {
    $edit = $_POST['edit'];

    if (empty($edit['subject'])) {
      form_set_error('subject', t('You must enter a subject.'));
    }
    if (empty($edit['recipients'])) {
      form_set_error('recipients', t('You must enter one or more recipients.'));
    }

    if (!form_get_errors()) {
      db_query("DELETE FROM {contact} WHERE subject = '%s'", $subject);
      db_query("INSERT INTO {contact} (subject, recipients, reply) VALUES ('%s', '%s', '%s')", $edit['subject'], $edit['recipients'], $edit['reply']);
      drupal_goto('admin/contact');
    }
  }

  $subject = db_fetch_object(db_query("SELECT * FROM {contact} WHERE subject = '%s'", $subject));

184 185 186
  $form = form_textfield(t('Subject'), 'subject', $subject->subject, 60, 255, t("Example: 'website feedback' or 'product information'."), NULL, TRUE);
  $form .= form_textarea(t('Recipients'), 'recipients', $subject->recipients, 60, 5, t("Example: 'webmaster@yoursite.com' or 'sales@yoursite.com'.  To specify multiple repecients, separate each e-mail address with a comma."), NULL, TRUE);
  $form .= form_textarea(t('Auto-reply'), 'reply', $subject->reply, 60, 5, t("Optional auto-reply.  Leave empty if you don't want to send the user an auto-reply message."));
187 188
  $form .= form_submit(t('Submit'));

Dries's avatar
 
Dries committed
189
  return form($form);
190 191 192 193
}

function contact_admin_delete($subject) {
  if ($_POST['op'] != t('Delete')) {
Dries's avatar
 
Dries committed
194
    return theme('confirm',
195 196 197 198
                  t('Are you sure you want to delete %subject?', array('%subject' => theme('placeholder', $subject))),
                  'admin/contact/delete/'. $subject,
                  t('This action cannot be undone.'),
                  t('Delete'),
Dries's avatar
 
Dries committed
199
                  t('Cancel'));
200 201 202 203 204 205 206 207 208 209 210 211
  }
  else {
    db_query("DELETE FROM {contact} WHERE subject = '%s'", $subject);
    drupal_goto('admin/contact');
  }
}


function contact_admin() {
  $result = db_query('SELECT subject, recipients FROM {contact} ORDER BY subject');
  $rows = array();
  while ($subject = db_fetch_object($result)) {
212
    $rows[] = array($subject->subject, $subject->recipients, l(t('edit'), 'admin/contact/edit/'. urlencode($subject->subject)), l(t('delete'), 'admin/contact/delete/'. urlencode($subject->subject)));
213 214
  }
  $header = array(t('Subject'), t('Recipients'), array('data' => t('Operations'), 'colspan' => 2));
Dries's avatar
 
Dries committed
215
  return theme('table', $header, $rows);
216 217 218 219 220 221 222 223 224 225 226 227
}

function contact_mail_page() {
  global $user;

  if (!flood_is_allowed('contact', CONTACT_HOURLY_THRESHOLD)) {
    $output = t("You can't send more than %number messages per hour. Please try again later.", array('%number' => CONTACT_HOURLY_THRESHOLD));
  }
  else {
    if (isset($_POST['edit'])) {
      $edit = $_POST['edit'];
    }
228

229 230 231 232 233 234 235 236 237 238 239
    if ($edit) {
      // Validate the fields:
      if (!$edit['name']) {
        form_set_error('name', t('You must enter a name.'));
      }
      if (!$edit['mail'] || !valid_email_address($edit['mail'])) {
        form_set_error('mail', t('You must enter a valid e-mail address.'));
      }
      if (!$edit['message']) {
        form_set_error('message', t('You must enter a message.'));
      }
240 241 242
      if (!$edit['subject']) {
        form_set_error('subject', t('You must select a valid subject.'));
      }
Dries's avatar
Dries committed
243

244 245 246
      if (!form_get_errors()) {
        // Prepare the sender:
        $from = $edit['mail'];
247

248
        // Compose the body:
Dries's avatar
Dries committed
249
        $message[] = t("%name sent a message using the contact form at %form:", array('%name' => $edit['name'], '%form' => url($_GET['q'], NULL, NULL, TRUE)));
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
        $message[] = $edit['message'];

        // Tidy up the body:
        foreach ($message as $key => $value) {
          $message[$key] = wordwrap($value);
        }

        // Format the subject:
        $subject = '['. variable_get('site_subject', 'drupal') .'] '. $edit['subject'];

        // Prepare the body:
        $body = implode("\n\n", $message);

        // Load the subject information:
        $contact = db_fetch_object(db_query("SELECT * FROM {contact} WHERE subject = '%s'", $edit['subject']));

        // Send the e-mail to the recipients:
        user_mail($contact->recipients, $contact->subject, $body, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");

        // Send an auto-reply if necessary:
        if ($contact->reply) {
          user_mail($from, $contact->subject, wordwrap($contact->reply), "From: $contact->recipients\nReply-to: $contact->recipients\nX-Mailer: Drupal\nReturn-path: $contact->recipients\nErrors-to: $contact->recipients");
        }

        // Log the operation:
        flood_register_event('contact');
        watchdog('mail', t('%name-from sent an e-mail regarding %subject.', array('%name-from' => theme('placeholder', $edit['name'] ." <$from>"), '%subject' => theme('placeholder', $contact->subject))));

        // Set a status message:
        drupal_set_message(t('Your message has been sent.'));

Dries's avatar
Dries committed
281 282
        // Jump to contact page:
        drupal_goto('contact');
283 284
      }
    }
Dries's avatar
Dries committed
285
    else if ($user->uid) {
286 287 288
      $edit['name'] = $user->name;
      $edit['mail'] = $user->mail;
    }
289

290
    $result = db_query('SELECT subject FROM contact ORDER BY subject');
291
    $subjects[] = '--';
292 293 294 295 296 297
    while ($subject = db_fetch_object($result)) {
      $subjects[$subject->subject] = $subject->subject;
    }

    if ($subjects) {
      $output  = variable_get('contact_form_information', t('You can leave us a message using the contact form below.'));
298 299
      $output .= form_textfield(t('Name'), 'name', $edit['name'], 60, 255, NULL, NULL, TRUE);
      $output .= form_textfield(t('E-mail'), 'mail', $edit['mail'], 60, 255, NULL, NULL, TRUE);
300
      $output .= form_select(t('Subject'), 'subject', $edit['subject'], $subjects, NULL, NULL, NULL, TRUE);
301
      $output .= form_textarea(t('Message'), 'message', $edit['message'], 60, 5, NULL, NULL, TRUE);
302 303 304 305 306 307 308 309
      $output .= form_submit(t('Send e-mail'));
      $output  = form($output);
    }
    else {
      $output = t('The contact form has not been configured.');
    }
  }

Dries's avatar
 
Dries committed
310
  return $output;
311 312
}

Dries's avatar
 
Dries committed
313
?>