Browse Source

Update course user session tracking every 5 minutes see BT#13267

jmontoyaa 7 years ago
parent
commit
e6b7eb95c3
3 changed files with 101 additions and 21 deletions
  1. 88 18
      main/inc/lib/events.lib.php
  2. 6 2
      main/inc/lib/login.lib.php
  3. 7 1
      main/inc/local.inc.php

+ 88 - 18
main/inc/lib/events.lib.php

@@ -2,6 +2,7 @@
 /* See license terms in /license.txt */
 
 //use Chamilo\UserBundle\Entity\User;
+use ChamiloSession as Session;
 use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
 
 /**
@@ -1803,34 +1804,103 @@ class Event
      * Registers in track_e_course_access when user logs in for the first time to a course
      * @param int $courseId ID of the course
      * @param int $user_id ID of the user
-     * @param int $session_id ID of the session (if any)
+     * @param int $sessionId ID of the session (if any)
+     *
+     * @return bool
      */
-    public static function event_course_login($courseId, $user_id, $session_id)
+    public static function eventCourseLogin($courseId, $user_id, $sessionId)
     {
-        $course_tracking_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
+        if (Session::read('login_as')) {
+            return false;
+        }
+        $table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
         $loginDate = $logoutDate = api_get_utc_datetime();
 
-        //$counter represents the number of time this record has been refreshed
+        // $counter represents the number of time this record has been refreshed
         $counter = 1;
-
         $courseId = intval($courseId);
         $user_id = intval($user_id);
-        $session_id = intval($session_id);
+        $sessionId = intval($sessionId);
         $ip = api_get_real_ip();
 
-        $sql = "INSERT INTO $course_tracking_table(c_id, user_ip, user_id, login_course_date, logout_course_date, counter, session_id)
-                VALUES('".$courseId."', '".$ip."', '".$user_id."', '$loginDate', '$logoutDate', $counter, '".$session_id."')";
-        Database::query($sql);
+        $sql = "INSERT INTO $table(c_id, user_ip, user_id, login_course_date, logout_course_date, counter, session_id)
+                VALUES('".$courseId."', '".$ip."', '".$user_id."', '$loginDate', '$logoutDate', $counter, '".$sessionId."')";
+        $courseAccessId = Database::query($sql);
 
-        // Course catalog stats modifications see #4191
-        CourseManager::update_course_ranking(
-            null,
-            null,
-            null,
-            null,
-            true,
-            false
-        );
+        if ($courseAccessId) {
+            // Course catalog stats modifications see #4191
+            CourseManager::update_course_ranking(
+                null,
+                null,
+                null,
+                null,
+                true,
+                false
+            );
+            return true;
+        }
+    }
+
+    /**
+     * Updates the user - course - session every X minutes
+     * In order to avoid
+     * @param int $courseId
+     * @param int $userId
+     * @param int $sessionId
+     * @param int $minutes
+     *
+     * @return bool
+     */
+    public static function eventCourseUpdate(
+        $courseId,
+        $userId,
+        $sessionId,
+        $minutes = 1
+    ) {
+        if (Session::read('login_as')) {
+            return false;
+        }
+
+        if (empty($courseId) || empty($userId)) {
+            return false;
+        }
+
+        $courseId = intval($courseId);
+        $userId = intval($userId);
+        $sessionId = intval($sessionId);
+
+        $table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
+        $sql = "SELECT course_access_id, logout_course_date 
+                FROM $table 
+                WHERE 
+                    c_id = $courseId AND
+                    session_id = $sessionId AND   
+                    user_id = $userId                     
+                ORDER BY login_course_date DESC
+                LIMIT 1";
+        $result = Database::query($sql);
+
+        // Save every 5 minutes by default
+        $seconds = $minutes * 60;
+        if (Database::num_rows($result)) {
+            $row = Database::fetch_array($result);
+            $id = $row['course_access_id'];
+            $logout = $row['logout_course_date'];
+            $now = time();
+            $logout = api_strtotime($logout, 'UTC');
+            if ($now - $logout > $seconds) {
+                $now = api_get_utc_datetime();
+                $sql = "UPDATE $table SET 
+                        logout_course_date = '$now', 
+                        counter = counter + 1
+                    WHERE course_access_id = $id";
+                Database::query($sql);
+            }
+
+            return true;
+        }
+
+        return false;
     }
 
     /**

+ 6 - 2
main/inc/lib/login.lib.php

@@ -448,9 +448,13 @@ class Login
                     }
 
                     if (!isset($_SESSION['login_as'])) {
-                        //Course login
+                        // Course login
                         if (isset($_user['user_id'])) {
-                            Event::event_course_login(api_get_course_int_id(), $_user['user_id'], api_get_session_id());
+                            Event::eventCourseLogin(
+                                api_get_course_int_id(),
+                                $_user['user_id'],
+                                api_get_session_id()
+                            );
                         }
                     }
                 } else {

+ 7 - 1
main/inc/local.inc.php

@@ -958,7 +958,7 @@ if (isset($cidReset) && $cidReset) {
             if (!isset($_SESSION['login_as'])) {
                 //Course login
                 if (isset($_user['user_id'])) {
-                    Event::event_course_login(
+                    Event::eventCourseLogin(
                         api_get_course_int_id(),
                         api_get_user_id(),
                         api_get_session_id()
@@ -1507,6 +1507,12 @@ if ((isset($cas_login) && $cas_login && exist_firstpage_parameter()) ||
     }
 }
 
+Event::eventCourseUpdate(
+    api_get_course_int_id(),
+    api_get_user_id(),
+    api_get_session_id()
+);
+
 Redirect::session_request_uri($logging_in, $user_id);
 
 if (!ChamiloApi::isAjaxRequest() && api_get_configuration_value('allow_mandatory_survey')) {