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); } }