Julio Montoya 12 years ago
parent
commit
585376a4aa

+ 38 - 45
main/exercice/hotpotatoes_exercise_report.php

@@ -50,12 +50,13 @@ $TBL_TRACK_EXERCICES        = Database :: get_statistic_table(TABLE_STATISTIC_TR
 $TBL_TRACK_HOTPOTATOES_EXERCICES        = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
 $TBL_LP_ITEM_VIEW           = Database :: get_course_table(TABLE_LP_ITEM_VIEW);
 
-$course_id      = api_get_course_int_id();
-$hotpotatoes_path    = isset($_REQUEST['path']) ? $_REQUEST['path'] : null;
-$filter_user    = isset($_REQUEST['filter_by_user']) ? intval($_REQUEST['filter_by_user']) : null;
+$course_id            = api_get_course_int_id();
+$hotpotatoes_path     = isset($_REQUEST['path']) ? $_REQUEST['path'] : null;
+$filter_user          = isset($_REQUEST['filter_by_user']) ? intval($_REQUEST['filter_by_user']) : null;
 
 $locked = api_resource_is_locked_by_gradebook($exercise_id, LINK_EXERCISE);
 
+
 if (empty($hotpotatoes_path)) {
     api_not_allowed();
 }
@@ -64,34 +65,35 @@ if (!$is_allowedToEdit) {
     api_not_allowed();
 }
 
-if (!empty($exercise_id))
-    $parameters['exerciseId'] = $exercise_id;
-if (!empty($_GET['path'])) {
-    $parameters['path'] = Security::remove_XSS($_GET['path']);
+if (!empty($_REQUEST['path'])) {
+    $parameters['path'] = Security::remove_XSS($_REQUEST['path']);
 }
 
+
+
+
 if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') {
     if (api_is_platform_admin() || api_is_course_admin() || api_is_course_tutor() || api_is_course_coach()) {
-
         $load_extra_data = false;
         if (isset($_REQUEST['extra_data']) && $_REQUEST['extra_data'] == 1) {
             $load_extra_data = true;
         }
         
-        require_once 'exercise_result.class.php';
-        switch ($_GET['export_format']) {
-            case 'xls' :
-                $export = new ExerciseResult();
-                $export->exportCompleteReportXLS($documentPath, null, $load_extra_data, null, $_GET['exerciseId'], $_GET['hotpotato_name']);
+        require_once 'hotpotatoes_exercise_result.class.php';
+        // @todo make xls export work
+//        switch ($_GET['export_format']) {
+//            case 'xls' :
+//                $export = new ExerciseResult();
+//                $export->exportCompleteReportXLS($documentPath, null, $load_extra_data, null, $_GET['exerciseId'], $_GET['hotpotato_name']);
+//                exit;
+//                break;
+//            case 'csv' :
+//            default :
+                $export = new HotpotatoesExerciseResult();
+                $export->exportCompleteReportCSV($documentPath, $hotpotatoes_path);
                 exit;
-                break;
-            case 'csv' :
-            default :
-                $export = new ExerciseResult();
-                $export->exportCompleteReportCSV($documentPath, null, $load_extra_data, null, $_GET['exerciseId'], $_GET['hotpotato_name']);
-                exit;
-                break;
-        }
+//                break;
+//        }
     } else {
         api_not_allowed(true);
     }
@@ -215,10 +217,7 @@ if ($is_allowedToEdit && $origin != 'learnpath') {
     // the form
     if (api_is_platform_admin() || api_is_course_admin() || api_is_course_tutor() || api_is_course_coach()) {
         $actions .= '<a href="admin.php?exerciseId='.intval($_GET['exerciseId']).'">' . Display :: return_icon('back.png', get_lang('GoBackToQuestionList'),'',ICON_SIZE_MEDIUM).'</a>';
-        $actions .='<a href="live_stats.php?' . api_get_cidreq() . '&exerciseId='.$exercise_id.'">'.Display :: return_icon('activity_monitor.png', get_lang('LiveResults'),'',ICON_SIZE_MEDIUM).'</a>';
-        $actions .='<a href="stats.php?' . api_get_cidreq() . '&exerciseId='.$exercise_id.'">'.Display :: return_icon('statistics.png', get_lang('ReportByQuestion'),'', ICON_SIZE_MEDIUM).'</a>';
-        $actions .= '<a id="export_opener" href="'.api_get_self().'?export_report=1&hotpotato_name='.Security::remove_XSS($_GET['path']).'&exerciseId='.intval($_GET['exerciseId']).'" >'.
-                     Display::return_icon('save.png',   get_lang('Export'),'',ICON_SIZE_MEDIUM).'</a>';
+        $actions .= '<a id="export_opener" href="'.api_get_self().'?export_report=1&path='.Security::remove_XSS($hotpotatoes_path).' ">'.Display::return_icon('save.png',   get_lang('Export'),'',ICON_SIZE_MEDIUM).'</a>';
     }
 } else {
     $actions .= '<a href="exercice.php">' . Display :: return_icon('back.png', get_lang('GoBackToQuestionList'),'',ICON_SIZE_MEDIUM).'</a>';
@@ -292,8 +291,8 @@ $extra =  '<script type="text/javascript">
 $extra .= '<div id="dialog-confirm" title="'.get_lang("ConfirmYourChoice").'">';
 $form = new FormValidator('report', 'post', null, null, array('class' => 'form-vertical'));
 $form->addElement('radio', 'export_format', null, get_lang('ExportAsCSV'), 'csv', array('id' => 'export_format_csv_label'));
-$form->addElement('radio', 'export_format', null, get_lang('ExportAsXLS'), 'xls', array('id' => 'export_format_xls_label'));
-$form->addElement('checkbox', 'load_extra_data', null, get_lang('LoadExtraData'), '0', array('id' => 'export_format_xls_label'));
+//$form->addElement('radio', 'export_format', null, get_lang('ExportAsXLS'), 'xls', array('id' => 'export_format_xls_label'));
+//$form->addElement('checkbox', 'load_extra_data', null, get_lang('LoadExtraData'), '0', array('id' => 'export_format_xls_label'));
 $form->setDefaults(array('export_format' => 'csv'));
 $extra .= $form->return_form();
 $extra .= '</div>';
@@ -302,13 +301,6 @@ if ($is_allowedToEdit)
     echo $extra;
 
 echo $actions;
-//echo $content;
-/*
-
-$tpl = new Template($nameTools);
-$tpl->assign('content', $content);
-$tpl->display_one_col_template();
-*/
 
 $url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_hotpotatoes_exercise_results&path='.$hotpotatoes_path.'&filter_by_user='.$filter_user;
 
@@ -333,15 +325,16 @@ if ($is_allowedToEdit || $is_tutor) {
 	$columns        = array(get_lang('FirstName'), get_lang('LastName'), get_lang('LoginName'),
                         get_lang('Group'), get_lang('StartDate'),  get_lang('Score'),  get_lang('Actions'));
 
-    //Column config
+  //Column config
+  // @todo fix search firstname/lastname that doesn't work. rmove search for the moment
 	$column_model   = array(
-                        array('name'=>'firstname',      'index'=>'firstname',		'width'=>'50',   'align'=>'left', 'search' => 'true'),
-                        array('name'=>'lastname',		'index'=>'lastname',		'width'=>'50',   'align'=>'left', 'formatter'=>'action_formatter', 'search' => 'true'),
-                        array('name'=>'login',          'hidden'=>'true',          'index'=>'username',        'width'=>'40',   'align'=>'left', 'search' => 'true'),
-                        array('name'=>'group_name',		'index'=>'group_id',        'width'=>'40',   'align'=>'left', 'search' => 'false'),
-						array('name'=>'exe_date',		'index'=>'exe_date',		'width'=>'60',   'align'=>'left', 'search' => 'false'),
-						array('name'=>'score',			'index'=>'exe_result',	    'width'=>'50',   'align'=>'left', 'search' => 'false'),
-						array('name'=>'actions',        'index'=>'actions',         'width'=>'60',  'align'=>'left', 'search' => 'false')
+                        array('name'=>'firstname',      'index'=>'firstname',		'width'=>'50',   'align'=>'left', 'search' => 'false'),
+                        array('name'=>'lastname',		    'index'=>'lastname',		'width'=>'50',   'align'=>'left', 'formatter'=>'action_formatter', 'search' => 'false'),
+                        array('name'=>'login',          'hidden'=>'true',       'index'=>'username',        'width'=>'40',   'align'=>'left', 'search' => 'false'),
+                        array('name'=>'group_name',		  'index'=>'group_id',    'width'=>'40',   'align'=>'left', 'search' => 'false'),
+            						array('name'=>'exe_date',		    'index'=>'exe_date',		'width'=>'60',   'align'=>'left', 'search' => 'false'),
+            						array('name'=>'score',			    'index'=>'exe_result',	'width'=>'50',   'align'=>'left', 'search' => 'false'),
+            						array('name'=>'actions',        'index'=>'actions',     'width'=>'60',  'align'=>'left', 'search' => 'false')
                        );
 
     $action_links = '
@@ -362,7 +355,7 @@ $extra_params['autowidth'] = 'true';
 //height auto
 $extra_params['height'] = 'auto';
 //$extra_params['excel'] = 'excel';
-$extra_params['rowList'] = array(10, 20 ,30);
+$extra_params['rowList'] = array(20, 50, 100, 500, 1000, 2000, 5000, 10000);
 
 ?>
 <script>
@@ -436,10 +429,10 @@ $(function() {
     <?php } ?>
 });
 </script>
-<form id="export_report_form" method="post" action="exercise_report.php">
+<form id="export_report_form" method="post" action="hotpotatoes_exercise_report.php">
     <input type="hidden" name="csvBuffer" id="csvBuffer" value="" />
     <input type="hidden" name="export_report" id="export_report" value="1" />
-    <input type="hidden" name="exerciseId" id="exerciseId" value="<?php echo $exercise_id ?>" />
+    <input type="hidden" name="path" id="path" value="<?php echo $hotpotatoes_path ?>" />
 </form>
 <?php
 

+ 389 - 0
main/exercice/hotpotatoes_exercise_result.class.php

@@ -0,0 +1,389 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+ * HotpotatoesExerciseResult class: This class allows to instantiate an object
+ * of type HotpotatoesExerciseResult
+ * which allows you to export exercises results in multiple presentation forms
+ * @package chamilo.exercise
+ * @author 
+ * @version $Id: $
+ */
+/**
+ * Code
+ */
+if(!class_exists('HotpotatoesExerciseResult')):
+/**
+ * Exercise results class
+ * @package chamilo.exercise
+ */
+class HotpotatoesExerciseResult
+{
+	private $exercises_list = array(); //stores the list of exercises
+	private $results = array(); //stores the results
+
+	/**
+	 * constructor of the class
+	 */
+	public function ExerciseResult($get_questions=false,$get_answers=false) {
+	}
+
+	/**
+	 * Reads exercises information (minimal) from the data base
+	 * @param	boolean		Whether to get only visible exercises (true) or all of them (false). Defaults to false.
+	 * @return	array		A list of exercises available
+	 */
+	private function _readExercisesList($only_visible = false)
+	{
+		$return = array();
+    	$TBL_EXERCISES          = Database::get_course_table(TABLE_QUIZ_TEST);
+
+		$sql="SELECT id,title,type,random,active FROM $TBL_EXERCISES";
+		if($only_visible)
+		{
+			$sql.= ' WHERE active=1';
+		}
+		$sql .= ' ORDER BY title';
+		$result=Database::query($sql);
+
+		// if the exercise has been found
+		while($row=Database::fetch_array($result,'ASSOC'))
+		{
+			$return[] = $row;
+		}
+		// exercise not found
+		return $return;
+	}
+
+
+
+	/**
+	 * Gets the results of all students (or just one student if access is limited)
+	 * @param	string		The document path (for HotPotatoes retrieval)
+	 * @param	integer		User ID. Optional. If no user ID is provided, we take all the results. Defauts to null
+	 */
+//	function _getExercisesReporting($document_path, $user_id = null, $filter = 0, $hotpotato_name = null) {
+	function _getExercisesReporting($document_path, $hotpotato_name = null, $user_id = null, $filter = 0) {
+		$return = array();
+
+    $TBL_EXERCISES          = Database::get_course_table(TABLE_QUIZ_TEST);
+    $TBL_USER          	    = Database::get_main_table(TABLE_MAIN_USER);
+    $TBL_TRACK_EXERCISES    	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_EXERCICES);
+    $TBL_TRACK_HOTPOTATOES	= Database::get_statistic_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES);
+    $TBL_TRACK_ATTEMPT_RECORDING= Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
+    
+    $cid             = api_get_course_id();
+    $course_id       = api_get_course_int_id();
+    $user_id         = intval($user_id);
+    $session_id_and  = ' AND te.session_id = ' . api_get_session_id() . ' ';
+    $hotpotato_name  = Database::escape_string($hotpotato_name);
+    
+    
+    if (!empty($exercise_id)) {
+      $session_id_and .= " AND exe_exo_id = $exercise_id ";
+    }
+
+		if (empty($user_id)) {
+      $sql="SELECT ".(api_is_western_name_order() ? "firstname as userpart1, lastname userpart2" : "lastname as userpart1, firstname as userpart2").",
+              email,
+              tth.exe_name,
+              tth.exe_result,
+              tth.exe_weighting,
+              tth.exe_date
+              FROM $TBL_TRACK_HOTPOTATOES tth, $TBL_USER tu
+              WHERE   tu.user_id=tth.exe_user_id AND
+                      tth.exe_cours_id = '" . Database :: escape_string($cid) . "' AND
+                      tth.exe_name = '$hotpotato_name'
+              ORDER BY tth.exe_cours_id ASC, tth.exe_date DESC";
+		} else {
+            $user_id_and = ' AND te.exe_user_id = ' . api_get_user_id() . ' ';
+			      // get only this user's results
+
+            $sql = "SELECT '', exe_name, exe_result , exe_weighting, exe_date
+                            FROM $TBL_TRACK_HOTPOTATOES
+                            WHERE   exe_user_id = '" . $user_id . "' AND
+                                    exe_cours_id = '" . Database :: escape_string($cid) . "' AND
+                                    tth.exe_name = '$hotpotato_name'
+                            ORDER BY exe_cours_id ASC, exe_date DESC";
+		}
+
+		$results = array();
+
+		$resx = Database::query($sql);
+		while ($rowx = Database::fetch_array($resx,'ASSOC')) {
+            $results[] = $rowx;
+		}
+
+		$hpresults = array();
+		$resx = Database::query($sql);
+	    while ($rowx = Database::fetch_array($resx,'ASSOC')) {
+            $hpresults[] = $rowx;
+		}
+
+		if ($filter) {
+			switch ($filter) {
+				case 1 :
+                    $filter_by_not_revised = true;
+                    break;
+				case 2 :
+                    $filter_by_revised = true;
+                    break;
+				default :
+                    null;
+			}
+		}
+
+		// Print the Result of Hotpotatoes Tests
+		if (is_array($hpresults)) {
+			for($i = 0; $i < sizeof($hpresults); $i++) {
+				$return[$i] = array();
+				$title = GetQuizName($hpresults[$i]['exe_name'], $document_path);
+				if ($title =='') {
+					$title = basename($hpresults[$i]['exe_name']);
+				}
+				if(empty($user_id)) {
+				    $return[$i]['email'] = $hpresults[$i]['email'];
+					$return[$i]['first_name'] = $hpresults[$i]['userpart1'];
+					$return[$i]['last_name'] = $hpresults[$i]['userpart2'];
+				}
+				$return[$i]['title'] = $title;
+				$return[$i]['start_date']  = api_get_local_time($results[$i]['exstart']);
+                $return[$i]['end_date']    = api_get_local_time($results[$i]['exdate']);
+                $return[$i]['duration']    = $results[$i]['duration'];
+
+				$return[$i]['result'] = $hpresults[$i]['exe_result'];
+				$return[$i]['max'] = $hpresults[$i]['exe_weighting'];
+			}
+		}
+		$this->results = $return;
+		return true;
+	}
+	/**
+	 * Exports the complete report as a CSV file
+	 * @param	string		Document path inside the document tool
+	 * @param	integer		Optional user ID
+	 * @param	boolean		Whether to include user fields or not
+	 * @return	boolean		False on error
+	 */
+	public function exportCompleteReportCSV($document_path='',$user_id=null, $export_user_fields = false, $export_filter = 0, $exercise_id = 0, $hotpotato_name = null) {
+		global $charset;
+		$this->_getExercisesReporting($document_path,$user_id, $export_filter, $exercise_id, $hotpotato_name);
+		$filename = 'exercise_results_'.date('YmdGis').'.csv';
+		if(!empty($user_id)) {
+			$filename = 'exercise_results_user_'.$user_id.'_'.date('YmdGis').'.csv';
+		}
+		$data = '';
+
+
+        if (api_is_western_name_order()) {
+            if(!empty($this->results[0]['first_name'])) {
+                $data .= get_lang('FirstName').';';
+            }
+            if(!empty($this->results[0]['last_name'])) {
+                $data .= get_lang('LastName').';';
+            }
+        } else {
+            if(!empty($this->results[0]['last_name'])) {
+                $data .= get_lang('LastName').';';
+            }
+            if(!empty($this->results[0]['first_name'])) {
+                $data .= get_lang('FirstName').';';
+            }
+        }
+        $data .= get_lang('Email').';';
+
+		if ($export_user_fields) {
+			//show user fields section with a big th colspan that spans over all fields
+			$extra_user_fields = UserManager::get_extra_fields(0,1000,5,'ASC',false, 1);
+			$num = count($extra_user_fields);
+			foreach($extra_user_fields as $field) {
+				$data .= '"'.str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($field[3]), ENT_QUOTES, $charset)).'";';
+			}
+		}
+
+		$data .= get_lang('Title').';';
+		$data .= get_lang('StartDate').';';
+        $data .= get_lang('EndDate').';';
+        $data .= get_lang('Duration'). ' ('.get_lang('MinMinutes').') ;';
+		$data .= get_lang('Score').';';
+		$data .= get_lang('Total').';';
+        $data .= get_lang('Status').';';
+		$data .= "\n";
+
+		//results
+		foreach($this->results as $row) {
+
+            if (api_is_western_name_order()) {
+                $data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset)).';';
+                $data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset)).';';
+            } else {
+                $data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset)).';';
+                $data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset)).';';
+            }
+
+            $data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['email']), ENT_QUOTES, $charset)).';';
+
+			if ($export_user_fields) {
+				//show user fields data, if any, for this user
+				$user_fields_values = UserManager::get_extra_user_data($row['user_id'],false,false, false, true);
+				foreach($user_fields_values as $value) {
+					$data .= '"'.str_replace('"','""',api_html_entity_decode(strip_tags($value), ENT_QUOTES, $charset)).'";';
+				}
+			}
+
+			$data .= str_replace("\r\n",'  ',api_html_entity_decode(strip_tags($row['title']), ENT_QUOTES, $charset)).';';
+			$data .= str_replace("\r\n",'  ',$row['start_date']).';';
+            $data .= str_replace("\r\n",'  ',$row['end_date']).';';
+            $data .= str_replace("\r\n",'  ',$row['duration']).';';
+			$data .= str_replace("\r\n",'  ',$row['result']).';';
+			$data .= str_replace("\r\n",'  ',$row['max']).';';
+            $data .= str_replace("\r\n",'  ',$row['status']).';';
+			$data .= "\n";
+		}
+
+		//output the results
+		$len = strlen($data);
+		header('Content-type: application/octet-stream');
+		header('Content-Type: application/force-download');
+		header('Content-length: '.$len);
+		if (preg_match("/MSIE 5.5/", $_SERVER['HTTP_USER_AGENT'])) {
+			header('Content-Disposition: filename= '.$filename);
+		} else {
+			header('Content-Disposition: attachment; filename= '.$filename);
+		}
+		if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
+			header('Pragma: ');
+			header('Cache-Control: ');
+			header('Cache-Control: public'); // IE cannot download from sessions without a cache
+		}
+		header('Content-Description: '.$filename);
+		header('Content-transfer-encoding: binary');
+		echo $data;
+		return true;
+	}
+
+	/**
+	 * Exports the complete report as an XLS file
+	 * @return	boolean		False on error
+	 */
+	public function exportCompleteReportXLS($document_path='',$user_id = null, $export_user_fields= false, $export_filter = 0, $exercise_id=0, $hotpotato_name = null) {
+		global $charset;
+		$this->_getExercisesReporting($document_path, $user_id, $export_filter, $exercise_id, $hotpotato_name);
+		$filename = 'exercise_results_'.date('YmdGis').'.xls';
+		if (!empty($user_id)) {
+			$filename = 'exercise_results_user_'.$user_id.'_'.date('YmdGis').'.xls';
+		}
+		$workbook = new Spreadsheet_Excel_Writer();
+		$workbook->setTempDir(api_get_path(SYS_ARCHIVE_PATH));
+		$workbook->setVersion(8); // BIFF8
+
+		$workbook->send($filename);
+		$worksheet =& $workbook->addWorksheet('Report '.date('YmdGis'));
+		$worksheet->setInputEncoding(api_get_system_encoding());
+		$line = 0;
+		$column = 0; //skip the first column (row titles)
+
+		// check if exists column 'user'
+		$with_column_user = false;
+		foreach ($this->results as $result) {
+			if (!empty($result['last_name']) && !empty($result['first_name'])) {
+				$with_column_user = true;
+				break;
+			}
+		}
+
+
+
+		if ($with_column_user) {
+
+		    $worksheet->write($line,$column,get_lang('Email'));
+		    $column++;
+
+            if (api_is_western_name_order()) {
+    			$worksheet->write($line,$column,get_lang('FirstName'));
+    			$column++;
+                $worksheet->write($line,$column,get_lang('LastName'));
+                $column++;
+            } else {
+                $worksheet->write($line,$column,get_lang('LastName'));
+                $column++;
+                $worksheet->write($line,$column,get_lang('FirstName'));
+                $column++;
+            }
+		}
+
+		if ($export_user_fields) {
+			//show user fields section with a big th colspan that spans over all fields
+			$extra_user_fields = UserManager::get_extra_fields(0,1000,5,'ASC',false, 1);
+
+			//show the fields names for user fields
+			foreach ($extra_user_fields as $field) {
+				$worksheet->write($line,$column,api_html_entity_decode(strip_tags($field[3]), ENT_QUOTES, $charset));
+				$column++;
+			}
+		}
+
+		$worksheet->write($line,$column, get_lang('Title'));
+		$column++;
+		$worksheet->write($line,$column, get_lang('StartDate'));
+        $column++;
+        $worksheet->write($line,$column, get_lang('EndDate'));
+        $column++;
+        $worksheet->write($line,$column, get_lang('Duration').' ('.get_lang('MinMinutes').')');
+		$column++;
+		$worksheet->write($line,$column, get_lang('Score'));
+		$column++;
+		$worksheet->write($line,$column, get_lang('Total'));
+		$column++;
+        $worksheet->write($line,$column, get_lang('Status'));
+		$line++;
+
+		foreach ($this->results as $row) {
+			$column = 0;
+
+            if ($with_column_user) {
+                $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['email']), ENT_QUOTES, $charset));
+                $column++;
+
+                if (api_is_western_name_order()) {
+                    $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset));
+                    $column++;
+                    $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset));
+                    $column++;
+                } else {
+                    $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['last_name']), ENT_QUOTES, $charset));
+                    $column++;
+                    $worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['first_name']), ENT_QUOTES, $charset));
+                    $column++;
+                }
+			}
+
+			if ($export_user_fields) {
+				//show user fields data, if any, for this user
+				$user_fields_values = UserManager::get_extra_user_data($row['user_id'],false,false, false, true);
+				foreach($user_fields_values as $value) {
+					$worksheet->write($line,$column, api_html_entity_decode(strip_tags($value), ENT_QUOTES, $charset));
+					$column++;
+				}
+			}
+
+			$worksheet->write($line,$column,api_html_entity_decode(strip_tags($row['title']), ENT_QUOTES, $charset));
+			$column++;
+			$worksheet->write($line,$column,$row['start_date']);
+            $column++;
+			$worksheet->write($line,$column,$row['end_date']);
+            $column++;
+			$worksheet->write($line,$column,$row['duration']);
+			$column++;
+			$worksheet->write($line,$column,$row['result']);
+			$column++;
+			$worksheet->write($line,$column,$row['max']);
+			$column++;
+            $worksheet->write($line,$column,$row['status']);
+			$line++;
+		}
+		//output the results
+		$workbook->close();
+		return true;
+	}
+}
+endif;