You are here

function opigno_messaging_private_message_add_form_submit in Opigno messaging 8

Same name and namespace in other branches
  1. 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'
opigno_messaging_form_private_message_add_form_alter in ./opigno_messaging.module
Implements hook_form_alter().

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(),
  ]);
}