Browse Source

Feature #272 - TableSort class: Removing old hacks, cleaning and optimization.

Ivan Tcholakov 15 years ago
parent
commit
232177cc4f
4 changed files with 48 additions and 149 deletions
  1. 5 10
      main/document/document.php
  2. 18 24
      main/dropbox/index.php
  3. 10 93
      main/inc/lib/tablesort.lib.php
  4. 15 22
      main/work/work.lib.php

+ 5 - 10
main/document/document.php

@@ -690,7 +690,7 @@ if (isset($docs_and_folders) && is_array($docs_and_folders)) {
 		$last_edit_date = $id['lastedit_date'];
 		$last_edit_date = api_get_local_time($last_edit_date, null, date_default_timezone_get());
 		$display_date = date_to_str_ago($last_edit_date).'<br /><span class="dropbox_date">'.api_format_date($last_edit_date).'</span>';
-		$row[] = $invisibility_span_open.$display_date.$invisibility_span_close.'<!--uts='.strtotime($last_edit_date).'-->';
+		$row[] = $invisibility_span_open.$display_date.$invisibility_span_close;
 
 		// Admins get an edit column
 		if ($is_allowed_to_edit || $group_member_with_upload_rights) {
@@ -794,16 +794,11 @@ $column_show[] = 0;
 $column_order = array();
 
 if (count($row) == 8) {
-	$column_order[] = 1;
-	$column_order[] = 2;
-	$column_order[] = 7;
-	$column_order[] = 6;
-	$column_order[] = 5;
+	$column_order[3] = 7;
+	$column_order[4] = 6;
 } elseif (count($row) == 6) {
-	$column_order[] = 1;
-	$column_order[] = 2;
-	$column_order[] = 7;
-	$column_order[] = 4;
+	$column_order[2] = 5;
+	$column_order[3] = 4;
 }
 
 $default_column = $is_allowed_to_edit ? 2 : 1;

+ 18 - 24
main/dropbox/index.php

@@ -250,13 +250,12 @@ if ($_GET['action'] != 'add') {
 		}
 	}
 
-
 	// ACTIONS
 	if ($_GET['view'] == 'received' OR !$dropbox_cnf['sent_received_tabs']) {
 		//echo '<h3>'.get_lang('ReceivedFiles').'</h3>';
 
 		// This is for the categories
-		if (isset($_GET['view_received_category']) AND $_GET['view_received_category']<>'') {
+		if (isset($_GET['view_received_category']) AND $_GET['view_received_category'] != '') {
 			$view_dropbox_category_received = Security::remove_XSS($_GET['view_received_category']);
 		} else {
 			$view_dropbox_category_received = 0;
@@ -381,6 +380,7 @@ if ($_GET['action'] != 'add') {
 		}
 
 		$column_header[] = array('RealDate', true);
+		$column_header[] = array('RealSize', true);
 
 		// An array with the setting of the columns -> 1: columns that we will show, 0:columns that will be hide
 		$column_show[] = 1;
@@ -401,14 +401,9 @@ if ($_GET['action'] != 'add') {
 		// in this case the the column of LastResent ( 4th element in $column_header) we will be order like the column RealDate
 		// because in the column RealDate we have the days in a correct format "2008-03-12 10:35:48"
 
-		$column_order[] = 1;
-		$column_order[] = 2;
-		$column_order[] = 3;
-		$column_order[] = 4;
-		$column_order[] = 7;
-		$column_order[] = 6;
-		$column_order[] = 7;
-		$column_order[] = 8;
+		$column_order[3] = 8;
+		$column_order[5] = 7;
+
 
 		// The content of the sortable table = the received files
 		foreach ($dropbox_person -> receivedWork as $dropbox_file) {
@@ -429,7 +424,8 @@ if ($_GET['action'] != 'add') {
 				$link_open = '<a href="dropbox_download.php?'.api_get_cidreq().'&amp;id='.$dropbox_file->id.'">';
 				$dropbox_file_data[] = $link_open.build_document_icon_tag('file', $dropbox_file->title).'</a>';
 				$dropbox_file_data[] = '<a href="dropbox_download.php?'.api_get_cidreq().'&id='.$dropbox_file->id.'&amp;action=download">'.Display::return_icon('filesave.gif', get_lang('Download'), array('style' => 'float:right;')).'</a>'.$link_open.$dropbox_file->title.'</a>'.$new_icon.'<br />'.$dropbox_file->description;
-				$dropbox_file_data[] = ceil(($dropbox_file->filesize) / 1024).' '.get_lang('kB');
+				$file_size = $dropbox_file->filesize;
+				$dropbox_file_data[] = format_file_size($file_size);
 				$dropbox_file_data[] = $dropbox_file->author;
 				//$dropbox_file_data[] = $dropbox_file->description;
 
@@ -454,7 +450,8 @@ if ($_GET['action'] != 'add') {
 					$dropbox_file_data[] = $action_icons;
 				}
 				$action_icons = '';
-				$dropbox_file_data[] = $dropbox_file->last_upload_date; //date
+				$dropbox_file_data[] = $last_upload_date;
+				$dropbox_file_data[] = $file_size;
 				$dropbox_data_recieved[] = $dropbox_file_data;
 			}
 		}
@@ -535,7 +532,8 @@ if ($_GET['action'] != 'add') {
 			$column_header[] = array(get_lang('Modify'), false, '', 'nowrap style="text-align: right"');
 		}
 
-		$column_header[] = array('RealDate', false);
+		$column_header[] = array('RealDate', true);
+		$column_header[] = array('RealSize', true);
 
 		$column_show = array();
 		$column_order = array();
@@ -558,14 +556,8 @@ if ($_GET['action'] != 'add') {
 		// in this case the the column of LastResent ( 4th element in $column_header) we will be order like the column RealDate
 		// because in the column RealDate we have the days in a correct format "2008-03-12 10:35:48"
 
-		$column_order[] = 1;
-		$column_order[] = 2;
-		$column_order[] = 3;
-		$column_order[] = 4;
-		$column_order[] = 7;
-		$column_order[] = 6;
-		$column_order[] = 7;
-		$column_order[] = 8;
+		$column_order[3] = 8;
+		$column_order[5] = 7;
 
 		// The content of the sortable table = the received files
 		foreach ($dropbox_person -> sentWork as $dropbox_file) {
@@ -576,7 +568,8 @@ if ($_GET['action'] != 'add') {
 				$link_open = '<a href="dropbox_download.php?'.api_get_cidreq().'&id='.$dropbox_file->id.'">';
 				$dropbox_file_data[] = $link_open.build_document_icon_tag('file', $dropbox_file->title).'</a>';
 				$dropbox_file_data[] = '<a href="dropbox_download.php?'.api_get_cidreq().'&id='.$dropbox_file->id.'&amp;action=download">'.Display::return_icon('filesave.gif', get_lang('Save'), array('style' => 'float:right;')).'</a>'.$link_open.$dropbox_file->title.'</a><br />'.$dropbox_file->description;
-				$dropbox_file_data[] = ceil(($dropbox_file->filesize)/1024).' '.get_lang('kB');
+				$file_size = $dropbox_file->filesize;
+				$dropbox_file_data[] = format_file_size($file_size);
 				foreach ($dropbox_file->recipients as $recipient) {
 					$receivers_celldata = display_user_link_work($recipient['user_id'], $recipient['name']).', '.$receivers_celldata;
 				}
@@ -592,12 +585,13 @@ if ($_GET['action'] != 'add') {
 									<a href="'.api_get_self().'?'.api_get_cidreq().'&view_received_category='.Security::remove_XSS($_GET['view_received_category']).'&amp;view_sent_category='.Security::remove_XSS($_GET['view_sent_category']).'&amp;view='.Security::remove_XSS($_GET['view']).'&amp;action=movesent&amp;move_id='.$dropbox_file->id.'">'.Display::return_icon('deplacer_fichier.gif', get_lang('Move')).'</a>
 									<a href="'.api_get_self().'?'.api_get_cidreq().'&view_received_category='.Security::remove_XSS($_GET['view_received_category']).'&amp;view_sent_category='.Security::remove_XSS($_GET['view_sent_category']).'&amp;view='.Security::remove_XSS($_GET['view']).'&amp;action=deletesentfile&amp;id='.$dropbox_file->id.'" onclick="javascript: return confirmation(\''.$dropbox_file->title.'\');">'.Display::return_icon('delete.gif', get_lang('Delete')).'</a>';
 				// This is a hack to have an additional row in a sortable table
-				if ($_GET['action'] == 'viewfeedback' AND isset($_GET['id']) and is_numeric($_GET['id']) AND $dropbox_file->id==$_GET['id']) {
+				if ($_GET['action'] == 'viewfeedback' && isset($_GET['id']) && is_numeric($_GET['id']) && $dropbox_file->id == $_GET['id']) {
 					$action_icons .= "</td></tr>\n"; // ending the normal row of the sortable table
 					$action_icons .= "<tr>\n\t<td colspan=\"2\"><a href=\"index.php?".api_get_cidreq()."&view_received_category=".Security::remove_XSS($_GET['view_received_category'])."&amp;view_sent_category=".Security::remove_XSS($_GET['view_sent_category'])."&amp;view=".Security::remove_XSS($_GET['view'])."\">".get_lang('CloseFeedback')."</a></td><td colspan=\"7\">".feedback($dropbox_file->feedback2)."</td>\n</tr>\n";
 				}
 				$dropbox_file_data[] = $action_icons;
-				$dropbox_file_data[] = $dropbox_file->last_upload_date;
+				$dropbox_file_data[] = $last_upload_date;
+				$dropbox_file_data[] = $file_size;
 				$action_icons = '';
 				$dropbox_data_sent[] = $dropbox_file_data;
 			}

+ 10 - 93
main/inc/lib/tablesort.lib.php

@@ -9,40 +9,9 @@
 
 define('SORT_DATE', 3);
 define('SORT_IMAGE', 4);
-define('SORT_CUSTOM', 5);
 
 class TableSort {
 
-	/**
-	 * This is a method for date comparison, using hidden raw values if they are given.
-	 * Date formats vary a lot, alse they have localized values. For avoiding using
-	 * unreliable in this case date parsing routine, this method checks first whether raw
-	 * date walues have been intentionaly passed in order precise sorting to be achieved.
-	 * Here is the format of the date value, hidden in a comment: <!--uts=1234685716-->
-	 * @param string $el1	The first element provided from the table.
-	 * @param string $el2	The second element provided from the table.
-	 * @result bool			Tre comparison result.
-	 * @author Ivan Tcholakov, 2010.
-	 */
-	public function date_compare($el1, $el2) {
-		if (($pos1 = strpos($el1, '<!--uts=')) !== false && ($pos2 = strpos($el1, '-->', $pos1)) !== false) {
-			$el1 = intval(substr($el1, $pos1 + 8, $pos2 - $pos1 - 8));
-		} else {
-			$el1 = strtotime(strip_tags($el1));
-		}
-		if (($pos1 = strpos($el2, '<!--uts=')) !== false && ($pos2 = strpos($el2, '-->', $pos1)) !== false) {
-			$el2 = intval(substr($el2, $pos1 + 8, $pos2 - $pos1 - 8));
-		} else {
-			$el2 = strtotime(strip_tags($el2));
-		}
-		if ($el1 > $el2) {
-			return 1;
-		} elseif ($el1 < $el2) {
-			return -1;
-		}
-		return 0;
-	}
-
 	/**
 	 * Sorts 2-dimensional table.
 	 * @param array $data The data to be sorted.
@@ -68,9 +37,7 @@ class TableSort {
 
 		$compare_function = '';
 		if ($type == SORT_REGULAR) {
-			if (TableSort::is_custom_sortable_column($data, $column)) {
-				$type = SORT_CUSTOM;
-			} elseif (TableSort::is_image_column($data, $column)) {
+			if (TableSort::is_image_column($data, $column)) {
 				$type = SORT_IMAGE;
 			} elseif (TableSort::is_date_column($data, $column)) {
 				$type = SORT_DATE;
@@ -82,9 +49,6 @@ class TableSort {
 		}
 
 		switch ($type) {
-			case SORT_CUSTOM:
-				$compare_function = 'TableSort::custom_compare($el1, $el2) > 0';
-				break;
 			case SORT_NUMERIC:
 				$compare_function = 'strip_tags($el1) > strip_tags($el2)';
 				break;
@@ -92,7 +56,7 @@ class TableSort {
 				$compare_function = 'api_strnatcmp(api_strtolower(strip_tags($el1,"<img>")),api_strtolower(strip_tags($el2,"<img>"))) > 0';
 				break;
 			case SORT_DATE:
-				$compare_function = 'TableSort::date_compare($el1, $el2) > 0';
+				$compare_function = 'strtotime(strip_tags($el1)) > strtotime(strip_tags($el2))';
 				break;
 			case SORT_STRING:
 			default:
@@ -113,13 +77,14 @@ class TableSort {
 	 * @param array $data The data to be sorted.
 	 * @param int $column The column on which the data should be sorted (default = 0)
 	 * @param string $direction The direction to sort (SORT_ASC (default) orSORT_DESC)
-	 * @param array $column_show The columns that we will show in the table i.e: $column_show=array('1','0','1') we will show the 1st and the 3th column.
-	 * @param array $column_order Changes how the columns will be sorted ie. $column_order=array('1','4','3','4') The 2nd column will be sorted like the 4 column
-	 * @param constant $type How should data be sorted (SORT_REGULAR, SORT_NUMERIC,SORT_STRING,SORT_DATE,SORT_IMAGE)	 *
+	 * @param array $column_show The columns that we will show in the table i.e: $column_show = array('1','0','1') we will show the 1st and the 3th column.
+	 * @param array $column_order Changes how the columns will be sorted ie. $column_order = array('0','3','2','3') The column [1] will be sorted like the column [3]
+	 * @param constant $type How should data be sorted (SORT_REGULAR, SORT_NUMERIC, SORT_STRING, SORT_DATE, SORT_IMAGE)
 	 * @return array The sorted dataset
 	 * @author bart.mollet@hogent.be
 	 */
 	public function sort_table_config($data, $column = 0, $direction = SORT_ASC, $column_show = null, $column_order = null, $type = SORT_REGULAR) {
+
 		if (!is_array($data) or count($data) == 0) {
 			return array();
 		}
@@ -136,17 +101,11 @@ class TableSort {
 		// Change columns sort
 	 	// Here we say that the real way of how the columns are going to be order is manage by the $column_order array
 	 	if (is_array($column_order)) {
-			for ($i = 0; $i < count($column_order); $i++) {
-				if ($column == $i + 1) {
-					$column = $column_order[$i];
-				}
-			}
+	 		$column = isset($column_order[$column]) ? $column_order[$column] : $column;
 	 	}
 
 		if ($type == SORT_REGULAR) {
-			if (TableSort::is_custom_sortable_column($data, $column)) {
-				$type = SORT_CUSTOM;
-			} elseif (TableSort::is_image_column($data, $column)) {
+			if (TableSort::is_image_column($data, $column)) {
 				$type = SORT_IMAGE;
 			} elseif (TableSort::is_date_column($data, $column)) {
 				$type =  SORT_DATE;
@@ -158,9 +117,6 @@ class TableSort {
 		}
 
 	 	switch ($type) {
-			case SORT_CUSTOM:
-				$compare_function = 'TableSort::custom_compare($el1, $el2) > 0';
-				break;
 	 		case SORT_NUMERIC:
 				$compare_function = 'strip_tags($el1) > strip_tags($el2)';
 				break;
@@ -168,7 +124,7 @@ class TableSort {
 				$compare_function = 'api_strnatcmp(api_strtolower(strip_tags($el1,"<img>")),api_strtolower(strip_tags($el2,"<img>"))) > 0';
 				break;
 			case SORT_DATE:
-				$compare_function = 'TableSort::date_compare($el1, $el2) > 0';
+				$compare_function = 'strtotime(strip_tags($el1)) > strtotime(strip_tags($el2))';
 				break;
 			case SORT_STRING:
 			default:
@@ -231,10 +187,7 @@ class TableSort {
 	private function is_date_column(& $data, $column) {
 		$is_date = true;
 		foreach ($data as $index => & $row) {
-			if (strpos($row[$column], '<!--uts=') !== false) {
-				// A hidden raw date value (an integer Unix time stamp) has been detected. It is needed for precise sorting.
-				$is_date &= true;
-			} elseif (strlen(strip_tags($row[$column])) != 0) {
+			if (strlen(strip_tags($row[$column])) != 0) {
 				$check_date = strtotime(strip_tags($row[$column]));
 				// strtotime Returns a timestamp on success, FALSE otherwise.
 				// Previous to PHP 5.1.0, this function would return -1 on failure.
@@ -268,40 +221,4 @@ class TableSort {
 		return $is_image;
 	}
 
-	/**
-	 * Checks whether a column of a 2D-array contains hidden numeric values that are suitable for sorting.
-	 * Here is the format of a sortable value, hidden within a comment: <!--sortable=1234685716-->
-	 * @param array $data		The data-array
-	 * @param int $column		The index of the column to check
-	 * @return bool				TRUE if the whole column contains hidden sortable values, FALSE otherwise
-	 * @author Ivan Tcholakov, 2010.
-	 */
-	private function is_custom_sortable_column(& $data, $column) {
-		$is_custom_sortable = true;
-		foreach ($data as $index => & $row) {
-			$cell = &$row[$column];
-			$is_custom_sortable &= ($pos = strpos($cell, '<!--sortable=')) !== false && strpos($cell, '-->', $pos) !== false;
-			if (!$is_custom_sortable) {
-				break;
-			}
-		}
-		return $is_custom_sortable;
-	}
-
-	/**
-	 * This is a method for custom comparison, using provided hidden values.
-	 * Here is the format of a sortable value, hidden within a comment: <!--sortable=1234685716-->
-	 * @param string $el1	The first element provided from the table.
-	 * @param string $el2	The second element provided from the table.
-	 * @result bool			Tre comparison result.
-	 * @author Ivan Tcholakov, 2010.
-	 */
-	public function custom_compare($el1, $el2) {
-		$pos = strpos($el1, '<!--sortable=');
-		$el1 = intval(substr($el1, $pos + 13, strpos($el1, '-->', $pos) - $pos - 13));
-		$pos = strpos($el2, '<!--sortable=');
-		$el2 = intval(substr($el2, $pos + 13, strpos($el2, '-->', $pos) - $pos - 13));
-		return $el1 > $el2 ? 1 : ($el1 < $el2 ? -1 : 0);
-	}
-
 }

+ 15 - 22
main/work/work.lib.php

@@ -370,7 +370,7 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 
 	if ($origin != 'learnpath') {
 		$table_header[] = array(get_lang('Modify'), true);
-		$table_header[] = array('RealDate', false);
+		$table_header[] = array('RealDate', true);
 	}
 
 	// An array with the setting of the columns -> 1: columns that we will show, 0:columns that will be hide
@@ -385,26 +385,16 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 	$column_show[] = 1; // modify
 	$column_show[] = 0;	//real date in correct format
 
-
 	// Here we change the way how the colums are going to be sort
 	// in this case the the column of LastResent ( 4th element in $column_header) we will be order like the column RealDate
 	// because in the column RealDate we have the days in a correct format "2008-03-12 10:35:48"
 
-	$column_order[] = 1; //type
-	$column_order[] = 2; // title
-
 	if ($count_files != 0) {
-		$column_order[] = 3; //authors
-	}
-
-	$column_order[] = 6; // date
-
-	if ($is_allowed_to_edit) {
-		$column_order[] = 5;
+		$column_order[3] = 5;
+	} else {
+		$column_order[2] = 4;
 	}
 
-	$column_order[] = 6;
-
 	$table_data = array();
 	$dirs_list = get_subdirs_list($work_dir);
 
@@ -456,10 +446,10 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 					$form_folder -> addGroup($group_name, 'my_group', get_lang('Title'));
 					$form_folder -> addGroupRule('my_group', get_lang('ThisFieldIsRequired'), 'required');
 					$defaults = array('my_group[dir_name]' => html_entity_decode($dir), 'description' => api_html_entity_decode($row['description']));
-					
+
 					//$form_folder-> addElement('textarea', 'description', get_lang('Description'), array('rows' => 5, 'cols' => 50));
 					$form_folder->add_html_editor('description', get_lang('Description'), false, false, array('ToolbarSet' => 'profile', 'Width' => '100%', 'Height' => '200'));
-					
+
 					$qualification_input[] = FormValidator :: createElement('text','qualification');
 					$form_folder -> addGroup($qualification_input, 'qualification', get_lang('QualificationNumeric'), 'size="10"');
 
@@ -534,7 +524,7 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 					}
 					if ($there_is_a_expire_date) {
 						$defaults = array_merge($defaults, convert_date_to_array($homework['expires_on'], 'expires'));
-					}					
+					}
 					if (!empty($row['qualification'])) {
 						$defaults = array_merge($defaults, array('qualification[qualification]' => $row['qualification']));
 					}
@@ -694,8 +684,9 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 
 			if ($direc_date != '' && $direc_date != '0000-00-00 00:00:00') {
 				$direc_date_local = api_get_local_time($direc_date, null, date_default_timezone_get());
-				$row[] = date_to_str_ago($direc_date_local).'<br /><span class="dropbox_date">'.api_format_date($direc_date_local).'</span>'.'<!--uts='.api_strtotime($direc_date_local).'-->';
+				$row[] = date_to_str_ago($direc_date_local).'<br /><span class="dropbox_date">'.api_format_date($direc_date_local).'</span>';
 			} else {
+				$direc_date_local = '0000-00-00 00:00:00';
 				$row[] = '';
 			}
 
@@ -709,6 +700,7 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 					$row[] = '';
 				}
 			}
+			$row[] = $direc_date_local;
 			$table_data[] = $row;
 		}
 	}
@@ -755,7 +747,7 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 				$row[] = display_user_link_work($row2['insert_user_id'], $work->author).$qualification_string; // $work->author;
 
 				$work_sent_date_local = api_get_local_time($work->sent_date, null, date_default_timezone_get());
-				$row[] = date_to_str_ago($work_sent_date_local).$add_string.'<br /><span class="dropbox_date">'.api_format_date($work_sent_date_local).'</span>'.'<!--uts='.api_strtotime($work_sent_date_local).'-->';
+				$row[] = date_to_str_ago($work_sent_date_local).$add_string.'<br /><span class="dropbox_date">'.api_format_date($work_sent_date_local).'</span>';
 
 				if ($is_allowed_to_edit) {
 
@@ -782,6 +774,7 @@ function display_student_publications_list($work_dir, $sub_course_dir, $currentC
 				} else {
 					$row[] = ' ';
 				}
+				$row[] = $work_sent_date_local;
 				$table_data[] = $row;
 			}
 		}
@@ -1136,7 +1129,7 @@ function get_parent_directories($my_cur_dir_path) {
 	$list_id = array();
 	if (!empty($my_cur_dir_path)) {
 		$list_parents = explode('/', $my_cur_dir_path);
-		$dir_acum = '';		
+		$dir_acum = '';
 		$work_table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
 		for ($i = 0; $i < count($list_parents) - 1; $i++) {
 			$item = Database::escape_string($list_parents[$i]);
@@ -1431,7 +1424,7 @@ function get_list_users_without_publication($task_id) {
 
 	if (!empty($session_id)){
 		$sql = "SELECT user_id as id FROM $work_table WHERE parent_id='$task_id' and session_id='".$session_id."'";
-		
+
 	} else {
 		$sql = "SELECT user_id as id FROM $work_table WHERE parent_id='$task_id'";
 	}
@@ -1446,7 +1439,7 @@ function get_list_users_without_publication($task_id) {
 	} else {
 		$sql_users = "SELECT cu.user_id, u.lastname, u.firstname, u.email FROM $table_course_user AS cu, $table_user AS u WHERE u.status!=1 and cu.course_code='".api_get_course_id()."' AND u.user_id=cu.user_id";
 	}
-	
+
 	$result_users = Database::query($sql_users);
 	$users_without_tasks = array();
 	while ($row_users = Database::fetch_row($result_users)) {