Newer
Older
* Enables the use of personal and site-wide contact forms.
Dries Buytaert
committed
use Drupal\Core\Form\FormStateInterface;
Angie Byron
committed
use Drupal\Core\Routing\RouteMatchInterface;
Dries Buytaert
committed
* Implements hook_help().
Angie Byron
committed
function contact_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.contact':
Angie Byron
committed
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The Contact module allows visitors to contact site administrators and other users. Users specify a subject, write their message, and can have a copy of their message sent to their own email address. For more information, see the online handbook entry for <a href="@contact">Contact module</a>.', array('@contact' => 'http://drupal.org/documentation/modules/contact')) . '</p>';
Angie Byron
committed
$output .= '<h3>' . t('Uses') . '</h3>';
$output .= '<dl>';
$output .= '<dt>' . t('User contact forms') . '</dt>';
$output .= '<dd>' . t('Site users can be contacted with a user contact form that keeps their email address 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 leads to a personal contact form displayed on their user profile. Site administrators are still able to use the contact form, even if has been disabled. The <em>Contact</em> tab is not shown when you view your own profile.') . '</dd>';
Angie Byron
committed
$output .= '<dt>' . t('Site-wide contact forms') . '</dt>';
Alex Pott
committed
$output .= '<dd>' . t('The <a href="@contact">Contact page</a> provides a simple form for users with the <em>Use the site-wide contact form</em> permission to send comments, feedback, or other requests. You can create forms for directing the contact messages to a set of defined recipients. Common forms for a business site, for example, might include "Website feedback" (messages are forwarded to website administrators) and "Product information" (messages are forwarded to members of the sales department). Email addresses defined within a form are not displayed publicly.', array('@contact' => url('contact'))) . '</p>';
Angie Byron
committed
$output .= '<dt>' . t('Navigation') . '</dt>';
catch
committed
$output .= '<dd>' . t('When the site-wide contact form is enabled, a link in the <em>Footer</em> menu is created, which you can modify on the <a href="@menu">Menus administration page</a>.', array('@menu' => url('admin/structure/menu'))) . '</dd>';
$output .= '<dt>' . t('Customization') . '</dt>';
$output .= '<dd>' . t('If you would like additional text to appear on the site-wide or personal contact page, use a block. You can create and edit blocks on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
Angie Byron
committed
$output .= '</dl>';
Dries Buytaert
committed
return $output;
Alex Pott
committed
case 'contact.form_list':
$output = '<p>' . t('Add one or more forms on this page to set up your site-wide <a href="@form">contact form</a>.', array('@form' => url('contact'))) . '</p>';
catch
committed
$output .= '<p>' . t('A <em>Contact</em> menu item is added to the <em>Footer</em> menu, which you can modify on the <a href="@menu-settings">Menus administration page</a>.', array('@menu-settings' => url('admin/structure/menu'))) . '</p>';
$output .= '<p>' . t('If you would like additional text to appear on the site-wide contact page, use a block. You can create and edit blocks on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</p>';
Dries Buytaert
committed
return $output;
Dries Buytaert
committed
/**
Dries Buytaert
committed
* Implements hook_permission().
Dries Buytaert
committed
*/
function contact_permission() {
return array(
Dries Buytaert
committed
'administer contact forms' => array(
'title' => t('Administer contact forms and contact form settings'),
Angie Byron
committed
),
'access site-wide contact form' => array(
'title' => t('Use the site-wide contact form'),
Angie Byron
committed
),
Dries Buytaert
committed
'access user contact forms' => array(
'title' => t("Use users' personal contact forms"),
Dries Buytaert
committed
),
);
Dries Buytaert
committed
}
Alex Pott
committed
/**
* Implements hook_entity_type_alter().
Alex Pott
committed
*/
function contact_entity_type_alter(array &$entity_types) {
/** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
$entity_types['user']->setLinkTemplate('contact-form', 'contact.personal_page');
Alex Pott
committed
}
Dries Buytaert
committed
/**
* Implements hook_entity_extra_field_info().
Dries Buytaert
committed
*/
function contact_entity_extra_field_info() {
Dries Buytaert
committed
$fields = array();
Dries Buytaert
committed
foreach (array_keys(entity_get_bundles('contact_message')) as $bundle) {
Dries Buytaert
committed
$fields['contact_message'][$bundle]['form']['name'] = array(
'label' => t('Sender name'),
'description' => t('Text'),
'weight' => -50,
);
$fields['contact_message'][$bundle]['form']['mail'] = array(
'label' => t('Sender email'),
'description' => t('Email'),
Dries Buytaert
committed
'weight' => -40,
);
if ($bundle == 'personal') {
$fields['contact_message'][$bundle]['form']['recipient'] = array(
'label' => t('Recipient user name'),
'description' => t('User'),
'weight' => -30,
);
}
Dries Buytaert
committed
$fields['contact_message'][$bundle]['form']['copy'] = array(
'label' => t('Send copy to sender'),
'description' => t('Option'),
'weight' => 50,
);
}
Dries Buytaert
committed
$fields['user']['user']['form']['contact'] = array(
'label' => t('Contact settings'),
'description' => t('Contact module form element.'),
'weight' => 5,
);
Dries Buytaert
committed
return $fields;
}
Gábor Hojtsy
committed
/**
Dries Buytaert
committed
* Implements hook_mail().
Gábor Hojtsy
committed
*/
function contact_mail($key, &$message, $params) {
Dries Buytaert
committed
$contact_message = $params['contact_message'];
Alex Pott
committed
/** @var $sender \Drupal\user\UserInterface */
Dries Buytaert
committed
$sender = $params['sender'];
Angie Byron
committed
$language = language_load($message['langcode']);
Dries Buytaert
committed
'!site-name' => \Drupal::config('system.site')->get('name'),
'!subject' => $contact_message->getSubject(),
Alex Pott
committed
'!form' => !empty($params['contact_form']) ? $params['contact_form']->label() : NULL,
Dries Buytaert
committed
'!form-url' => url(current_path(), array('absolute' => TRUE, 'language' => $language)),
Dries Buytaert
committed
'!sender-name' => user_format_name($sender),
Dries Buytaert
committed
if ($sender->isAuthenticated()) {
Alex Pott
committed
$variables['!sender-url'] = $sender->url('canonical', array('absolute' => TRUE, 'language' => $language));
Dries Buytaert
committed
}
else {
$variables['!sender-url'] = $params['sender']->getEmail();
Dries Buytaert
committed
}
$options = array('langcode' => $language->id);
Gábor Hojtsy
committed
switch ($key) {
case 'page_mail':
case 'page_copy':
Alex Pott
committed
$message['subject'] .= t('[!form] !subject', $variables, $options);
Dries Buytaert
committed
$message['body'][] = t("!sender-name (!sender-url) sent a message using the contact form at !form-url.", $variables, $options);
$build = entity_view($contact_message, 'mail', $language->id);
Dries Buytaert
committed
$message['body'][] = drupal_render($build);
Gábor Hojtsy
committed
break;
Gábor Hojtsy
committed
case 'page_autoreply':
Alex Pott
committed
$message['subject'] .= t('[!form] !subject', $variables, $options);
$message['body'][] = $params['contact_form']->reply;
Gábor Hojtsy
committed
break;
Gábor Hojtsy
committed
case 'user_mail':
case 'user_copy':
'!recipient-name' => user_format_name($params['recipient']),
Dries Buytaert
committed
'!recipient-edit-url' => url('user/' . $params['recipient']->id() . '/edit', array('absolute' => TRUE, 'language' => $language)),
Dries Buytaert
committed
$message['subject'] .= t('[!site-name] !subject', $variables, $options);
$message['body'][] = t('Hello !recipient-name,', $variables, $options);
$message['body'][] = t("!sender-name (!sender-url) has sent you a message via your contact form at !site-name.", $variables, $options);
$message['body'][] = t("If you don't want to receive such emails, you can change your settings at !recipient-edit-url.", $variables, $options);
$build = entity_view($contact_message, 'mail', $language->id);
$message['body'][] = drupal_render($build);
Gábor Hojtsy
committed
break;
}
Dries Buytaert
committed
}
Dries Buytaert
committed
Dries Buytaert
committed
* Implements hook_form_FORM_ID_alter().
*
* Add the enable personal contact form to an individual user's account page.
*
Alex Pott
committed
* @see \Drupal\user\ProfileForm::form()
Dries Buytaert
committed
function contact_form_user_form_alter(&$form, FormStateInterface $form_state) {
catch
committed
$form['contact'] = array(
'#type' => 'details',
catch
committed
'#title' => t('Contact settings'),
Angie Byron
committed
'#open' => TRUE,
catch
committed
'#weight' => 5,
);
$account = $form_state->getFormObject()->getEntity();
if (!\Drupal::currentUser()->isAnonymous() && $account->id()) {
$account_data = \Drupal::service('user.data')->get('contact', $account->id(), 'enabled');
}
catch
committed
$form['contact']['contact'] = array(
'#type' => 'checkbox',
'#title' => t('Personal contact form'),
'#default_value' => isset($account_data) ? $account_data : \Drupal::config('contact.settings')->get('user_default_enabled'),
'#description' => t('Allow other users to contact you via a personal contact form which keeps your email 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.'),
catch
committed
);
Alex Pott
committed
$form['actions']['submit']['#submit'][] = 'contact_user_profile_form_submit';
Dries Buytaert
committed
/**
Alex Pott
committed
* Submit callback for the user profile form to save the contact page setting.
Dries Buytaert
committed
*/
Dries Buytaert
committed
function contact_user_profile_form_submit($form, FormStateInterface $form_state) {
$account = $form_state->getFormObject()->getEntity();
Alex Pott
committed
if ($account->id() && $form_state->hasValue('contact')) {
\Drupal::service('user.data')->set('contact', $account->id(), 'enabled', (int) $form_state->getValue('contact'));
}
Dries Buytaert
committed
}
Dries Buytaert
committed
/**
Dries Buytaert
committed
* Implements hook_form_FORM_ID_alter().
*
* Add the default personal contact setting on the user settings page.
*
* @see user_admin_settings()
Dries Buytaert
committed
*/
Dries Buytaert
committed
function contact_form_user_admin_settings_alter(&$form, FormStateInterface $form_state) {
Dries Buytaert
committed
$form['contact'] = array(
'#type' => 'details',
'#title' => t('Contact settings'),
Angie Byron
committed
'#open' => TRUE,
Dries Buytaert
committed
'#weight' => 0,
);
$form['contact']['contact_default_status'] = array(
'#type' => 'checkbox',
'#title' => t('Enable the personal contact form by default for new users.'),
'#description' => t('Changing this setting will not affect existing users.'),
'#default_value' => \Drupal::config('contact.settings')->get('user_default_enabled'),
Dries Buytaert
committed
);
Dries Buytaert
committed
// Add submit handler to save contact configuration.
$form['#submit'][] = 'contact_form_user_admin_settings_submit';
}
/**
* Form submission handler for user_admin_settings().
*
* @see contact_form_user_admin_settings_alter()
*/
Dries Buytaert
committed
function contact_form_user_admin_settings_submit($form, FormStateInterface $form_state) {
\Drupal::config('contact.settings')
Alex Pott
committed
->set('user_default_enabled', $form_state->getValue('contact_default_status'))
Dries Buytaert
committed
->save();