Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/main/inc/lib/events.lib.inc.php

556 lines
15 KiB

<?php
/*
==============================================================================
Dokeos - elearning and course management software
Copyright (c) 2004 Dokeos S.A.
Copyright (c) 2003 Ghent University (UGent)
Copyright (c) 2001 Universite catholique de Louvain (UCL)
Copyright (c) Sebastien Piraux
Copyright (c) Toon Van Hoecke
For a full list of contributors, see "credits.txt".
The full license can be read in "license.txt".
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
See the GNU General Public License for more details.
Contact: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
==============================================================================
*/
/**
==============================================================================
* EVENTS LIBRARY
*
* This is the events library for Dokeos.
* Include/require it in your code to use its functionality.
* Functions of this library are used to record informations when some kind
* of event occur. Each event has his own types of informations then each event
* use its own function.
*
* @package dokeos.library
* @todo convert queries to use Database API
==============================================================================
*/
/*
==============================================================================
INIT SECTION
==============================================================================
*/
// REGROUP TABLE NAMES FOR MAINTENANCE PURPOSE
$TABLETRACK_LOGIN = $_configuration['statistics_database']."`.`track_e_login";
$TABLETRACK_OPEN = $_configuration['statistics_database']."`.`track_e_open";
$TABLETRACK_ACCESS = $_configuration['statistics_database']."`.`track_e_access";
$TABLETRACK_DOWNLOADS = $_configuration['statistics_database']."`.`track_e_downloads";
$TABLETRACK_UPLOADS = $_configuration['statistics_database']."`.`track_e_uploads";
$TABLETRACK_LINKS = $_configuration['statistics_database']."`.`track_e_links";
$TABLETRACK_EXERCICES = $_configuration['statistics_database']."`.`track_e_exercices";
$TABLETRACK_SUBSCRIPTIONS = $_configuration['statistics_database']."`.`track_e_subscriptions";
$TABLETRACK_LASTACCESS = $_configuration['statistics_database']."`.`track_e_lastaccess"; //for "what's new" notification
/*
==============================================================================
FUNCTIONS
==============================================================================
*/
/**
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for open event (when homepage is opened)
*/
function event_open()
{
global $_configuration;
global $TABLETRACK_OPEN;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
// @getHostByAddr($_SERVER['REMOTE_ADDR']) : will provide host and country information
// $_SERVER['HTTP_USER_AGENT'] : will provide browser and os information
// $_SERVER['HTTP_REFERER'] : provide information about refering url
$referer = $_SERVER['HTTP_REFERER'];
// record informations only if user comes from another site
//if(!eregi($_configuration['root_web'],$referer))
$pos = strpos($referer, $_configuration['root_web']);
if ($pos === false)
{
$remhost = @ getHostByAddr($_SERVER['REMOTE_ADDR']);
if ($remhost == $_SERVER['REMOTE_ADDR'])
$remhost = "Unknown"; // don't change this
$reallyNow = time();
$sql = "INSERT INTO `".$TABLETRACK_OPEN."`
(`open_remote_host`,
`open_agent`,
`open_referer`,
`open_date`)
VALUES
('".$remhost."',
'".$_SERVER['HTTP_USER_AGENT']."', '".$referer."', FROM_UNIXTIME($reallyNow) )";
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
}
return 1;
}
/**
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for login event
* (when an user identifies himself with username & password)
*/
function event_login()
{
global $_configuration;
global $_user;
global $TABLETRACK_LOGIN;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
$sql = "INSERT INTO `".$TABLETRACK_LOGIN."`
(`login_user_id`,
`login_ip`,
`login_date`)
VALUES
('".$_user['user_id']."',
'".$_SERVER['REMOTE_ADDR']."',
FROM_UNIXTIME(".$reallyNow."))";
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
//return 0;
}
/**
* @param tool name of the tool (name in mainDb.accueil table)
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for access event for courses
*/
function event_access_course()
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_ACCESS;
global $TABLETRACK_LASTACCESS; //for "what's new" notification
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
if(api_get_setting('use_session_mode')=='true' && isset($_SESSION['id_session']))
{
$id_session = intval($_SESSION['id_session']);
}
else
{
$id_session = 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_ACCESS."`
(`access_user_id`,
`access_cours_code`,
`access_date`)
VALUES
(".$user_id.",
'".$_cid."',
FROM_UNIXTIME(".$reallyNow."))";
$res = api_sql_query($sql,__FILE__,__LINE__);
// added for "what's new" notification
$sql = " UPDATE `$TABLETRACK_LASTACCESS`
SET access_date = FROM_UNIXTIME($reallyNow)
WHERE `access_user_id` = ".$user_id." AND `access_cours_code` = '".$_cid."' AND `access_tool` IS NULL AND `access_session_id`=".$id_session;
$res = api_sql_query($sql,__FILE__,__LINE__);
if (mysql_affected_rows() == 0)
{
$sql = " INSERT INTO `$TABLETRACK_LASTACCESS`
(`access_user_id`,`access_cours_code`,`access_date`, access_session_id)
VALUES
(".$user_id.", '".$_cid."', FROM_UNIXTIME($reallyNow), ".$id_session.")";
$res = api_sql_query($sql,__FILE__,__LINE__);
}
// end "what's new" notification
return 1;
}
/**
* @param tool name of the tool (name in mainDb.accueil table)
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for access event for tools
*
* $tool can take this values :
* Links, Calendar, Document, Announcements,
* Group, Video, Works, Users, Exercices, Course Desc
* ...
* Values can be added if new modules are created (15char max)
* I encourage to use $nameTool as $tool when calling this function
*
* Functionality for "what's new" notification is added by Toon Van Hoecke
*/
function event_access_tool($tool, $id_session=0)
{
global $_configuration;
// if tracking is disabled record nothing
// if( ! $_configuration['tracking_enabled'] ) return 0; //commented because "what's new" notification must always occur
global $_user;
global $_cid;
global $TABLETRACK_ACCESS;
global $_configuration;
global $_course;
global $TABLETRACK_LASTACCESS; //for "what's new" notification
if(api_get_setting('use_session_mode')=='true' && isset($_SESSION['id_session']))
{
$id_session = intval($_SESSION['id_session']);
}
else
{
$id_session = 0;
}
$reallyNow = time();
$user_id = $_user['user_id'] ? "'".$_user['user_id']."'" : "NULL"; // "NULL" is anonymous
// record information
// only if user comes from the course $_cid
//if( eregi($_configuration['root_web'].$_cid,$_SERVER['HTTP_REFERER'] ) )
//$pos = strpos($_SERVER['HTTP_REFERER'],$_configuration['root_web'].$_cid);
$pos = strpos(strtolower($_SERVER['HTTP_REFERER']), strtolower(api_get_path(WEB_COURSE_PATH).$_course['path']));
// added for "what's new" notification
$pos2 = strpos(strtolower($_SERVER['HTTP_REFERER']), strtolower($_configuration['root_web']."index"));
// end "what's new" notification
if ($_configuration['tracking_enabled'] && ($pos !== false || $pos2 !== false))
{
$sql = "INSERT INTO `".$TABLETRACK_ACCESS."`
(`access_user_id`,
`access_cours_code`,
`access_tool`,
`access_date`)
VALUES
(".$user_id.",".// Don't add ' ' around value, it's already done.
"'".$_cid."' ,
'".htmlspecialchars($tool, ENT_QUOTES)."',
FROM_UNIXTIME(".$reallyNow."))";
$res = api_sql_query($sql,__FILE__,__LINE__);
}
// "what's new" notification
$sql = " UPDATE `$TABLETRACK_LASTACCESS`
SET access_date = FROM_UNIXTIME($reallyNow)
WHERE `access_user_id` = ".$user_id." AND `access_cours_code` = '".$_cid."' AND `access_tool` = '".htmlspecialchars($tool, ENT_QUOTES)."' AND `access_session_id`=".$id_session;
$res = api_sql_query($sql,__FILE__,__LINE__);
if (mysql_affected_rows() == 0)
{
$sql = "INSERT INTO `$TABLETRACK_LASTACCESS`
(`access_user_id`,`access_cours_code`,`access_tool`, `access_date`, `access_session_id`)
VALUES
(".$user_id.", '".$_cid."' , '".htmlspecialchars($tool, ENT_QUOTES)."', FROM_UNIXTIME($reallyNow), $id_session)";
$res = api_sql_query($sql,__FILE__,__LINE__);
}
return 1;
}
/**
* @param doc_id id of document (id in mainDb.document table)
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for download event
* (when an user click to d/l a document)
* it will be used in a redirection page
* bug fixed: Roan Embrechts
* Roan:
* The user id is put in single quotes,
* (why? perhaps to prevent sql insertion hacks?)
* and later again.
* Doing this twice causes an error, I remove one of them.
*/
function event_download($doc_url)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_DOWNLOADS;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_DOWNLOADS."`
(
`down_user_id`,
`down_cours_id`,
`down_doc_path`,
`down_date`
)
VALUES
(
".$user_id.",
'".$_cid."',
'".htmlspecialchars($doc_url, ENT_QUOTES)."',
FROM_UNIXTIME(".$reallyNow.")
)";
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
return 1;
}
/**
* @param doc_id id of document (id in mainDb.document table)
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for upload event
* used in the works tool to record informations when
* an user upload 1 work
*/
function event_upload($doc_id)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_UPLOADS;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_UPLOADS."`
(
`upload_user_id`,
`upload_cours_id`,
`upload_work_id`,
`upload_date`
)
VALUES
(
".$user_id.",
'".$_cid."',
'".$doc_id."',
FROM_UNIXTIME(".$reallyNow.")
)";
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
return 1;
}
/**
* @param link_id (id in coursDb liens table)
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record information for link event (when an user click on an added link)
* it will be used in a redirection page
*/
function event_link($link_id)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_LINKS;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_LINKS."`
(
`links_user_id`,
`links_cours_id`,
`links_link_id`,
`links_date`
)
VALUES
(
".$user_id.",
'".$_cid."',
'".$link_id."',
FROM_UNIXTIME(".$reallyNow.")
)";
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
return 1;
}
/**
* @param exo_id ( id in courseDb exercices table )
* @param result ( score @ exercice )
* @param weighting ( higher score )
* @author Sebastien Piraux <piraux_seb@hotmail.com>
* @desc Record result of user when an exercice was done
*/
function event_exercice($exo_id, $score, $weighting)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_EXERCICES;
global $origin, $learnpath_id, $learnpath_item_id;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_EXERCICES."`
(
`exe_user_id`,
`exe_cours_id`,
`exe_exo_id`,
`exe_result`,
`exe_weighting`,
`exe_date`
)
VALUES
(
".$user_id.",
'".$_cid."',
'".$exo_id."',
'".$score."',
'".$weighting."',
FROM_UNIXTIME(".$reallyNow.")
)";
$tbl_learnpath_user = Database::get_course_table(TABLE_LEARNPATH_USER);
if ($origin == 'learnpath')
{
if ($user_id == "NULL")
{
$user_id = '0';
}
$sql2 = "update $tbl_learnpath_user set score='$score' where (user_id=$user_id and learnpath_id='$learnpath_id' and learnpath_item_id='$learnpath_item_id')";
$res2 = api_sql_query($sql2,__FILE__,__LINE__);
}
$res = api_sql_query($sql,__FILE__,__LINE__);
//$mysql_query($sql);
//return 0;
}
function exercise_attempt($score,$answer,$quesId,$exeId,$j)
{
global $_configuration;
global $_user;
global $_cid;
global $TABLETRACK_ATTEMPT;
global $origin, $learnpath_id, $learnpath_item_id;
// if tracking is disabled record nothing
if (!$_configuration['tracking_enabled'])
{
return 0;
}
$reallyNow = time();
if ($_user['user_id'])
{
$user_id = "'".$_user['user_id']."'";
}
else // anonymous
{
$user_id = "NULL";
}
$sql = "INSERT INTO `".$TABLETRACK_ATTEMPT."`
(`exe_id`,
`user_id`,
`question_id`,
`answer`,
`marks`,
`course_code`,
`position`
)
VALUES
(
".$exeId.",
".$user_id.",
'".$quesId."',
'".addslashes($answer)."',
'".$score."',
'".$_cid."',
'".$j."'
)";
$tbl_learnpath_user = Database::get_course_table(TABLE_LEARNPATH_USER);
if ($origin == 'learnpath')
{
if ($user_id == "NULL")
{
$user_id = '0';
}
$sql2 = "update $tbl_learnpath_user set score='$score' where (user_id=$user_id and learnpath_id='$learnpath_id' and learnpath_item_id='$learnpath_item_id')";
$res2 = api_sql_query($sql2,__FILE__,__LINE__);
}
//$res = api_sql_query($sql,__FILE__,__LINE__);
$res = mysql_query($sql) or die(mysql_error());
//return 0;
}
?>