České řazení ve správě skupin a výpisu protokolů
Z MoodleDocs
Moodle1.6
Obsah |
Popis problému
Na stránce pro správu skupin v kursu (course/groups.php) a na stránce výpisu protokolů (course/report.php) jsou v rozbalovacích seznamech jména uživatelů a názvy kursů začínající diakritizovaným znakem zařazeny na konec seznamu.
Popis řešení
Pro správné české řazení jsme vytvořili sadu řadicích funkcí, umístili je do zvláštního souboru a na příslušných místech v kódu Moodlu potom už jen nahradili volání původních funkcí voláním lokálních funkcí.
Autor řešení: Jaroslav Šeděnka, jaroslav@sedenka.cz
Správa skupin
Na začátku se zahrne soubor s funkcemi pro řazení a následně zamění tři volání řadicích funkcí.
--- course/groups.php (revision 279)
+++ course/groups.php (revision 280)
@@ -27,6 +27,8 @@
require_once('../config.php');
require_once('lib.php');
+ require_once('../lib/moodlecscoll.php'); // zahrnuti souboru s funkcemi pro ceske razeni
$courseid = required_param('id', PARAM_INT); // Course id
$selectedgroup = optional_param('group', NULL, PARAM_INT); // Current group id
@@ -201,14 +203,17 @@
//unset($nonmembers[$groupuser->id]);
$countusers++;
}
- natcasesort($listmembers[$group->id]);
+ moodlecscoll_sort($listmembers[$group->id]);
}
$listgroups[$group->id] = $group->name." ($countusers)";
}
- natcasesort($listgroups);
+ moodlecscoll_sort($listgroups);
}
- natcasesort($nonmembers);
+ moodlecscoll_sort($nonmembers);
if (empty($selectedgroup)) { // Choose the first group by default
if ($selectedgroup = array_shift($temparr = array_keys($listgroups))) {
Výpis protokolů
Na začátku se zahrne soubor s funkcemi pro řazení a následně zamění dvě volání řadicích funkcí – nejdříve pro řazení kursů, podruhé po řazení uživatelů.
--- course/report/log/lib.php (revision 280)
+++ course/report/log/lib.php (revision 281)
@@ -1,5 +1,8 @@
<?php // $Id: lib.php,v 1.5 2006/04/20 22:36:22 skodak Exp $
+ require_once $CFG->dirroot.'/lib/moodlecscoll.php'; // zahrnuti souboru s funkcemi pro ceske razeni
function print_log_selector_form($course, $selecteduser=0, $selecteddate="today",
$modname="", $modid=0, $modaction="", $selectedgroup=-1,$showcourses=0,$showusers=0) {
@@ -65,7 +68,8 @@
}
}
- asort($courses);
+ moodlecscoll_sort($courses);
}
$activities = array();
@@ -111,7 +115,8 @@
$strftimedaydate = get_string("strftimedaydate");
- asort($users);
+ moodlecscoll_sort($users);
// Prepare the list of action options.
Soubor řadicích funkcí
Soubor nese jméno moodlecscoll.php a je umístěn v adresáři lib.
<?php
// sada funkci pro ceske razeni
//
// moodlecscoll_sort (&$array)
// moodlecscoll_charat ($string, $index)
// moodlecscoll_strcoll ($a, $b)
/**
* Setridi pole predane jako parametr se zachovanim klicu podle ceskeho
* lexikografickeho trideni bez ohledu na velikost pismen
*
* Funkce nic nevraci, primo zmeni pole predane referenci!
*
* @param array[string] &$array pole stringu v UTF-8 k setrideni, predava se referenci a tridi "na miste"
*/
function moodlecscoll_sort (&$array) {
uasort($array, 'moodlecscoll_strcoll');
}
/**
* Vrati znak na pozici $index z retezce $string, pracuje v UTF-8
*
* @param string $string retezec v UTF-8, ze ktereho znak vybirame
* @param int $index pozice znaku, ktery chceme vratit
* @return char znak v UTF-8 na pozici $index v retezci $string
*/
function moodlecscoll_charat ($string, $index) {
return mb_substr($string, $index, 1, 'UTF-8');
}
/**
* Lexikograficky komparator pro stringy v UTF-8 podle priblizneho
* ceskeho narodniho trizeni bez ohledu na velikost pismen
*
* Zamenou promenne $abeceda jde pouzit libovolne jine trizeni, jen
* ch je zadratovane vevnitr
*
* @param string $a prvni retezec ke trizeni
* @param string $b druhy retezec ke trizeni
* @return int 1 pokud je $a vetsi, 0 pokud jsou stejne, -1 pokud je $a mensi
*/
function moodlecscoll_strcoll ($a, $b) {
// tridici sekvence, obecne muze byt jakakoli, hlavne malymi pismeny
// jednina podporovana dvojhlaska je ch kvuli primemu zadratovani vevnitr
$abeceda = array ('0','1','2','3','4','5','6','7','8','9',
'a','á','b','c','č','d','ď','e','é','f','g','h','ch',
'i','í','j','k','l','m','n', 'ň','o','ó','p','q','r','ř','s','š','t',
'ť','u','ú','ů','v','w','x','y','z','ž');
$abeceda = array_flip($abeceda);
// trideni je case insensitive
$a = mb_strtolower($a, 'UTF-8');
$b = mb_strtolower($b, 'UTF-8');
if ($a == $b) return 0;
// v cyklu prochazime pismena (CH se bere jako jedno pismeno), pokud je
// jedno vetsi tak skoncime, jinak se jede dal
$iA = 0;
$iB = 0;
do {
if (moodlecscoll_charat($a, $iA) == 'c' and moodlecscoll_charat($a, $iA+1) == 'h') {
$charA = moodlecscoll_charat($a, $iA) . moodlecscoll_charat($a,$iA + 1);
$iA++;
} else {
$charA = moodlecscoll_charat($a, $iA);
}
if (moodlecscoll_charat($b, $iB) == 'c' and moodlecscoll_charat($b, $iB+1) == 'h') {
$charB = moodlecscoll_charat($b, $iB) . moodlecscoll_charat($b, $iB+1);
$iB++;
} else {
$charB = moodlecscoll_charat($b, $iB);
}
if ($abeceda[$charA] > $abeceda[$charB]) {
return 1;
} elseif ($abeceda[$charA] < $abeceda[$charB]) {
return -1;
}
$iA++;
$iB++;
} while ($charA != and $charB != );
return 0;
}
?>
