TYPO3-Umlaute: Sortierung Umlaute funktioniert nicht / UTF-8
| Autor | Nachricht |
|---|---|
|
Verfasst am: 11. 07. 2011 [19:47]
|
|
|
tbrodard
Thierry Brodard
Themenersteller
Dabei seit: 26.05.2011
Beiträge: 7
|
Hallo, Die Einträge mit Umlaute (Ö, Ü, Ä, ...) am Anfang vom Sortierfeld werden immer am Ende der Liste angezeigt. Das selbe für Einträge mit Umlaute innerhalb vom Sortierfeld (z.B. "Bülach" ) Wie ist es möglich es zu sortieren, wie wenn man es via SQL macht. z.B. SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1; Von mir es gesehen sollte es so behandelt werden: http://www.afz.bremen.de/sixcms/detail.php?gsid=bremen08.c.2237.de Besten dank für die Hilfe ! [Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 11.07.2011 um 19:48.] |
|
Verfasst am: 13. 07. 2011 [20:22]
|
|
|
dirk
Dirk Wildt
Dabei seit: 27.09.2010
Beiträge: 601
|
Hallo Thierry, ist die Datenbank in UTF-8 oder in ISO? Viele Grüße Dirk --
Willst Du den TYPO3-Browser mit einer Spende unterstützen? Wir freuen uns über jeden EUR! Sponsoring: Ich will einfach einen Betrag spenden http://typo3-browser.de/sponsoring |
|
Verfasst am: 13. 07. 2011 [21:29]
|
|
|
tbrodard
Thierry Brodard
Themenersteller
Dabei seit: 26.05.2011
Beiträge: 7
|
Hallo Dirk, Die Datenbank und sämtliche Tabellen sind UTF-8 (DB: utf8_unicode_ci, Tabelle: utf8_general_ci) Beste Grüsse Thierry |
|
Verfasst am: 13. 07. 2011 [21:38]
|
|
|
dirk
Dirk Wildt
Dabei seit: 27.09.2010
Beiträge: 601
|
Hallo Thierry, danke für die schnelle Antwort. Ich habe mir das DRS angesehen: Die Sortierung wird mit php multisort_rows() und str_to_lower() durchgeführt. UTF-8 wird dabei offensichtlich nicht unterstützt. Die Meldung im DRS ist: * [WARN/UTF-8] multisort_rows() uses strtolower(). This is UTF-8 insecure and multibyte insecure! Ich kann mich schwach daran erinnern, dass ich damals beim programmieren der Sortierfunktion keine schnelle Lösung für eine korrekte Sortierung mit UTF-8-Sonderzeichen gefunden habe. Kennst Du eine? Viele Grüße Dirk --
Willst Du den TYPO3-Browser mit einer Spende unterstützen? Wir freuen uns über jeden EUR! Sponsoring: Ich will einfach einen Betrag spenden http://typo3-browser.de/sponsoring |
|
Verfasst am: 13. 07. 2011 [22:21]
|
|
|
tbrodard
Thierry Brodard
Themenersteller
Dabei seit: 26.05.2011
Beiträge: 7
|
Nein, leider keine. Aber in class.tx_browser_pi1_multisort.php, Zeile 235, hat man: PHP /////////////////////////////////////////////////////////////////
//
// Building arguments for array_multisort - Part II
$i_count_args = 0;
$bool_drsWarnUtf8 = false; // 101009
foreach((array) $args as $key => $arr_tableField_order)
{
$i_count_rows = 0;
foreach ($rows as $row => $elements)
{
if(!$arr_tableField_order['caseSensitive'])
{
$str_value = strtolower($rows[$row][$arr_tableField_order['table.field']]);
if (!$bool_drsWarnUtf8 && $this->pObj->b_drs_warn)
{
t3lib_div::devlog('[WARN/UTF-8] multisort_rows() uses strtolower(). This is '.
'UTF-8 insecure and multibyte insecure!', $this->pObj->extKey, 2);
$bool_drsWarnUtf8 = true;
}
}
if($arr_tableField_order['caseSensitive'])
{
$str_value = $rows[$row][$arr_tableField_order['table.field']];
}
$arr_multisort[$i_count_args]['table.field'][$i_count_rows] = $str_value;
$i_count_rows++;
}
$arr_multisort[$i_count_args]['int_orderFlag'] = $arr_tableField_order['int_orderFlag'];
$arr_multisort[$i_count_args]['int_typeFlag'] = $arr_tableField_order['int_typeFlag'];
$i_count_args++;
}Wie ich verstehe ist 'caseSensitive' nur für die Eigenschaft "a-z_Browser" vorgesehen, gemäss Dok. Könnte man es für Views / Lists auch definieren ? In meinem Fall wurde es sicher das Problem lösen. Vor allem: besten Dank für diese Browser Extension. Es spart wirklich Zeit ! |
|
Verfasst am: 20. 07. 2011 [20:08]
|
|
|
tbrodard
Thierry Brodard
Themenersteller
Dabei seit: 26.05.2011
Beiträge: 7
|
Hallo Dirk, Hättest Du eine Idee, wie ich weitergehen konnte ? Besten Dank Thierry |
|
Verfasst am: 28. 07. 2011 [12:10]
|
|
|
dirk
Dirk Wildt
Dabei seit: 27.09.2010
Beiträge: 601
|
Hallo Thierry, nee, habe ich nicht. Weißt Du, ob man PHP utf-8-sicher sortieren kann? Das wäre der Weg. Viele Grüße Dirk --
Willst Du den TYPO3-Browser mit einer Spende unterstützen? Wir freuen uns über jeden EUR! Sponsoring: Ich will einfach einen Betrag spenden http://typo3-browser.de/sponsoring |
|
Verfasst am: 17. 08. 2011 [08:51]
|
|
|
tbrodard
Thierry Brodard
Themenersteller
Dabei seit: 26.05.2011
Beiträge: 7
|
Hallo Dirk, Im Moment habe ich wt_directory genützt, da es für die Bedürfnisse genügt. Ich denke dass die Lösung bleibt in dem man die Sortierung durch MySQL machen lässt, da es voll UTF-8 unterstützt. Ich finde aber keine volle Beispiele (obwohl die Doku von Browser ziemlich umfangsreich ist, danke !) wie man "override" genau nützen kann. Mit diesem "override", wie ich verstanden habe, kann man die "ORDER BY" Anweisung durch MySQL laufen lassen ? |
|
Verfasst am: 14. 09. 2011 [01:13]
|
|
|
dirk
Dirk Wildt
Dabei seit: 27.09.2010
Beiträge: 601
|
Hallo Thierry, vielen Dank für Deinen Vorschlag. Der Browser verwendet nicht die OrderBy-Anweisung in der SQL-Query aus folgendem Grund: * Nach einem bestimmten Update (Versionsnummer weiß ich nicht mehr) von mysql gab es keine akzeptable Performance mehr bei Verwendung von OrderBy Ich weiß nicht, ob dies noch Stand der Dinge ist. Wenn nicht, könnte OrderBy wieder in die SQL-Query integriert werdeb. Dein Vorschlag wäre dann realisierbar. Viele Grüße Dirk --
Willst Du den TYPO3-Browser mit einer Spende unterstützen? Wir freuen uns über jeden EUR! Sponsoring: Ich will einfach einen Betrag spenden http://typo3-browser.de/sponsoring |
|
Verfasst am: 11. 01. 2012 [16:39]
|
|
|
renate
Renate
Dabei seit: 12.12.2011
Beiträge: 11
|
Da mich die falsche Sortierung auch ärgert, hab ich mich mal ein wenig mit dem Thema beschäftigt und einige gefundene Ideen ein wenig lesbarer gemacht und zusammengestellt. Wenn ich das als $rows = array_sortbyindex(...) in die Funktion multisort_rows_upto_6_level und dann einen vardump ausgebe, stimmt die Sortierung. D.h. generell geht es, die richtige locale scheint gesetzt zu sein. Nur müsste das dazugehörige config array erzeugt werden und das Ganze an die richtige Stelle befürdert, das sortierte Array kommt nämlich nicht in meinem Select Feld an. PHP <?php // data $rows = array( array( 'static_countries.cn_short_de' => 'Afghanistan', 'static_countries.uid' => '3', 'tx_data.title' => 'Felix', ), array( 'static_countries.cn_short_de' => 'Afghanistan', 'static_countries.uid' => '3', 'tx_data.title' => 'Alex', ), array( 'static_countries.cn_short_de' => 'Aruba', 'static_countries.uid' => '15', 'tx_data.title' => 'Frank', ), array( 'static_countries.cn_short_de' => 'Ägypten', 'static_countries.uid' => '62', 'tx_data.title' => 'Andreas', ), ); //functions define( 'FUNC_NAME', 0 ); define( 'INDEXFIELD_IN_FUNCPARAMS_POS', 1 ); define( 'FUNC_PARAMS', 2 ); // generates an array with keys containing all the other keys to sort for // in the form 'key1_key2_key3' => 0 function array_index( $array, $field2funcArr ) { $indexArr = array(); foreach( $array as $key => $valArr ) { $currentIndex = ''; foreach( $field2funcArr as $fieldid => $funcArr ) { if( is_array($funcArr) ) { $funcArr[FUNC_PARAMS][$funcArr[INDEXFIELD_IN_FUNCPARAMS_POS]] = $valArr[$fieldid]; $currentIndex.= call_user_func_array( $funcArr[FUNC_NAME], $funcArr[FUNC_PARAMS] ).'_'; } else { $currentIndex.= $valArr[$fieldid].'_'; } } $indexArr[$currentIndex] = $key; } return $indexArr; } // adapted // from http://de2.php.net/manual/en/function.usort.php , Quicker 05-Jan-2012 09:53 // if issortindexbykey = 1 then sorts the index array by key // put the rows in the correct order into $resultArr // not sure what happens on issortindexbykey = 0 function array_sortbyindex( &$array, $indexArr, $issortindexbykey = true ) { // assumes complete index!: each item of indexArr must correlate a key of array // not sure about the original comment above. It works perfect with only the sorting fields $resultArr = array(); if( $issortindexbykey ) { ksort( $indexArr, SORT_LOCALE_STRING ); } foreach( $indexArr as $key => $datakey ) { $resultArr[$datakey] = $array[$datakey]; } return $resultArr; } // from http://de2.php.net/manual/de/ref.mbstring.php // missing mb_str_pad function function mb_str_pad($input, $pad_length, $pad_string, $pad_style, $encoding="UTF-8"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" /> { return str_pad($input, strlen($input)-mb_strlen($input,$encoding)+$pad_length, $pad_string, $pad_style); } //////////////////////////////////////////// //////////////////////////////////////////// // main $oldLocale = setlocale( LC_COLLATE, "0" ); echo "System Locale: $oldLocale<br><br>"; setlocale( LC_COLLATE, 'de_DE.utf8' ); $newLocale = setlocale( LC_COLLATE, "0" ); echo "New Locale: $newLocale<br>"; // the values in the sub arrays are: // array( IndexField => array( // FUNC_NAME, // INDEXFIELD_IN_FUNCPARAMS_POS, // array( '', 7, '0', STR_PAD_LEFT ) // function parameters // ) // ); // empty array = no transformation for this field $arrayIndex = array_index( $rows, array( 'static_countries.cn_short_de' => array( 'mb_str_pad', 0, array( '', 15, '0', STR_PAD_RIGHT, 'UTF-8' ) ), 'tx_data.title' => array( 'mb_str_pad', 0, array( '', 8, '0', STR_PAD_RIGHT, 'UTF-8' ) ) ) ); $sorted = array_sortbyindex( $rows, $arrayIndex); echo "not sorted<br>"; var_dump($arrayIndex); ksort($arrayIndex, SORT_LOCALE_STRING); echo "sorted<br>"; var_dump($arrayIndex); var_dump($sorted); ?> |
Powered by TYPO3 und mm_forum Extension


