České řazení ve správě skupin a výpisu protokolů: Porovnání verzí

Z MoodleDocs
Přejít na:navigace, hledání
Řádek 68: Řádek 68:


== Soubor řadicích funkcí ==
== Soubor řadicích funkcí ==
Soubor nese jméno moodlecscoll.php a je umístěn v adresáři <tt>lib</tt>.
Soubor nese jméno '''moodlecscoll.php''' a je umístěn v adresáři '''lib'''.


  <?php
  <?php

Verze z 24. 11. 2006, 11:21

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