r2168 - bugfix: tag tree is now always correctly sorted
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 22 Aug 2008 14:36:05 +0000 (14:36 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 22 Aug 2008 14:36:05 +0000 (14:36 +0000)
ChangeLog
inc/database.php
inc/functions.php
inc/init.php

index 41d77e1..77d3428 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
                highlightling for RackCode editing
        bugfix: tags are now properly displayed for users
        bugfix: the JavaScript error isn't generated any more (fix by Aaron)
+       bugfix: tag tree is now always correctly sorted
 0.16.2 2008-08-21
        bugfix: IP address picker was broken
        bugfix: more message processing fixes
index 873de66..abd14aa 100644 (file)
@@ -2747,6 +2747,8 @@ function getTagList ()
                "from TagTree left join TagStorage on id = tag_id " .
                "group by id, target_realm order by tag";
        $result = useSelectBlade ($query, __FUNCTION__);
+       $ci = 0; // Collation index. The resulting rows are ordered according to default collation,
+       // which is utf8_general_ci for UTF-8.
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
        {
                if (!isset ($ret[$row['id']]))
@@ -2754,6 +2756,7 @@ function getTagList ()
                        (
                                'id' => $row['id'],
                                'tag' => $row['tag'],
+                               'ci' => $ci++,
                                'parent_id' => $row['parent_id'],
                                'refcnt' => array()
                        );
index 9db6790..c2c1186 100644 (file)
@@ -1395,4 +1395,20 @@ function findRouters ($addrlist)
        return $ret;
 }
 
+// Assist in tag chain sorting.
+function taginfoCmp ($tagA, $tagB)
+{
+       return $tagA['ci'] - $tagB['ci'];
+}
+
+// Modify the given tag tree so, that each level's items are sorted alphabetically.
+function sortTagTree (&$tree)
+{
+       usort ($tree, 'taginfoCmp');
+       // Don't make a mistake of directly iterating over the items of current level, because this way
+       // the sorting will be performed on a _copy_ if each item, not the item itself.
+       foreach (array_keys ($tree) as $tagid)
+               sortTagTree ($tree[$tagid]['kids']);
+}
+
 ?>
index d099db2..1d1d8f3 100644 (file)
@@ -162,6 +162,7 @@ $op = (isset ($_REQUEST['op'])) ? $_REQUEST['op'] : '';
 // Order matters here.
 $taglist = getTagList();
 $tagtree = getTagTree();
+sortTagTree ($tagtree);
 
 require_once 'inc/navigation.php';
 require_once 'inc/pagetitles.php';