MDL-25394 Tidied up several things in order to get this integrated
authorSam Hemelryk <sam@moodle.com>
Tue, 31 May 2011 06:28:03 +0000 (14:28 +0800)
committerSam Hemelryk <sam@moodle.com>
Tue, 31 May 2011 06:28:03 +0000 (14:28 +0800)
lang/en/error.php
lib/adminlib.php
lib/db/upgrade.php
lib/moodlelib.php
lib/outputrenderers.php
lib/pagelib.php
theme/index.php
theme/switchdevice.php [moved from theme/switch.php with 65% similarity]
version.php

index 20004e0..2bdeea6 100644 (file)
@@ -277,6 +277,7 @@ $string['invalidcoursemodule'] = 'Invalid course module ID';
 $string['invalidcoursenameshort'] = 'Invalid short course name';
 $string['invaliddata'] = 'Data submitted is invalid';
 $string['invaliddatarootpermissions'] = 'Invalid permissions detected in $CFG->dataroot directory, administrator has to fix permissions.';
+$string['invaliddevicetype'] = 'Invalid device type';
 $string['invalidelementid'] = 'Incorrect element id!';
 $string['invalidentry'] = 'This is not valid entry!';
 $string['invalidevent'] = 'Invalid event';
index 0f0e26f..b0f849f 100644 (file)
@@ -7317,8 +7317,13 @@ class admin_setting_configcolourpicker extends admin_setting {
 class admin_setting_devicedetectregex extends admin_setting {
 
     /**
-    * Calls parent::__construct with specific args
-    */
+     * Calls parent::__construct with specific args
+     *
+     * @param string $name
+     * @param string $visiblename
+     * @param string $description
+     * @param mixed $defaultsetting
+     */
     public function __construct($name, $visiblename, $description, $defaultsetting = '') {
         global $CFG;
         parent::__construct($name, $visiblename, $description, $defaultsetting);
@@ -7496,7 +7501,6 @@ class admin_setting_devicedetectregex extends admin_setting {
     }
 }
 
-
 /**
  * Multiselect for current modules
  *
index 92017e6..52a1c84 100644 (file)
@@ -6112,13 +6112,6 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
         upgrade_main_savepoint(true, 2011052300.02);
     }
 
-    //set enable theme detection to the new themes setting.
-    if ($oldversion < 2011052500.00) {
-        set_config('enabledevicedetection', 1);
-
-        upgrade_main_savepoint(true, 2011052500.00);
-    }
-
     return true;
 }
 
index ba34b27..c5c5765 100644 (file)
@@ -7603,7 +7603,6 @@ function check_php_version($version='5.2.4') {
     return false;
 }
 
-
 /**
  * Returns whether a device/browser combination is mobile, tablet, legacy, default or the result of 
  * an optional admin specified regular expression.  If enabledevicedetection is set to no or not set
@@ -7633,13 +7632,11 @@ function get_device_type() {
     //mobile detection PHP direct copy from open source detectmobilebrowser.com
     $phonesregex = '/android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i';
     $modelsregex = '/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i';
-
-    if (preg_match($phonesregex,$useragent)||preg_match($modelsregex,substr($useragent,0,4))){
+    if (preg_match($phonesregex,$useragent) || preg_match($modelsregex,substr($useragent, 0, 4))){
         return 'mobile';
     }
 
     $tabletregex = '/Tablet browser|iPad|iProd|GT-P1000|GT-I9000|SHW-M180S|SGH-T849|SCH-I800|Build\/ERE27|sholest/i';
-
     if (preg_match($tabletregex, $useragent)) {
          return 'tablet';
     }
@@ -7651,10 +7648,10 @@ function get_device_type() {
     return 'default';
 }
 
-
 /**
  * Returns a list of the device types supporting by Moodle
- * @param boolean incusertypes includes types specified using the devicedetectregex admin setting
+ *
+ * @param boolean $incusertypes includes types specified using the devicedetectregex admin setting
  * @return array $types
  */
 function get_device_type_list($incusertypes = true) {
@@ -7673,49 +7670,32 @@ function get_device_type_list($incusertypes = true) {
     return $types;
 }
 
-
 /**
  * Returns the theme selected for a particular device or false if none selected.
- * @param string $themes
+ *
  * @param string $devicetype
- * @return string $theme or boolean false
+ * @return string|false The name of the theme to use for the device or the false if not set
  */
 function get_selected_theme_for_device_type($devicetype = null) {
     global $CFG;
 
     if (empty($devicetype)) {
-        $devicetype = get_device_type();
-
-        //check if the user has switched theme, change $devicetype to default.
-        $switched = get_user_switched_device($devicetype);
-
-        if ($switched) {
-            $devicetype = $switched;
-        }
+        $devicetype = get_user_device_type();
     }
 
     $themevarname = get_device_cfg_var_name($devicetype);
-
     if (empty($CFG->$themevarname)) {
         return false;
     }
 
-     //prevent problems if a user installs themes
-    if (!is_dir($CFG->dirroot.'/theme/'.$CFG->$themevarname)) {
-        if ($devicetype == 'default') {
-            return 'standard';
-        } else {
-            return false;
-        }
-    }
-
     return $CFG->$themevarname;
 }
 
-
 /**
  * Returns the name of the device type theme var in $CFG (because there is not a standard convention to allow backwards compatability
+ *
  * @param string $devicetype
+ * @return string The config variable to use to determine the theme
  */
 function get_device_cfg_var_name($devicetype = null) {
     if ($devicetype == 'default' || empty($devicetype)) {
@@ -7725,59 +7705,41 @@ function get_device_cfg_var_name($devicetype = null) {
     return 'theme' . $devicetype;
 }
 
-
 /**
- * Returns device type or false if the user has switched theme to default for a device type
- * @param string $devicetype
+ * Allows the user to switch the device they are seeing the theme for.
+ * This allows mobile users to switch back to the default theme, or theme for any other device.
+ *
+ * @param string $newdevice The device the user is currently using.
+ * @return string The device the user has switched to
  */
-function get_user_switched_device($devicetype = null) {
+function set_user_device_type($newdevice) {
     global $USER;
 
-    if (empty($USER)) {
-        return false;
-    }
-
-    if (empty($devicetype)) {
-        $devicetype = get_device_type();
-    }
-
-    $switchdevice = get_user_preferences('switchdevice'.$devicetype);
+    $devicetype = get_device_type();
+    $devicetypes = get_device_type_list();
 
-    if (empty($switchdevice)) {
-        return false;
+    if ($newdevice == $devicetype) {
+        unset_user_preference('switchdevice'.$devicetype);
+    } else if (in_array($newdevice, $devicetypes)) {
+        set_user_preference('switchdevice'.$devicetype, $newdevice);
     }
-
-    return $switchdevice;
 }
 
-
-function switch_device($devicetype = null) {
-    global $USER;
-
-    if (is_null($devicetype)) {
-        $devicetype = get_device_type();
-    }
-
-    $switcheddevice = get_user_preferences('switchdevice'.$devicetype);
-    if (!empty($switcheddevice)) {
-        $switcheddevice = false;
-    } else {
-        $pref = optional_param('switchdevice', '', PARAM_TEXT);
-
-        if (!empty($pref)) {
-            $switcheddevice = $pref;
-        } else if ($devicetype == 'default') {
-            $switcheddevice = 'mobile';
-        } else {
-            $switcheddevice = 'default';
-        }
+/**
+ * Returns the device the user is currently using, or if the user has chosen to switch devices
+ * for the current device type the type they have switched to.
+ *
+ * @return string The device the user is currently using or wishes to use
+ */
+function get_user_device_type() {
+    $device = get_device_type();
+    $switched = get_user_preferences('switchdevice'.$device, false);
+    if ($switched != false) {
+        return $switched;
     }
-
-    set_user_preference('switchdevice'.$devicetype, $switcheddevice);
+    return $device;
 }
 
-
 /**
  * Returns one or several CSS class names that match the user's browser. These can be put
  * in the body tag of the page to apply browser-specific rules without relying on CSS hacks
index 92346d9..7f63cf3 100644 (file)
@@ -212,8 +212,6 @@ class core_renderer extends renderer_base {
     protected $contenttype;
     /** @var string used by {@link redirect_message()} method to communicate with {@link header()}. */
     protected $metarefreshtag = '';
-    /** @var set if the theme links function has been called **/
-    protected $switchlinkdisplayed;
 
     /**
      * Get the DOCTYPE declaration that should be used with this page. Designed to
@@ -364,11 +362,12 @@ class core_renderer extends renderer_base {
         // but some of the content won't be known until later, so we return a placeholder
         // for now. This will be replaced with the real content in {@link footer()}.
         $output = self::PERFORMANCE_INFO_TOKEN;
-        if ($this->page->devicetypeinuse == 'legacy'){
+        if ($this->page->devicetypeinuse == 'legacy') {
             // The legacy theme is in use print the notification
             $output .= html_writer::tag('div', get_string('legacythemeinuse'), array('class'=>'legacythemeinuse'));
         }
 
+        // Get links to switch device types (only shown for users not on a default device)
         $output .= $this->theme_switch_links();
 
         if (!empty($CFG->debugpageinfo)) {
@@ -2502,36 +2501,33 @@ EOD;
         return $content;
     }
 
-
-    /*
+    /**
      * Renders theme links for switching between default and other themes.
+     *
+     * @return string
      */
     protected function theme_switch_links() {
-        if ($this->switchlinkdisplayed) {
-            return '';
-        }
-
-        global $USER;
-
-        $type = get_device_type();
 
-        $this->switchlinkdisplayed = true;
+        $actualdevice = get_device_type();
+        $currentdevice = $this->page->devicetypeinuse;
+        $switched = ($actualdevice != $currentdevice);
 
-        if ($type == 'default') {
+        if (!$switched && $currentdevice == 'default' && $actualdevice == 'default') {
+            // The user is using the a default device and hasn't switched so don't shown the switch
+            // device links.
             return '';
         }
 
-        $switched = get_user_switched_device();
-
         if ($switched) {
             $linktext = get_string('switchdevicerecommended');
+            $devicetype = $actualdevice;
         } else {
             $linktext = get_string('switchdevicedefault');
+            $devicetype = 'default';
         }
+        $linkurl = new moodle_url('/theme/switchdevice.php', array('url' => $this->page->url, 'device' => $devicetype, 'sesskey' => sesskey()));
 
-        $content = html_writer::start_tag('div', array('id'=>'theme_switch_link'));
-        $linkurl = new moodle_url('/theme/switch.php', array('url' => $this->page->url));
-
+        $content  = html_writer::start_tag('div', array('id' => 'theme_switch_link'));
         $content .= html_writer::link($linkurl, $linktext);
         $content .= html_writer::end_tag('div');
 
@@ -2539,7 +2535,6 @@ EOD;
     }
 }
 
-
 /// RENDERERS
 
 /**
index 97a3106..b6c9cf0 100644 (file)
@@ -64,7 +64,7 @@ defined('MOODLE_INTERNAL') || die();
  * @property-read object $course The current course that we are inside - a row from the
  *      course table. (Also available as $COURSE global.) If we are not inside
  *      an actual course, this will be the site course.
- * @property-read bool $devicetypeinuse name of the device type in use
+ * @property-read string $devicetypeinuse The name of the device type in use
  * @property-read string $docspath The path to the Moodle docs for this page.
  * @property-read string $focuscontrol The id of the HTML element to be focused when the page has loaded.
  * @property-read bool $headerprinted
@@ -218,9 +218,11 @@ class moodle_page {
 
     /**
      * Is set to the name of the device type in use.
+     * This will we worked out when it is first used.
+     *
      * @var string
      */
-    protected $_devicetypeinuse = 'default';
+    protected $_devicetypeinuse = null;
 
     protected $_https_login_required = false;
 
@@ -524,10 +526,24 @@ class moodle_page {
 
     /**
      * Please do not call this method directly, use the ->devicetypeinuse syntax. {@link __get()}.
-     * @return bool
+     *
+     * @return string The device type being used.
      */
     protected function magic_get_devicetypeinuse() {
-        return ($this->_devicetypeinuse);
+        if (empty($this->_devicetypeinuse)) {
+            $this->_devicetypeinuse = get_user_device_type();
+        }
+        return $this->_devicetypeinuse;
+    }
+
+    /**
+     * Please do not call this method directly, use the ->legacythemeinuse syntax. {@link __get()}.
+     * @deprecated since 2.1
+     * @return bool
+     */
+    protected function magic_get_legacythemeinuse() {
+        debugging('$PAGE->legacythemeinuse is a deprecated property - please use $PAGE->devicetypeinuse and check if it is equal to legacy.', DEVELOPER_DEBUG);
+        return ($this->devicetypeinuse == 'legacy');
     }
 
     /**
@@ -1280,19 +1296,15 @@ class moodle_page {
             }
         }
 
-        $devicetype = get_device_type();
-
-        $theme = '';
-
         foreach ($themeorder as $themetype) {
             switch ($themetype) {
                 case 'course':
-                    if (!empty($CFG->allowcoursethemes) and !empty($this->_course->theme) and $devicetype == 'default') {
+                    if (!empty($CFG->allowcoursethemes) && !empty($this->_course->theme) && $this->devicetypeinuse == 'default') {
                         return $this->_course->theme;
                     }
 
                 case 'category':
-                    if (!empty($CFG->allowcategorythemes) and $devicetype == 'default') {
+                    if (!empty($CFG->allowcategorythemes) && $this->devicetypeinuse == 'default') {
                         $categories = $this->categories;
                         foreach ($categories as $category) {
                             if (!empty($category->theme)) {
@@ -1307,7 +1319,7 @@ class moodle_page {
                     }
 
                 case 'user':
-                    if (!empty($CFG->allowuserthemes) and !empty($USER->theme) && $devicetype == 'default') {
+                    if (!empty($CFG->allowuserthemes) && !empty($USER->theme) && $this->devicetypeinuse == 'default') {
                         if ($mnetpeertheme) {
                             return $mnetpeertheme;
                         } else {
@@ -1319,10 +1331,18 @@ class moodle_page {
                     if ($mnetpeertheme) {
                         return $mnetpeertheme;
                     }
-
-                    $this->_devicetypeinuse = $devicetype;
-
-                    return get_selected_theme_for_device_type();
+                    // First try for the device the user is using.
+                    $devicetheme = get_selected_theme_for_device_type($this->devicetypeinuse);
+                    if (!empty($devicetheme)) {
+                        return $devicetheme;
+                    }
+                    // Next try for the default device (as a fallback)
+                    $devicetheme = get_selected_theme_for_device_type('default');
+                    if (!empty($devicetheme)) {
+                        return $devicetheme;
+                    }
+                    // The default device theme isn't set up - use the overall default theme.
+                    return theme_config::DEFAULT_THEME;
             }
         }
     }
index 9a4d1da..3f5faa1 100644 (file)
@@ -28,19 +28,26 @@ $device = optional_param('device', '', PARAM_TEXT);
 
 admin_externalpage_setup('themeselector');
 
+if (!empty($device)) {
+    // Make sure the device requested is valid
+    $devices = get_device_type_list();
+    if (!in_array($device, $devices)) {
+        // The provided device isn't a valid device throw an error
+        print_error('invaliddevicetype');
+    }
+}
+
 unset($SESSION->theme);
 
 if ($reset and confirm_sesskey()) {
     theme_reset_all_caches();
 
 } else if ($choose && $device && confirm_sesskey()) {
-
-    $chosentheme = $choose;
-    $heading = get_string('themesaved');
  
-    $theme = theme_config::load($chosentheme);
+    // Load the theme to make sure it is valid.
+    $theme = theme_config::load($choose);
+    // Get the config argument for the chosen device.
     $themename = get_device_cfg_var_name($device);
-
     set_config($themename, $theme->name);
 
     // Create a new page for the display of the themes readme.
@@ -57,7 +64,7 @@ if ($reset and confirm_sesskey()) {
     $output = $confirmpage->get_renderer('core');
 
     echo $output->header();
-    echo $output->heading($heading);
+    echo $output->heading(get_string('themesaved'));
     echo $output->box_start();
     echo format_text(get_string('choosereadme', 'theme_'.$theme->name), FORMAT_MOODLE);
     echo $output->box_end();
@@ -72,108 +79,117 @@ if ($reset and confirm_sesskey()) {
 echo $OUTPUT->header('themeselector');
 echo $OUTPUT->heading(get_string('themes'));
 
-echo $OUTPUT->single_button(new moodle_url('index.php', array('sesskey'=>sesskey(), 'reset'=>1)), get_string('themeresetcaches', 'admin'));
+echo $OUTPUT->single_button(new moodle_url('index.php', array('sesskey' => sesskey(), 'reset' => 1)), get_string('themeresetcaches', 'admin'));
 
+$table = new html_table();
+$table->data = array();
 if ($CFG->enabledevicedetection && empty($device)) {
-    $table = new html_table();
-    $table->id = 'devicethemeselector';
+    // Display a list of devices that a user can select a theme for.
+
+    $strthemenotselected = get_string('themenoselected', 'admin');
+    $strthemeselect = get_string('themeselect', 'admin');
+
+    // Display the device selection screen
+    $table->id = 'admindeviceselector';
     $table->head = array(get_string('devicetype', 'admin'), get_string('theme'), get_string('info'));
 
     $devices = get_device_type_list();
-
     foreach ($devices as $device) {
-        $row = array();
-        $row[] = $device;
 
         $themename = get_selected_theme_for_device_type($device);
-
         if (!$themename && $device == 'default') {
             $themename = theme_config::DEFAULT_THEME;
         }
 
+        $screenshotcell = $strthemenotselected;
         if ($themename) {
-            $strthemename = get_string('pluginname', 'theme_'.$themename);
-            // link to the screenshot, now mandatory - the image path is hardcoded because we need image from other themes, not the current one
-            $screenshotpath = new moodle_url('/theme/image.php', array('theme'=>$themename, 'image'=>'screenshot', 'component'=>'theme'));
-            // Contents of the first screenshot/preview cell.
-            $row[] = html_writer::empty_tag('img', array('src'=>$screenshotpath, 'alt'=>$strthemename));
-        } else {
-            $row[] = get_string('themenoselected', 'admin');
+            // Check the theme exists
+            $themename = clean_param($themename, PARAM_THEME);
+            if (empty($themename)) {
+                // Likely the theme has been deleted
+                unset_config(get_device_cfg_var_name($device));
+            } else {
+                $strthemename = get_string('pluginname', 'theme_'.$themename);
+                // link to the screenshot, now mandatory - the image path is hardcoded because we need image from other themes, not the current one
+                $screenshoturl = new moodle_url('/theme/image.php', array('theme' => $themename, 'image' => 'screenshot', 'component' => 'theme'));
+                // Contents of the screenshot/preview cell.
+                $screenshotcell = html_writer::empty_tag('img', array('src' => $screenshoturl, 'alt' => $strthemename));
+            }
         }
 
-        $select = new single_button(new moodle_url('/theme/index.php', array('device' => $device, 'sesskey' => sesskey())), get_string('themeselect', 'admin'), 'get');
-
-        $row[] = $OUTPUT->render($select);
+        $deviceurl = new moodle_url('/theme/index.php', array('device' => $device, 'sesskey' => sesskey()));
+        $select = new single_button($deviceurl, $strthemeselect, 'get');
 
-        $table->data[$device] = $row;
+        $table->data[] = array(
+            $device,
+            $screenshotcell,
+            $OUTPUT->render($select)
+        );
     }
+} else {
+    // Either a device has been selected of $CFG->enabledevicedetection is off so display a list
+    // of themes to select.
 
-    echo html_writer::table($table);
-    echo $OUTPUT->footer();
+    if (empty($device)) {
+        // if $CFG->enabledevicedetection is off this will return 'default'
+        $device = get_device_type();
+    }
 
-    exit;
-}
+    $table->id = 'adminthemeselector';
+    $table->head = array(get_string('theme'), get_string('info'));
 
-//if $CFG->enabledevicedetection is set to no, then this will return the default device type.
-if (empty($device)) {
-    $device = get_device_type();
-}
+    $themes = get_plugin_list('theme');
 
-$table = new html_table();
-$table->id = 'adminthemeselector';
-$table->head = array(get_string('theme'), get_string('info'));
-
-$themes = get_plugin_list('theme');
-
-foreach ($themes as $themename => $themedir) {
-    // Load the theme config.
-    try {
-        $theme = theme_config::load($themename);
-    } catch (Exception $e) {
-        // Bad theme, just skip it for now.
-        continue;
-    }
+    foreach ($themes as $themename => $themedir) {
 
-    if ($themename !== $theme->name) {
-        //obsoleted or broken theme, just skip for now
-        continue;
-    }
-    if (!$CFG->themedesignermode && $theme->hidefromselector) {
-        // The theme doesn't want to be shown in the theme selector and as theme
-        // designer mode is switched off we will respect that decision.
-        continue;
-    }
-    $strthemename = get_string('pluginname', 'theme_'.$themename);
+        // Load the theme config.
+        try {
+            $theme = theme_config::load($themename);
+        } catch (Exception $e) {
+            // Bad theme, just skip it for now.
+            continue;
+        }
+        if ($themename !== $theme->name) {
+            //obsoleted or broken theme, just skip for now
+            continue;
+        }
+        if (!$CFG->themedesignermode && $theme->hidefromselector) {
+            // The theme doesn't want to be shown in the theme selector and as theme
+            // designer mode is switched off we will respect that decision.
+            continue;
+        }
+        $strthemename = get_string('pluginname', 'theme_'.$themename);
 
-    // Build the table row, and also a list of items to go in the second cell.
-    $row = array();
-    $infoitems = array();
-    $rowclasses = array();
+        // Build the table row, and also a list of items to go in the second cell.
+        $row = array();
+        $infoitems = array();
+        $rowclasses = array();
 
-    // Set up bools whether this theme is chosen either main or legacy
-    $ischosentheme = ($themename == get_selected_theme_for_device_type($device));
+        // Set up bools whether this theme is chosen either main or legacy
+        $ischosentheme = ($themename == get_selected_theme_for_device_type($device));
 
-    if ($ischosentheme) {
-        // Is the chosen main theme
-        $rowclasses[] = 'selectedtheme';
-    }
+        if ($ischosentheme) {
+            // Is the chosen main theme
+            $rowclasses[] = 'selectedtheme';
+        }
 
-    // link to the screenshot, now mandatory - the image path is hardcoded because we need image from other themes, not the current one
-    $screenshotpath = new moodle_url('/theme/image.php', array('theme'=>$themename, 'image'=>'screenshot', 'component'=>'theme'));
-    // Contents of the first screenshot/preview cell.
-    $row[] = html_writer::empty_tag('img', array('src'=>$screenshotpath, 'alt'=>$strthemename));
-    // Contents of the second cell.
-    $infocell = $OUTPUT->heading($strthemename, 3);
+        // link to the screenshot, now mandatory - the image path is hardcoded because we need image from other themes, not the current one
+        $screenshotpath = new moodle_url('/theme/image.php', array('theme'=>$themename, 'image'=>'screenshot', 'component'=>'theme'));
+        // Contents of the first screenshot/preview cell.
+        $row[] = html_writer::empty_tag('img', array('src'=>$screenshotpath, 'alt'=>$strthemename));
+        // Contents of the second cell.
+        $infocell = $OUTPUT->heading($strthemename, 3);
 
-    // Button to choose this as the main theme
-    $maintheme = new single_button(new moodle_url('/theme/index.php', array('device' => $device, 'choose' => $themename, 'sesskey' => sesskey())), get_string('usetheme'), 'get');
-    $maintheme->disabled = $ischosentheme;
-    $infocell .= $OUTPUT->render($maintheme);
+        // Button to choose this as the main theme
+        $maintheme = new single_button(new moodle_url('/theme/index.php', array('device' => $device, 'choose' => $themename, 'sesskey' => sesskey())), get_string('usetheme'), 'get');
+        $maintheme->disabled = $ischosentheme;
+        $infocell .= $OUTPUT->render($maintheme);
 
-    $row[] = $infocell;
+        $row[] = $infocell;
 
-    $table->data[$themename] = $row;
-    $table->rowclasses[$themename] = join(' ', $rowclasses);
+        $table->data[$themename] = $row;
+        $table->rowclasses[$themename] = join(' ', $rowclasses);
+    }
 }
 
 echo html_writer::table($table);
similarity index 65%
rename from theme/switch.php
rename to theme/switchdevice.php
index 669295d..c2e4180 100644 (file)
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * This code processes switch requests-> ... -> Theme selector UI.
+ * This code processes switch device requests-> ... -> Theme selector UI.
+ * 
+ * This script doesn't require login as not logged in users should still
+ * be able to switch the device theme they are using.
  */
 
 require('../config.php');
 
-$url = required_param('url', PARAM_LOCALURL);
+$url       = required_param('url', PARAM_LOCALURL);
+$newdevice = required_param('device', PARAM_TEXT);
 
-switch_device();
+require_sesskey();
+
+set_user_device_type($newdevice);
 
 redirect($url);
\ No newline at end of file
index adb2206..6f45a7d 100644 (file)
@@ -30,7 +30,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$version  = 2011052500.06;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2011053100.00;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes