. /** * Theme functions. * * @package theme_moove * @copyright 2017 Willian Mano - http://conecti.me * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Inject additional SCSS. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_get_extra_scss($theme) { $scss = $theme->settings->scss; $scss .= theme_moove_set_headerimg($theme); $scss .= theme_moove_set_topfooterimg($theme); $scss .= theme_moove_set_loginbgimg($theme); return $scss; } /** * Adds the cover to CSS. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_set_headerimg($theme) { global $OUTPUT; $headerimg = $theme->setting_file_url('headerimg', 'headerimg'); if (is_null($headerimg)) { $headerimg = $OUTPUT->image_url('headerimg', 'theme'); } $headercss = "#page-site-index.notloggedin #page-header {background-image: url('$headerimg');}"; return $headercss; } /** * Adds the footer image to CSS. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_set_topfooterimg($theme) { global $OUTPUT; $topfooterimg = $theme->setting_file_url('topfooterimg', 'topfooterimg'); if (is_null($topfooterimg)) { $topfooterimg = $OUTPUT->image_url('footer-bg', 'theme'); } $headercss = "#top-footer {background-image: url('$topfooterimg');}"; return $headercss; } /** * Adds the login page background image to CSS. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_set_loginbgimg($theme) { global $OUTPUT; $loginbgimg = $theme->setting_file_url('loginbgimg', 'loginbgimg'); if (is_null($loginbgimg)) { $loginbgimg = $OUTPUT->image_url('login_bg', 'theme'); } $headercss = "#page-login-index.moove-login #page-wrapper #page {background-image: url('$loginbgimg');}"; return $headercss; } /** * Returns the main SCSS content. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_get_main_scss_content($theme) { global $CFG; $scss = ''; $filename = !empty($theme->settings->preset) ? $theme->settings->preset : null; $fs = get_file_storage(); $context = context_system::instance(); if ($filename == 'default.scss') { // We still load the default preset files directly from the boost theme. No sense in duplicating them. $scss .= file_get_contents($CFG->dirroot . '/theme/boost/scss/preset/default.scss'); } else if ($filename == 'plain.scss') { // We still load the default preset files directly from the boost theme. No sense in duplicating them. $scss .= file_get_contents($CFG->dirroot . '/theme/boost/scss/preset/plain.scss'); } else if ($filename && ($presetfile = $fs->get_file($context->id, 'theme_moove', 'preset', 0, '/', $filename))) { // This preset file was fetched from the file area for theme_moove and not theme_boost (see the line above). $scss .= $presetfile->get_content(); } else { // Safety fallback - maybe new installs etc. $scss .= file_get_contents($CFG->dirroot . '/theme/boost/scss/preset/default.scss'); } // Moove scss. $moovevariables = file_get_contents($CFG->dirroot . '/theme/moove/scss/moove/_variables.scss'); $moove = file_get_contents($CFG->dirroot . '/theme/moove/scss/moove.scss'); // Combine them together. return $moovevariables . "\n" . $scss . "\n" . $moove; } /** * Get SCSS to prepend. * * @param theme_config $theme The theme config object. * @return string */ function theme_moove_get_pre_scss($theme) { $scss = ''; $configurable = [ // Config key => [variableName, ...]. 'brandcolor' => ['brand-primary'], 'navbarheadercolor' => 'navbar-header-color', 'navbarbg' => 'navbar-bg', 'navbarbghover' => 'navbar-bg-hover' ]; // Prepend variables first. foreach ($configurable as $configkey => $targets) { $value = isset($theme->settings->{$configkey}) ? $theme->settings->{$configkey} : null; if (empty($value)) { continue; } array_map(function($target) use (&$scss, $value) { $scss .= '$' . $target . ': ' . $value . ";\n"; }, (array) $targets); } // Prepend pre-scss. if (!empty($theme->settings->scsspre)) { $scss .= $theme->settings->scsspre; } return $scss; } /** * Serves any files associated with the theme settings. * * @param stdClass $course * @param stdClass $cm * @param context $context * @param string $filearea * @param array $args * @param bool $forcedownload * @param array $options * @return mixed */ function theme_moove_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) { $theme = theme_config::load('moove'); if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'logo') { return $theme->setting_file_serve('logo', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'headerimg') { return $theme->setting_file_serve('headerimg', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'marketing1icon') { return $theme->setting_file_serve('marketing1icon', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'marketing2icon') { return $theme->setting_file_serve('marketing2icon', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'marketing3icon') { return $theme->setting_file_serve('marketing3icon', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'marketing4icon') { return $theme->setting_file_serve('marketing4icon', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'topfooterimg') { return $theme->setting_file_serve('topfooterimg', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'loginbgimg') { return $theme->setting_file_serve('loginbgimg', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'favicon') { return $theme->setting_file_serve('favicon', $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and preg_match("/^sliderimage[1-9][0-9]?$/", $filearea) !== false) { return $theme->setting_file_serve($filearea, $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and preg_match("/^sponsorsimage[1-9][0-9]?$/", $filearea) !== false) { return $theme->setting_file_serve($filearea, $args, $forcedownload, $options); } if ($context->contextlevel == CONTEXT_SYSTEM and preg_match("/^clientsimage[1-9][0-9]?$/", $filearea) !== false) { return $theme->setting_file_serve($filearea, $args, $forcedownload, $options); } send_file_not_found(); } /** * Get theme setting * * @param string $setting * @param bool $format * @return string */ function theme_moove_get_setting($setting, $format = false) { $theme = theme_config::load('moove'); if (empty($theme->settings->$setting)) { return false; } if (!$format) { return $theme->settings->$setting; } if ($format === 'format_text') { return format_text($theme->settings->$setting, FORMAT_PLAIN); } if ($format === 'format_html') { return format_text($theme->settings->$setting, FORMAT_HTML, array('trusted' => true, 'noclean' => true)); } return format_string($theme->settings->$setting); } /** * Extend the Moove navigation * * @param flat_navigation $flatnav */ function theme_moove_extend_flat_navigation(\flat_navigation $flatnav) { theme_moove_add_certificatesmenuitem($flatnav); theme_moove_delete_menuitems($flatnav); theme_moove_add_coursesections_to_navigation($flatnav); } /** * Add items to flat navigation menu * * @param flat_navigation $flatnav * */ function theme_moove_add_certificatesmenuitem(\flat_navigation $flatnav) { global $COURSE; try { if (!theme_moove_has_certificates_plugin()) { return; } $actionurl = new \moodle_url('/theme/moove/certificates.php'); // Course page. if ($COURSE->id > 1) { $parentitem = $flatnav->find('competencies', \navigation_node::TYPE_SETTING); $actionurl = new \moodle_url('/theme/moove/certificates.php', ['id' => $COURSE->id]); } if ($COURSE->id == 1 && !$parentitem = $flatnav->find('privatefiles', \navigation_node::TYPE_SETTING)) { return; } if (!is_null($parentitem->parent)) { $certificatesitemoptions = [ 'action' => $actionurl, 'text' => get_string('certificates', 'theme_moove'), 'shorttext' => get_string('certificates', 'theme_moove'), 'icon' => new pix_icon('i/export', ''), 'type' => \navigation_node::TYPE_SETTING, 'key' => 'certificates', 'parent' => $parentitem->parent ]; $certificatesitem = new \flat_navigation_node($certificatesitemoptions, 0); $flatnav->add($certificatesitem, $parentitem->key); } } catch (\coding_exception $e) { debugging($e->getMessage(), DEBUG_DEVELOPER, $e->getTrace()); } catch (\moodle_exception $e) { debugging($e->getMessage(), DEBUG_NORMAL, $e->getTrace()); } } /** * Remove items from navigation * * @param flat_navigation $flatnav */ function theme_moove_delete_menuitems(\flat_navigation $flatnav) { $itemstodelete = [ 'coursehome' ]; foreach ($flatnav as $item) { if (in_array($item->key, $itemstodelete)) { $flatnav->remove($item->key); continue; } if (isset($item->parent->key) && $item->parent->key == 'mycourses' && isset($item->type) && $item->type == \navigation_node::TYPE_COURSE) { $flatnav->remove($item->key, \navigation_node::TYPE_COURSE); } } } /** * Improve flat navigation menu * * @param flat_navigation $flatnav */ function theme_moove_add_coursesections_to_navigation(\flat_navigation $flatnav) { global $PAGE; $participantsitem = $flatnav->find('participants', \navigation_node::TYPE_CONTAINER); if (!$participantsitem) { return; } if ($PAGE->course->format != 'singleactivity') { $coursesectionsoptions = [ 'text' => get_string('coursesections', 'theme_moove'), 'shorttext' => get_string('coursesections', 'theme_moove'), 'icon' => new pix_icon('t/viewdetails', ''), 'type' => \navigation_node::COURSE_CURRENT, 'key' => 'course-sections', 'parent' => $participantsitem->parent ]; $coursesections = new \flat_navigation_node($coursesectionsoptions, 0); foreach ($flatnav as $item) { if ($item->type == \navigation_node::TYPE_SECTION) { $coursesections->add_node(new \navigation_node([ 'text' => $item->text, 'shorttext' => $item->shorttext, 'icon' => $item->icon, 'type' => $item->type, 'key' => $item->key, 'parent' => $coursesections, 'action' => $item->action ])); } } $flatnav->add($coursesections, $participantsitem->key); } $mycourses = $flatnav->find('mycourses', \navigation_node::NODETYPE_LEAF); if ($mycourses) { $flatnav->remove($mycourses->key); $flatnav->add($mycourses, 'privatefiles'); } } /** * Check if a certificate plugin is installed. * * @return bool */ function theme_moove_has_certificates_plugin() { $simplecertificate = \core_plugin_manager::instance()->get_plugin_info('mod_simplecertificate'); $customcert = \core_plugin_manager::instance()->get_plugin_info('mod_customcert'); if ($simplecertificate || $customcert) { return true; } return false; }