. /** * Glossary Random block. * * @package block_glossary_random * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('BGR_RANDOMLY', '0'); define('BGR_LASTMODIFIED', '1'); define('BGR_NEXTONE', '2'); define('BGR_NEXTALPHA', '3'); class block_glossary_random extends block_base { function init() { $this->title = get_string('pluginname','block_glossary_random'); } function specialization() { global $CFG, $DB; require_once($CFG->libdir . '/filelib.php'); $this->course = $this->page->course; // load userdefined title and make sure it's never empty if (empty($this->config->title)) { $this->title = get_string('pluginname','block_glossary_random'); } else { $this->title = $this->config->title; } if (empty($this->config->glossary)) { return false; } if (!isset($this->config->nexttime)) { $this->config->nexttime = 0; } //check if it's time to put a new entry in cache if (time() > $this->config->nexttime) { // place glossary concept and definition in $pref->cache if (!$numberofentries = $DB->count_records('glossary_entries', array('glossaryid'=>$this->config->glossary, 'approved'=>1))) { $this->config->cache = get_string('noentriesyet','block_glossary_random'); $this->instance_config_commit(); } // Get glossary instance, if not found then return without error, as this will be handled in get_content. if (!$glossary = $DB->get_record('glossary', array('id' => $this->config->glossary))) { return false; } $this->config->globalglossary = $glossary->globalglossary; // Save course id in config, so we can get correct course module. $this->config->courseid = $glossary->course; // Get module and context, to be able to rewrite urls if (! $cm = get_coursemodule_from_instance('glossary', $glossary->id, $this->config->courseid)) { return false; } $glossaryctx = context_module::instance($cm->id); $limitfrom = 0; $limitnum = 1; $orderby = 'timemodified ASC'; switch ($this->config->type) { case BGR_RANDOMLY: $i = rand(1,$numberofentries); $limitfrom = $i-1; break; case BGR_NEXTONE: if (isset($this->config->previous)) { $i = $this->config->previous + 1; } else { $i = 1; } if ($i > $numberofentries) { // Loop back to beginning $i = 1; } $limitfrom = $i-1; break; case BGR_NEXTALPHA: $orderby = 'concept ASC'; if (isset($this->config->previous)) { $i = $this->config->previous + 1; } else { $i = 1; } if ($i > $numberofentries) { // Loop back to beginning $i = 1; } $limitfrom = $i-1; break; default: // BGR_LASTMODIFIED $i = $numberofentries; $limitfrom = 0; $orderby = 'timemodified DESC, id DESC'; break; } if ($entry = $DB->get_records_sql("SELECT id, concept, definition, definitionformat, definitiontrust FROM {glossary_entries} WHERE glossaryid = ? AND approved = 1 ORDER BY $orderby", array($this->config->glossary), $limitfrom, $limitnum)) { $entry = reset($entry); if (empty($this->config->showconcept)) { $text = ''; } else { $text = "

".format_string($entry->concept,true)."

"; } $options = new stdClass(); $options->trusted = $entry->definitiontrust; $options->overflowdiv = true; $entry->definition = file_rewrite_pluginfile_urls($entry->definition, 'pluginfile.php', $glossaryctx->id, 'mod_glossary', 'entry', $entry->id); $text .= format_text($entry->definition, $entry->definitionformat, $options); $this->config->nexttime = usergetmidnight(time()) + DAYSECS * $this->config->refresh; $this->config->previous = $i; } else { $text = get_string('noentriesyet','block_glossary_random'); } // store the text $this->config->cache = $text; $this->instance_config_commit(); } } function instance_allow_multiple() { // Are you going to allow multiple instances of each block? // If yes, then it is assumed that the block WILL USE per-instance configuration return true; } function get_content() { global $USER, $CFG, $DB; if (empty($this->config->glossary)) { $this->content = new stdClass(); if ($this->user_can_edit()) { $this->content->text = get_string('notyetconfigured','block_glossary_random'); } else { $this->content->text = ''; } $this->content->footer = ''; return $this->content; } require_once($CFG->dirroot.'/course/lib.php'); // If $this->config->globalglossary is not set then get glossary info from db. if (!isset($this->config->globalglossary)) { if (!$glossary = $DB->get_record('glossary', array('id' => $this->config->glossary))) { return ''; } else { $this->config->courseid = $glossary->course; $this->config->globalglossary = $glossary->globalglossary; $this->instance_config_commit(); } } $modinfo = get_fast_modinfo($this->config->courseid); // If deleted glossary or non-global glossary on different course page, then reset. if (!isset($modinfo->instances['glossary'][$this->config->glossary]) || ((empty($this->config->globalglossary) && ($this->config->courseid != $this->page->course->id)))) { $this->config->glossary = 0; $this->config->cache = ''; $this->instance_config_commit(); $this->content = new stdClass(); if ($this->user_can_edit()) { $this->content->text = get_string('notyetconfigured','block_glossary_random'); } else { $this->content->text = ''; } $this->content->footer = ''; return $this->content; } $cm = $modinfo->instances['glossary'][$this->config->glossary]; if (!has_capability('mod/glossary:view', context_module::instance($cm->id))) { return ''; } if (empty($this->config->cache)) { $this->config->cache = ''; } if ($this->content !== NULL) { return $this->content; } $this->content = new stdClass(); // Show glossary if visible and place links in footer. if ($cm->visible) { $this->content->text = $this->config->cache; if (has_capability('mod/glossary:write', context_module::instance($cm->id))) { $this->content->footer = ''.$this->config->addentry.'
'; } else { $this->content->footer = ''; } $this->content->footer .= ''.$this->config->viewglossary.''; // Otherwise just place some text, no link. } else { $this->content->footer = $this->config->invisible; } return $this->content; } }