opigno_class_app.module in Opigno Class App 7
Module hooks.
File
opigno_class_app.moduleView source
<?php
/**
* @file
* Module hooks.
*/
/**
* Implements hook_menu().
*/
function opigno_class_app_menu() {
$items = array();
if (module_exists('opigno_quiz_app')) {
$items['admin/opigno/students/class-results'] = array(
'title' => t("My class student results"),
'description' => t("Displays all class student results"),
'page callback' => 'opigno_class_app_class_results',
'access arguments' => array(
'access class results',
),
);
}
return $items;
}
/**
* Implements hook_menu_alter().
*/
function opigno_class_app_menu_alter(&$items) {
if (module_exists('opigno_quiz_app') && !empty($items['user/%/achievements'])) {
$items['user/%/achievements']['page callback'] = $items['my-achievements']['page callback'] = 'opigno_class_app_user_results';
}
}
/**
* Implements hook_views_api().
*/
function opigno_class_app_views_api() {
return array(
'api' => '3.0',
);
}
/**
* Implements hook_permission().
*/
function opigno_class_app_permission() {
return array(
'access class results' => array(
'title' => t('Access class results'),
'description' => t('Allows class coaches to access all their student results.'),
),
);
}
/**
* Implements hook_og_permission().
*/
function opigno_class_app_og_permission() {
return array(
'access class results' => array(
'title' => t('Access class results'),
'description' => t('Allows class coaches to access all their student results.'),
),
);
}
/**
* Implements hook_menu_local_tasks_alter().
*/
function opigno_class_app_menu_local_tasks_alter(&$data, $router_item, $root_path) {
if ($root_path == 'admin/opigno/content/class-administration') {
$item = menu_get_item('node/add/class');
if ($item['access']) {
$item['title'] = t("Add a new class");
$item['options']['attributes']['class'][] = $item['localized_options']['attributes']['class'][] = 'add-class';
$item['options']['attributes']['class'][] = $item['localized_options']['attributes']['class'][] = 'opigno-class-app-add-class';
$item['options']['attributes']['class'][] = $item['localized_options']['attributes']['class'][] = 'opigno-class-app-class-administration-add-class-link';
$data['actions']['output'][] = array(
'#theme' => 'menu_local_action',
'#link' => $item,
);
}
}
}
/**
* Implements of hook_views_default_views_alter().
*/
function opigno_class_app_views_default_views_alter(&$views) {
// Group the courses by class.
/*if (array_key_exists('opigno_my_courses', $views)) {
$display = $views['opigno_my_courses']->display['default'];
// Add grouping.
$display->display_options['style_options']['grouping'] = array(
0 => array(
'field' => 'title_1',
'rendered' => 1,
'rendered_strip' => 0,
),
);
// Add Class relationship.
$display->display_options['relationships']['reverse_opigno_class_courses_node']['id'] = 'reverse_opigno_class_courses_node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['table'] = 'node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['field'] = 'reverse_opigno_class_courses_node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['relationship'] = 'og_membership_related_node_group';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['label'] = 'Class referencing the course';
// Add class title field.
$display->display_options['fields']['title_1']['id'] = 'title_1';
$display->display_options['fields']['title_1']['table'] = 'node';
$display->display_options['fields']['title_1']['field'] = 'title';
$display->display_options['fields']['title_1']['relationship'] = 'reverse_opigno_class_courses_node';
$display->display_options['fields']['title_1']['label'] = '';
$display->display_options['fields']['title_1']['exclude'] = TRUE;
$display->display_options['fields']['title_1']['element_label_colon'] = FALSE;
}*/
// TODO: Delete this when tested
if (array_key_exists('opigno_course_catalgue', $views)) {
$display = $views['opigno_course_catalgue']->display['default'];
/*
// Add grouping.
$display->display_options['style_options']['grouping'] = array(
0 => array(
'field' => 'group_group_1',
'rendered' => 1,
'rendered_strip' => 0,
),
);
// Add Class relationship.
$display->display_options['relationships']['reverse_opigno_class_courses_node']['id'] = 'reverse_opigno_class_courses_node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['table'] = 'node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['field'] = 'reverse_opigno_class_courses_node';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['relationship'] = 'og_membership_related_node_group';
$display->display_options['relationships']['reverse_opigno_class_courses_node']['label'] = 'Class referencing the course';
// Add class title field.
$display->display_options['fields']['title_1']['id'] = 'title_1';
$display->display_options['fields']['title_1']['table'] = 'node';
$display->display_options['fields']['title_1']['field'] = 'title';
$display->display_options['fields']['title_1']['relationship'] = 'reverse_opigno_class_courses_node';
$display->display_options['fields']['title_1']['label'] = '';
$display->display_options['fields']['title_1']['exclude'] = TRUE;
$display->display_options['fields']['title_1']['element_label_colon'] = FALSE;
*/
/* Field: Content: Group */
/* $display->display_options['fields']['group_group_1']['id'] = 'group_group_1';
$display->display_options['fields']['group_group_1']['table'] = 'field_data_group_group';
$display->display_options['fields']['group_group_1']['field'] = 'group_group';
$display->display_options['fields']['group_group_1']['relationship'] = 'reverse_opigno_class_courses_node';
$display->display_options['fields']['group_group_1']['label'] = '';
$display->display_options['fields']['group_group_1']['exclude'] = TRUE;
$display->display_options['fields']['group_group_1']['alter']['alter_text'] = TRUE;
$display->display_options['fields']['group_group_1']['alter']['text'] = '[title_1] <div class="catalogue-class-group"> [group_group_1] </div>';
$display->display_options['fields']['group_group_1']['element_label_colon'] = FALSE;
$display->display_options['fields']['group_group_1']['type'] = 'og_group_subscribe';
$display->display_options['fields']['group_group_1']['settings'] = array(
'field_name' => 'og_user_node',
);
*/
/* Filter criterion: Opigno Quiz App: Hide courses from classes */
$display->display_options['filters']['filter_courses_from_classes']['id'] = 'filter_courses_from_classes';
$display->display_options['filters']['filter_courses_from_classes']['table'] = 'node';
$display->display_options['filters']['filter_courses_from_classes']['field'] = 'filter_courses_from_classes';
$display->display_options['filters']['filter_courses_from_classes']['group'] = 1;
}
if (array_key_exists('my_trainings', $views)) {
$display = $views['my_trainings']->display['default'];
/* Filter criterion: Opigno Quiz App: Hide courses from classes */
$display->display_options['filters']['filter_courses_from_classes']['id'] = 'filter_courses_from_classes';
$display->display_options['filters']['filter_courses_from_classes']['table'] = 'node';
$display->display_options['filters']['filter_courses_from_classes']['field'] = 'filter_courses_from_classes';
$display->display_options['filters']['filter_courses_from_classes']['relationship'] = 'og_membership_related_node_group';
$display->display_options['filters']['filter_courses_from_classes']['group'] = 1;
}
}
/**
* Page callback: display class results.
*/
function opigno_class_app_class_results() {
global $user;
$html = '';
// Failsafe.
if (!module_exists('opigno_quiz_app')) {
return t("This page requires the Opigno Quiz App to be enabled.");
}
// Cache accounts, as we will potentially use them many times.
$accounts = array();
$state = isset($_SESSION['opigno_quiz_app']['state_filter'][request_path()]) ? $_SESSION['opigno_quiz_app']['state_filter'][request_path()] : OG_STATE_ACTIVE;
foreach (og_get_groups_by_user($user, 'node') as $gid => $nid) {
$node = node_load($nid);
if ($node->type == 'class' && og_user_access('node', $nid, 'access class results')) {
$rows = array();
$scores = array();
foreach ($node->opigno_class_courses as $lang => $items) {
foreach ($items as $item) {
foreach (opigno_get_users_in_group($item['target_id'], $state) as $uid => $account) {
if (og_is_member('node', $nid, 'user', $account)) {
if ($data = opigno_quiz_app_get_course_data_result($uid, $item['target_id'])) {
$course = node_load($item['target_id']);
$scores[$uid][$course->title] = $data;
$scores[$uid][$course->title]['node'] = $course;
$accounts[$uid] = $account;
}
}
}
}
}
foreach ($scores as $uid => $course_results) {
$passed = OPIGNO_QUIZ_APP_PASSED;
foreach ($course_results as $results) {
if (!empty($results['passed']) && $results['passed'] != OPIGNO_QUIZ_APP_PASSED) {
$passed = $results['passed'];
break;
}
}
$rows[] = array(
theme('table', array(
'header' => array(
t("@name (!status)", array(
'@name' => $accounts[$uid]->name,
'!status' => $passed == OPIGNO_QUIZ_APP_PASSED ? t("Passed") : ($passed == OPIGNO_QUIZ_APP_FAILED ? t("Failed") : t("Pending")),
)),
),
'rows' => array(
array(
theme('opigno_quiz_app_user_results', array(
'user' => $accounts[$uid],
'results' => $course_results,
)),
),
),
'attributes' => array(
'class' => array(
'opigno-quiz-app-results-table',
'opigno-quiz-app-results-collapsible-table',
'opigno-quiz-app-course-class-user-results-table',
),
),
)),
);
}
$header = array(
check_plain($node->title),
);
$html .= theme('table', array(
'header' => $header,
'rows' => $rows,
'attributes' => array(
'class' => array(
'opigno-quiz-app-results-table',
'opigno-quiz-app-results-collapsible-table',
'opigno-quiz-app-course-class-results-table',
),
),
));
}
}
module_load_include('inc', 'opigno_quiz_app', 'includes/opigno_quiz_app.pages');
$path = drupal_get_path('module', 'opigno_quiz_app');
drupal_add_js($path . '/js/opigno_quiz_app.js');
drupal_add_css($path . '/css/opigno_quiz_app.css');
$form = drupal_get_form('opigno_quiz_app_filter_by_status_form');
return render($form) . $html;
}
/**
* Page callback: view user results.
* Overwrite callback from Quiz app, group courses by class.
*
* @param int $uid
*
* @return string
*/
function opigno_class_app_user_results($uid = NULL) {
if (!isset($uid)) {
global $user;
$uid = $user->uid;
$account = clone $user;
}
else {
$account = user_load($uid);
}
if (empty($uid)) {
drupal_set_message(t("Could not find any user to display results for."), 'error');
drupal_not_found();
}
// Failsafe.
if (!module_exists('opigno_quiz_app')) {
return t("This page requires the Opigno Quiz App to be enabled.");
}
$html = '';
$scores = array();
$classes = array();
$printed_scores = array();
foreach (og_get_groups_by_user($account, 'node') as $gid => $nid) {
$node = node_load($nid);
if ($node->type == OPIGNO_COURSE_BUNDLE) {
if ($score_data = opigno_quiz_app_get_course_data_result($uid, $nid)) {
$scores[$nid] = $score_data;
$scores[$nid]['node'] = $node;
}
}
elseif ($node->type == 'class') {
$classes[$nid]['node'] = $node;
foreach ($node->opigno_class_courses as $lang => $items) {
foreach ($items as $item) {
$classes[$nid]['courses'][$item['target_id']] = $item['target_id'];
}
}
}
}
if (!empty($classes)) {
foreach ($classes as $class_nid => $data) {
$class_scores = array();
if (!empty($data['courses'])) {
$printed_scores = array_merge($printed_scores, array_keys($data['courses']));
foreach ($data['courses'] as $course_nid) {
$class_scores[$scores[$course_nid]['node']->title] = $scores[$course_nid];
}
$passed = OPIGNO_QUIZ_APP_PASSED;
foreach ($data['courses'] as $course_nid) {
if (!empty($scores[$course_nid]['passed']) && $scores[$course_nid]['passed'] != OPIGNO_QUIZ_APP_PASSED) {
$passed = $scores[$course_nid]['passed'];
break;
}
}
$html .= theme('table', array(
'header' => array(
t("@name (!status)", array(
'@name' => check_plain($data['node']->title),
'!status' => $passed == OPIGNO_QUIZ_APP_PASSED ? t("Passed") : ($passed == OPIGNO_QUIZ_APP_FAILED ? t("Failed") : t("Pending")),
)),
),
'rows' => array(
array(
theme('opigno_quiz_app_user_results', array(
'user' => $account,
'results' => $class_scores,
)),
),
),
'attributes' => array(
'class' => array(
'opigno-quiz-app-results-table',
'opigno-quiz-app-results-collapsible-table',
'opigno-quiz-app-course-class-results-table',
),
),
));
}
}
foreach ($printed_scores as $printed_score) {
unset($scores[$printed_score]);
}
}
$other_scores = array();
foreach ($scores as $nid => $score_data) {
$other_scores[$score_data['node']->title] = $score_data;
}
$html .= theme('opigno_quiz_app_user_results', array(
'user' => $account,
'results' => $other_scores,
));
$path = drupal_get_path('module', 'opigno_quiz_app');
drupal_add_js($path . '/js/opigno_quiz_app.js');
drupal_add_css($path . '/css/opigno_quiz_app.css');
return $html;
}
function opigno_class_app_classes_of_course_that_user_is_part_of($course_nid, $user_id) {
$classes = array();
$query = db_select('field_data_opigno_class_courses', 'class_course');
$query
->join('og_membership', 'ogm', 'ogm.gid = class_course.entity_id');
$query
->fields('ogm', array(
'gid',
));
$query
->fields('class_course', array());
$query
->groupBy('ogm.gid');
$query
->condition('ogm.entity_type', 'user', '=');
$query
->condition('ogm.state', 1, '=');
$query
->condition('ogm.etid', $user_id, '=');
$query
->condition('class_course.deleted', 0, '=');
$query
->condition('class_course.opigno_class_courses_target_id', $course_nid, '=');
$result = $query
->execute();
while ($record = $result
->fetchAssoc()) {
$classes[$record['gid']] = $record['gid'];
}
return $classes;
}
function opigno_class_app_courses_of_class_that_user_is_part_of($class) {
$courses = array();
$query = db_select('field_data_opigno_class_courses', 'class_course');
$query
->fields('class_course', array(
'opigno_class_courses_target_id',
));
$query
->condition('class_course.deleted', 0, '=');
$query
->condition('class_course.bundle', 'class', '=');
$query
->condition('class_course.entity_id', $class, '=');
$result = $query
->execute();
while ($record = $result
->fetchAssoc()) {
$courses[$record['opigno_class_courses_target_id']] = $record['opigno_class_courses_target_id'];
}
return $courses;
}
/**
* Implements hook_views_query_alter().
*/
function opigno_class_app_views_query_alter(&$view, &$query) {
//Removes the courses that are part of classes that you are part of
if ($view->name == "active_trainings") {
global $user;
$memberships = og_get_groups_by_user($user, "node");
foreach ($memberships as $membership) {
$courses = opigno_class_app_courses_of_class_that_user_is_part_of($membership);
foreach ($courses as $course) {
if (og_is_member("node", $course, 'user', $user, $states = array(
OG_STATE_ACTIVE,
))) {
unset($memberships[$course]);
}
}
}
if (!empty($memberships)) {
$view->query->where[] = array(
'conditions' => array(
array(
'field' => 'og_membership.gid',
'value' => $memberships,
'operator' => 'IN',
),
),
'args' => array(),
'type' => 'AND',
);
}
}
}
/**
* Implements hook_views_data().
*/
function opigno_class_app_views_data() {
$data['node']['filter_courses_from_classes'] = array(
'title' => t('Hide courses from classes'),
'help' => t('This filter will remove the courses from the view if the class is already showing up'),
'filter' => array(
'handler' => 'opigno_class_app_filter_courses_from_classes',
),
);
return $data;
}
/*
* Function get class courses
*/
function opigno_class_app_get_class_courses($node) {
$courses = array();
if (module_exists("opigno_sort_groups")) {
return opigno_sort_group_courses($node);
}
else {
if (isset($node->opigno_class_courses[LANGUAGE_NONE])) {
foreach ($node->opigno_class_courses[LANGUAGE_NONE] as $cindex => $course) {
$courses[] = $course['target_id'];
}
}
}
return $courses;
}
Functions
Name![]() |
Description |
---|---|
opigno_class_app_classes_of_course_that_user_is_part_of | |
opigno_class_app_class_results | Page callback: display class results. |
opigno_class_app_courses_of_class_that_user_is_part_of | |
opigno_class_app_get_class_courses | |
opigno_class_app_menu | Implements hook_menu(). |
opigno_class_app_menu_alter | Implements hook_menu_alter(). |
opigno_class_app_menu_local_tasks_alter | Implements hook_menu_local_tasks_alter(). |
opigno_class_app_og_permission | Implements hook_og_permission(). |
opigno_class_app_permission | Implements hook_permission(). |
opigno_class_app_user_results | Page callback: view user results. Overwrite callback from Quiz app, group courses by class. |
opigno_class_app_views_api | Implements hook_views_api(). |
opigno_class_app_views_data | Implements hook_views_data(). |
opigno_class_app_views_default_views_alter | Implements of hook_views_default_views_alter(). |
opigno_class_app_views_query_alter | Implements hook_views_query_alter(). |