342 lines
14 KiB
Plaintext
342 lines
14 KiB
Plaintext
<?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':
|
|
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)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Implementation of hook_menu().
|
|
*/
|
|
function contact_menu($may_cache) {
|
|
global $user;
|
|
$items = array();
|
|
|
|
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 category'),
|
|
'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 {
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* Implementation of hook_settings().
|
|
*/
|
|
function contact_settings() {
|
|
return 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'))));
|
|
}
|
|
|
|
/**
|
|
* 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') {
|
|
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' => url("user/$user->uid/contact")))), 'weight' => 2));
|
|
}
|
|
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)) {
|
|
$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")));
|
|
}
|
|
else if (!flood_is_allowed('contact', CONTACT_HOURLY_THRESHOLD)) {
|
|
$output = t("You can't contact more than %number users per hour. Please try again later.", array('%number' => CONTACT_HOURLY_THRESHOLD));
|
|
}
|
|
else {
|
|
$edit = $_POST['edit'];
|
|
|
|
if ($edit) {
|
|
// Validate the message:
|
|
if (!$edit['message']) {
|
|
form_set_error('message', t('You must enter a message.'));
|
|
}
|
|
if (!$edit['subject']) {
|
|
form_set_error('subject', t('You must enter a subject.'));
|
|
}
|
|
|
|
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) {
|
|
$message[$key] = wordwrap($value);
|
|
}
|
|
|
|
// Prepare all fields:
|
|
$to = $account->mail;
|
|
$from = $user->mail;
|
|
|
|
// Format the subject:
|
|
$subject = '['. variable_get('site_name', 'drupal') .'] '. $edit['subject'];
|
|
|
|
// Prepare the body:
|
|
$body = implode("\n\n", $message);
|
|
|
|
// Send the e-mail:
|
|
user_mail($to, $subject, $body, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");
|
|
|
|
// Send a copy if requested:
|
|
if ($edit['copy']) {
|
|
user_mail($from, $subject, $body, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");
|
|
}
|
|
|
|
// Log the operation:
|
|
flood_register_event('contact');
|
|
watchdog('mail', t('%name-from sent %name-to an e-mail.', array('%name-from' => theme('placeholder', $user->name), '%name-to' => theme('placeholder', $account->name))));
|
|
|
|
// Set a status message:
|
|
drupal_set_message(t('The message has been sent.'));
|
|
|
|
// Jump to the user's profile page:
|
|
drupal_goto("user/$account->uid");
|
|
}
|
|
}
|
|
else {
|
|
$edit['mail'] = $user->mail;
|
|
}
|
|
|
|
$output = form_item(t('From'), $user->name .' <'. $user->mail .'>');
|
|
$output .= form_item(t('To'), $account->name);
|
|
$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);
|
|
$output .= form_checkbox(t('Send me a copy.'), 'copy', $edit['copy']);
|
|
$output .= form_submit(t('Send e-mail'));
|
|
$output = form($output);
|
|
}
|
|
|
|
drupal_set_title($account->name);
|
|
return $output;
|
|
}
|
|
else {
|
|
drupal_not_found();
|
|
}
|
|
}
|
|
|
|
function contact_admin_edit($category = NULL) {
|
|
if (isset($_POST['edit'])) {
|
|
$edit = $_POST['edit'];
|
|
|
|
if (empty($edit['category'])) {
|
|
form_set_error('category', t('You must enter a category.'));
|
|
}
|
|
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 category = '%s'", $category);
|
|
db_query("INSERT INTO {contact} (category, recipients, reply) VALUES ('%s', '%s', '%s')", $edit['category'], $edit['recipients'], $edit['reply']);
|
|
drupal_goto('admin/contact');
|
|
}
|
|
}
|
|
else {
|
|
$category = db_fetch_object(db_query("SELECT * FROM {contact} WHERE category = '%s'", $category));
|
|
$edit['category'] = $category->category;
|
|
$edit['recipients'] = $category->recipients;
|
|
$edit['reply'] = $category->reply;
|
|
}
|
|
|
|
$form = form_textfield(t('Category'), 'category', $edit['category'], 60, 255, t("Example: 'website feedback' or 'product information'."), NULL, TRUE);
|
|
$form .= form_textarea(t('Recipients'), 'recipients', $edit['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', $edit['reply'], 60, 5, t("Optional auto-reply. Leave empty if you don't want to send the user an auto-reply message."));
|
|
$form .= form_submit(t('Submit'));
|
|
|
|
return form($form);
|
|
}
|
|
|
|
function contact_admin_delete($category) {
|
|
if ($_POST['op'] != t('Delete')) {
|
|
return theme('confirm',
|
|
t('Are you sure you want to delete %category?', array('%category' => theme('placeholder', $category))),
|
|
'admin/contact/delete/'. $category,
|
|
t('This action cannot be undone.'),
|
|
t('Delete'),
|
|
t('Cancel'));
|
|
}
|
|
else {
|
|
db_query("DELETE FROM {contact} WHERE category = '%s'", $category);
|
|
drupal_goto('admin/contact');
|
|
}
|
|
}
|
|
|
|
|
|
function contact_admin() {
|
|
$result = db_query('SELECT category, recipients FROM {contact} ORDER BY category');
|
|
$rows = array();
|
|
while ($category = db_fetch_object($result)) {
|
|
$rows[] = array($category->category, $category->recipients, l(t('edit'), 'admin/contact/edit/'. urlencode($category->category)), l(t('delete'), 'admin/contact/delete/'. urlencode($category->category)));
|
|
}
|
|
$header = array(t('Category'), t('Recipients'), array('data' => t('Operations'), 'colspan' => 2));
|
|
return theme('table', $header, $rows);
|
|
}
|
|
|
|
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'];
|
|
}
|
|
|
|
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['subject']) {
|
|
form_set_error('subject', t('You must enter a subject.'));
|
|
}
|
|
if (!$edit['message']) {
|
|
form_set_error('message', t('You must enter a message.'));
|
|
}
|
|
if (!$edit['category']) {
|
|
// Look if there is only one category
|
|
$result = db_query('SELECT category FROM {contact}');
|
|
if (db_num_rows($result) == 1) {
|
|
$category = db_fetch_object($result);
|
|
$edit['category'] = $category->category;
|
|
}
|
|
else {
|
|
form_set_error('category', t('You must select a valid category.'));
|
|
}
|
|
}
|
|
|
|
if (!form_get_errors()) {
|
|
// Prepare the sender:
|
|
$from = $edit['mail'];
|
|
|
|
// Compose the body:
|
|
$message[] = t("%name sent a message using the contact form at %form:", array('%name' => $edit['name'], '%form' => url($_GET['q'], NULL, NULL, TRUE)));
|
|
$message[] = $edit['message'];
|
|
|
|
// Tidy up the body:
|
|
foreach ($message as $key => $value) {
|
|
$message[$key] = wordwrap($value);
|
|
}
|
|
|
|
// Format the category:
|
|
$subject = '['. $edit['category'] .'] '. $edit['subject'];
|
|
|
|
// Prepare the body:
|
|
$body = implode("\n\n", $message);
|
|
|
|
// Load the category information:
|
|
$contact = db_fetch_object(db_query("SELECT * FROM {contact} WHERE category = '%s'", $edit['category']));
|
|
|
|
// Send the e-mail to the recipients:
|
|
user_mail($contact->recipients, $subject, $body, "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");
|
|
|
|
// If the user requests it, send a copy.
|
|
if ($edit['copy']) {
|
|
user_mail($from, $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, $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 %category.', array('%name-from' => theme('placeholder', $edit['name'] ." <$from>"), '%category' => theme('placeholder', $contact->category))));
|
|
|
|
// Set a status message:subject
|
|
drupal_set_message(t('Your message has been sent.'));
|
|
|
|
// Jump to contact page:
|
|
drupal_goto('contact');
|
|
}
|
|
}
|
|
else if ($user->uid) {
|
|
$edit['name'] = $user->name;
|
|
$edit['mail'] = $user->mail;
|
|
}
|
|
|
|
$result = db_query('SELECT category FROM {contact} ORDER BY category');
|
|
$categories[] = '--';
|
|
while ($category = db_fetch_object($result)) {
|
|
$categories[$category->category] = $category->category;
|
|
}
|
|
|
|
if (count($categories) > 1) {
|
|
$output = variable_get('contact_form_information', t('You can leave us a message using the contact form below.'));
|
|
$output .= form_textfield(t('Your name'), 'name', $edit['name'], 60, 255, NULL, NULL, TRUE);
|
|
$output .= form_textfield(t('Your e-mail address'), 'mail', $edit['mail'], 60, 255, NULL, NULL, TRUE);
|
|
$output .= form_textfield(t('Subject'), 'subject', $edit['subject'], 60, 255, NULL, NULL, TRUE);
|
|
if (count($categories) > 2) {
|
|
$output .= form_select(t('Category'), 'category', $edit['category'], $categories, NULL, NULL, NULL, TRUE);
|
|
}
|
|
$output .= form_textarea(t('Message'), 'message', $edit['message'], 60, 5, NULL, NULL, TRUE);
|
|
$output .= form_checkbox(t('Send me a copy.'), 'copy', $edit['copy']);
|
|
$output .= form_submit(t('Send e-mail'));
|
|
$output = form($output);
|
|
}
|
|
else {
|
|
$output = t('The contact form has not been configured.');
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|