Hacked By AnonymousFox
index.php 0000644 00000012544 15200307662 0006373 0 ustar 00 <?php
/* For licensing terms, see /license.txt */
/**
* Reports
* @author Arnaud Ligot <arnaud@cblue.be>
* @copyrights CBLUE SPRL 2011
* @package chamilo.reports
*/
exit;
// name of the language file that needs to be included
$language_file = array('reportlib');
$cidReset = true;
// including files
require_once '../inc/global.inc.php';
require_once 'reports.lib.php';
// protect script
api_block_anonymous_users();
// defining constants
// current section
$this_section = SECTION_REPORTS;
// setting the name of the tool
$tool_name=get_lang('Reports');
// Displaying the header
foreach (array('jquery.ba-bbq.min.js', 'jquery.validate.js', 'jquery.form.js', 'jquery.form.wizard.js', 'jquery.dataTables.min.js') as $js)
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/'.$js.'" type="text/javascript" language="javascript"></script>'."\n";
// FIXME
$htmlHeadXtra[] = ' <style type="text/css">
#reportsBuilderWizard {
padding : 1em;
width : 500px;
border-style: solid;
border-color: #0daee4;
}
#fieldWrapper {
}
#wizardNavigation {
margin-top : 0.5em;
margin-right : 1em;
text-align: right;
}
#data {
font-size : 0.7em;
}
input {
margin-right: 0.1em;
margin-bottom: 0.5em;
}
.input_field_25em {
width: 2.5em;
}
.input_field_3em {
width: 3em;
}
.input_field_35em {
width: 3.5em;
}
.input_field_12em {
width: 12em;
}
label {
margin-bottom: 0.2em;
font-weight: bold;
font-size: 0.8em;
}
label.error {
color: red;
font-size: 0.8em;
margin-left : 0.5em;
}
.step span {
float: right;
font-weight: bold;
padding-right: 0.8em;
}
.navigation_button {
width : 70px;
}
#data {
overflow : auto;
display: none;
}
.result {
padding-top: 15px;
}
#result2 {
margin: 50px;
}
#result3 {
margin: 100px;
}
#result4 {
margin: 150px;
}
select.link, select.link:hover {
color: black;
}
</style>';
$htmlCSSXtra[] = 'dataTable.css';
reports_loadTemplates();
Display::display_header($tool_name);
?>
<div id="reportsBuilderWizard">
<h3><?php get_lang('Reports'); ?></h3>
<div id='wizardContent'>
<p><?php echo get_lang('PleaseFillFormToBuildReport'); ?></p>
<h5 id="status"></h5>
<form id="reportsBuilderWizardForm" method="post" action="reports.php" class="bbq">
<div id="fieldWrapper">
<span class="step" id="first">
<span class="font_normal_07em_black"><?php echo get_lang('PleaseChooseReportType'); ?></span><br />
<label for="type"><?php echo get_lang('ReportType'); ?></label><br />
<select class="input_field_12em link required" name="type" id="type">
<?php
foreach ($reports_template as $key => $value) {
echo '<option value="'.$key.'">'.$value['description'].'</option>';
}
?>
</select><br />
</span>
<?php
foreach ($reports_template as $key => $value) {
echo $value['wizard'];
}
?>
<span id="format" class="step submit_step">
<span class="font_normal_07em_black"><?php echo get_lang('ReportFormat'); ?></span><br />
<select name="format" id="format">
<option value="html">HTML</option>
<option value="csv">CSV</option>
<option value="sql">SQL</option>
<option value="link"><?php echo get_lang('ReportTypeLink'); ?></option>
</select><br />
</span>
</div>
<div id="wizardNavigation">
<input class="navigation_button" id="back" value="<?php echo get_lang('Back'); ?>" type="reset" />
<input class="navigation_button" id="next" value="<?php echo get_lang('Next'); ?>" type="submit" />
</div>
</form>
<hr />
</div>
<div id="wizardShowButton">
<?php echo get_lang('ShowWizard'); ?>
</div>
<p id="data"></p>
</div>
<div id="result" class="result">
</div>
<div id="result2" class="result">
</div>
<div id="result3" class="result">
</div>
<div id="result4" class="result">
</div>
<script type="text/javascript">
$(function(){
$("#wizardShowButton").hide();
$("#wizardShowButton").click(function() {
$("#wizardContent").show();
$("#wizardShowButton").hide();
});
$("#reportsBuilderWizardForm").formwizard({
formPluginEnabled: true,
validationEnabled: true,
focusFirstInput : true,
formOptions :{
success: function(data){
$("#wizardContent").hide();
$("#wizardShowButton").show();
$(".result").html('');
$("#result").html(data);
},
beforeSubmit: function(data){$("#data").html("data sent to the server: " + $.param(data));},
resetForm: false
}
}
);
});
function setSubDataUri(elem, uri) {
$.ajax({
url: uri,
success: function(data) {
$(elem).closest('.result').nextAll().html('');
$(elem).closest('.result').next().html(data);
}
});
}
</script>
<?
// Footer
Display::display_footer();
multiquery.lib.php 0000644 00000003136 15200307662 0010246 0 ustar 00 <?php
// get fields informations
function multiquery_query($array) {
$result = array();
$field = 0;
for ($i = 0; $i <sizeof($array); $i++) {
// mysql handler
$result[$i]['mysql'] = mysql_query($array[$i]);
if (! $result[$i]['mysql'])
die("error in query $i : ".$array[$i]);
// fields
$result[$i]['num_fields'] = mysql_num_fields($result[$i]['mysql']);
for ($j = 0; $j < $result[$i]['num_fields']; $j++) {
$name = mysql_field_name($result[$i]['mysql'], $j);
$result['field'][$field]['query']=$i;
$result['field'][$field]['name']=$name;
$result['field'][$field]['id']=$j;
$result['field_assoc'][$name][$field];
$field++;
}
}
$result['num_queries'] = sizeof($array);
// rows
$numberOfResult = mysql_num_rows($result[0]['mysql']);
for ($i = 1; $i <$result['num_queries']; $i++)
if ($numberOfResult != mysql_num_rows($result[$i]['mysql']))
die("wrong number of row: $numberOfResult vs ".
mysql_num_rows($result[$i]['mysql'])." on query $i");
$result['num_rows'] = $numberOfResult;
$result['num_fields'] = $field;
return $result;
}
function multiquery_num_rows(&$mq_h) {
return $mq_h['num_rows'];
}
function multiquery_num_fields(&$mq_h) {
return $mq_h['num_fields'];
}
function multiquery_field_name(&$mq_h, $id) {
return $mq_h['field'][$id]['name'];
}
function multiquery_fetch_row(&$mq_h) {
$result = array();
$pos = 0;
for ($i = 0; $i < $mq_h['num_queries']; $i++) {
$row = mysql_fetch_row($mq_h[$i]['mysql']);
if (!$row) return false; // last line
for ($j = 0; $j < sizeof($row); $j++) {
$result[$pos] = $row[$j];
$pos++;
}
}
return $result;
}
reports.cli.php 0000644 00000002406 15200307662 0007524 0 ustar 00 <?php
require_once 'reports.lib.php';
$longopts = array(
'course:',
'tool:',
'ci:',
'cn:',
'sci:',
'scn:',
'ssci:',
'sscn:',
'link:',
'addValue',
'addKey',
'help',
'clearAll',
'score:',
'progress:',
'time:',
'attempt:',
'session:',
'attempt:',
'uid:',
'key:',
'addDBKeys',
'build');
$options = getopt("", $longopts);
echo "\n\n";
if (array_key_exists('help', $options))
echo "help message\n";
else if (array_key_exists('clearAll', $options)) {
reports_clearAll();
echo Database::error();
} else if (array_key_exists('build', $options)) {
reports_build();
echo Database::error();
} else if (array_key_exists('addDBKeys', $options)) {
reports_addDBKeys();
echo Database::error();
} else if (array_key_exists('addValue', $options)) {
reports_addValue($options['key'], $options['session'], $options['uid'],
$options['attempt'], $options['score'],
$options['progress'], $options['time']);
echo Database::error();
} else if (array_key_exists('addKey', $options)) {
echo reports_addKey($options['course'], $options['tool'],
$options['ci'], $options['cn'],
$options['sci'], $options['scn'],
$options['ssci'], $options['sscn'],
$options['link']);
echo "\n";
echo Database::error();
} else
echo "action not found\n";
echo "\n";
?>
reports.cron.php 0000644 00000000254 15200307662 0007715 0 ustar 00 <?php
require_once 'reports.lib.php';
reports_clearAll();
echo Database::error();
reports_build();
echo Database::error();
reports_addDBKeys();
echo Database::error();
?>
reports.lib.php 0000644 00000020430 15200307662 0007520 0 ustar 00 <?php
require_once '../inc/global.inc.php';
define ('REPORTS_PROGRESS_COMPLETED', 1);
$reports_modules = array();
$reports_enabled_modules = array('quiz','course','scorm');
$reports_enabled_templates = array('exercicesMultiCourses', 'courseTime', 'courseArticulate');
// load templates
function reports_loadTemplates() {
global $reports_enabled_templates, $reports_template;
foreach ($reports_enabled_templates as $t)
require_once 'templates/'.$t.'.reports.php';
}
// clear all reporting data
/*
function reports_clearAll() {
//Database::query('DELETE FROM '.Database::get_main_table(TABLE_MAIN_REPORTS_KEYS));
//Database::query('DELETE FROM '.Database::get_main_table(TABLE_MAIN_REPORTS_VALUES));
Database::query('DROP TABLE '.Database::get_main_table(TABLE_MAIN_REPORTS_KEYS));
Database::query('DROP TABLE '.Database::get_main_table(TABLE_MAIN_REPORTS_VALUES));
Database::query('
CREATE TABLE '.Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).' (
id int unsigned NOT NULL AUTO_INCREMENT primary key,
course_id int unsigned DEFAULT NULL,
tool_id int unsigned DEFAULT NULL,
child_id int unsigned DEFAULT NULL,
child_name varchar(64) DEFAULT NULL,
subchild_id int unsigned DEFAULT NULL,
subchild_name varchar(64) DEFAULT NULL,
subsubchild_id int unsigned DEFAULT NULL,
subsubchild_name varchar(64) DEFAULT NULL,
link varchar(256) DEFAULT NULL)');
Database::query('
CREATE TABLE '.Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).' (
key_id int unsigned NOT NULL,
user_id int unsigned NOT NULL,
session_id int unsigned NOT NULL,
attempt int NOT NULL,
score decimal(5,3) DEFAULT NULL,
progress int DEFAULT NULL,
report_time int DEFAULT NULL,
ts datetime DEFAULT NULL)');
}
function reports_addDBKeys() {
// cannot had this primary key here due to mysql restrction on auto_increment
// Database::query('alter table '.Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).
// ' primary key(id)');
Database::query('alter ignore table '.
Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).
' add index(course_id)');
Database::query('alter table '.
Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).
' add index(course_id,tool_id,child_id,subchild_id,subsubchild_id)');
Database::query('alter ignore table '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' add index(user_id)');
Database::query('alter ignore table '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' add primary key(key_id,user_id,session_id,attempt)');
}
// build all reporting data
function reports_build() {
global $reports_enabled_modules, $reports_modules;
// include + init
foreach($reports_enabled_modules as $module) {
require_once('modules/'.$module.'.php');
$initFunc = 'reports_modules_'.$module.'_init';
$initFunc();
}
// init For Each Courses
foreach($reports_enabled_modules as $module) {
$initFuncFEC = 'reports_modules_'.$module.'_init_forEachCourses';
foreach(CourseManager::get_courses_list() as $course)
$initFuncFEC($course['code'], $course['id'],
$course['db_name']);
}
// fetch data
foreach($reports_enabled_modules as $module)
foreach ($reports_modules[$module] as $keys)
reports_automaticAdd($keys['keys_query'],
$keys['values_query_function']);
}
// add a key and returns his id
// field are not checked for insertion since this function is for internal
// use only
function reports_addKey($course_id, $tool_id,
$child_id, $child_name,
$subchild_id, $subchild_name,
$subsubchild_id, $subsubchild_name,
$link) {
Database::query('INSERT into '.
Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).
' (id, course_id, tool_id, child_id, child_name, '.
'subchild_id, subchild_name, subsubchild_id, subsubchild_name,'.
'link ) values (null, '.
($course_id == '' ? 'NULL' :$course_id).', '.
($tool_id == '' ? 'NULL' :$tool_id).', '.
($child_id == '' ? 'NULL' :$child_id).', '.
($child_name == '' ? 'NULL' :"'$child_name'").', '.
($subchild_id == '' ? 'NULL' :$subchild_id).', '.
($subchild_name == '' ? 'NULL' : "'$subchild_name'").', '.
($subsubchild_id == '' ? 'NULL' : $subsubchild_id).', '.
($subsubchild_name == '' ? 'NULL' : "'$subsubchild_name'").', '.
($link == '' ? 'NULL' : "'$link'").')');
return Database::insert_id();
}
// add a value
function reports_addValue($key, $session, $uid, $attempt, $score,
$progress, $time, $ts) {
Database::query('INSERT into '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' (key_id, user_id, session_id, attempt, score, '.
'progress, report_time) values ('.$key.', '.
$uid.', '.
// -1 instead of null because of primary key limitation with null column
($session == '' ? '-1' : $session).', '.
($attempt == '' ? '-1' : $attempt).', '.
($score == '' ? 'NULL' : $score).', '.
($progress == '' ? 'NULL' : $progress).', '.
($time == '' ? 'NULL' : $time).', '.
($ts == '' ? 'NULL' : $ts).')');
}
// add a value using a sub query warning take care about the order of the fields
function reports_addValueQuery($query) {
Database::query('INSERT into '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' (key_id, user_id, session_id, attempt, score, '.
'progress, report_time, ts) ('.$query.')');
}
*/
// return tools ID (parametre is a constant from main_api
function reports_getToolId($tool) {
$tools = array_flip(api_get_tools_lists());
if (array_key_exists($tool, $tools))
return $tools[$tool];
else
return null;
}
// return a sql clause returning triplet of (course, $session, $uid) the
// current user is authorized to reed
function reports_getVisibilitySQL () {
return "select cru.user_id from ".Database::get_main_table(TABLE_MAIN_COURSE_USER).' cru';
// fixme sessions
}
// this function execute keys_query (SQL statement)
// each rows may returns following fields course_id, tool_id, child_id,
// child_name, subchild_id, subchild_name, subsubchild_id, subsubchild_name,
// link
// row may contains other fields.
// rows are parsed using fetch_assoc
// assoc array are then given to values_query_function
// this function must return a assoc array
// return["type"] should be either 'static' or 'sql'
// return["static"] should contains an array of assoc array which may
// includes following headers: session, user_id, attempt, score progress and
// time.
// return["sql"] (when type==sql) an sql query returning the same fields.
// this sql stateuement MUST include a field key_id with the value given
// to the function as parametre. This statement will be passed to
// reports_addValueQuery
/*
function reports_automaticAdd($keys_query, $values_query_function) {
$keys_result = Database::query($keys_query);
if (!$keys_query) {
echo 'folowwing keys_query failed: '.$keys_query."\n";
return;
}
$num = Database::num_rows($keys_result);
for ($i = 0; $i < $num; $i++) {
$keys = Database::fetch_assoc($keys_result);
$key_id = reports_addKey(
array_key_exists('course_id', $keys) ? $keys['course_id'] : '',
array_key_exists('tool_id', $keys) ? $keys['tool_id'] : '',
array_key_exists('child_id', $keys) ? $keys['child_id'] : '',
array_key_exists('child_name', $keys) ? $keys['child_name'] : '',
array_key_exists('subchild_id', $keys) ? $keys['subchild_id'] : '',
array_key_exists('subchild_name', $keys) ? $keys['subchild_name'] : '',
array_key_exists('subsubchild_id', $keys) ? $keys['subsubchild_id'] : '',
array_key_exists('subsubchild_name', $keys) ? $keys['subsubchild_name'] : '',
array_key_exists('link', $keys) ? $keys['link'] : '');
$values = $values_query_function($keys, $key_id);
if ($values['type'] == 'static')
for ($j = 0; $j<sizeof($values['static']); $j++)
reports_addValue($key_id,
array_key_exists('session', $values['static'][$j]) ? $values['static'][$j]['session'] : '',
array_key_exists('user_id', $values['static'][$j]) ? $values['static'][$j]['user_id'] : '',
array_key_exists('attempt', $values['static'][$j]) ? $values['static'][$j]['attempt'] : '',
array_key_exists('score', $values['static'][$j]) ? $values['static'][$j]['score'] : '',
array_key_exists('progress', $values['static'][$j]) ? $values['static'][$j]['progress'] : '',
array_key_exists('report_time', $values['static'][$j]) ? $values['static'][$j]['report_time'] : '',
array_key_exists('ts', $values['static'][$j]) ? $values['static'][$j]['ts'] : '');
else
reports_addValueQuery($values['sql']);
}
}*/
reports.php 0000644 00000015261 15200307662 0006761 0 ustar 00 <?php
/* For licensing terms, see /license.txt */
/**
* Reports
* @author Arnaud Ligot <arnaud@cblue.be>
* @copyrights CBLUE SPRL 2011
* @package chamilo.reports
*/
exit;
// name of the language file that needs to be included
$language_file = array('reportlib');
$cidReset = true;
// including files
require_once '../inc/global.inc.php';
require_once 'reports.lib.php';
require_once 'multiquery.lib.php';
// protect script
api_block_anonymous_users();
// defining constants
// current section
$this_section = SECTION_REPORTS;
// setting the name of the tool
$tool_name=get_lang('Reports');
// loading templates
reports_loadTemplates();
// random suffix for div id (to enable multiple report per page)
$idsuffix = rand();
// "Link" type
if ($_REQUEST['format'] == 'link') {
// converting post vars to get uri
$params = '';
$kv = array();
foreach ($_POST as $key => $value)
if ($key != 'format')
$kv[] = $key.'='.urlencode($value);
$query_string = join("&", $kv);
die('<a href="reports.php?format=directlink&'.$query_string.'">'.get_lang('ReportTypeLink').'</a>');
}
if ($_REQUEST['format'] == 'directlink') {
foreach (array('jquery.dataTables.min.js') as $js)
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/'.$js.'" type="text/javascript" language="javascript"></script>'."\n";
$htmlCSSXtra[] = 'dataTable.css';
?>
<script type="text/javascript">
function setSubDataUri(elem, uri) {
$.ajax({
url: uri,
success: function(data) {
$(elem).closest('.result').nextAll().html('');
$(elem).closest('.result').next().html(data);
}
});
}
</script>
<?php
Display::display_header($tool_name);
echo '<div id="result" class="result">';
}
// outputing a link to csv file instead of outputing csv data directly
if ($_REQUEST['format'] == 'csv') {
// converting post vars to get uri
$params = '';
$kv = array();
foreach ($_POST as $key => $value)
if ($key != 'format')
$kv[] = $key.'='.urlencode($value);
$query_string = join("&", $kv);
die('<a href="reports.php?format=downloadcsv&'.$query_string.'">'.get_lang('DownloadFile').'</a>');
} else if ($_REQUEST['format'] == 'downloadcsv') {
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') == false)) {
header("Pragma: must-revalidate");
header("Cache-Control: must-revalidate");
header("Content-type: application/vnd.ms-excel");
}
else {
header("Content-type: text/csv");
}
$date = date("Y-m-d");
$filename = "reporting-$date.csv";
header("Content-Disposition: attachment; filename=$filename");
$_REQUEST['format'] = 'csv';
}
if (is_array($reports_template[$_REQUEST['type']])) {
$query = $reports_template[$_REQUEST['type']]['getSQL']();
if (! is_array($query))
$query = array($query);
if ($_REQUEST['format'] == 'sql')
die(var_export($query, true));
$result = multiquery_query($query);
// check number of result
$numberOfResult = multiquery_num_rows($result);
if ($numberOfResult == 0) {
// This case should be taken care of by the display template itself, we should let the script run
//die(get_lang('NoDataAvailable'));
}
} else {
die('<b>'.get_lang('ErrorWhileBuildingReport').'</b>');
}
if ($_REQUEST['format'] == 'html' || $_REQUEST['format'] == 'directlink') {
if (isset($reports_template[$_REQUEST['type']]['html_header'])) {
echo $reports_template[$_REQUEST['type']]['html_header'];
}
echo '<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
$("#reportsData'.$idsuffix.'").dataTable({
"oLanguage":
{
"sProcessing": "Traitement en cours...",
"sLengthMenu": "Afficher _MENU_ éléments",
"sZeroRecords": "Aucun élément à afficher",
"sInfo": "Affichage de l'."'".'élement _START_ à _END_ sur _TOTAL_ éléments",
"sInfoEmpty": "Affichage de l'."'".'élement 0 à 0 sur 0 éléments",
"sInfoFiltered": "(filtré de _MAX_ éléments au total)",
"sInfoPostFix": "",
"sSearch": "Rechercher :",
"sUrl": "",
"oPaginate": {
"sFirst": "Premier",
"sPrevious": "Précédent",
"sNext": "Suivant",
"sLast": "Dernier"
}
}
});
} );
</script>';
echo '<table id="reportsData'.$idsuffix.'" class="display">'; // FIXME style
// counting fields
$nfields = multiquery_num_fields($result);
$columns = array();
$columns_islink = array();
echo '<thead><tr>';
for ($i=0; $i < $nfields; $i++) {
$columns[$i] = multiquery_field_name($result, $i);
if (substr($columns[$i], -5, 5) != '_link') {
$column_islink[$i] = false;
echo '<th>'.$columns[$i].'</th>';
} else
$columns_islink[$i] = true;
}
// checking resolving link column id
$columns_flip = array_flip($columns);
$columns_link = array();
for ($i=0; $i < $nfields; $i++)
if ($column_islink[$i] == false && array_key_exists($columns[$i].'_link', $columns_flip))
$columns_link[$i] = $columns_flip[$columns[$i].'_link'];
else
$columns_link[$i] = '';
echo '</tr></thead><tbody>';
while ($row = multiquery_fetch_row($result)) {
echo '<tr>';
for ($i = 0; $i<$nfields; $i++)
if (!$columns_islink[$i]){ // ignore links
if ($columns_link[$i] != '') // link is defined
if (substr($columns_link[$i],0,10) == 'javascript') {
echo '<td><a href="#" onclick="'.$row[$columns_link[$i]].'">'.$row[$i].'</a></td>';
}
else {
echo '<td><a href="'.$row[$columns_link[$i]].'">'.$row[$i].'</a></td>';
}
else
echo '<td>'.$row[$i].'</td>';
}
echo "</tr>\n";
}
echo '</tbody></table>';
if ($_REQUEST['format'] == 'directlink') {
echo '</div>
<div id="result2" class="result" style="margin: 50px;">
</div>
<div id="result3" class="result" style="margin: 100px;">
</div>
<div id="result4" class="result" style="margin: 150px;">
</div>';
Display::display_footer();
}
} else if ($_REQUEST['format'] == 'csv') {
$nfields = multiquery_num_fields($result);
$columns = array();
$columns_islink = array();
for ($i=0; $i < $nfields; $i++) {
$columns[$i] = multiquery_field_name($result, $i);
if (substr($columns[$i], -5, 5) != '_link') {
$column_islink[$i] = false;
echo csv_escaping($columns[$i]).',';
} else
$columns_islink[$i] = true;
}
echo "\n";
while ($row = multiquery_fetch_row($result)) {
for ($i = 0; $i<$nfields; $i++)
if (!$columns_islink[$i]) // ignore links
echo csv_escaping($row[$i]).','; // fixme
echo "\n";
}
} else die(get_lang('UnknownFormat'));
function csv_escaping($value, $csv_separator = ',') {
$value = str_replace('"','""',$value);
if (strpos($value, '""') or strpos($value, $csv_separator) or $value != trim($value) ) {
$value = '"'.$value.'"';
}
return $value;
}
?>
modules/quiz.php 0000644 00000002114 15200307662 0007714 0 ustar 00 <?php
$reports_modules['quiz'] = array ();
function reports_modules_quiz_init() {
}
function reports_modules_quiz_init_forEachCourses($course_code, $course_id, $course_db) {
global $reports_modules;
$reports_modules_quiz_toolid = reports_getToolId(TOOL_QUIZ);
array_push($reports_modules['quiz'],
array('keys_query' =>
'select '.$course_id.' as course_id, '.
$reports_modules_quiz_toolid.' as tool_id, '.
'q.id as child_id, q.title as child_name, '.
"'".$course_code."'".' as course_code from '.Database::get_course_table(TABLE_QUIZ_TEST).' q ',
'values_query_function' => 'reports_modules_quiz_quizVal'));
}
function reports_modules_quiz_quizVal($quiz, $key_id) {
return array('type'=> 'sql', 'sql' =>
'select '.$key_id.', exe_user_id as uid, '.
'session_id, -1 as attempt, exe_result as score, '.
REPORTS_PROGRESS_COMPLETED.' as progress, '.
'exe_duration as time, exe_date as ts from '.
Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES).
' where exe_cours_id = '."'".$quiz['course_code']."'".
' and exe_exo_id='.$quiz['child_id']);
}
modules/scorm.php 0000644 00000010322 15200307662 0010047 0 ustar 00 <?php
$reports_modules['scorm'] = array ();
function reports_modules_scorm_init() {
}
function reports_modules_scorm_init_forEachCourses($course_code, $course_id, $course_db) {
global $reports_modules;
$reports_modules_scorm_toolid = reports_getToolId(TOOL_LEARNPATH);
// package level
array_push($reports_modules['scorm'],
array('keys_query' =>
'select '.$course_id.' as course_id, '.
$reports_modules_scorm_toolid.' as tool_id, '.
'lp.id as child_id, lp.name as child_name, '.
"'".$course_db."'".' as course_db from '.
Database::get_course_table(TABLE_LP_MAIN).' lp',
'values_query_function' => 'reports_modules_scorm_packageVal'));
// sco level
array_push($reports_modules['scorm'],
array('keys_query' =>
'select '.$course_id.' as course_id, '.
$reports_modules_scorm_toolid.' as tool_id, '.
'lp.id as child_id, lp.name as child_name, '.
'lpi.id as subchild_id, lpi.title as subchild_name, '.
"'".$course_db."'".' as course_db from '.
Database::get_course_table(TABLE_LP_MAIN, $course_db).
' lp,'.
Database::get_course_table(TABLE_LP_ITEM, $course_db).
' lpi where lp.id = lpi.lp_id',
'values_query_function' => 'reports_modules_scorm_scoVal'));
// objectives level
array_push($reports_modules['scorm'],
array('keys_query' =>
'select distinct '.$course_id.' as course_id, '.
$reports_modules_scorm_toolid.' as tool_id, '.
'lp.id as child_id, lp.name as child_name, '.
'lpi.id as subchild_id, '.
'lpi.title as subchild_name, '.
'null as subsubchild_id, '.
'lpivo.objective_id as subsubchild_name, '.
"'".$course_db."'".' as course_db from '.
Database::get_course_table(TABLE_LP_MAIN, $course_db).
' lp,'.
Database::get_course_table(TABLE_LP_ITEM, $course_db).
' lpi, '.
Database::get_course_table(TABLE_LP_ITEM_VIEW, $course_db).
' lpiv, '.
Database::get_course_table(TABLE_LP_IV_OBJECTIVE, $course_db).
' lpivo '.
'where lp.id = lpi.lp_id '.
'and lpi.id = lpiv.lp_item_id '.
'and lpiv.id = lpivo.lp_iv_id ',
'values_query_function' => 'reports_modules_scorm_objVal'));
}
function reports_modules_scorm_packageVal($scorm, $key_id) {
return array('type'=> 'sql', 'sql' =>
'select '.$key_id.', user_id as uid, '.
'session_id, view_count as attempt, null as score, '.
'progress as progress, '.
'null as time, null as ts from '.
Database::get_course_table(TABLE_LP_VIEW, $scorm['course_db']).
' where lp_id = '.$scorm['child_id']);
}
function reports_modules_scorm_scoVal($scorm, $key_id) {
return array('type'=> 'sql', 'sql' =>
'select '.$key_id.', lpv.user_id as uid, '.
'lpv.session_id, lpiv.view_count as attempt, '.
'lpiv.score as score, '.
'(case lpiv.status '.
'when "incomplete" then 0 '.
'when "completed" then 1 '.
'when "passed" then 2 '.
'when "failed" then 3 '.
'when "browsed" then 4 '.
'when "not attempted" then 5 '.
'else 6 '.
'end) as progress, '.
'lpiv.total_time as time, null as ts from '.
Database::get_course_table(TABLE_LP_VIEW, $scorm['course_db']).
' lpv, '.
Database::get_course_table(TABLE_LP_ITEM_VIEW, $scorm['course_db']).
' lpiv '.
' where lpv.lp_id = '.$scorm['child_id'].
' and lpiv.lp_item_id = '.$scorm['subchild_id'].
' and lpiv.lp_view_id = lpv.id');
}
function reports_modules_scorm_objVal($scorm, $key_id) {
return array('type'=> 'sql', 'sql' =>
'select '.$key_id.', lpv.user_id as uid, '.
'lpv.session_id, lpiv.view_count as attempt, '.
'lpivo.score_raw as score, '.
'(case lpivo.status '.
'when "incomplete" then 0 '.
'when "completed" then 1 '.
'when "passed" then 2 '.
'when "failed" then 3 '.
'when "browsed" then 4 '.
'when "not attempted" then 5 '.
'else 6 '.
'end) as progress, '.
'null as time, null as ts from '.
Database::get_course_table(TABLE_LP_VIEW, $scorm['course_db']).
' lpv, '.
Database::get_course_table(TABLE_LP_ITEM_VIEW, $scorm['course_db']).
' lpiv, '.
Database::get_course_table(TABLE_LP_IV_OBJECTIVE, $scorm['course_db']).
' lpivo '.
' where lpv.lp_id = '.$scorm['child_id'].
' and lpiv.lp_item_id = '.$scorm['subchild_id'].
' and lpivo.objective_id = "'.$scorm['subsubchild_name'].'" '.
' and lpiv.lp_view_id = lpv.id'.
' and lpivo.lp_iv_id=lpiv.id');
}
modules/course.php 0000644 00000001661 15200307662 0010232 0 ustar 00 <?php
$reports_modules['course'] = array ();
function reports_modules_course_init() {
}
function reports_modules_course_init_forEachCourses($course_code, $course_id, $course_db) {
global $reports_modules;
// $reports_modules_course_toolid = reports_getToolId(TOOL_QUIZ);
array_push($reports_modules['course'],
array('keys_query' =>
'select '.$course_id.' as course_id, "'.$course_code.'" as course_code',
'values_query_function' => 'reports_modules_course_val'));
}
function reports_modules_course_val($course, $key_id) {
return array('type'=> 'sql', 'sql' =>
'select '.$key_id.', user_id as uid, '.
'-1 as session_id, -1 as attempt, null as score, '.
'NULL as progress, '.
'(sum(logout_course_date) - sum(login_course_date)) as time, null as ts from '.
Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS).
' where course_code = '."'".$course['course_code']."'".
' group by user_id');
}
templates/courseTime.reports.php 0000644 00000002653 15200307662 0013076 0 ustar 00 <?php
/*
$reports_template['courseTime'] = array(
'description' => 'Time spent by students in each courses',
'getSQL' => 'reports_template_courseTime_getSQL',
'wizard' =>
'
<span id="courseTime" class="step">
<span class="font_normal_07em_black">This test does not need any particular settings</span><br />
<input type="hidden" class="link" value="format" />
</span>
');*/
function reports_template_courseTime_getSQL() {
// fetch columns
$result = array();
$query = 'select r.id as kid, c.title as course '.
'from '.
Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).' r, '.
Database::get_main_table(TABLE_MAIN_COURSE).' c '.
'where r.course_id=c.id and r.tool_id is null and r.child_id is null'.
' order by c.title';
$columns = Database::query($query);
if (Database::num_rows($columns) == 0)
die('<b>'.get_lang('no data found: '.$query).'</b>');
$columns = Database::store_result($columns);
// fetch data
$query = 'select u.lastname Name, u.firstname Firstname';
foreach ($columns as $key => $column)
$query .= ', sec_to_time(k'.$key.'.report_time) as `'.
$column['course'].'` ';
$query .= ' from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
foreach ($columns as $key => $column) // fixme sessions
$query .= 'left outer join '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' k'.$key.
' on k'.$key.'.key_id = '.$column['kid'].
' and k'.$key.'.user_id = u.user_id ';
return $query;
}
templates/courseArticulate.reports.php 0000644 00000011647 15200307662 0014300 0 ustar 00 <?php
$reports_template['CourseArticulate'] = array(
'description' => 'CourseArticulate',
'getSQL' => 'reports_template_CourseArticulate_getSQL',
'wizard' =>
'
<span id="CourseArticulate" class="step">
<span class="font_normal_07em_black">This report does not need any particular settings</span><br />
<input type="hidden" class="link" value="format" />
</span>
');
function reports_template_CourseArticulate_getSQL() {
// settings
// Nom, prenom
$query = 'select u.lastname as "Last name", u.firstname as "First name" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' order by u.user_id ';
$queries[0] = $query;
// Custom Field
foreach (array("tags" => "tags") as $k => $v) { // FIXME
$query = 'select ufv.field_value as "'.$v.'" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= 'left join'.Database::get_main_table(TABLE_MAIN_USER_FIELD).' uf ';
$query .= ' on uf.field_variable="'.$k.'" ';
$query .= 'left outer join '.Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES).' ufv ';
$query .= ' on ufv.user_id = u.user_id and ufv.field_id = uf.id ';
$query .= 'where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' order by u.user_id ';
$queries[] = $query;
}
// Stored Value
$sv = array();
foreach ($sv as $k => $v) {
if (!isset($v['sql']))
$v['sql'] = 'FIELD';
$sqlField = str_replace('FIELD', 'sv.sv_value', $v['sql']);
$query = 'select '.$sqlField.' as "'.$v['title'].'" ';
// $query = 'select sec_to_time(sv.sv_value) as "'.$v.'" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= ' left outer join '.Database::get_main_table(TABLE_TRACK_STORED_VALUES).' sv ';
$query .= 'on sv.user_id = u.user_id and sv_key = "'.$k.'" ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' group by u.user_id ';
$query .= ' order by u.user_id ';
$queries[] = $query;
}
// first and last connection
$query = 'select min(tel.login_date) as "First connection", max(tel.logout_date) as "Latest connection" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= 'left outer join '.Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN).' tel ';
$query .= ' on tel.login_user_id = u.user_id ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' group by u.user_id ';
$query .= ' order by u.user_id ';
$queries[] = $query;
// SCORM Data
$scormData = array();
$course_list = CourseManager::get_real_course_list();
foreach ($course_list as $code => $details) {
$list = Database::query('SELECT l.id as lid, l.name as lname, li.id as liid, li.title as lititle '.
' FROM '.Database::get_course_table(TABLE_LP_MAIN).' l, '.Database::get_course_table(TABLE_LP_ITEM).' li '.
' WHERE l.c_id = '.$details['real_id'].' AND li.c_id = '.$details['real_id'].' AND l.id = li.lp_id');
while ($lpItem = Database::fetch_assoc($list)) {
$scormData[] = array('coursedb' => $details['db_name'],
'lid' => $lpItem['lid'],
'liid' => $lpItem['liid'],
'target_view_count' => 1,
'target_indicator' => 'score',
'title' => $details['title'].'/'.$lpItem['lname'].'/'.$lpItem['lititle'].'/1/score',
'sql' => 'FIELD');
$scormData[] = array('coursedb' => $details['db_name'],
'lid' => $lpItem['lid'],
'liid' => $lpItem['liid'],
'target_view_count' => 2,
'target_indicator' => 'score',
'title' => $details['title'].'/'.$lpItem['lname'].'/'.$lpItem['lititle'].'/2/score',
'sql' => 'FIELD');
$scormData[] = array('coursedb' => $details['db_name'],
'lid' => $lpItem['lid'],
'liid' => $lpItem['liid'],
'target_view_count' => null,
'target_indicator' => 'score',
'title' => $details['title'].'/'.$lpItem['lname'].'/'.$lpItem['lititle'].'/all/score',
'sql' => 'avg(FIELD)');
}
}
foreach($scormData as $v) {
if (!isset($v['sql']))
$v['sql'] = 'FIELD';
$sqlField = str_replace('FIELD', $v['target_indicator'], $v['sql']);
$query = 'select '.$sqlField.' as "'.$v['title'].'" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= 'left outer join '.Database::get_course_table(TABLE_LP_VIEW, $details['db_name']).' lv ';
$query .= ' on u.user_id = lv.user_id and lv.lp_id = '.$v['lid'];
$query .= ' left outer join '.Database::get_course_table(TABLE_LP_ITEM_VIEW, $details['db_name']).' liv ';
$query .= ' on lv.id = liv.lp_view_id ';
if ($v['target_view_count'])
$query .= ' and liv.view_count = '.$v['target_view_count'];
$query .= ' and liv.lp_item_id = '.$v['liid'].' ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' group by u.user_id ';
$query .= ' order by u.user_id ';
$queries[] = $query;
}
return $queries;
}
templates/exercicesMultiCourses.reports.php 0000644 00000005433 15200307662 0015307 0 ustar 00 <?php
$reports_template['exercicesMultiCourses'] = array(
'description' => 'Result of each test per student',
'getSQL' => 'reports_template_exercicesMultiCourses_getSQL',
'wizard' =>
'
<span id="exercicesMultiCourses" class="step">
<span class="font_normal_07em_black">Result of each test per student</span><br />
<!-- <label for="scoremin">Score min</label><br />
<input class="input_field_25em" name="scoremin" id="scoremin" value="0"><br />
<label for="scoremax">Score max</label><br />
<input class="input_field_25em" name="scoremax" id="scoremax" value="0"><br />
--> <label for="tattempt">How to treat Attempts</label><br />
<select name="tattempt" id="tattempt">
<!-- <option value="first">take only the first one</option>
<option value="last">take only the last one</option>
--> <option value="avg">take the average value</option>
<option value="min">take the minimum value</option>
<option value="max">take the maximum value</option>
</select><br />
<!-- <label name="gcourses">Do you want to group quiz per courses</label><br />
<select name="gcourses" id="gcourses">
<option value="nogroup">Do not group</option>
<option value="average">group and take the average value</option>
<option value="min">group and take the minimum value</option>
<option value="max">group and take the maximum value</option>
</select></br>
--> <input type="hidden" class="link" value="format" />
</span>
');
function reports_template_exercicesMultiCourses_getSQL() {
// foreach quiz
$result = array();
$columns = Database::query('select r.id as kid, c.title as course, '.
'r.child_name as test from '.
Database::get_main_table(TABLE_MAIN_REPORTS_KEYS).' r, '.
Database::get_main_table(TABLE_MAIN_COURSE).' c '.
'where r.course_id=c.id and r.tool_id='.
reports_getToolId(TOOL_QUIZ).
' order by r.course_id, r.child_name');
if (Database::num_rows($columns) == 0)
die('<b>'.get_lang('no data found').'</b>');
$query = 'select u.lastname Name, u.firstname Firstname';
$columns = Database::store_result($columns);
if ($_REQUEST['tattempt'] == 'min' || $_REQUEST['tattempt'] == 'max')
$function = $_REQUEST['tattempt'];
else
$function = 'avg';
foreach ($columns as $key => $column)
$query .= ', '.$function.'(k'.$key.'.score) as `'.
$column['course'].' - '.
$column['test'].'` ';
$query .= ' from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
foreach ($columns as $key => $column) // fixme sessions
$query .= 'left outer join '.
Database::get_main_table(TABLE_MAIN_REPORTS_VALUES).
' k'.$key.
' on k'.$key.'.key_id = '.$column['kid'].
' and k'.$key.'.user_id = u.user_id ';
$query .= ' group by ';
foreach ($columns as $key => $column) // grouping attempt
$query .= 'k'.$key.'.attempt, ';
$query = substr($query, 0, -2); // removing last ', ';
return $query;
}
templates/generic.reports.php 0000644 00000004200 15200307662 0012361 0 ustar 00 <?php
$reports_template['Generic'] = array(
'description' => 'Generic',
'getSQL' => 'reports_template_Generic_getSQL',
'wizard' =>
'
<span id="Generic" class="step">
<span class="font_normal_07em_black">This report does not need any particular settings</span><br />
<input type="hidden" class="link" value="format" />
</span>
');
function reports_template_Generic_getSQL() {
// settings
// Nom, prenom
$query = 'select u.lastname as "Last name", u.firstname as "First name" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' order by u.user_id ';
$queries[0] = $query;
// Custom Field
foreach (array(10 => "description") as $k => $v) {
$query = 'select ufv.field_value as "'.$v.'" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= 'left outer join '.Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES).' ufv ';
$query .= ' on ufv.user_id = u.user_id and ufv.field_id = '.$k;
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' order by u.user_id ';
$queries[] = $query;
}
// Stored Value
$sv = array();
foreach ($sv as $k => $v) {
$query = 'select sec_to_time(sv.sv_value) as "'.$v.'" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= ' left outer join '.Database::get_main_table(TABLE_TRACK_STORED_VALUES).' sv ';
$query .= 'on sv.user_id = u.user_id and sv_key = "'.$k.'" ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' order by u.user_id ';
$queries[] = $query;
}
// premiere connexion
$query = 'select min(tel.login_date) as "First connection", max(tel.logout_date) as "Latest connection" ';
$query .= 'from '.Database::get_main_table(TABLE_MAIN_USER).' u ';
$query .= 'left outer join '.Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN).' tel ';
$query .= ' on tel.login_user_id = u.user_id ';
$query .= ' where u.user_id in ('.reports_getVisibilitySQL().') ';
$query .= ' group by u.user_id ';
$query .= ' order by u.user_id ';
$queries[] = $query;
return $queries;
}
Hacked By AnonymousFox1.0, Coded By AnonymousFox