]> git.mjollnir.org Git - moodle.git/commitdiff
filters: MDL-7336 upgrade $CFG->textfilters into filter_active table.
authortjhunt <tjhunt>
Mon, 13 Apr 2009 06:51:45 +0000 (06:51 +0000)
committertjhunt <tjhunt>
Mon, 13 Apr 2009 06:51:45 +0000 (06:51 +0000)
lib/db/upgrade.php
lib/filterlib.php
version.php

index 09541c8cc11f0df7698c5a0fba7d86f688f4e770..c7cc88996de4bcefa9bc38fa59713f367f403840 100644 (file)
@@ -1599,6 +1599,30 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
         upgrade_main_savepoint($result, 2009040301);
     }
 
+    if ($result && $oldversion < 2009040302) {
+    /// Transfer current settings from $CFG->textfilters
+        $disabledfilters = filter_get_all_installed();
+        if (empty($CFG->textfilters)) {
+            $activefilters = array();
+        } else {
+            $activefilters = explode(',', $CFG->textfilters);
+        }
+        $syscontext = get_context_instance(CONTEXT_SYSTEM);
+        $sortorder = 1;
+        foreach ($activefilters as $filter) {
+            filter_set_global_state($filter, TEXTFILTER_ON, $sortorder);
+            $sortorder += 1;
+            unset($disabledfilters[$filter]);
+        }
+        foreach ($disabledfilters as $filter => $notused) {
+            filter_set_global_state($filter, TEXTFILTER_DISABLED, $sortorder);
+            $sortorder += 1;
+        }
+
+    /// Main savepoint reached
+        upgrade_main_savepoint($result, 2009040302);
+    }
+
     return $result;
 }
 
index 74f203fed89ef69a4e90aa7d7891be49537784bd..207da17b7f800c1b8461e1decda828cce0cc1212 100644 (file)
@@ -1,6 +1,13 @@
 <?php // $Id$
       // Contains special functions that are particularly useful to filters
 
+/**
+ * The states a filter can be in, stored in the filter_active table.
+ */
+define('TEXTFILTER_ON', 1);
+define('TEXTFILTER_OFF', -1);
+define('TEXTFILTER_DISABLED', -9999);
+
 abstract class filter_base {
     public static $filters = array();
     protected $courseid;
@@ -152,6 +159,89 @@ function filter_get_all_installed() {
     return $filternames;
 }
 
+/**
+ * Set the global activated state for a text filter.
+ * @param $filter The filter name, for example 'filter/tex' or 'mod/glossary'.
+ * @param $state One of the values TEXTFILTER_ON, TEXTFILTER_OFF or TEXTFILTER_DISABLED.
+ * @param $sortorder (optional) a position in the sortorder to place this filter.
+ *      If not given defaults to:
+ *      No change in order if we are updating an exsiting record, and not changing to or from TEXTFILTER_DISABLED.
+ *      Just after the last currently active filter for a change to TEXTFILTER_ON or TEXTFILTER_OFF
+ *      Just after the very last filter for a change to TEXTFILTER_DISABLED
+ */
+function filter_set_global_state($filter, $state, $sortorder = false) {
+    global $DB;
+
+    // Check requested state is valid.
+    if (!in_array($state, array(TEXTFILTER_ON, TEXTFILTER_OFF, TEXTFILTER_DISABLED))) {
+        throw new coding_exception("Illegal option '$state' passed to filter_set_global_state. ' .
+                'Must be one of TEXTFILTER_ON, TEXTFILTER_OFF or TEXTFILTER_DISABLED.");
+    }
+
+    // Check sortorder is valid.
+    if ($sortorder !== false) {
+        if ($sortorder < 1 || $sortorder > $DB->get_field('filter_active', 'MAX(sortorder)', array()) + 1) {
+            throw new coding_exception("Invalid sort order passed to filter_set_global_state.");
+        }
+    }
+
+    // See if there is an existing record.
+    $syscontext = get_context_instance(CONTEXT_SYSTEM);
+    $rec = $DB->get_record('filter_active', array('filter' => $filter, 'contextid' => $syscontext->id));
+    if (empty($rec)) {
+        $insert = true;
+        $rec = new stdClass;
+        $rec->filter = $filter;
+        $rec->contextid = $syscontext->id;
+    } else {
+        $insert = false;
+        if ($sortorder === false && !($rec->active == TEXTFILTER_DISABLED xor $state == TEXTFILTER_DISABLED)) {
+            $sortorder = $rec->sortorder;
+        }
+    }
+
+    // Automatic sort order.
+    if ($sortorder === false) {
+        if ($state == TEXTFILTER_DISABLED) {
+            $prevmaxsortorder = $DB->get_field('filter_active', 'MAX(sortorder)', array());
+        } else {
+            $prevmaxsortorder = $DB->get_field_select('filter_active', 'MAX(sortorder)', 'active <> ?', array(TEXTFILTER_DISABLED));
+        }
+        if (empty($prevmaxsortorder)) {
+            $sortorder = 1;
+        } else {
+            $sortorder = $prevmaxsortorder + 1;
+            if (!$insert && $state == TEXTFILTER_DISABLED) {
+                $sortorder = $prevmaxsortorder;
+            }
+        }
+    }
+
+    // Move any existing records out of the way of the sortorder.
+    if ($insert) {
+        $DB->execute('UPDATE {filter_active} SET sortorder = sortorder + 1 WHERE sortorder >= ?', array($sortorder));
+    } else if ($sortorder != $rec->sortorder) {
+        $sparesortorder = $DB->get_field('filter_active', 'MIN(sortorder)', array()) - 1;
+        $DB->set_field('filter_active', 'sortorder', $sparesortorder, array('filter' => $filter, 'contextid' => $syscontext->id));
+        if ($sortorder < $rec->sortorder) {
+            $DB->execute('UPDATE {filter_active} SET sortorder = sortorder + 1 WHERE sortorder >= ? AND sortorder < ?',
+                    array($sortorder, $rec->sortorder));
+        } else if ($sortorder > $rec->sortorder) {
+            $DB->execute('UPDATE {filter_active} SET sortorder = sortorder - 1 WHERE sortorder <= ? AND sortorder > ?',
+                    array($sortorder, $rec->sortorder));
+        }
+    }
+
+    // Insert/update the new record.
+    $rec->active = $state;
+    $rec->sortorder = $sortorder;
+    if ($insert) {
+        $DB->insert_record('filter_active', $rec);
+    } else {
+        $DB->update_record('filter_active', $rec);
+    }
+}
+
 /**
  * Process phrases intelligently found within a HTML text (such as adding links)
  *
index 97942affeb9be613b845d42e4d2aae8e8924d792..e47190409329819bae47bf239ad4e60f9b0ca5d7 100644 (file)
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2009040301;  // YYYYMMDD   = date of the last version bump
+    $version = 2009040302;  // YYYYMMDD   = date of the last version bump
                             //         XX = daily increments
 
     $release = '2.0 dev (Build: 20090413)';  // Human-friendly version name