openlucius-2.0.0-alpha3/modules/core/ol_main/src/Services/OlGroups.php

modules/core/ol_main/src/Services/OlGroups.php
<?php

namespace Drupal\ol_main\Services;


use Drupal\Component\Utility\Html;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Url;
use Drupal\ol_group\Entity\OlGroup;
use Drupal\ol_group_user\Entity\OlGroupUser;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Class OlGroups.
 */
class OlGroups{

  /**
   * @var $route
   */
  protected $route;

  /**
   * @var $messenger
   */
  protected $messenger;

  /**
   * @var $current_user
   */
  protected $current_user;

  /**
   * @var $renderer
   */
  protected $renderer;

  /**
   * @var $members
   */
  protected $members;

  /**
   * OlMembers constructor.
   *
   * @param $route
   * @param $messenger
   * @param $current_user
   * @param $renderer
   * @param $members
   */
  public function __construct($route, $messenger, $current_user, $renderer, $members) {
    $this->route = $route;
    $this->messenger = $messenger;
    $this->current_user = $current_user;
    $this->renderer = $renderer;
    $this->members = $members;
  }


  /**
   * Defines group types.
   * @return array
   */
  public function getGroupTypes(){
    $group_types = array();
    $group_types['company'] = array(
      'label' => t('Company wide group'),
      'block_header' => t('Company wide'),
      'icon_class' => t('lni lni-apartment'),
      'weight' => 10,
    );
    $group_types['team'] = array(
      'label' => t('Team'),
      'block_header' => t('Teams'),
      'icon_class' => t('lni lni-users'),
      'weight' => 50,
    );
    $group_types['project'] = array(
      'label' => t('Project'),
      'block_header' => t('Projects'),
      'icon_class' => t('lni lni-rocket'),
      'weight' => 100,
    );
    return $group_types;
  }

