Select Git revision
locallib.php
-
Kathrin Osswald authoredKathrin Osswald authored
locallib.php 22.61 KiB
<?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/>.
/**
* Theme Boost Campus - Locallib file
*
* @package theme_boost_campus
* @copyright 2017 Kathrin Osswald, Ulm University kathrin.osswald@uni-ulm.de
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Return the files from the loginbackgroundimage file area.
* This function always loads the files from the filearea that is not really performant.
* However, we accept this at the moment as it is only invoked on the login page.
*
* @return array|null
* @throws coding_exception
* @throws dml_exception
*/
function theme_boost_campus_get_loginbackgroundimage_files() {
// Static variable to remember the files for subsequent calls of this function.
static $files = null;
if ($files == null) {
// Get the system context.
$systemcontext = \context_system::instance();
// Get filearea.
$fs = get_file_storage();
// Get all files from filearea.
$files = $fs->get_area_files($systemcontext->id, 'theme_boost_campus', 'loginbackgroundimage',
false, 'itemid', false);
}
return $files;
}
/**
* Get the random number for displaying the background image on the login page randomly.
*
* @return int|null
* @throws coding_exception
* @throws dml_exception
*/
function theme_boost_campus_get_random_loginbackgroundimage_number() {
// Static variable.
static $number = null;
if ($number == null) {
// Get all files for loginbackgroundimages.
$files = theme_boost_campus_get_loginbackgroundimage_files();
// Get count of array elements.
$filecount = count($files);
// We only return a number if images are uploaded to the loginbackgroundimage file area.
if ($filecount > 0) {
// Generate random number.
$number = rand(1, $filecount);
}
}
return $number;
}
/**
* Get a random class for body tag for the background image of the login page.
*
* @return string
*/
function theme_boost_campus_get_random_loginbackgroundimage_class() {
// Get the static random number.
$number = theme_boost_campus_get_random_loginbackgroundimage_number();
// Only create the class name with the random number if there is a number (=files uploaded to the file area).
if ($number != null) {
return "loginbackgroundimage" . $number;
} else {
return "";
}
}
/**
* Get the text that should be displayed for the randomly displayed background image on the login page.
*
* @return string
* @throws coding_exception
* @throws dml_exception
*/
function theme_boost_campus_get_loginbackgroundimage_text() {
// Get the random number.
$number = theme_boost_campus_get_random_loginbackgroundimage_number();
// Only search for the text if there's a background image.
if ($number != null) {
// Get the files from the filearea loginbackgroundimage.
$files = theme_boost_campus_get_loginbackgroundimage_files();
// Get the file for the selected random number.
$file = array_slice($files, ($number - 1), 1, false);
// Get the filename.
$filename = array_pop($file)->get_filename();
// Get the config for loginbackgroundimagetext and make array out of the lines.
$lines = explode("\n", get_config('theme_boost_campus', 'loginbackgroundimagetext'));
// Proceed the lines.
foreach ($lines as $line) {
$settings = explode("|", $line);
// Compare the filenames for a match and return the text that belongs to the randomly selected image.
if (strcmp($filename, $settings[0]) == 0) {
return format_string($settings[1]);
break;
}
}
} else {
return "";
}
}
/**
* Add background images from setting 'loginbackgroundimage' to SCSS.
*
* @return string
*/
function theme_boost_campus_get_loginbackgroundimage_scss() {
$count = 0;
$scss = "";
// Get all files from filearea.
$files = theme_boost_campus_get_loginbackgroundimage_files();
// Add URL of uploaded images to eviqualent class.
foreach ($files as $file) {
$count++;
// Get url from file.
$url = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(),
$file->get_itemid(), $file->get_filepath(), $file->get_filename());
// Add this url to the body class loginbackgroundimage[n] as a background image.
$scss .= '$loginbackgroundimage' . $count.': "' . $url . '";';
}
return $scss;
}
/**
* Create information needed for the imagearea.mustache file.
*
* @return array
*/
function theme_boost_campus_get_imageareacontent() {
// Get cache.
$themeboostcampuscache = cache::make('theme_boost_campus', 'imagearea');
// If cache is filled, return the cache.
$cachecontent = $themeboostcampuscache->get('imageareadata');
if (!empty($cachecontent)) {
return $cachecontent;
} else { // Create cache.
// Fetch context.
$systemcontext = \context_system::instance();
// Get filearea.
$fs = get_file_storage();
// Get all files from filearea.
$files = $fs->get_area_files($systemcontext->id, 'theme_boost_campus', 'imageareaitems', false, 'itemid', false);
// Initialize the array which holds the image links.
$links = [];
// Initialize the array which holds the alt texts.
$alttexts = [];
// Only continue processing if there are files in the filearea.
if (!empty($files)) {
// Get the content from the setting imageareaitemsattributes and explode it to an array by the delimiter "new line".
// The string contains: the image identifier (uploaded file name) and the corresponding link URL.
$lines = explode("\n", get_config('theme_boost_campus', 'imageareaitemsattributes'));
// Parse item settings.
foreach ($lines as $line) {
$line = trim($line);
// If the setting is empty.
if (strlen($line) == 0) {
// Create an array with a dummy entry because the function array_key_exists need a
// not empty array for parameter 2.
$links = array('foo');
$alttexts = array('bar');
continue;
} else {
$settings = explode("|", $line);
// Check if parameter 2 or 3 is set.
if (!empty($settings[1]) || !empty($settings[2])) {
foreach ($settings as $i => $setting) {
$setting = trim($setting);
if (!empty($setting)) {
switch ($i) {
// Check for the first param: link.
case 1:
// The name of the image is the key for the URL that will be set.
$links[$settings[0]] = $settings[1];
break;
// Check for the second param: alt text.
case 2:
// The name of the image is the key for the alt text that will be set.
$alttexts[$settings[0]] = $settings[2];
break;
}
}
}
}
}
}
// Initialize the array which holds the data which is later stored in the cache.
$imageareacache = [];
// Traverse the files.
foreach ($files as $file) {
// Get the Moodle url for each file.
$url = moodle_url::make_pluginfile_url($file->get_contextid(), $file->get_component(), $file->get_filearea(),
$file->get_itemid(), $file->get_filepath(), $file->get_filename());
// Get the path to the file.
$filepath = $url->get_path();
// Get the filename.
$filename = $file->get_filename();
// If filename and link value from the imageareaitemsattributes setting entry match.
if (array_key_exists($filename, $links)) {
$linkpath = $links[$filename];
} else {
$linkpath = "";
}
// If filename and alt text value from the imageareaitemsattributes setting entry match.
if (array_key_exists($filename, $alttexts)) {
$alttext = $alttexts[$filename];
} else {
$alttext = "";
}
// Add the file.
$imageareacache[] = array('filepath' => $filepath, 'linkpath' => $linkpath, 'alttext' => $alttext);
}
// Sort array alphabetically ascending to the key "filepath".
usort($imageareacache, function($a, $b) {
return strcmp($a["filepath"], $b["filepath"]);
});
// Fill the cache.
$themeboostcampuscache->set('imageareadata', $imageareacache);
return $imageareacache;
} else { // If no images are uploaded, then cache an empty array.
$themeboostcampuscache->set('imageareadata', array());
return array();
}
}
}
/**
* Returns a modified flat_navigation object.
*
* @param flat_navigation $flatnav The flat navigation object.
* @return flat_navigation.
*/
function theme_boost_campus_process_flatnav(flat_navigation $flatnav) {
global $USER;
// If the setting defaulthomepageontop is enabled.
if (get_config('theme_boost_campus', 'defaulthomepageontop') == 'yes') {
// Only proceed processing if we are in a course context.
if (($coursehomenode = $flatnav->find('coursehome', global_navigation::TYPE_CUSTOM)) != false) {
// If the site home is set as the default homepage by the admin.
if (get_config('core', 'defaulthomepage') == HOMEPAGE_SITE) {
// Return the modified flat_navigation.
$flatnavreturn = theme_boost_campus_set_node_on_top($flatnav, 'home', $coursehomenode);
} else if (get_config('core', 'defaulthomepage') == HOMEPAGE_MY) { // If the dashboard is set as the default homepage
// by the admin.
// Return the modified flat_navigation.
$flatnavreturn = theme_boost_campus_set_node_on_top($flatnav, 'myhome', $coursehomenode);
} else if (get_config('core', 'defaulthomepage') == HOMEPAGE_USER) { // If the admin defined that the user can set
// the default homepage for himself.
// Site home.
if (get_user_preferences('user_home_page_preference') == 0) {
// Return the modified flat_navigtation.
$flatnavreturn = theme_boost_campus_set_node_on_top($flatnav, 'home', $coursehomenode);
} else if (get_user_preferences('user_home_page_preference') == 1 || // Dashboard.
get_user_preferences('user_home_page_preference') === false) { // If no user preference is set,
// use the default value of core setting default homepage (Dashboard).
// Return the modified flat_navigtation.
$flatnavreturn = theme_boost_campus_set_node_on_top($flatnav, 'myhome', $coursehomenode);
} else { // Should not happen.
// Return the passed flat navigation without changes.
$flatnavreturn = $flatnav;
}
} else { // Should not happen.
// Return the passed flat navigation without changes.
$flatnavreturn = $flatnav;
}
} else { // Not in course context.
// Return the passed flat navigation without changes.
$flatnavreturn = $flatnav;
}
} else { // Defaulthomepageontop not enabled.
// Return the passed flat navigation without changes.
$flatnavreturn = $flatnav;
}
return $flatnavreturn;
}
/**
* Modifies the flat_navigation to add the node on top.
*
* @param flat_navigation $flatnav The flat navigation object.
* @param string $nodename The name of the node that is to modify.
* @param navigation_node $beforenode The node before which the to be modified node shall be added.
* @return flat_navigation.
*/
function theme_boost_campus_set_node_on_top(flat_navigation $flatnav, $nodename, $beforenode) {
// Get the node for which the sorting shall be changed.
$pageflatnav = $flatnav->find($nodename, global_navigation::TYPE_SYSTEM);
// If user is logged in as a guest pageflatnav is false. Only proceed here if the result is true.
if (!empty($pageflatnav)) {
// Set the showdivider of the new top node to false that no empty nav-element will be created.
$pageflatnav->set_showdivider(false);
// Add the showdivider to the coursehome node as this is the next one and this will add a margin top to it.
$beforenode->set_showdivider(true, $beforenode->text);
// Remove the site home navigation node that it does not appear twice in the menu.
$flatnav->remove($nodename);
// Set the collection label for this node.
$flatnav->set_collectionlabel($pageflatnav->text);
// Add the saved site home node before the $beforenode.
$flatnav->add($pageflatnav, $beforenode->key);
}
// Return the modified changes.
return $flatnav;
}
/**
* Provides the node for the in-course course or activity settings.
*
* @return navigation_node.
*/
function theme_boost_campus_get_incourse_settings() {
global $COURSE, $PAGE;
// Initialize the node with false to prevent problems on pages that do not have a courseadmin node.
$node = false;
// If setting showsettingsincourse is enabled.
if (get_config('theme_boost_campus', 'showsettingsincourse') == 'yes') {
// Only search for the courseadmin node if we are within a course or a module context.
if ($PAGE->context->contextlevel == CONTEXT_COURSE || $PAGE->context->contextlevel == CONTEXT_MODULE) {
// Get the courseadmin node for the current page.
$node = $PAGE->settingsnav->find('courseadmin', navigation_node::TYPE_COURSE);
// Check if $node is not empty for other pages like for example the langauge customization page.
if (!empty($node)) {
// If the setting 'incoursesettingsswitchtoroleposition' is set either set to the option 'yes'
// or to the option 'both', then add these to the $node.
if (((get_config('theme_boost_campus', 'incoursesettingsswitchtoroleposition') == 'yes') ||
(get_config('theme_boost_campus', 'incoursesettingsswitchtoroleposition') == 'both'))
&& !is_role_switched($COURSE->id)) {
// Build switch role link
// We could only access the existing menu item by creating the user menu and traversing it.
// So we decided to create this node from scratch with the values copied from Moodle core.
$roles = get_switchable_roles($PAGE->context);
if (is_array($roles) && (count($roles) > 0)) {
// Define the properties for a new tab.
$properties = array('text' => get_string('switchroleto', 'theme_boost_campus'),
'type' => navigation_node::TYPE_CONTAINER,
'key' => 'switchroletotab');
// Create the node.
$switchroletabnode = new navigation_node($properties);
// Add the tab to the course administration node.
$node->add_node($switchroletabnode);
// Add the available roles as children nodes to the tab content.
foreach ($roles as $key => $role) {
$properties = array('action' => new moodle_url('/course/switchrole.php',
array('id' => $COURSE->id,
'switchrole' => $key,
'returnurl' => $PAGE->url->out_as_local_url(false),
'sesskey' => sesskey())),
'type' => navigation_node::TYPE_CUSTOM,
'text' => $role);
$switchroletabnode->add_node(new navigation_node($properties));
}
}
}
}
}
return $node;
}
}
/**
* Provides the node for the in-course settings for other contexts.
*
* @return navigation_node.
*/
function theme_boost_campus_get_incourse_activity_settings() {
global $PAGE;
$context = $PAGE->context;
$node = false;
// If setting showsettingsincourse is enabled.
if (get_config('theme_boost_campus', 'showsettingsincourse') == 'yes') {
// Settings belonging to activity or resources.
if ($context->contextlevel == CONTEXT_MODULE) {
$node = $PAGE->settingsnav->find('modulesettings', navigation_node::TYPE_SETTING);
} else if ($context->contextlevel == CONTEXT_COURSECAT) {
// For course category context, show category settings menu, if we're on the course category page.
if ($PAGE->pagetype === 'course-index-category') {
$node = $PAGE->settingsnav->find('categorysettings', navigation_node::TYPE_CONTAINER);
}
} else {
$node = false;
}
}
return $node;
}
/**
* Build the guest access hint HTML code.
*
* @param int $courseid The course ID.
* @return string.
*/
function theme_boost_campus_get_course_guest_access_hint($courseid) {
global $CFG;
require_once($CFG->dirroot . '/enrol/self/lib.php');
$html = '';
$instances = enrol_get_instances($courseid, true);
$plugins = enrol_get_plugins(true);
foreach ($instances as $instance) {
if (!isset($plugins[$instance->enrol])) {
continue;
}
$plugin = $plugins[$instance->enrol];
if ($plugin->show_enrolme_link($instance)) {
$html = html_writer::tag('div', get_string('showhintcourseguestaccesslink',
'theme_boost_campus', array('url' => $CFG->wwwroot . '/enrol/index.php?id=' . $courseid)));
break;
}
}
return $html;
}
/**
* Return if the info banner should be displayed on current page layout.
*
* @param array $infobannerpagestoshow The list of page layouts on which the info banner should be shown.
* @param string $infobannercontent The content which should be displayed within the info banner.
* @param mixed|moodle_page $thispagelayout The current page layout.
* @param string $perbibuserprefdialdismissed The user preference if the dissmissible banner has been dismissed.
* @return boolean
*/
function theme_boost_campus_show_banner_on_selected_page($infobannerpagestoshow, $infobannercontent, $thispagelayout,
$perbibuserprefdialdismissed) {
// Initialize variable.
$infobannershowonselectedpage = false;
// Traverse multiselect setting.
foreach ($infobannerpagestoshow as $page) {
if (empty($infobannercontent)) {
$infobannershowonselectedpage = false;
} else {
// Decide if the info banner should be shown at all.
if (!empty($infobannercontent) && $thispagelayout == $page && !$perbibuserprefdialdismissed) {
$infobannershowonselectedpage = true;
continue;
}
}
}
return $infobannershowonselectedpage;
}
/**
* Return if the time limited info banner should be displayed on current page layout.
*
* @param int $now The timestamp of the current server time.
* @param array $timedibshowonpages The list of page layouts on which the info banner should be shown.
* @param string $timedibcontent The content which should be displayed within the info banner.
* @param string $timedibstartsetting The value from setting timedibstart.
* @param string $timedibendsetting The value from setting timedibend.
* @param mixed|moodle_page $thispagelayout The current page layout.
* @return boolean
*/
function theme_boost_campus_show_timed_banner_on_selected_page($now, $timedibshowonpages, $timedibcontent, $timedibstartsetting,
$timedibendsetting, $thispagelayout) {
// Initialize variable.
$timedinfobannershowonselectedpage = false;
// Check if time settings are empty and try to convert the time string_s_ to a unix timestamp.
if (empty($timedibstartsetting)) {
$timedibstartempty = true;
$timedibstart = 0;
} else {
$timedibstart = strtotime($timedibstartsetting);
$timedibstartempty = false;
}
if (empty($timedibendsetting)) {
$timedibendempty = true;
$timedibend = 0;
} else {
$timedibend = strtotime($timedibendsetting);
$timedibendempty = false;
}
// Add the time check:
// Show the banner when now is between start and end time OR
// Show the banner when start is not set but end is not reached yet OR
// Show the banner when end is not set, but start lies in the past OR
// Show the banner if no dates are set, so there's no time restriction.
if (($now >= $timedibstart && $now <= $timedibend ||
($now <= $timedibend && $timedibstartempty) ||
($now >= $timedibstart && $timedibendempty) ||
($timedibstartempty && $timedibendempty))) {
$timedinfobannershowonselectedpage = theme_boost_campus_show_banner_on_selected_page($timedibshowonpages,
$timedibcontent, $thispagelayout, false);
}
return $timedinfobannershowonselectedpage;
}