summaryrefslogtreecommitdiff
path: root/modules/contact/contact.module
blob: 0274940faa71f0ce5ba551636a04f3fe7b18e74d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
<?php
// $Id$

/**
 * @file
 * Enables the use of personal and site-wide contact forms.
 */

/**
 * Implement hook_help().
 */
function contact_help($path, $arg) {
  switch ($path) {
    case 'admin/help#contact':
      $output = '<p>' . t('The contact module facilitates communication via e-mail, by allowing your site\'s visitors to contact one another (personal contact forms), and by providing a simple way to direct messages to a set of administrator-defined recipients (the <a href="@contact">contact page</a>). With either form, users specify a subject, write their message, and (optionally) have a copy of their message sent to their own e-mail address.', array('@contact' => url('contact'))) . '</p>';
      $output .= '<p>' . t("Personal contact forms allow users to be contacted via e-mail, while keeping recipient e-mail addresses private. Users may enable or disable their personal contact forms by editing their <em>My account</em> page. If enabled, a <em>Contact</em> tab leading to their personal contact form is available on their user profile. Site administrators have access to all personal contact forms (even if they have been disabled). The <em>Contact</em> tab is only visible when viewing another user's profile (users do not see their own <em>Contact</em> tab).") . '</p>';
      $output .= '<p>' . t('The <a href="@contact">contact page</a> provides a simple form for visitors to leave comments, feedback, or other requests. Messages are routed by selecting a category from a list of administrator-defined options; each category has its own set of e-mail recipients. Common categories for a business site include, for example, "Website feedback" (messages are forwarded to web site administrators) and "Product information" (messages are forwarded to members of the sales department). The actual e-mail addresses defined within a category are not displayed. Only users in roles with the <em>access site-wide contact form</em> permission may access the <a href="@contact">contact page</a>.', array('@contact' => url('contact'))) . '</p>';
      $output .= '<p>' . t('A link to your site\'s <a href="@contact">contact page</a> from the main <em>Navigation</em> menu is created, but is disabled by default. Create a similar link on another menu by adding a menu item pointing to the path "contact"', array('@contact' => url('contact'))) . '</p>';
      $output .= '<p>' . t('Customize the <a href="@contact">contact page</a> with additional information (like physical location, mailing address, and telephone number) using the <a href="@contact-settings">contact form settings page</a>. The <a href="@contact-settings">settings page</a> also provides configuration options for the maximum number of contact form submissions a user may perform per hour, and the default status of users\' personal contact forms.', array('@contact-settings' => url('admin/settings/contact'), '@contact' => url('contact'))) . '</p>';
      $output .= '<p>' . t('For more information, see the online handbook entry for <a href="@contact">Contact module</a>.', array('@contact' => url('http://drupal.org/handbook/modules/contact/', array('absolute' => TRUE)))) . '</p>';
      return $output;
    case 'admin/structure/contact':
      $output = '<p>' . t('This page lets you set up <a href="@form">your site-wide contact form</a>. To do so, add one or more categories. You can associate different recipients with each category 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'))) . '</p>';
      if (!module_exists('menu')) {
        $menu_note = t('The menu item can be customized and configured only once the menu module has been <a href="@modules-page">enabled</a>.', array('@modules-page' => url('admin/settings/modules')));
      }
      else {
        $menu_note = '';
      }
      $output .= '<p>' . t('The contact module also adds a <a href="@menu-settings">menu item</a> (disabled by default) to the navigation block.', array('@menu-settings' => url('admin/structure/menu'))) . ' ' . $menu_note . '</p>';
      return $output;
  }
}

/**
 * Implement hook_permission().
 */
function contact_permission() {
  return array(
    'administer site-wide contact form' => array(
      'title' => t('Administer site-wide contact form'),
      'description' => t('Configure site-wide contact form administration settings.'),
    ),
    'access site-wide contact form' => array(
      'title' => t('Access site-wide contact form'),
      'description' => t('Send feedback to administrators via e-mail using the site-wide contact form.'),
    ),
  );
}

/**
 * Implement hook_menu().
 */
