====== Blocks ======
===== Default Blocks =====
Use the block configuration in config.php to determine which blocks should be added automatically, e.g. upon course creation.
If you do **not** want any blocks to appear, you cannot use an empty string, but you can just fill in a colon. E.g.:
$CFG->defaultblocks_override = ':';
The colon actually is a separator: any blocks listed before the colon will appear in the left column, any after that in the right column.
If you really don't want any blocks at all, "unlock" the Navigation and Settings blocks under ''Site Administration > Plugins > Blocks > Manage Blocks''. Don't do this in a production environment, however, because I had some issues getting these default blocks back after relocking them.
===== Developing Blocks =====
In Moodle 2.3, all blocks must have a method ''get_content''. This method **must** memoize its result, because it's called twice in the same page request. The first time by ''block_base#formatted_contents'' and the second time by ''block_base#is_empty'' (both functions are called from ''block_base#get_content_for_output'').
==== Blocks in the Middle Column ====
If you want to put a block in the "middle" of the screen you can only do that in the "My home" page (formerly "My Moodle").
But if you want blocks in the middle column inside a course, you need to make a few changes to standard Moodle. Here's how you that:
Inside **''lib/blocklib.php''**
define('BLOCK_POS_RIGHT', 'side-post');
// NEW:
define('BLOCK_POS_CENTER', 'center');
Inside **''theme/yourtheme/layout/general.php''** and **''theme/yourtheme/layout/frontpage.php''**:
Add this code around the start of the files:
$hascenter = (empty($PAGE->layout_options['noblocks']) && $PAGE->blocks->region_has_content('center', $OUTPUT));
And right after: ''
blocks_for_region('center') ?>
Inside **''theme/yourtheme/config.php''**:
Find this array: ''$THEME->layouts = array(''
And alter the various entries: include the 'center' everywhere. Example:
'frontpage' => array(
'file' => 'frontpage.php',
'regions' => array('side-pre', 'side-post', 'center'),
'defaultregion' => 'side-pre',
),
Inside **''theme/yourtheme/lang/en/theme_yourtheme.php''**:
Put it in translation:
$string['region-center'] = 'Center';
Inside **''lib/outputcomponents.php''**:
Replace the original function with this one:
public function add_class($class) {
if (array_key_exists('class', $this->attributes)) {
return $this->attributes['class'] .= ' '.$class;
}
$this->attributes['class'] = $class;
}
==== Include Javascript in Your Block ====
To include javascript, use this code:
public function get_content() {
if ($this->content !== null) return $this->content;
$this->content = new stdClass;
$this->page->requires->js('/blocks/simplenav/jquery.collapsible.min.js');
This code assumes that:
* your block is called 'simplenav'
* there is a javascript file called 'jquery.collapsible.min.js' sitting in the root of your block folder
===== Add Blocks to Your Courses (Or All Courses) =====
INSERT INTO `mdl_block_instances` (`blockname`, `parentcontextid`, `showinsubcontexts`, `pagetypepattern`, `subpagepattern`, `defaultregion`, `defaultweight`, `configdata`)
SELECT 'activity_modules', id, 0, 'course-view-*', NULL, 'side-post', 0, ''
FROM mdl_context
WHERE contextlevel = 50
AND instanceid <> 1
AND id NOT IN (SELECT parentcontextid FROM mdl_block_instances WHERE blockname = 'activity_modules')
(The ids and actual numbers mentioned here are the same in all Moodle installations).
===== Quiz Suppresses All Blocks by Default for Students =====
Attention: the quiz activity suppresses all blocks (except the 'fake' quiz navigation block) by default, if you're logged in with a student role.
See ''Quiz settings > Appearance > Show blocks during quiz attempts'' (underneath the 'Show more' link).
Change this behavior for all quizzes with:
UPDATE `mdl_quiz` SET `showblocks`= 1;
===== All Blocks Are Invisible When Not Logged In =====
Uncheck ''Site administration ► Security ► Site policies'' and then ''Force users to log in''.
In other words, if you require all users to login before they can see anything, then all blocks are excluded too.