diff --git a/main/inc/lib/multibyte_string_functions.lib.php b/main/inc/lib/multibyte_string_functions.lib.php
index 59098a7310..60d796ae57 100644
--- a/main/inc/lib/multibyte_string_functions.lib.php
+++ b/main/inc/lib/multibyte_string_functions.lib.php
@@ -1037,6 +1037,50 @@ function api_add_pcre_unicode_modifier($pcre, $encoding = null) {
return api_is_utf8($encoding) ? $pcre.'u' : $pcre;
}
+/**
+ * ----------------------------------------------------------------------------
+ * Functions for string comparison
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ * Performs string comparison, case insensitive, language sensitive, replacement of strcmp().
+ * @param string $string1 The first string.
+ * @param string $string2 The second string.
+ * @param string $language (optional) The language in which comparison is to be made. If language is omitted, interface language is assumed then.
+ * @param string $encoding (optional) The used internally by this function character encoding. If it is omitted, the platform character set will be used by default.
+ * @link http://php.net/manual/en/function.strcmp.php
+ * @link http://php.net/manual/en/collator.compare.php
+ */
+function api_strcmp($string1, $string2, $language = null, $encoding = null) {
+ if (INTL_INSTALLED) {
+ $collator = api_get_collator($language);
+ if (is_object($collator)) {
+ $result = collator_compare($collator, api_utf8_encode($string1, $encoding), api_utf8_encode($string2, $encoding));
+ return $result === false ? 0 : $result;
+ }
+ }
+ return strcmp($string1, $string2);
+}
+
+/**
+ * Returns an instance of Collator class (ICU) created for a specified language.
+ * @param string $language (optional) The specified language. If it is omitted, then the interface language is assumed.
+ * @return object The corresponding instance of Collator class.
+ * @link http://php.net/manual/en/collator.create.php
+ */
+function api_get_collator($language = null) {
+ static $collator = array();
+ if (INTL_INSTALLED) {
+ if (!isset($collator[$language])) {
+ $locale = api_get_locale_from_language($language);
+ $collator[$language] = collator_create($locale);
+ }
+ return $collator[$language];
+ }
+ return null;
+}
+
/**
* ----------------------------------------------------------------------------
* Encoding management functions
diff --git a/main/inc/lib/tablesort.lib.php b/main/inc/lib/tablesort.lib.php
index e605e46f39..4f80cee43d 100644
--- a/main/inc/lib/tablesort.lib.php
+++ b/main/inc/lib/tablesort.lib.php
@@ -95,37 +95,43 @@ class TableSort
if($column != strval(intval($column))){return $data;} //probably an attack
if(!in_array($direction,array(SORT_ASC,SORT_DESC))){return $data;} // probably an attack
$compare_function = '';
+ if ($type == SORT_REGULAR)
+ {
+ if (TableSort::is_image_column($data, $column))
+ {
+ $type = SORT_IMAGE;
+ }
+ elseif (TableSort::is_date_column($data, $column))
+ {
+ $type = SORT_DATE;
+ }
+ elseif (TableSort::is_numeric_column($data, $column))
+ {
+ $type = SORT_NUMERIC;
+ }
+ else
+ {
+ $type = SORT_STRING;
+ }
+ }
switch ($type)
{
- case SORT_REGULAR :
- if (TableSort::is_image_column($data, $column))
- {
- return TableSort::sort_table($data, $column, $direction, SORT_IMAGE);
- }
- elseif (TableSort::is_date_column($data, $column))
- {
- return TableSort::sort_table($data, $column, $direction, SORT_DATE);
- }
- elseif (TableSort::is_numeric_column($data, $column))
- {
- return TableSort::sort_table($data, $column, $direction, SORT_NUMERIC);
- }
- return TableSort::sort_table($data, $column, $direction, SORT_STRING);
- break;
case SORT_NUMERIC :
$compare_function = 'strip_tags($el1) > strip_tags($el2)';
break;
case SORT_IMAGE :
- //$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1,"
")),TableSort::orderingstring(strip_tags($el2,"
"))) > 0';
- $compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1,"
")),TableSort::orderingstring(strip_tags($el2,"
"))) > 0';
+ ////$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1,"
")),TableSort::orderingstring(strip_tags($el2,"
"))) > 0';
+ //$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1,"
")),TableSort::orderingstring(strip_tags($el2,"
"))) > 0';
+ $compare_function = 'api_strcmp(TableSort::orderingstring(strip_tags($el1,"
")),TableSort::orderingstring(strip_tags($el2,"
"))) > 0';
break;
case SORT_DATE :
$compare_function = 'strtotime(strip_tags($el1)) > strtotime(strip_tags($el2))';
break;
case SORT_STRING :
default:
- //$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
- $compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
+ ////$compare_function = 'strnatcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
+ //$compare_function = 'strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
+ $compare_function = 'api_strcmp(TableSort::orderingstring(strip_tags($el1)),TableSort::orderingstring(strip_tags($el2))) > 0';
break;
}
$function_body = '$el1 = $a['.$column.']; $el2 = $b['.$column.']; return ('.$direction.' == SORT_ASC ? ('.$compare_function.') : !('.$compare_function.'));';
diff --git a/main/mySpace/index.php b/main/mySpace/index.php
index 1b6fd25979..eb9bcee9d3 100644
--- a/main/mySpace/index.php
+++ b/main/mySpace/index.php
@@ -89,9 +89,9 @@ function sort_users($a,$b){
$a = trim(api_strtolower($a[$_SESSION['tracking_column']]));
$b = trim(api_strtolower($b[$_SESSION['tracking_column']]));
if($_SESSION['tracking_direction'] == 'DESC')
- return strcmp($b, $a);
+ return api_strcmp($b, $a);
else
- return strcmp($a, $b);
+ return api_strcmp($a, $b);
}
diff --git a/main/tracking/courseLog.php b/main/tracking/courseLog.php
index 23c89a811e..4f9f4445fd 100644
--- a/main/tracking/courseLog.php
+++ b/main/tracking/courseLog.php
@@ -128,9 +128,9 @@ function sort_users($a,$b) {
$a = trim(api_strtolower($a[$_SESSION['tracking_column']]));
$b = trim(api_strtolower($b[$_SESSION['tracking_column']]));
if ($_SESSION['tracking_direction'] == 'DESC') {
- return strcmp($b, $a);
+ return api_strcmp($b, $a);
} else {
- return strcmp($a, $b);
+ return api_strcmp($a, $b);
}
}