function opigno_messaging_private_message_add_form_submit in Opigno messaging 8
Same name and namespace in other branches
- 3.x opigno_messaging.module \opigno_messaging_private_message_add_form_submit()
Add private message form custom submit handler.
1 string reference to 'opigno_messaging_private_message_add_form_submit'
File
- ./
opigno_messaging.module, line 375 - Contains opigno_messaging.module.
Code
function opigno_messaging_private_message_add_form_submit(array $form, FormStateInterface $form_state) {
/** @var \Drupal\Core\Entity\ContentEntityFormInterface $form_obj */
$form_obj = $form_state
->getFormObject();
$current_user = \Drupal::currentUser();
/** @var \Drupal\user\UserDataInterface $user_data */
$user_data = \Drupal::service('user.data');
$pm_config = \Drupal::config('private_message.settings');
/** @var \Drupal\private_message\Service\PrivateMessageServiceInterface $pm_service */
$pm_service = \Drupal::service('private_message.service');
$form_state
->cleanValues();
/** @var \Drupal\private_message\Entity\PrivateMessageInterface $entity */
$entity = $form_obj
->buildEntity($form, $form_state);
$entity
->save();
/** @var \Drupal\user\UserInterface[] $members */
$members = $form_state
->get('thread_members');
if (!$members) {
// Generate an array containing the members of the thread.
$members = [
$current_user,
];
foreach ($form_state
->getValue('members') as $info) {
$user = User::load($info['target_id']);
if ($user) {
$members[] = $user;
}
}
}
$subject = $form_state
->getValue('subject');
// If subject is set, create new thread.
if ($subject) {
$private_message_thread = PrivateMessageThread::create();
foreach ($members as $member) {
$private_message_thread
->addMember($member);
}
$private_message_thread
->set('field_pm_subject', $subject);
$private_message_thread
->save();
}
else {
// Try get thread from path.
$parameters = \Drupal::routeMatch()
->getParameters();
$private_message_thread = $parameters
->get('private_message_thread');
if ($private_message_thread === NULL) {
$storage = $form_state
->getStorage();
if (isset($storage['thread_id'])) {
// Get current thread for "private_messages" page (not PM thread page).
$private_message_thread = PrivateMessageThread::load($storage['thread_id']);
}
else {
$private_message_thread = $pm_service
->getThreadForMembers($members);
}
}
}
// Add the new message to the thread and save.
/** @var \Drupal\private_message\Entity\PrivateMessageThreadInterface $private_message_thread */
$private_message_thread
->addMessage($entity);
$private_message_thread
->save();
$mailManager = \Drupal::service('plugin.manager.mail');
$params = [
'private_message' => $entity,
'private_message_thread' => $private_message_thread,
];
$config_factory = \Drupal::configFactory();
$message_notification_mail_map = $config_factory
->getEditable('private_message.mail')
->get('message_notification');
$site_name = \Drupal::config('system.site')
->get('name');
$params['subject'] = str_replace('[site:name]', $site_name, $message_notification_mail_map['subject']);
if ($members) {
$db_connection = \Drupal::service('database');
$thread_url = $private_message_thread
->toUrl();
$thread_url
->setOption('absolute', TRUE);
$thread_url = Link::fromTextAndUrl($thread_url
->toString(), $thread_url)
->toString();
$delta = 0;
// Send email notifications for members.
foreach ($members as $member) {
if ($member
->id() != $current_user
->id()) {
$params['member'] = $member;
$send = $user_data
->get('private_message', $member
->id(), 'email_notification');
$send = is_numeric($send) ? (bool) $send : $pm_config
->get('enable_email_notifications') && $pm_config
->get('send_by_default');
if ($send) {
$user_name = $member
->getDisplayName();
$author_name = $entity
->getOwner()
->getDisplayName();
$message = $entity
->getMessage();
$params['message'] = str_replace([
'[site:name]',
'[user:display-name]',
'[private_message:author-name]',
'[private_message:message]',
'[private_message_thread:url]',
], [
'<strong>' . $site_name . '</strong>',
'<strong>' . $user_name . '</strong>',
'<strong>' . $author_name . '</strong>',
'<strong>' . $message . '</strong>',
'<strong>' . $thread_url . '</strong>',
], $message_notification_mail_map['body']);
$mailManager
->mail('opigno_messaging', 'message_notification', $member
->getEmail(), $member
->getPreferredLangcode(), $params);
}
}
$query = $db_connection
->select('pm_thread_delete_time', 'pmtdt');
$query
->join('private_message_thread__last_delete_time', 'pmtldt', 'pmtldt.last_delete_time_target_id = pmtdt.id');
$query
->fields('pmtdt', [
'id',
]);
$query
->condition('pmtldt.entity_id', $private_message_thread
->id());
$query
->condition('pmtdt.owner', $member
->id());
$member_last_delete_time = $query
->execute()
->fetchField();
// Restore delete time for users who have deleted thread.
if (!$member_last_delete_time) {
try {
$db_connection
->insert('pm_thread_delete_time')
->fields([
'uuid' => \Drupal::service('uuid')
->generate(),
'owner' => $member
->id(),
'delete_time' => 0,
])
->execute();
} catch (Exception $e) {
\Drupal::logger('opigno_messaging')
->error($e
->getMessage());
}
if (empty($e)) {
$query = $db_connection
->select('pm_thread_delete_time', 'pmtdt');
$query
->fields('pmtdt', [
'id',
]);
$query
->condition('pmtdt.owner', $member
->id());
$query
->orderBy('id', 'DESC');
$query
->range(0, 1);
$member_last_delete_time = $query
->execute()
->fetchField();
if ($member_last_delete_time) {
try {
$db_connection
->insert('private_message_thread__last_delete_time')
->fields([
'bundle' => 'private_message_thread',
'deleted' => 0,
'entity_id' => $private_message_thread
->id(),
'revision_id' => $private_message_thread
->id(),
'langcode' => 'und',
'delta' => $delta,
'last_delete_time_target_id' => $member_last_delete_time,
])
->execute();
} catch (Exception $e) {
\Drupal::logger('opigno_messaging')
->error($e
->getMessage());
}
if (empty($e)) {
$delta++;
}
}
}
}
}
// Update delete time thread with a new message for members (set to 0).
$delete_times = $private_message_thread
->getLastDeleteTimes();
if ($delete_times) {
$delete_times = array_map(function ($delete_time) {
return $delete_time
->id();
}, $delete_times);
try {
$db_connection
->update('pm_thread_delete_time')
->fields([
'delete_time' => 0,
])
->condition('id', $delete_times, 'IN')
->execute();
} catch (Exception $e) {
\Drupal::logger('opigno_messaging')
->error($e
->getMessage());
}
}
}
// Send the user to the private message page. As this thread is the newest,
// it wll be at the top of the list.
$form_state
->setRedirect('entity.private_message_thread.canonical', [
'private_message_thread' => $private_message_thread
->id(),
]);
}