České řazení ve správě skupin a výpisu protokolů: Porovnání verzí
mBez shrnutí editace |
|||
(Není zobrazena jedna mezilehlá verze od stejného uživatele.) | |||
Řádek 1: | Řádek 1: | ||
{{Moodle 1.6}} | |||
== Popis problému == | == 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. | 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. | ||
Řádek 159: | Řádek 160: | ||
?> | ?> | ||
[[Kategorie:Správa]] |
Aktuální verze z 24. 11. 2006, 13:16
Moodle1.6
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; } ?>