MDL-45828 cache: definitions now sorted in the admin UI
authorSam Hemelryk <sam@moodle.com>
Mon, 9 Jun 2014 21:41:30 +0000 (09:41 +1200)
committerSam Hemelryk <sam@moodle.com>
Sun, 20 Jul 2014 21:25:22 +0000 (09:25 +1200)
cache/renderer.php
lib/classes/collator.php
lib/tests/collator_test.php

index 685b838..c643dd3 100644 (file)
@@ -235,6 +235,8 @@ class core_cache_renderer extends plugin_renderer_base {
         );
         $table->data = array();
 
+        core_collator::asort_array_of_arrays_by_key($definitions, 'name');
+
         $none = new lang_string('none', 'cache');
         foreach ($definitions as $id => $definition) {
             $actions = cache_administration_helper::get_definition_actions($context, $definition);
index ad779f2..398ff67 100644 (file)
@@ -284,6 +284,46 @@ class core_collator {
         return $result;
     }
 
+    /**
+     * Locale aware sort of array of arrays.
+     *
+     * Given an array like:
+     * $array = array(
+     *     array('name' => 'bravo'),
+     *     array('name' => 'charlie'),
+     *     array('name' => 'alpha')
+     * );
+     *
+     * If you call:
+     * core_collator::asort_array_of_arrays_by_key($array, 'name')
+     *
+     * You will be returned $array sorted by the name key of the subarrays. e.g.
+     * $array = array(
+     *     array('name' => 'alpha'),
+     *     array('name' => 'bravo'),
+     *     array('name' => 'charlie')
+     * );
+     *
+     * @param array $array An array of objects to sort (handled by reference)
+     * @param string $key The key to use for comparison
+     * @param int $sortflag One of
+     *          core_collator::SORT_NUMERIC,
+     *          core_collator::SORT_STRING,
+     *          core_collator::SORT_NATURAL,
+     *          core_collator::SORT_REGULAR
+     *      optionally "|" core_collator::CASE_SENSITIVE
+     * @return bool True on success
+     */
+    public static function asort_array_of_arrays_by_key(array &$array, $key, $sortflag = core_collator::SORT_STRING) {
+        $original = $array;
+        foreach ($array as $initkey => $item) {
+            $array[$initkey] = $item[$key];
+        }
+        $result = self::asort($array, $sortflag);
+        self::restore_array($array, $original);
+        return $result;
+    }
+
     /**
      * Locale aware sorting, the key associations are kept, keys are sorted alphabetically.
      *
index 5711157..f962480 100644 (file)
@@ -198,6 +198,48 @@ class core_collator_testcase extends advanced_testcase {
         $this->assertTrue($result);
     }
 
+    /**
+     * Tests the sorting of an array of arrays by key.
+     */
+    public function test_asort_array_of_arrays_by_key() {
+        $array = array(
+            'a' => array('name' => 'bravo'),
+            'b' => array('name' => 'charlie'),
+            'c' => array('name' => 'alpha')
+        );
+        $this->assertSame(array('a', 'b', 'c'), array_keys($array));
+        $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name'));
+        $this->assertSame(array('c', 'a', 'b'), array_keys($array));
+
+        $array = array(
+            'a' => array('name' => 'b'),
+            'b' => array('name' => 1),
+            'c' => array('name' => 0)
+        );
+        $this->assertSame(array('a', 'b', 'c'), array_keys($array));
+        $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name'));
+        $this->assertSame(array('c', 'b', 'a'), array_keys($array));
+
+        $array = array(
+            'a' => array('name' => 'áb'),
+            'b' => array('name' => 'ab'),
+            1   => array('name' => 'aa'),
+            'd' => array('name' => 'cc'),
+            0   => array('name' => 'Áb')
+        );
+        $this->assertSame(array('a', 'b', 1, 'd', 0), array_keys($array));
+        $this->assertTrue(core_collator::asort_array_of_arrays_by_key($array, 'name'));
+        $this->assertSame(array(1, 'b', 'a', 0, 'd'), array_keys($array));
+        $this->assertSame(array(
+            1   => array('name' => 'aa'),
+            'b' => array('name' => 'ab'),
+            'a' => array('name' => 'áb'),
+            0   => array('name' => 'Áb'),
+            'd' => array('name' => 'cc')
+        ), $array);
+
+    }
+
     /**
      * Returns an array of sorted names.
      * @param array $objects