improvements-2.x-dev/modules/improvements_contact/improvements_contact.module
modules/improvements_contact/improvements_contact.module
<?php
use Drupal\contact\ContactFormInterface as ContactFormEntityInterface;
use Drupal\contact\Entity\ContactForm as ContactFormEntity;
use Drupal\contact\Entity\Message as ContactMessageEntity;
use Drupal\contact\MessageForm as ContactMessageForm;
use Drupal\contact\MessageInterface as ContactMessageEntityInterface;
use Drupal\Core\Entity\ContentEntityStorageInterface;
use Drupal\Core\Entity\EntityFormBuilderInterface;
use Drupal\Core\Entity\EntityFormInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\Checkboxes;
use Drupal\Core\Routing\RouteObjectInterface;
use Drupal\druhels\ArrayHelper;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
require_once __DIR__ . '/improvements_contact.ajax.inc';
/**
* Implements hook_theme().
*/
function improvements_contact_theme(): array {
return [
'contact_success_message' => [
'variables' => [
'message' => NULL,
],
],
];
}
/**
* Implements hook_form_BASE_FORM_ID_alter(): contact_form_form.
*
* @see \Drupal\contact\ContactFormEditForm
*/
function improvements_contact_form_contact_form_form_alter(array &$form, FormStateInterface $form_state): void {
$contact_form_form_object = $form_state->getFormObject(); /** @var EntityFormInterface $contact_form_form_object */
$contact_form_entity = $contact_form_form_object->getEntity(); /** @var ContactFormEntityInterface $contact_form_entity */
if (!in_array($contact_form_form_object->getOperation(), ['add', 'edit'])) {
return;
}
$form['recipients_new'] = [
'#type' => 'textfield',
'#title' => $form['recipients']['#title'],
'#description' => $form['recipients']['#description'],
'#default_value' => $form['recipients']['#default_value'],
'#required' => TRUE,
'#weight' => 0.001,
];
$form['recipients']['#default_value'] = 'dummy@dummy.dummy';
$form['recipients']['#required'] = FALSE;
$form['recipients']['#access'] = FALSE;
$form['additional_settings'] = [
'#type' => 'details',
'#title' => t('Additional settings'),
];
$form['additional_settings']['page_title'] = [
'#type' => 'textfield',
'#title' => t('Page title'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'page_title'),
'#weight' => 1,
];
$form['additional_settings']['text_before'] = [
'#type' => 'textarea',
'#title' => t('Text before form'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'text_before'),
'#weight' => 2,
];
$form['additional_settings']['text_after'] = [
'#type' => 'textarea',
'#title' => t('Text after form'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'text_after'),
'#weight' => 3,
];
$form['additional_settings']['name_label'] = [
'#type' => 'textfield',
'#title' => t('Name field label'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'name_label'),
'#weight' => 4,
];
$form['additional_settings']['mail_label'] = [
'#type' => 'textfield',
'#title' => t('E-mail field label'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'mail_label'),
'#weight' => 5,
];
$form['additional_settings']['subject_label'] = [
'#type' => 'textfield',
'#title' => t('Subject field label'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'subject_label'),
'#weight' => 6,
];
$form['additional_settings']['message_label'] = [
'#type' => 'textfield',
'#title' => t('Message field label'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'message_label'),
'#weight' => 7,
];
$form['additional_settings']['submit_button_text'] = [
'#type' => 'textfield',
'#title' => t('Submit button text'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'submit_button_text'),
'#weight' => 8,
];
$form['additional_settings']['name_placeholder'] = [
'#type' => 'textfield',
'#title' => t('Name field placeholder'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'name_placeholder'),
'#weight' => 9,
];
$form['additional_settings']['email_placeholder'] = [
'#type' => 'textfield',
'#title' => t('E-mail field placeholder'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'email_placeholder'),
'#weight' => 10,
];
$form['additional_settings']['email_subject'] = [
'#type' => 'textfield',
'#title' => t('E-mail subject'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'email_subject'),
'#weight' => 11,
];
$form['additional_settings']['required_fields'] = [
'#type' => 'checkboxes',
'#title' => t('Required fields'),
'#options' => [
'name' => t('Name'),
'mail' => t('E-mail'),
'subject' => t('Subject'),
'message' => t('Message'),
],
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'required_fields', ['name', 'mail', 'subject', 'message']),
'#weight' => 12,
];
$form['additional_settings']['html_attributes'] = [
'#type' => 'textarea',
'#title' => t('Html attributes'),
'#description' => t('Example') . ' <code>class: my-class</code>',
'#default_value' => ArrayHelper::formatArrayAsKeyValueList($contact_form_entity->getThirdPartySetting('improvements', 'html_attributes', [])),
'#rows' => 2,
'#weight' => 17,
];
$form['additional_settings']['hide_preview_button'] = [
'#type' => 'checkbox',
'#title' => t('Hide preview button'),
'#default_value' => $contact_form_entity->getThirdPartySetting('improvements', 'hide_preview_button'),
'#weight' => 18,
];
$form['#entity_builders'][] = 'improvements_contact_form_entity_builder';
$form['actions']['submit']['#submit'][] = 'improvements_contact_form_submit';
// Hide fields from contact_starge module
if (isset($form['contact_storage_submit_text'])) {
$form['contact_storage_submit_text']['#access'] = FALSE;
}
if (isset($form['contact_storage_preview'])) {
$form['contact_storage_preview']['#access'] = FALSE;
}
improvements_contact_ajax_form_contact_form_form_alter($form, $form_state);
}
/**
* Contact form entity builder.
*
* @see improvements_contact_form_contact_form_form_alter().
*/
function improvements_contact_form_entity_builder(string $entity_type, ContactFormEntityInterface $contact_form, array &$form, FormStateInterface $form_state): void {
// Save recipients
$recipients = array_map('trim', explode(',', $form_state->getValue('recipients_new')));
$contact_form->setRecipients($recipients);
// Save additional settings
$simple_settings = [
'page_title',
'text_before',
'text_after',
'name_label',
'mail_label',
'subject_label',
'message_label',
'submit_button_text',
'name_placeholder',
'email_placeholder',
'email_subject',
'hide_preview_button',
];
foreach ($simple_settings as $setting_name) {
$contact_form->setThirdPartySetting('improvements', $setting_name, $form_state->getValue($setting_name));
}
$contact_form->setThirdPartySetting('improvements', 'required_fields', Checkboxes::getCheckedCheckboxes($form_state->getValue('required_fields')));
$contact_form->setThirdPartySetting('improvements', 'html_attributes', ArrayHelper::formatKeyValueListAsArray($form_state->getValue('html_attributes'), ': '));
}
/**
* Custom submit callback for contact edit form.
*
* @see improvements_contact_form_contact_form_edit_form_alter().
*/
function improvements_contact_form_submit(array $form, FormStateInterface $form_state): void {
$contact_form_form_object = $form_state->getFormObject(); /** @var EntityFormInterface $contact_form_form_object */
$contact_form_entity = $contact_form_form_object->getEntity(); /** @var ContactFormEntityInterface $contact_form_entity */
$contact_form_entity_id = $contact_form_entity->id();
$entity_field_manager = \Drupal::service('entity_field.manager');
$contact_message_entity_field_definitions = $entity_field_manager->getFieldDefinitions('contact_message', $contact_form_entity_id);
// Set new labels
/** @see improvements_contact_entity_bundle_field_info_alter() */
/*foreach (['name', 'mail', 'subject', 'message'] as $field_name) {
$field_config = $contact_message_field_definitions[$field_name]->getConfig($contact_form_entity_id);
if (
($new_field_label = $form_state->getValue($field_name . '_label')) &&
$new_field_label != $field_config->getLabel()
) {
$field_config->setLabel(trim($new_field_label))->save();
}
}*/
// Set required fields
$required_fields = Checkboxes::getCheckedCheckboxes($form_state->getValue('required_fields'));
foreach (['subject', 'message'] as $field_name) {
$field_is_required = in_array($field_name, $required_fields);
$contact_message_entity_field_definitions[$field_name]
->getConfig($contact_form_entity_id)
->setRequired($field_is_required)
->save();
}
}
/**
* Implements hook_form_BASE_FORM_ID_alter(): contact_message_form.
*
* @see \Drupal\contact\MessageForm::form()
*/
function improvements_contact_form_contact_message_form_alter(array &$form, FormStateInterface $form_state, string $form_id): void {
$contact_message_form_object = $form_state->getFormObject(); /** @var ContactMessageForm $contact_message_form_object */
$contact_message_entity = $contact_message_form_object->getEntity(); /** @var ContactMessageEntity $contact_message_entity */
$contact_form_entity = $contact_message_entity->getContactForm();
$required_fields = $contact_form_entity->getThirdPartySetting('improvements', 'required_fields', []);
$token_service = \Drupal::token();
// HTML attributes
if ($html_attributes = $contact_form_entity->getThirdPartySetting('improvements', 'html_attributes', [])) {
$form['#attributes'] = array_merge($form['#attributes'] ?? [], ArrayHelper::formatArrayAsAttributes($html_attributes));
}
// Add title
$form['title'] = [
'#type' => 'item',
'#markup' => $contact_form_entity->label(),
];
// Add texts
if ($text_before = $contact_form_entity->getThirdPartySetting('improvements', 'text_before')) {
$form['text_before'] = [
'#type' => 'item',
'#markup' => $token_service->replace($text_before),
];
}
if ($text_after = $contact_form_entity->getThirdPartySetting('improvements', 'text_after')) {
$form['text_after'] = [
'#type' => 'item',
'#markup' => $token_service->replace($text_after),
];
}
// Change labels
if ($name_label = $contact_form_entity->getThirdPartySetting('improvements', 'name_label')) {
$form['name']['#title'] = $name_label;
}
if ($mail_label = $contact_form_entity->getThirdPartySetting('improvements', 'mail_label')) {
$form['mail']['#title'] = $mail_label;
}
// Set placeholder
if ($name_placeholder = $contact_form_entity->getThirdPartySetting('improvements', 'name_placeholder')) {
$form['name']['#placeholder'] = $name_placeholder;
}
if ($email_placeholder = $contact_form_entity->getThirdPartySetting('improvements', 'email_placeholder')) {
$form['mail']['#placeholder'] = $email_placeholder;
}
// Restore "name" and "mail" elements for logged users
if (\Drupal::currentUser()->isAuthenticated()) {
if (isset($form['name']['#type']) && $form['name']['#type'] == 'item') {
$form['name']['#type'] = 'textfield';
$form['name']['#default_value'] = $form['name']['#value'];
unset($form['name']['#value']);
}
if (isset($form['mail']['#type']) && $form['mail']['#type'] == 'item') {
$form['mail']['#type'] = 'email';
$form['mail']['#default_value'] = $form['mail']['#value'];
unset($form['mail']['#value']);
}
}
// Change #required option
if (isset($form['name'])) {
$form['name']['#required'] = in_array('name', $required_fields);
}
if (isset($form['mail'])) {
$form['mail']['#required'] = in_array('mail', $required_fields);
}
// Change submit button text
if ($submit_button_text = $contact_form_entity->getThirdPartySetting('improvements', 'submit_button_text')) {
$form['actions']['submit']['#value'] = $submit_button_text;
}
// Hide "preview" button
if ($contact_form_entity->getThirdPartySetting('improvements', 'hide_preview_button')) {
$form['actions']['preview']['#access'] = FALSE;
}
improvements_contact_ajax_form_contact_message_form_alter($form, $form_state, $form_id);
}
/**
* Implements hook_page_title_alter().
*/
function improvements_contact_page_title_alter(&$title, Request $request, Route $route): void {
$route_name = $request->attributes->get(RouteObjectInterface::ROUTE_NAME);
if ($route_name == 'entity.contact_form.canonical') {
$contact_form_entity = $request->attributes->get('contact_form'); /** @var ContactFormEntityInterface $contact_form_entity */
if ($contact_form_page_title = $contact_form_entity->getThirdPartySetting('improvements', 'page_title')) {
$title = $contact_form_page_title;
}
}
elseif ($route_name == 'entity.contact_message.canonical') {
$contact_message_entity = $request->attributes->get('contact_message'); /** @var ContactMessageEntityInterface $contact_message_entity */
$contact_form_entity = $contact_message_entity->getContactForm();
$title = t('Message from "@label" contact form', ['@label' => $contact_form_entity->label()]);
}
}
/**
* Implements hook_page_ROUTE_NAME_result_alter(): entity.contact_form.canonical
*/
function improvements_contact_page_entity_contact_form_canonical_result_alter(mixed &$result): void {
unset($result['#title']);
}
/**
* Implements hook_page_ROUTE_NAME_result_alter(): entity.contact_message.canonical
*/
function improvements_contact_page_entity_contact_message_canonical_result_alter(mixed &$result): void {
foreach ($result['#pre_render'] as $key => $callback) {
if (is_array($callback) && isset($callback[1]) && $callback[1] == 'buildTitle') {
unset($result['#pre_render'][$key]);
}
}
}
/**
* Implements hook_mail_ID_alter(): contact_page_mail.
*/
function improvements_contact_mail_contact_page_mail_alter(array &$message): void {
$contact_form_entity = $message['params']['contact_form']; /** @var ContactFormEntityInterface $contact_form_entity */
$contact_message_entity = $message['params']['contact_message']; /** @var ContactMessageEntityInterface $contact_message_entity */
// Change contact message email subject
if ($contact_form_email_subject = $contact_form_entity->getThirdPartySetting('improvements', 'email_subject')) {
$message['subject'] = \Drupal::token()->replace($contact_form_email_subject, [
'contact_form' => $contact_form_entity,
'contact_message' => $contact_message_entity,
]);
}
}
/**
* Implements hook_entity_base_field_info_alter().
*
* @param BaseFieldDefinition[] $fields
* @param EntityTypeInterface $entity_type
*
* @see \Drupal\contact\Entity\Message::baseFieldDefinitions()
*/
function improvements_contact_entity_base_field_info_alter(array &$fields, EntityTypeInterface $entity_type): void {
if ($entity_type->id() == 'contact_message') {
$fields['name']->setDisplayConfigurable('view', TRUE);
$fields['mail']->setDisplayConfigurable('view', TRUE);
$fields['langcode']->setDisplayConfigurable('form', TRUE);
// Fields from contact_storage module
if (isset($fields['created'])) {
$fields['created']->setDisplayConfigurable('view', TRUE)->setLabel(t('Date of creation'));
}
if (isset($fields['ip_address'])) {
$fields['ip_address']->setDisplayConfigurable('view', TRUE);
}
}
}
/**
* Implements hook_entity_bundle_field_info_alter().
*/
function improvements_contact_entity_bundle_field_info_alter(array &$fields, EntityTypeInterface $entity_type, ?string $bundle): void {
// Change contact message entity fields labels
// Use this method because method in improvements_contact_form_submit() not support translation
if ($bundle && $fields && $entity_type->id() == 'contact_message') {
$contact_form_entity = ContactFormEntity::load($bundle);
$contact_form_entity_third_party_settings = $contact_form_entity->getThirdPartySettings('improvements');
foreach (['name', 'mail', 'subject', 'message'] as $field_name) {
if (
!empty($contact_form_entity_third_party_settings[$field_name . '_label']) &&
isset($fields[$field_name])
) {
$fields[$field_name]->setLabel($contact_form_entity_third_party_settings[$field_name . '_label']);
}
}
}
}
/**
* Implements hook_mail_alter().
*/
function improvements_contact_mail_alter(array &$message): void {
// Replace tokens in contact message e-mail
if ($message['id'] == 'contact_page_mail') {
$message['to'] = \Drupal::token()->replace($message['to']);
}
}
/**
* Return contact message form.
*/
function improvements_contact_get_message_form(string $contact_form_id): array {
$contact_message_storage = \Drupal::entityTypeManager()->getStorage('contact_message'); /** @var ContentEntityStorageInterface $contact_message_storage */
$contact_message = $contact_message_storage->create(['contact_form' => $contact_form_id]); /** @var ContactMessageEntityInterface $contact_message */
$entity_form_builder = \Drupal::service('entity.form_builder'); /** @var EntityFormBuilderInterface $entity_form_builder */
$form = $entity_form_builder->getForm($contact_message);
$form['#cache']['contexts'][] = 'user.permissions';
return $form;
}
/**
* Implements hook_entity_extra_field_info().
*/
function improvements_contact_entity_extra_field_info(): array {
$extra_fields = [];
foreach (array_keys(\Drupal::service('entity_type.bundle.info')->getBundleInfo('contact_message')) as $bundle) {
$extra_fields['contact_message'][$bundle]['form']['title'] = [
'label' => t('Form title'),
'weight' => 0,
];
$extra_fields['contact_message'][$bundle]['form']['text_before'] = [
'label' => t('Text before form'),
'weight' => 0,
];
$extra_fields['contact_message'][$bundle]['form']['text_after'] = [
'label' => t('Text after form'),
'weight' => 0,
];
}
return $extra_fields;
}
/**
* Implements hook_local_tasks_alter().
*/
function improvements_contact_local_tasks_alter(array &$local_tasks): void {
if (isset($local_tasks['entity.contact_message.collection'])) {
$local_tasks['entity.contact_message.collection']['title'] = t('Messages');
}
}
