View source
<?php
namespace Drupal\opigno_learning_path\Controller;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\group\Entity\Group;
use Drupal\user\Entity\User;
use Drupal\views\Views;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class LearningPathMembershipController extends ControllerBase {
protected $connection;
protected $formBuilder;
public function __construct(Connection $connection, FormBuilderInterface $formBuilder) {
$this->connection = $connection;
$this->formBuilder = $formBuilder;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('database'), $container
->get('form_builder'));
}
public function createMembersFormModal() {
$form = $this->formBuilder
->getForm('Drupal\\opigno_learning_path\\Form\\LearningPathCreateMemberForm');
$command = new OpenModalDialogCommand($this
->t('Create new members'), $form);
$response = new AjaxResponse();
$response
->addCommand($command);
return $response;
}
public function createUserFormModal() {
$form = $this->formBuilder
->getForm('Drupal\\opigno_learning_path\\Form\\LearningPathCreateUserForm');
$command = new OpenModalDialogCommand($this
->t('2/2 create a new user'), $form);
$response = new AjaxResponse();
$response
->addCommand($command);
return $response;
}
public function createClassFormModal() {
$form = $this->formBuilder
->getForm('Drupal\\opigno_learning_path\\Form\\LearningPathCreateClassForm');
$command = new OpenModalDialogCommand($this
->t('Create a new class'), $form);
$response = new AjaxResponse();
$response
->addCommand($command);
return $response;
}
public function addUserToTrainingAutocomplete(Group $group) {
$matches = [];
$is_class = $group
->getGroupType()
->id() == 'opigno_class';
$string = \Drupal::request()->query
->get('q');
if ($string !== NULL) {
$like_string = '%' . $this->connection
->escapeLike($string) . '%';
$query = \Drupal::entityQuery('user')
->condition('uid', 0, '<>');
$cond_group = $query
->orConditionGroup()
->condition('mail', $like_string, 'LIKE')
->condition('name', $like_string, 'LIKE');
$query = $query
->condition($cond_group)
->sort('name')
->range(0, 20);
$uids = $query
->execute();
$users = User::loadMultiple($uids);
foreach ($users as $user) {
$id = $user
->id();
$name = $user
->getDisplayName();
if ($group
->getMember($user) !== FALSE) {
continue;
}
$matches[] = [
'value' => "{$name} (User #{$id})",
'label' => "{$name} (User #{$id})",
'type' => 'user',
'id' => 'user_' . $id,
];
}
if (!$is_class) {
$query = \Drupal::entityQuery('group')
->condition('type', 'opigno_class')
->condition('label', $like_string, 'LIKE')
->sort('label')
->range(0, 20);
$gids = $query
->execute();
$classes = Group::loadMultiple($gids);
$db_connection = \Drupal::service('database');
foreach ($classes as $class) {
$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 (!$is_class_added) {
$id = $class
->id();
$name = $class
->label();
$matches[] = [
'value' => "{$name} (Group #{$id})",
'label' => "{$name} (Group #{$id})",
'type' => 'group',
'id' => 'class_' . $id,
];
}
}
}
}
return new JsonResponse($matches);
}
public function addUserToClassAutocomplete(Group $group) {
$matches = [];
$string = \Drupal::request()->query
->get('q');
if ($string !== NULL) {
$like_string = '%' . $this->connection
->escapeLike($string) . '%';
$query = \Drupal::entityQuery('user')
->condition('uid', 0, '<>')
->condition('name', $like_string, 'LIKE')
->sort('name')
->range(0, 20);
$uids = $query
->execute();
$count = count($uids);
if ($count < 20) {
$range = 20 - $count;
$query = \Drupal::entityQuery('user')
->condition('uid', 0, '<>')
->condition('mail', $like_string, 'LIKE')
->sort('name')
->range(0, $range);
$uids = array_merge($uids, $query
->execute());
}
$users = User::loadMultiple($uids);
foreach ($users as $user) {
$id = $user
->id();
$name = $user
->getDisplayName();
$matches[] = [
'value' => "{$name} ({$id})",
'label' => "{$name} ({$id})",
'type' => 'user',
'id' => 'user_' . $id,
];
}
}
return new JsonResponse($matches);
}
public function findUsersInGroupAutocomplete() {
$matches = [];
$string = \Drupal::request()->query
->get('q');
if ($string) {
$like_string = '%' . $this->connection
->escapeLike($string) . '%';
$curr_group = \Drupal::routeMatch()
->getParameter('group');
$query = \Drupal::entityQuery('user')
->condition('uid', 0, '<>');
$cond_group = $query
->orConditionGroup()
->condition('mail', $like_string, 'LIKE')
->condition('name', $like_string, 'LIKE');
$query = $query
->condition($cond_group)
->sort('name');
$uids = $query
->execute();
$users = User::loadMultiple($uids);
foreach ($users as $user) {
$id = $user
->id();
$name = $user
->getDisplayName();
if ($curr_group
->getMember($user) === FALSE) {
continue;
}
$matches[] = [
'value' => "{$name} ({$id})",
'label' => $name,
'id' => $id,
];
}
}
return new JsonResponse($matches);
}
public function findGroupMember(Group $group, $class_id, $uid) {
$response = new AjaxResponse();
if ($class_id === '0') {
$content_types = [
'group_content_type_27efa0097d858',
'group_content_type_af9d804582e19',
'learning_path-group_membership',
];
$group_content_ids = \Drupal::entityQuery('group_content')
->condition('gid', $group
->id())
->condition('type', $content_types, 'IN')
->sort('changed', 'DESC')
->execute();
$content = \Drupal::entityTypeManager()
->getStorage('group_content')
->loadMultiple($group_content_ids);
$users = [];
$classes = [];
foreach ($content as $item) {
$entity = $item
->getEntity();
if ($entity === NULL) {
continue;
}
$type = $entity
->getEntityTypeId();
$bundle = $entity
->bundle();
if ($type === 'user') {
$users[$entity
->id()] = [
'group content' => $item,
'entity' => $entity,
];
}
elseif ($type === 'group' && $bundle === 'opigno_class') {
$classes[$entity
->id()] = [
'group content' => $item,
'entity' => $entity,
];
}
}
if ($classes) {
foreach ($classes as $class) {
$view_id = 'opigno_group_members_table';
$display = 'group_members_block';
$args = [
$class['entity']
->id(),
];
$members_view = Views::getView($view_id);
if (is_object($members_view)) {
$members_view->storage
->set('group_members', array_keys($users));
$members_view
->setArguments($args);
$members_view
->setDisplay($display);
$members_view
->setItemsPerPage(0);
$members_view
->execute();
if (!empty($members_view->result)) {
foreach ($members_view->result as $key => $item) {
$member = $item->_entity
->getEntity();
if ($member
->id() == $uid) {
$display_default = $members_view->storage
->getDisplay('default');
$per_page = $display_default["display_options"]["pager"]["options"]["items_per_page"];
$current_page = intdiv($key, $per_page);
$class_id = $class['entity']
->id();
break 2;
}
}
}
}
}
if (isset($current_page)) {
$selector = '#class-' . $class_id . ' .views-element-container';
$members_view = Views::getView($view_id);
if (is_object($members_view)) {
$members_view->storage
->set('group_members', array_keys($users));
$members_view
->setArguments($args);
$members_view
->setDisplay($display);
$members_view
->setCurrentPage($current_page);
$members_view
->preExecute();
$members_view
->execute();
$members_view_renderable = $members_view
->buildRenderable($display, $args);
$response
->addCommand(new ReplaceCommand($selector, $members_view_renderable));
}
}
}
}
return $response;
}
public function deleteUser() {
$group = \Drupal::routeMatch()
->getParameter('group');
if (!isset($group)) {
throw new NotFoundHttpException();
}
$uid = \Drupal::request()->query
->get('user_id');
$user = User::load($uid);
if (!isset($user)) {
throw new NotFoundHttpException();
}
$member = $group
->getMember($user);
if (!isset($member)) {
throw new NotFoundHttpException();
}
$group
->removeMember($user);
return new JsonResponse();
}
public function deleteClass() {
$group = \Drupal::routeMatch()
->getParameter('group');
$class_id = \Drupal::request()->query
->get('class_id');
$class = Group::load($class_id);
if (!isset($group) || !isset($class)) {
throw new NotFoundHttpException();
}
$content = $group
->getContent();
$account = $this
->currentUser();
foreach ($content as $item) {
$entity = $item
->getEntity();
$type = $entity
->getEntityTypeId();
$bundle = $entity
->bundle();
if ($type === 'group' && $bundle === 'opigno_class' && $entity
->id() === $class
->id()) {
$item
->delete();
break;
}
}
return new JsonResponse();
}
public function toggleRole() {
$group = \Drupal::routeMatch()
->getParameter('group');
$query = \Drupal::request()->query;
$uid = $query
->get('uid');
$user = User::load($uid);
$role = $query
->get('role');
if (!isset($group) || !isset($user) || !isset($role)) {
throw new NotFoundHttpException();
}
$member = $group
->getMember($user);
if (!isset($member)) {
throw new NotFoundHttpException();
}
$group_content = $member
->getGroupContent();
$values = $group_content
->get('group_roles')
->getValue();
$found = FALSE;
foreach ($values as $index => $value) {
if ($value['target_id'] === $role) {
$found = TRUE;
unset($values[$index]);
break;
}
}
if ($found === FALSE) {
$values[] = [
'target_id' => $role,
];
}
$group_content
->set('group_roles', $values);
$group_content
->save();
return new JsonResponse();
}
public function validate() {
$group = \Drupal::routeMatch()
->getParameter('group');
$gid = $group
->id();
$uid = \Drupal::request()->query
->get('user_id');
$user = User::load($uid);
if (!isset($group) || !isset($user)) {
throw new NotFoundHttpException();
}
$member = $group
->getMember($user);
if (!isset($member)) {
throw new NotFoundHttpException();
}
$group_content = $member
->getGroupContent();
$query = \Drupal::database()
->merge('opigno_learning_path_group_user_status')
->key('mid', $group_content
->id())
->insertFields([
'mid' => $group_content
->id(),
'uid' => $uid,
'gid' => $gid,
'status' => 1,
'message' => '',
])
->updateFields([
'uid' => $uid,
'gid' => $gid,
'status' => 1,
'message' => '',
]);
$result = $query
->execute();
if ($result) {
$tags = $member
->getCacheTags();
\Drupal::service('cache_tags.invalidator')
->invalidateTags($tags);
$message = $this
->t('Enrollment validated to a new training "@name"', [
'@name' => $group
->label(),
]);
$url = Url::fromRoute('entity.group.canonical', [
'group' => $group
->id(),
])
->toString();
opigno_set_message($uid, $message, $url);
$config = \Drupal::config('opigno_learning_path.learning_path_settings');
$send_to_users = $config
->get('opigno_learning_path_notify_users');
if ($send_to_users) {
$module = 'opigno_learning_path';
$key = 'opigno_learning_path_membership_validated';
$email = $user
->getEmail();
$lang = $user
->getPreferredLangcode();
$params = [];
$params['subject'] = $this
->t('Your membership to the training @training has been approved', [
'@training' => $group
->label(),
]);
$site_config = \Drupal::config('system.site');
$link = $group
->toUrl()
->setAbsolute()
->toString();
$args = [
'@username' => $user
->getDisplayName(),
'@training' => $group
->label(),
':link' => $link,
'@link_text' => $link,
'@platform' => $site_config
->get('name'),
];
$params['message'] = $this
->t('Dear @username
Your membership to the training @training has been approved. You can now access this training at: <a href=":link">@link_text</a>
@platform', $args);
\Drupal::service('plugin.manager.mail')
->mail($module, $key, $email, $lang, $params);
}
}
return new JsonResponse();
}
}