blocks MDL-24066 Blocks can now choose to be hideable + navigation and settings are...
authorSam Hemelryk <sam@moodle.com>
Tue, 14 Sep 2010 02:12:41 +0000 (02:12 +0000)
committerSam Hemelryk <sam@moodle.com>
Tue, 14 Sep 2010 02:12:41 +0000 (02:12 +0000)
blocks/moodleblock.class.php
blocks/navigation/block_navigation.php
blocks/navigation/db/upgrade.php
blocks/navigation/version.php
blocks/settings/block_settings.php
blocks/settings/db/upgrade.php [new file with mode: 0644]
blocks/settings/version.php
lib/blocklib.php

index 10e1463..2014354 100644 (file)
@@ -725,11 +725,26 @@ class block_base {
         throw new coding_exception('config_print() can no longer be used. Blocks should use a settings.php file.');
     }
 
+    /**
+     * Can be overridden by the block to prevent the block from being dockable.
+     * 
+     * @return bool
+     */
     public function instance_can_be_docked() {
         global $CFG;
         return (!empty($CFG->allowblockstodock) && $this->page->theme->enable_dock);
     }
 
+    /**
+     * If overridden and set to true by the block it will not be hidable when
+     * editing is turned on.
+     *
+     * @return bool
+     */
+    public function instance_can_be_hidden() {
+        return true;
+    }
+
     /** @callback callback functions for comments api */
     public static function comment_template($options) {
         $ret = <<<EOD
index 9c612f6..89afeea 100644 (file)
@@ -85,6 +85,16 @@ class block_navigation extends block_base {
         return true;
     }
 
+    /**
+     * The navigation block cannot be hidden by default as it is integral to
+     * the navigation of Moodle.
+     *
+     * @return false
+     */
+    function  instance_can_be_hidden() {
+        return false;
+    }
+
     function instance_can_be_docked() {
         return (parent::instance_can_be_docked() && (empty($this->config->enabledock) || $this->config->enabledock=='yes'));
     }
index 371397d..6c70efc 100644 (file)
  * was complex due to us wanting to remvoe the outmoded blocks that this
  * block was going to replace.
  *
+ * @global moodle_database $DB
  * @param int $oldversion
  * @param object $block
  */
 function xmldb_block_navigation_upgrade($oldversion, $block) {
+    global $DB;
     // Implemented at 2009082800
+
+    if ($oldversion < 2010091400) {
+
+        $sql = "SELECT bp.id FROM {block_instances} bi 
+                LEFT JOIN {block_positions} bp ON bp.blockinstanceid=bi.id
+                WHERE bi.blockname='navigation' AND bp.visible=0";
+        $blockpositions = $DB->get_records_sql($sql);
+        if ($blockpositions) {
+            foreach ($blockpositions as $bp) {
+                $bp->visible = 1;
+                $DB->update_record('block_positions', $bp);
+            }
+        }
+
+        upgrade_block_savepoint(true, 2010091400, 'navigation');
+    }
+
     return true;
 }
\ No newline at end of file
index ed16d20..781019d 100644 (file)
@@ -15,4 +15,4 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-$plugin->version = 2009082800;
+$plugin->version = 2010091400;
index d5a7d4d..bab697d 100644 (file)
@@ -60,6 +60,16 @@ class block_settings extends block_base {
         return false;
     }
 
+    /**
+     * The settings block cannot be hidden by default as it is integral to
+     * the navigation of Moodle.
+     *
+     * @return false
+     */
+    function  instance_can_be_hidden() {
+        return false;
+    }
+
     /**
      * Set the applicable formats for this block to all
      * @return array
diff --git a/blocks/settings/db/upgrade.php b/blocks/settings/db/upgrade.php
new file mode 100644 (file)
index 0000000..ea48cd7
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file keeps track of upgrades to the settings block
+ *
+ * Sometimes, changes between versions involve alterations to database structures
+ * and other major things that may break installations.
+ *
+ * The upgrade function in this file will attempt to perform all the necessary
+ * actions to upgrade your older installation to the current version.
+ *
+ * If there's something it cannot do itself, it will tell you what you need to do.
+ *
+ * The commands in here will all be database-neutral, using the methods of
+ * database_manager class
+ *
+ * Please do not forget to use upgrade_set_timeout()
+ * before any action that may take longer time to finish.
+ *
+ * @since 2.0
+ * @package blocks
+ * @copyright 2009 Sam Hemelryk
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * As of the implementation of this block and the general navigation code
+ * in Moodle 2.0 the body of immediate upgrade work for this block and
+ * settings is done in core upgrade {@see lib/db/upgrade.php}
+ *
+ * There were several reasons that they were put there and not here, both becuase
+ * the process for the two blocks was very similar and because the upgrade process
+ * was complex due to us wanting to remvoe the outmoded blocks that this
+ * block was going to replace.
+ *
+ * @global moodle_database $DB
+ * @param int $oldversion
+ * @param object $block
+ */
+function xmldb_block_settings_upgrade($oldversion, $block) {
+    global $DB;
+    // Implemented at 2009082800
+
+    if ($oldversion < 2010091400) {
+
+        $sql = "SELECT bp.id FROM {block_instances} bi
+                LEFT JOIN {block_positions} bp ON bp.blockinstanceid=bi.id
+                WHERE bi.blockname='settings' AND bp.visible=0";
+        $blockpositions = $DB->get_records_sql($sql);
+        if ($blockpositions) {
+            foreach ($blockpositions as $bp) {
+                $bp->visible = 1;
+                $DB->update_record('block_positions', $bp);
+            }
+        }
+
+        upgrade_block_savepoint(true, 2010091400, 'settings');
+    }
+
+    return true;
+}
\ No newline at end of file
index ed16d20..781019d 100644 (file)
@@ -15,4 +15,4 @@
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
-$plugin->version = 2009082800;
+$plugin->version = 2010091400;
index 67c1f8a..493d642 100644 (file)
@@ -93,7 +93,10 @@ class block_manager {
 
 /// Field declarations =========================================================
 
-    /** @var moodle_page the moodle_page we are managing blocks for. */
+    /**
+     * the moodle_page we are managing blocks for.
+     * @var moodle_page
+     */
     protected $page;
 
     /** @var array region name => 1.*/
@@ -972,7 +975,7 @@ class block_manager {
                     'icon' => 'i/roles', 'caption' => get_string('assignroles', 'role'));
         }
 
-        if ($this->page->user_can_edit_blocks()) {
+        if ($this->page->user_can_edit_blocks() && $block->instance_can_be_hidden()) {
             // Show/hide icon.
             if ($block->instance->visible) {
                 $controls[] = array('url' => $actionurl . '&bui_hideid=' . $block->instance->id,
@@ -1096,6 +1099,8 @@ class block_manager {
 
         if (!$this->page->user_can_edit_blocks()) {
             throw new moodle_exception('nopermissions', '', $this->page->url->out(), get_string('hideshowblocks'));
+        } else if (!$block->instance_can_be_hidden()) {
+            return false;
         }
 
         blocks_set_visibility($block->instance, $this->page, $newvisibility);