function contact_menu() {
  $items['admin/structure/contact'] = array(
    'title' => 'Contact form',
    'description' => 'Create a system contact form and set up categories for the form to use.',
    'page callback' => 'contact_admin_categories',
    'access arguments' => array('administer site-wide contact form'),
  );
  $items['admin/structure/contact/list'] = array(
    'title' => 'List',
    'page callback' => 'contact_admin_categories',
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
  $items['admin/structure/contact/add'] = array(
    'title' => 'Add category',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('contact_admin_edit', 3),
    'access arguments' => array('administer site-wide contact form'),
    'type' => MENU_LOCAL_ACTION,
    'weight' => 1,
  );
  $items['admin/structure/contact/edit/%contact'] = array(
    'title' => 'Edit contact category',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('contact_admin_edit', 3, 4),
    'access arguments' => array('administer site-wide contact form'),
    'type' => MENU_CALLBACK,
  );
  $items['admin/structure/contact/delete/%contact'] = array(
    'title' => 'Delete contact',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('contact_admin_delete', 4),
    'access arguments' => array('administer site-wide contact form'),
    'type' => MENU_CALLBACK,
  );
  $items['admin/settings/contact'] = array(
    'title' => 'Contact form',
    'description' => 'Toggle personal contact forms and maximum contact form submissions.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('contact_admin_settings'),
    'access arguments' => array('administer site-wide contact form'),
  );
  $items['contact'] = array(
    'title' => 'Contact',
    'page callback' => 'contact_site_page',
    'access arguments' => array('access site-wide contact form'),
    'type' => MENU_SUGGESTED_ITEM,
  );
  $items['user/%user/contact'] = array(
    'title' => 'Contact',
    'page callback' => 'contact_personal_page',
    'page arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'access callback' => '_contact_personal_tab_access',
    'access arguments' => array(1),
    'weight' => 2,
  );
  return $items;
}

/**
 * Determine permission to a user's personal contact form.
 */
function _contact_personal_tab_access($account) {
  global $user;
  if (!isset($account->contact)) {
    $account->contact = FALSE;
  }
  return
    $account && $user->uid &&
    (
      ($user->uid != $account->uid && $account->contact) ||
      user_access('administer users')
    );
}

/**
 * Load the data for a single contact category.
 */
function contact_load($cid) {
  $contact = db_query("SELECT cid, category, recipients, reply, weight, selected FROM {contact} WHERE cid = :cid", array(':cid' => $cid))
    ->fetchAssoc();
  return empty($contact) ? FALSE : $contact;
}

/**
 * Implement hook_user_form().
 */
function contact_user_form(&$edit, $account, $category) {
  if ($category == 'account') {
    $form['contact'] = array('#type' => 'fieldset',
      '#title' => t('Contact settings'),
      '#weight' => 5,
      '#collapsible' => TRUE,
    );
    $form['contact']['contact'] = array('#type' => 'checkbox',
      '#title' => t('Personal contact form'),
      '#default_value' => !empty($edit['contact']) ? $edit['contact'] : FALSE,
      '#description' => t('Allow other users to contact you via a <a href="@url">personal contact form</a> which keeps your e-mail address hidden. Note that some privileged users such as site administrators are still able to contact you even if you choose to disable this feature.', array('@url' => url("user/$account->uid/contact"))),
    );
    return $form;
  }
}

/**
 * Implement hook_user_insert().
 */
function contact_user_insert(&$edit, $account, $category) {
  $edit['contact'] = variable_get('contact_default_status', 1);
}

/**
 * Implement hook_mail().
 */
function contact_mail($key, &$message, $params) {
  $language = $message['language'];
  switch ($key) {
    case 'page_mail':
    case 'page_copy':
      $contact = $params['contact'];
      $message['subject'] .= t('[!category] !subject', array('!category' => $contact['category'], '!subject' => $params['subject']), array('langcode' => $language->language));
      $message['body'][] = t("!name sent a message using the contact form at !form.", array('!name' => $params['name'], '!form' => url($_GET['q'], array('absolute' => TRUE, 'language' => $language))), array('langcode' => $language->language));
      $message['body'][] = $params['message'];
      break;
    case 'page_autoreply':
      $contact = $params['contact'];
      $message['subject'] .= t('[!category] !subject', array('!category' => $contact['category'], '!subject' => $params['subject']), array('langcode' => $language->language));
      $message['body'][] = $contact['reply'];
      break;
    case 'user_mail':
    case 'user_copy':
      $user = $params['user'];
      $account = $params['account'];
      $message['subject'] .= '[' . variable_get('site_name', 'Drupal') . '] ' . $params['subject'];
      $message['body'][] = "$account->name,";
      $message['body'][] = 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", array('absolute' => TRUE, 'language' => $language)), '!form-url' => url($_GET['q'], array('absolute' => TRUE, 'language' => $language)), '!site' => variable_get('site_name', 'Drupal')), array('langcode' => $language->language));
      $message['body'][] = t("If you don't want to receive such e-mails, you can change your settings at !url.", array('!url' => url("user/$account->uid", array('absolute' => TRUE, 'language' => $language))), array('langcode' => $language->language));
      $message['body'][] = t('Message:', array(), array('langcode' => $language->language));
      $message['body'][] = $params['message'];
      break;
  }
}