You are here

public function LearningPathMembershipController::addUserToTrainingAutocompleteSelect in Opigno Learning path 3.x

Returns response for the autocompletion.

Parameters

\Drupal\group\Entity\Group $group: Group.

Return value

\Symfony\Component\HttpFoundation\JsonResponse A JSON response containing the autocomplete suggestions.

1 call to LearningPathMembershipController::addUserToTrainingAutocompleteSelect()
LearningPathMembershipController::addUserToTrainingAutocomplete in src/Controller/LearningPathMembershipController.php
Returns response for the autocompletion.

File

src/Controller/LearningPathMembershipController.php, line 106

Class

LearningPathMembershipController
Controller for the actions related to LP membership.

Namespace

Drupal\opigno_learning_path\Controller

Code

public function addUserToTrainingAutocompleteSelect(Group $group) : array {
  $matches = [];
  $default = [];
  $is_class = $group
    ->getGroupType()
    ->id() == 'opigno_class';
  $string = \Drupal::request()->query
    ->get('q');

  // Find users by email or name.
  $query = \Drupal::entityQuery('user')
    ->condition('uid', 0, '<>');
  if ($string !== NULL) {
    $like_string = '%' . $this->connection
      ->escapeLike($string) . '%';
    $cond_group = $query
      ->orConditionGroup()
      ->condition('mail', $like_string, 'LIKE')
      ->condition('name', $like_string, 'LIKE');
    $query = $query
      ->condition($cond_group);
  }
  $query
    ->sort('name');
  $uids = $query
    ->execute();
  $users = User::loadMultiple($uids);

  /** @var \Drupal\user\Entity\User $user */
  foreach ($users as $user) {
    $id = $user
      ->id();
    $name = $user
      ->getDisplayName();

    // Skip users that already members of the current group.
    if ($group
      ->getMember($user) !== FALSE) {
      $default[] = 'user_' . $id;
    }
    $matches['user_' . $id] = [
      'value' => "{$name} (User #{$id})",
      'label' => "{$name} (User #{$id})",
      'type' => 'user',
      'id' => 'user_' . $id,
    ];
  }
  if (!$is_class) {

    // Find classes by name.
    $query = \Drupal::entityQuery('group')
      ->condition('type', 'opigno_class');
    if ($string && $like_string) {
      $query
        ->condition('label', $like_string, 'LIKE');
    }
    $query
      ->sort('label')
      ->range(0, 20);
    $gids = $query
      ->execute();
    $classes = Group::loadMultiple($gids);
    $db_connection = \Drupal::service('database');

    /** @var \Drupal\group\Entity\Group $class */
    foreach ($classes as $class) {

      // Check if class already added.
      $is_class_added = $db_connection
        ->select('group_content_field_data', 'g_c_f_d')
        ->fields('g_c_f_d', [
        'id',
      ])
        ->condition('gid', $group
        ->id())
        ->condition('entity_id', $class
        ->id())
        ->condition('type', 'group_content_type_27efa0097d858')
        ->execute()
        ->fetchField();

      // If class haven't added yet.
      $id = $class
        ->id();
      $name = $class
        ->label();
      if ($is_class_added) {
        $default[] = 'class_' . $id;
      }
      $matches['class_' . $id] = [
        'value' => "{$name} (Group #{$id})",
        'label' => "{$name} (Group #{$id})",
        'type' => 'group',
        'id' => 'class_' . $id,
        'members' => array_reduce($class
          ->getMembers(), function ($acc, GroupMembership $entity) {
          $user = $entity
            ->getGroupContent()
            ->getEntity();
          $id = $user
            ->id();
          $name = $user
            ->getDisplayName();
          $acc[$user
            ->getEntityTypeId() . '_' . $user
            ->id()] = [
            'value' => "{$name} (User #{$id})",
            'label' => "{$name} (User #{$id})",
            'type' => 'user',
            'id' => 'user_' . $id,
          ];
          return $acc;
        }, []),
      ];
    }
  }
  return [
    $matches,
    $default,
  ];
}