  /**
   * @param string $name
   * @param string $type
   * @param int $uid
   * @param bool $message_redirect
   *
   * @return int|string|null
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public function addGroup($name, $type, $uid = null, $message_redirect = true){
    // Get uid if argument is empty.
    $uid = (empty($uid)) ? $this->current_user->id(): $uid;
    // Create Group.
    $ol_group = OlGroup::create([
      'name' => Html::escape($name),
      'type' => $type,
      'landing' => 'stream',
      'enabled_sections' => 'stream,members,files,messages', // Todo: jsonize.
      'user_id' => $uid,
    ]);
    $ol_group->save();
    $new_group_id = $ol_group->id();

    // Add all users to this company-wide group.
    if($type == 'company') {
      // Add all users to this group.
      $all_members = $this->members->getAllUsers();
      foreach ($all_members as $member){
        $ol_group = OlGroupUser::create([
          'name' => $name,
          'group_id' => $new_group_id,
          'member_uid' => $member->uid,
        ]);
        $ol_group->save();
      }
      $this->messenger->addStatus(t('All members were added to this company wide group.'));
    }
    // Only add current user to this group, since it's not company wide.
    else {
      // Add user to Group.
      $ol_group = OlGroupUser::create([
        'name' => $name,
        'group_id' => $new_group_id,
        'member_uid' => $uid,
      ]);
      $ol_group->save();
    }
    if($message_redirect === true) {
      // Redirect with message.
      $this->messenger->addStatus(t('Your group was created successfully!'));
      $this->messenger->addStatus(t('You can now configure it in the form below:'));
      $path = Url::fromRoute('ol_main.group_settings', ['gid' => $new_group_id])
        ->toString();
      $response = new RedirectResponse($path);
      $response->send();
    }
    return $new_group_id;
  }

  /**
   * @param int $status
   * @param null $type
   *
   * @return mixed
   */
  public function getGroups($status, $type = null){
    // Get groups data.
    $uid = $this->current_user->id();
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'name');
    $query->addField('gr', 'id');
    $query->addField('gr', 'landing');
    $query->addField('gr', 'user_id');
    $query->addField('gr', 'changed');
    $query->addField('gr', 'created');
    $query->condition('gr.status', $status);
    $query->condition('lgu.member_uid', $uid);
    if ($type) {
    $query->condition('gr.type', $type);
    }
    $query->orderBy('gr.type', 'desc');
    $query->orderBy('gr.name', 'asc');
    $query->join('ol_group_user', 'lgu', 'lgu.group_id = gr.id');
    return $query->execute()->fetchAll();
  }


  /**
   * @param $groups_data
   * @return mixed
   */
  public function addActivityBadge($groups_data){
    // Loop through groups objects, add badge count if needed.
    foreach ($groups_data as $group_data) {
      // Get current user id.
      $uid = $this->current_user->id();
      $gid = $group_data->id;
      // Get timestamp user last visited group
      $query = \Drupal::database()->select('ol_group_user', 'ogu');
      $query->addField('ogu', 'changed');
      $query->condition('ogu.group_id', $gid);
      $query->condition('ogu.member_uid', $uid);
      $timestamp_user_group =  $query->execute()->fetchField();
      // Get timestamp last stream_item in group
      $query = \Drupal::database()->select('ol_stream_item', 'osi');
      $query->addField('osi', 'created');
      $query->condition('osi.group_id', $gid);
      $query->orderBy('osi.id', 'desc');
      $timestamp_stream_item =  $query->execute()->fetchField();
      // Get new items for this user, if timestamps differ.
      if ($timestamp_stream_item > $timestamp_user_group) {
        // Count query stream items where created > user_group_timestamp
        // Non-chat
        $query = \Drupal::database()->select('ol_stream_item', 'osi');
        $query->addField('osi', 'id');
        $query->condition('osi.group_id', $gid);
        $query->condition('osi.created', $timestamp_user_group ,'>');
        $query->condition('osi.entity_type', 'chat' ,'!=');
        $group_data->non_chat_count =  $query->countQuery()->execute()->fetchField();
        // Chat, needed for different badge, to prevent badge-cluttering.
        $query = \Drupal::database()->select('ol_stream_item', 'osi');
        $query->addField('osi', 'id');
        $query->condition('osi.group_id', $gid);
        $query->condition('osi.created', $timestamp_user_group ,'>');
        $query->condition('osi.entity_type', 'chat');
        $group_data->chat_count =  $query->countQuery()->execute()->fetchField();
      }
    }
    return $groups_data;
  }

  /**
   * @param $gid
   * @return mixed
   */
  public function getGroupUuidById($gid) {
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'uuid');
    $query->condition('gr.id', $gid);
    return $query->execute()->fetchField();
  }

  /**
   * @param $uuid
   * @return mixed
   */
  public function getGroupIdByUuid($uuid) {
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'id');
    $query->condition('gr.uuid', $uuid);
    return $query->execute()->fetchField();
  }

  /**
   * @return mixed
   */
  public function getCurrentGroupId() {
    return $this->route->getParameter('gid');
  }

  /**
   * @param $gid
   * @return mixed
   */
  public function getGroupName($gid = null) {
    // Get current gid if not provided.
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'name');
    $query->condition('gr.id', $gid);
    return $query->execute()->fetchField();
  }

  /**
   * @param $gid
   * @return mixed
   */
  public function getGroupHome($gid) {
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'landing');
    $query->condition('gr.id', $gid);
    return $query->execute()->fetchField();
  }

  /**
   * @param null $form_state
   * @param null $options
   */
  public function saveGroupSettings($form_state = null, $options = null){
    // Get form values.
    $name = Html::escape($form_state->getValue('name'));
    $sections = $form_state->getValue('sections');
    $homepage = $form_state->getValue('homepage');
    //$on_top = $form_state->getValue('on_top')[1];
    $status = $form_state->getValue('status')[1];
    // Switch, because checked = 1 means archived, but status 0 is archived in dbase.
    $status = ($status == 1) ? 0 : 1;
    // Handle on_top setting.
    //$on_top = ($on_top) ? 99 : 1 ; // 99 = on top | 1 = default.
    // Get current gid.
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    // Build array with only ticked values.
    $enabled_sections_array = array();
    foreach ($sections as $key => $section){
      if (!empty($section)){
        $enabled_sections_array[] = $key;
      }
    }
    // Build array with section override names.
    $sections_overrides = array();
    foreach ($options as $key => $section){
      if (!empty($section)){
        // Get override name.
        $override = $form_state->getValue('override_' .$key);
        // Build array if override name is provided.
        if(!empty($override)) {
          $sections_overrides[$key] = $override;
        }
      }
    }
    // Encode to json format.
    $sections_overrides_json = json_encode($sections_overrides);

    // Save group settings.
    \Drupal::database()->update('ol_group')
      ->fields([
        'name' => $name,
        'enabled_sections' => implode(',', $enabled_sections_array),
        'section_overrides' => $sections_overrides_json,
        'landing' => $homepage,
       // 'type' => $type,
        'status' => $status,
      ])
      ->condition('id', $gid, '=')
      ->execute();
    \Drupal::messenger()->addStatus(t('Your group settings were saved successfully.'));
  }

  /**
   * Returns if group has 'on top' checked.
   * @return bool
   */
  public function isOnTop(){
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'id');
    $query->condition('gr.id', $gid);
    $query->condition('gr.type', 99); // 99 = 'on top'.
    return ($query->execute()->fetchField()) ? true : false;
  }

  /**
   * Returns status of a group.
   * @return mixed
   */
  public function isArchived(){
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'status');
    $query->condition('gr.id', $gid);
    return $query->execute()->fetchField();
  }

  /**
   * Returns status of a group.
   *
   * @param null $gid
   * @return mixed
   */
  public function getGroupType($gid = null){
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'type');
    $query->condition('gr.id', $gid);
    return $query->execute()->fetchField();
  }

  /**
   * @return void
   */
  public function redirectToTopGroup(){
    // Get current uid.
    $uid = $this->current_user->id();
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('gr', 'id');
    $query->addField('gr', 'landing');
    //$query->condition('gr.type', 99); // 99 = 'on top'.
    $query->condition('lgu.member_uid', $uid);
    $query->condition('gr.type', 'company');
    //$query->orderBy('gr.id', 'desc');
    $query->orderBy('gr.name', 'asc');
    $query->join('ol_group_user', 'lgu', 'lgu.group_id = gr.id');
    $query->range(0,1);
    $top_gid = $query->execute()->fetchObject();
    // Get landing page of top group.
    // Nasty, but else fromRoute would be too dynamic to build.
    global $base_url;
    $path = $base_url .'/group/'.$top_gid->id .'/'.$top_gid->landing;
    $response = new TrustedRedirectResponse($path);
    $response->send();
    exit; // Stop here, needed to prevent Notice message.
  }

  /**
   * Returns fid of current group header image.
   *
   * @return integer
   */
  public function getHeaderImage() {
    $gid = (empty($gid)) ? $this->route->getParameter('gid') : $gid;
    // Query if current user is group admin.
    $query = \Drupal::database()->select('ol_file', 'olf');
    $query->addField('olf', 'file_id');
    $query->condition('olf.group_id', $gid);
    $query->condition('olf.entity_type', 'group_header');
    return $query->execute()->fetchField();
  }

  /**
   * @param $groups_data
   *
   * @return string
   */
  public function renderArchivedGroupsCards($groups_data){

    // Initiate html var.
    $groups_html = '';
    // Loop through array and render HTML rows via twig file.
    foreach ($groups_data as $group){
      // Needed for 'group admin' badge.
      $groups_row_data['name'] = $group->name;
      $groups_row_data['id'] = $group->id;
      $groups_row_data['landing'] = $group->landing;
      $groups_row_data['admin_uid'] = $group->user_id;
      $groups_row_data['admin_name'] = $this->getGroupAdminName($group->id, $group->user_id);
      $groups_row_data['created'] = $group->created;
      $groups_row_data['changed'] = $group->changed;
      // Render the html row.
      $render = ['#theme' => 'groups_card', '#vars' => $groups_row_data];
      $groups_html .= $this->renderer->render($render);
    }
    return $groups_html;
  }

  /**
   * @param $gid
   * @return mixed
   */
  public function getGroupAdminName($gid, $uid){
    $query = \Drupal::database()->select('ol_group', 'gr');
    $query->addField('ufd', 'name');
    $query->condition('gr.id', $gid);
    $query->join('users_field_data', 'ufd','ufd.uid = gr.user_id');
    return $query->execute()->fetchField();
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc