class LearningPathController in Opigno Learning path 8
Same name and namespace in other branches
- 3.x src/Controller/LearningPathController.php \Drupal\opigno_learning_path\Controller\LearningPathController
Class LearningPathController.
Hierarchy
- class \Drupal\Core\Controller\ControllerBase implements ContainerInjectionInterface uses LoggerChannelTrait, MessengerTrait, LinkGeneratorTrait, RedirectDestinationTrait, UrlGeneratorTrait, StringTranslationTrait
- class \Drupal\opigno_learning_path\Controller\LearningPathController
Expanded class hierarchy of LearningPathController
1 file declares its use of LearningPathController
- DefaultTwigExtension.php in src/
TwigExtension/ DefaultTwigExtension.php
File
- src/
Controller/ LearningPathController.php, line 19
Namespace
Drupal\opigno_learning_path\ControllerView source
class LearningPathController extends ControllerBase {
/**
* Returns step score cell.
*/
protected function build_step_score_cell($step) {
if (in_array($step['typology'], [
'Module',
'Course',
'Meeting',
'ILT',
])) {
$score = $step['best score'];
return [
'#type' => 'container',
[
'#type' => 'html_tag',
'#tag' => 'span',
'#value' => $score . '%',
],
[
'#type' => 'container',
'#attributes' => [
'class' => [
'lp_step_result_bar',
],
],
[
'#type' => 'html_tag',
'#tag' => 'div',
'#attributes' => [
'class' => [
'lp_step_result_bar_value',
],
'style' => "width: {$score}%",
],
'#value' => '',
],
],
];
}
else {
return [
'#markup' => '‐',
];
}
}
/**
* Returns step state cell.
*/
protected function build_step_state_cell($step) {
$user = $this
->currentUser();
$uid = $user
->id();
$status = opigno_learning_path_get_step_status($step, $uid, TRUE);
switch ($status) {
case 'pending':
$markup = '<span class="lp_step_state_pending"></span>' . $this
->t('Pending');
break;
case 'failed':
$markup = '<span class="lp_step_state_failed"></span>' . $this
->t('Failed');
break;
case 'passed':
$markup = '<span class="lp_step_state_passed"></span>' . $this
->t('Passed');
break;
default:
$markup = '‐';
break;
}
return [
'#markup' => $markup,
];
}
/**
* Returns course row.
*/
protected function build_course_row($step) {
$result = $this
->build_step_score_cell($step);
$state = $this
->build_step_state_cell($step);
return [
$step['name'],
[
'class' => 'lp_step_details_result',
'data' => $result,
],
[
'class' => 'lp_step_details_state',
'data' => $state,
],
];
}
/**
* Returns training content.
*/
public function trainingContent() {
/** @var \Drupal\group\Entity\Group $group */
$group = \Drupal::routeMatch()
->getParameter('group');
$user = \Drupal::currentUser();
// Get training certificate expiration flag.
$latest_cert_date = LPStatus::getTrainingStartDate($group, $user
->id());
$content = [
'#attached' => [
'library' => [
'core/drupal.dialog.ajax',
],
],
'#theme' => 'opigno_learning_path_training_content',
];
// If not a member.
if (!$group
->getMember($user) || !$user
->isAuthenticated() && $group->field_learning_path_visibility->value === 'semiprivate') {
return $content;
}
// Check if membership has status 'pending'.
if (!LearningPathAccess::statusGroupValidation($group, $user)) {
return $content;
}
// Get training guided navigation option.
$freeNavigation = !OpignoGroupManagerController::getGuidedNavigation($group);
if ($freeNavigation) {
// Get all steps for LP.
$steps = opigno_learning_path_get_all_steps($group
->id(), $user
->id(), NULL, $latest_cert_date);
}
else {
// Get guided steps.
$steps = opigno_learning_path_get_steps($group
->id(), $user
->id(), NULL, $latest_cert_date);
}
$steps = array_filter($steps, function ($step) use ($user) {
if ($step['typology'] === 'Meeting') {
// If the user have not the collaborative features role.
if (!$user
->hasPermission('view meeting entities')) {
return FALSE;
}
// If the user is not a member of the meeting.
/** @var \Drupal\opigno_moxtra\MeetingInterface $meeting */
$meeting = \Drupal::entityTypeManager()
->getStorage('opigno_moxtra_meeting')
->load($step['id']);
if (!$meeting
->isMember($user
->id())) {
return FALSE;
}
}
elseif ($step['typology'] === 'ILT') {
// If the user is not a member of the ILT.
/** @var \Drupal\opigno_ilt\ILTInterface $ilt */
$ilt = \Drupal::entityTypeManager()
->getStorage('opigno_ilt')
->load($step['id']);
if (!$ilt
->isMember($user
->id())) {
return FALSE;
}
}
return TRUE;
});
$steps_array = [];
$steps = array_values($steps);
if ($steps) {
foreach ($steps as $key => $step) {
$sub_title = '';
$link = NULL;
$free_link = NULL;
$score = $this
->build_step_score_cell($step);
$state = $this
->build_step_state_cell($step);
unset($start_date);
unset($end_date);
if ($step['typology'] === 'Course') {
if ($freeNavigation) {
// Get all steps for LP.
$course_steps = opigno_learning_path_get_all_steps($step['id'], $user
->id(), NULL, $latest_cert_date);
}
else {
// Get guided steps.
$course_steps = opigno_learning_path_get_steps($step['id'], $user
->id(), NULL, $latest_cert_date);
}
foreach ($course_steps as $course_step_key => &$course_step) {
if ($course_step_key == 0) {
// Load first step entity.
$first_step = OpignoGroupManagedContent::load($course_steps[$course_step_key]['cid']);
/* @var \Drupal\opigno_group_manager\OpignoGroupContentTypesManager $content_types_manager */
$content_types_manager = \Drupal::service('opigno_group_manager.content_types.manager');
$content_type = $content_types_manager
->createInstance($first_step
->getGroupContentTypeId());
$step_url = $content_type
->getStartContentUrl($first_step
->getEntityId(), $group
->id());
$link = Link::createFromRoute($course_step['name'], $step_url
->getRouteName(), $step_url
->getRouteParameters())
->toString();
}
else {
// Get link to module.
$course_parent_content_id = $course_steps[$course_step_key - 1]['cid'];
$link = Link::createFromRoute($course_step['name'], 'opigno_learning_path.steps.next', [
'group' => $group
->id(),
'parent_content' => $course_parent_content_id,
])
->toString();
}
// Add compiled parameters to step array.
$course_step['title'] = !empty($link) ? $link : $course_step['name'];
$course_step['summary_details_table'] = [
'#type' => 'table',
'#attributes' => [
'class' => [
'lp_step_summary_details',
],
],
'#header' => [
$this
->t('Score'),
$this
->t('State'),
],
'#rows' => [
[
[
'class' => 'lp_step_details_result',
'data' => $this
->build_step_score_cell($course_step),
],
[
'class' => 'lp_step_details_state',
'data' => $this
->build_step_state_cell($course_step),
],
],
],
];
}
$step['course_steps'] = $course_steps;
$steps[$key]['course_steps'] = $course_steps;
}
elseif ($step['typology'] === 'Module') {
$step['module'] = OpignoModule::load($step['id']);
}
$title = $step['name'];
if ($step['typology'] === 'Meeting') {
/** @var \Drupal\opigno_moxtra\MeetingInterface $meeting */
$meeting = $this
->entityTypeManager()
->getStorage('opigno_moxtra_meeting')
->load($step['id']);
$start_date = $meeting
->getStartDate();
$end_date = $meeting
->getEndDate();
if ($freeNavigation) {
$free_link = Link::createFromRoute($title, 'opigno_moxtra.meeting', [
'opigno_moxtra_meeting' => $step['id'],
])
->toString();
}
}
elseif ($step['typology'] === 'ILT') {
/** @var \Drupal\opigno_ilt\ILTInterface $ilt */
$ilt = $this
->entityTypeManager()
->getStorage('opigno_ilt')
->load($step['id']);
$start_date = $ilt
->getStartDate();
$end_date = $ilt
->getEndDate();
if ($freeNavigation) {
$free_link = Link::createFromRoute($title, 'entity.opigno_ilt.canonical', [
'opigno_ilt' => $step['id'],
])
->toString();
}
}
if (isset($start_date) && isset($end_date)) {
$start_date = DrupalDateTime::createFromFormat(DrupalDateTime::FORMAT, $start_date);
$end_date = DrupalDateTime::createFromFormat(DrupalDateTime::FORMAT, $end_date);
$end_date_format = $end_date
->format('g:i A');
if ($start_date
->format('jS F Y') != $end_date
->format('jS F Y')) {
$end_date_format = $end_date
->format('jS F Y - g:i A');
}
$title .= ' / ' . $this
->t('@start to @end', [
'@start' => $start_date
->format('jS F Y - g:i A'),
'@end' => $end_date_format,
]);
}
$keys = array_keys($steps);
// Build link for first step.
if ($key == $keys[0]) {
if ($step['typology'] == 'Course') {
$link = NULL;
}
else {
// Load first step entity.
$first_step = OpignoGroupManagedContent::load($steps[$key]['cid']);
/* @var \Drupal\opigno_group_manager\OpignoGroupContentTypesManager $content_types_manager */
$content_types_manager = \Drupal::service('opigno_group_manager.content_types.manager');
$content_type = $content_types_manager
->createInstance($first_step
->getGroupContentTypeId());
$step_url = $content_type
->getStartContentUrl($first_step
->getEntityId(), $group
->id());
$link = Link::createFromRoute($title, $step_url
->getRouteName(), $step_url
->getRouteParameters())
->toString();
}
}
else {
if ($step['typology'] == 'Course') {
$link = NULL;
}
else {
// Get link to module.
if (!empty($free_link)) {
$link = $free_link;
}
elseif (!empty($steps[$key - 1]['cid'])) {
// Get previous step cid.
if ($steps[$key - 1]['typology'] == 'Course') {
// If previous step is course get it's last step.
if (!empty($steps[$key - 1]['course_steps'])) {
$course_last_step = end($steps[$key - 1]['course_steps']);
if (!empty($course_last_step['cid'])) {
$parent_content_id = $course_last_step['cid'];
}
}
}
else {
// If previous step isn't a course.
$parent_content_id = $steps[$key - 1]['cid'];
}
if (!empty($parent_content_id)) {
$link = Link::createFromRoute($title, 'opigno_learning_path.steps.next', [
'group' => $group
->id(),
'parent_content' => $parent_content_id,
])
->toString();
}
}
}
}
// Add compiled parameters to step array.
$step['title'] = !empty($link) ? $link : $title;
$step['sub_title'] = $sub_title;
$step['score'] = $score;
$step['state'] = $state;
$step['summary_details_table'] = [
'#type' => 'table',
'#attributes' => [
'class' => [
'lp_step_summary_details',
],
],
'#header' => [
$this
->t('Score'),
$this
->t('State'),
],
'#rows' => [
[
[
'class' => 'lp_step_details_result',
'data' => $score,
],
[
'class' => 'lp_step_details_state',
'data' => $state,
],
],
],
];
$steps_array[] = [
'#theme' => 'opigno_learning_path_training_content_step',
'#step' => $step,
'#group' => $group,
];
}
if ($steps_array) {
$steps = $steps_array;
}
}
// $TFTController = new TFTController();
// $listGroup = $TFTController->listGroup($group->id());
$tft_url = Url::fromRoute('tft.group', [
'group' => $group
->id(),
])
->toString();
$content['tabs'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'lp_tabs',
'nav',
'mb-4',
],
],
];
$content['tabs'][] = [
'#markup' => '<a class="lp_tabs_link active" data-toggle="tab" href="#training-content">' . $this
->t('Training Content') . '</a>',
];
$content['tabs'][] = [
'#markup' => '<a class="lp_tabs_link" data-toggle="tab" href="#documents-library">' . $this
->t('Documents Library') . '</a>',
];
$content['tab_content'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'tab-content',
],
],
];
$content['tab_content'][] = [
'#type' => 'container',
'#attributes' => [
'id' => 'training-content',
'class' => [
'tab-pane',
'fade',
'show',
'active',
],
],
'steps' => $steps,
];
$content['tab_content'][] = [
'#type' => 'container',
'#attributes' => [
'id' => 'documents-library',
'class' => [
'tab-pane',
'fade',
],
],
[
'#type' => 'html_tag',
'#tag' => 'iframe',
'#attributes' => [
'src' => $tft_url,
'frameborder' => 0,
'width' => '100%',
'height' => '600px',
],
],
];
$is_moxtra_enabled = \Drupal::hasService('opigno_moxtra.workspace_controller');
if ($is_moxtra_enabled) {
$has_workspace_field = $group
->hasField('field_workspace');
$has_workspace_access = $user
->hasPermission('view workspace entities');
if ($has_workspace_field && $has_workspace_access) {
if ($group
->get('field_workspace')
->getValue() && ($workspace_id = $group
->get('field_workspace')
->getValue()[0]['target_id'])) {
$workspace_url = Url::fromRoute('opigno_moxtra.workspace.iframe', [
'opigno_moxtra_workspace' => $workspace_id,
])
->toString();
$content['tabs'][] = [
'#markup' => '<a class="lp_tabs_link" data-toggle="tab" href="#collaborative-workspace">' . $this
->t('Collaborative Workspace') . '</a>',
];
}
$workspace_tab = [
'#type' => 'container',
'#attributes' => [
'id' => 'collaborative-workspace',
'class' => [
'tab-pane',
'fade',
],
],
'content' => [
'#type' => 'container',
'#attributes' => [
'class' => [
'row',
],
],
isset($workspace_url) ? [
'#type' => 'html_tag',
'#tag' => 'iframe',
'#attributes' => [
'src' => $workspace_url,
'frameborder' => 0,
'width' => '100%',
'height' => '600px',
],
] : [],
],
];
$content['tab_content'][] = $workspace_tab;
}
}
$has_enable_forum_field = $group
->hasField('field_learning_path_enable_forum');
$has_forum_field = $group
->hasField('field_learning_path_forum');
if ($has_enable_forum_field && $has_forum_field) {
$enable_forum_field = $group
->get('field_learning_path_enable_forum')
->getValue();
$forum_field = $group
->get('field_learning_path_forum')
->getValue();
if (!empty($enable_forum_field) && !empty($forum_field)) {
$enable_forum = $enable_forum_field[0]['value'];
$forum_tid = $forum_field[0]['target_id'];
if ($enable_forum && _opigno_forum_access($forum_tid, $user)) {
$forum_url = Url::fromRoute('forum.page', [
'taxonomy_term' => $forum_tid,
])
->toString();
$content['tabs'][] = [
'#markup' => '<a class="lp_tabs_link" data-toggle="tab" href="#forum">' . $this
->t('Forum') . '</a>',
];
$content['tab_content'][] = [
'#type' => 'container',
'#attributes' => [
'id' => 'forum',
'class' => [
'tab-pane',
'fade',
],
],
[
'#type' => 'html_tag',
'#tag' => 'iframe',
'#attributes' => [
'src' => $forum_url,
'frameborder' => 0,
'width' => '100%',
'height' => '600px',
],
],
];
}
}
}
$content['#attached']['library'][] = 'opigno_learning_path/training_content';
return $content;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ControllerBase:: |
protected | property | The configuration factory. | |
ControllerBase:: |
protected | property | The current user service. | 1 |
ControllerBase:: |
protected | property | The entity form builder. | |
ControllerBase:: |
protected | property | The entity manager. | |
ControllerBase:: |
protected | property | The entity type manager. | |
ControllerBase:: |
protected | property | The form builder. | 2 |
ControllerBase:: |
protected | property | The key-value storage. | 1 |
ControllerBase:: |
protected | property | The language manager. | 1 |
ControllerBase:: |
protected | property | The module handler. | 2 |
ControllerBase:: |
protected | property | The state service. | |
ControllerBase:: |
protected | function | Returns the requested cache bin. | |
ControllerBase:: |
protected | function | Retrieves a configuration object. | |
ControllerBase:: |
private | function | Returns the service container. | |
ControllerBase:: |
public static | function |
Instantiates a new instance of this class. Overrides ContainerInjectionInterface:: |
40 |
ControllerBase:: |
protected | function | Returns the current user. | 1 |
ControllerBase:: |
protected | function | Retrieves the entity form builder. | |
ControllerBase:: |
protected | function | Retrieves the entity manager service. | |
ControllerBase:: |
protected | function | Retrieves the entity type manager. | |
ControllerBase:: |
protected | function | Returns the form builder service. | 2 |
ControllerBase:: |
protected | function | Returns a key/value storage collection. | 1 |
ControllerBase:: |
protected | function | Returns the language manager service. | 1 |
ControllerBase:: |
protected | function | Returns the module handler. | 2 |
ControllerBase:: |
protected | function |
Returns a redirect response object for the specified route. Overrides UrlGeneratorTrait:: |
|
ControllerBase:: |
protected | function | Returns the state storage service. | |
LearningPathController:: |
protected | function | Returns course row. | |
LearningPathController:: |
protected | function | Returns step score cell. | |
LearningPathController:: |
protected | function | Returns step state cell. | |
LearningPathController:: |
public | function | Returns training content. | |
LinkGeneratorTrait:: |
protected | property | The link generator. | 1 |
LinkGeneratorTrait:: |
protected | function | Returns the link generator. | |
LinkGeneratorTrait:: |
protected | function | Renders a link to a route given a route name and its parameters. | |
LinkGeneratorTrait:: |
public | function | Sets the link generator service. | |
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
RedirectDestinationTrait:: |
protected | property | The redirect destination service. | 1 |
RedirectDestinationTrait:: |
protected | function | Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url. | |
RedirectDestinationTrait:: |
protected | function | Returns the redirect destination service. | |
RedirectDestinationTrait:: |
public | function | Sets the redirect destination service. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
UrlGeneratorTrait:: |
protected | property | The url generator. | |
UrlGeneratorTrait:: |
protected | function | Returns the URL generator service. | |
UrlGeneratorTrait:: |
public | function | Sets the URL generator service. | |
UrlGeneratorTrait:: |
protected | function | Generates a URL or path for a specific route based on the given parameters. |